CPU: ATmega328/16MHz Flash memory: 32KB 14 digital input ... · void testtt() {Serial.println(x);...

Post on 16-Oct-2020

7 views 0 download

Transcript of CPU: ATmega328/16MHz Flash memory: 32KB 14 digital input ... · void testtt() {Serial.println(x);...

• CPU: ATmega328/16MHz

• Flash memory: 32KB

• 14 digital input/output pins (of which 6 can be

used as PWM outputs)

• 6 analog inputs

• a USB connection, a power jack, an ICSP header

• a reset button

Βασικά χαρακτηριστικά Arduino UNO

Reset button

Pin ψηφιακών

εισόδων/εξόδων (0-13)

Pin

A

RE

Fγείωση

Pin επανεκκίνησης

USB port

Τροφοδοσία 3.3V

Τροφοδοσία 5VPin εξωτερικής

τροφοδοσίας

εξωτερική

τροφοδοσία

Μικροελεγκτής

ATMEGA 328

LED λειτουργίας

Pin σειριακής επικοινωνίας

γείωση

Pin Αναλογικών

εισόδων (Α0-Α5)

LED σειριακής

επικοινωνίας

Attiny85 (8KB Flash) Arduino Nano (32KB Flash)

Arduino Mega (256KB Flash) Arduino Due (512KB Flash) 32bit

Παρόμοια Boards

Τύποι διασύνδεσης:

• USB (type A,B)

• miniUSB

• microUSB

Διασυνδέσεις

Στα Arduino, μπορούμε να συνδέσουμε διάφορα αισθητήρια, είτε πάνω στο board (shield)

Διασυνδέσειςδιάφορα αισθητήρια, είτε απομακρυσμένα

Διασυνδέσειςδιάφορα actuators motors, servo, stepper motors, DC motors

Διασυνδέσειςδιάφορα υλικά που θα δουλεψουμε …

Arduino Uno pins DC Current per I/O Pin: 20mA

Jack Voltage (recommended 7-12V) < 20V

Pins Παραμετροποίησης

Το Board Arduino Uno, διαθέτει

6 Αναλογικές ΕισόδουςPins (Α0,Α1,Α2,Α3,Α4,Α5)

στις οποίες μπορούμε να

συνδέσουμε & να μετρήσουμε

μια τάση (ή σήμα)

που θα κυμαίνεται από

0,1,2… έως 5V.

(*αν βάλουμε 6V θα καεί η πόρτα !!)

Αναλογικοί είσοδοι (pins Α0 - Α5) :

Το πόσα δεκαδικά ψηφία (ακρίβεια) μπορεί να διαβάσει, μια αναλογική

είσοδος, π.χ.: 4.99511718 V (θεωρητικά) εξαρτάται από το ADC ( Analog to Digital Converter)

Το Arduino Uno έχει δυνατότητα 10bit

(Τα Arduino Due,Zero,MKR έχουν 12bit)

Μπορεί να ξεχωρίσει στο σήμα που θα του δώσουμε,1024 στάθμες

5V/1024=0.0048828125 V. Δηλαδή αν του δώσουμε ένα σήμα 4,9mV ή 9,8

mV θα καταλάβει τη διαφορά.

Για να διαβάσουμε τη τιμή της τάσης στην αναλογική πόρτα χρησιμοποιούμε

το x = analogRead(Α0);

ΠΡΟΣΟΧΗ ! Το analogWrite (11,255) δεν είναι εντολή για τις αναλογικές πόρτες

ΕΙΣΟΔΟΥ(Α0-Α5) παρακάτω θα εξηγήσουμε τη χρήση του στα PWM ποδαράκια.

Pins Παραμετροποίησης

Παραμετροποίηση pinsΨηφιακοί είσοδοι/έξοδοι:Το Arduino Uno, Διαθέτει 14

ψηφιακές Εισόδους/Εξόδους pins

(0,1,2,3,4,5,6,7,8,9,10,11,12,13)

(Τα Mega,Due έχουν 54 πόρτες)

Η διαφορα αναλογικές με ψηφιακές πόρτες,

είναι ότι:

• Οι ψηφιακές πόρτες (σαν εισόδοι),

καταλαβαίνουν μόνο 2 στάθμες

σήματος. 0V ή 5/V (low/high).

Π.χ. Αν σε μια ψηφιακή είσοδο

τροφοδοτήσουμε 1V ή 2V ή 2,4V αυτό θα

καταλάβει ότι βάλαμε 0V (LOW).

Ενώ αν εφαρμόσουμε τάση 2,6V ή 4V ή 4,9V θα

διαβάσει ότι του βάλαμε 5V (HIGH).

(*αν εφαρμόσουμε 6V ίσως καεί η πόρτα…)χρήση: var = digitalRead(4);

Εισάγουμε τον κώδικα στο περιβάλλον IDE το οποίο είναι open-source και

κατεβάζουμε δωρεάν από τη διεύθυνση (http://arduino.cc)

Σύνταξη του κώδικα

Τα αρχεία κώδικα που

δημιουργούμε ονομάζονται sketch

files και είναι τύπου .ino

Για τον έλεγχο της ορθότητας του

κώδικα χρησιμοποιούμε το

πλήκτρο Verify

Σύνταξη του κώδικα

Πριν τη μεταφορά του κώδικα στο μικροελεγκτή, συνδέσουμε σε μια θύρα USB το Arduino και

ρυθμίζουμε την ίδια θύρα στο περιβάλλον IDE (π.χ. COM3). Επίσης δηλώνουμε την έκδοση

του board που χρησιμοποιούμε (π.χ. Arduino UNO). Μετά τις κατάλληλες ρυθμίσεις, το

Arduino board «βλέπει» το περιβάλλον IDE. Μεταφέρουμε το πρόγραμμα στο μικροελεγκτή

(Upload)

Σύνταξη του κώδικα

• Τα σχόλια γραμμής, μπορούν να ξεκινάνε με //:

// my comments

• ή τα κυκλώνουμε με /* και */:

/* this is comment

comment1

comment2

This program is used for………..

comment3

comment4

*/

Αρχικά, δηλώνουμε αν θέλουμε να καλέσουμε

κάποια βιβλιοθήκη π.χ. κάποιου shield

#include <Test.h>

Η θέση του φακέλου βρίσκεται συνήθως

C:/user~/Documents/Arduino/libraries/

Σύνταξη του κώδικα

void setup()

{

//αρχικός κώδικας (παραμετροποίηση)

}

void loop()

{

//κώδικας που τρέχει για πάντα

}

τo Arduino , ξεκινάει, τρέχει μια φορά το setup()

και μετά τρέχει για πάντα το loop()….

Σύνταξη του κώδικα

Παραμετροποίηση ταχύτητας usb

Το καλώδιο σύνδεσης usb ,

εκτός από τροφοδοσία (500mΑ)

κάνει την βασική επικοινωνία.

void setup()

{

Serial.begin(9600);

Serial.print(“test1");

Serial.print(“test2");

delay(3000);

Serial.println(“test3");

Serial.println(“test4");

//my first program

}

loop() {}

Αποτέλεσμα του κώδικα

στην οθόνη τερματικού:

test1test2

test3

test4

Σημείωση:

Τα test3 test4 θα αργήσουν 3sec να

εκτυπωθούν.

Η ταχύτητα που μιλάει το arduino,

Θα πρέπει να είναι η ίδια με του

τερματικού (π.χ. Serial monitor)

Εκτύπωση μηνύματος

int i=0;

void setup()

{

Serial.begin(9600);

Serial.println(“start");

}

void loop()

{

for (i=0;i<60;i++)

{

Serial.println(i);

delay(500);

}

Serial.println(“end”);

}

• Δοκιμάστε αυτό το κώδικα.Τι περιμένουμε να δούμε?

• Βάλτε διαφορετική ταχύτητα στο τερματικό. Τι βλέπουμε?

Εκτύπωση μηνύματος

void setup()

{

int x=200;

Serial.begin(9600);

Serial.println(x);

}

void loop()

{

testtt();

}

void testtt()

{

Serial.println(x);

delay(1000);

}

Δοκιμάστε αυτό το κώδικα.τι θα περιμένουμε να δούμε?

Προτεινόμενη δομή κώδικα/*

* External libraries

*/

#include <SPI.h>

/*

* Constants & variables

*/

char msg = “Hello Arduino…”; // single line comment

/*

* Custom & standard Functions

*/

void printMessage()

{

Serial.println(message);

}

void setup()

{

//initialize serial port

Serial.begin(9600);

}

void loop()

{

printMessage();

Delay(5000);

}

Code execution

Code execution

Ορισμός pinModeΜε το pinMode,

Ορίζουμε το Ψηφιακό

Port αν θα είναι:

• INPUT,

• INPUT_PULL_UP,

• OUTPUT

π.χ.

void setup()

{

pinMode(13, OUTPUT); }

*το L είναι μόνιμα ενωμένο με το pin 13 εσωτερικά στο UNO (LED_BUILTIN)

Αναβόσβημα LED

void setup()

{

pinMode(13, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH);

delay(1000);

digitalWrite(13, LOW);

delay(3000);

}

Τι κάνει αυτός ο κώδικας?

Το delay μας δημιουργεί

κάποιο πρόβλημα?

Αναβόσβημα LED

void setup()

{

pinMode(13, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH);

delay(1000);

digitalWrite(13, LOW);

delay(3000);

}

Τι κάνει αυτός ο κώδικας?

Αν το αλλάξουμε σε digitalWrite(LED_BUILTIN, HIGH) ?

Αναβόσβημα LED

Αυτό μπορεί να γίνει?

Αναβόσβημα LED

void setup()

{

pinMode(13, OUTPUT);

pinMode(10, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH);

digitalWrite(10, LOW);

delay(1000);

digitalWrite(13, LOW);

digitalWrite(10, HIGH);

delay(3000);

}

Τι κάνει αυτός ο κώδικας?

Αναβόσβημα LED

Αυτό μπορεί να γίνει?

Αναβόσβημα LED

Αυτό μπορεί να γίνει?

Digital inputΜέχρι τώρα, είδαμε το digitalWrite(13,HIGH);

Για να διαβάσουμε τη τιμή της τάσης (LOW/HIGH)

που υπάρχει σε μια ψηφιακή πόρτα εισόδου π.χ. την 7, χρησιμοποιούμε το

var = digitalRead(7);

int var;

void setup()

{

pinMode(7, INPUT);

}

void loop()

{

var = digitalRead(7);

delay(5);

} // Αν σε κάποια είσοδο, συνδέσουμε ένα

// καλώδιο στον αέρα τι θα «βλέπει» το arduino?

// LOW ή HIGH?

Digital input

Για να διαβάσουμε σωστά τη τιμή (LOW/HIGH) της πόρτας D7

βάζουμε μια μεγάλη αντίσταση του D7 προς τη γη. (debounce)

Γιατί μεγάλη αντίσταση? Τι θα γίνει χωρίς αυτή?

Ποια η διαδρομή του ρεύματος όταν (ΔΕΝ) πατηθεί το μπουτόν?

Digital input

const int buttonPin = 7;

const int ledPin = 13;

int buttonState = 0;

void setup()

{

pinMode(ledPin, OUTPUT);

pinMode(buttonPin, INPUT);

}

void loop()

{

buttonState = digitalRead(buttonPin);

if (buttonState == HIGH)

{

digitalWrite(ledPin, HIGH);

}

else

{

digitalWrite(ledPin, LOW);

}

} // Τι κάνει αυτός ο κώδικας ?

Digital inputconst int buttonPin = 7;

const int ledPin = 13;

int buttonState = 0;

void setup()

{

Serial.begin(9600);

pinMode(ledPin, OUTPUT);

pinMode(buttonPin, INPUT);

}

void loop()

{

buttonState = digitalRead(buttonPin);

if (buttonState == HIGH)

{ digitalWrite(ledPin, HIGH); }

else

{

digitalWrite(ledPin, LOW);

}

Serial.println(buttonState); // Τι κάνει αυτός ο κώδικας ?

}

PWMΕίδαμε οτι με τα

digitalWrite(13,HIGH); // LED ON

digitalWrite(13,LOW); // LED OFF

στέλνουμε 5V ή 0V στο pin 13.

Αν θέλουμε να στείλουμε σε κάποιο pin

κάποια ενδιάμεση τάση?

Αυτό γίνεται με την τεχνική PWM (pulse Width

Modulation)

Αλλά μόνο στα pins με τo σύμβολο ~

Πρακτικά, αυτό που κάνουμε, είναι ότι

στέλνουμε μια παλμοσειρά με 0 ή 5 volts

Η εντολή συντάσσεται analogWrite(pin,value);

π.χ. analogWrite(11,255);

*Η τιμή που μπορούμε να γράψουμε είναι

0-255. Aν δώσουμε κάποια μεγαλύτερη τιμή,

γίνεται rollover.

PWM

Παραδείγματα εντολών:

analogWrite(11,0); // στο pin11 στειλε 0volt σβηστο Led

analogWrite(11,127); // στο pin11 στειλε παλμούς, που η rms τιμή να ειναι 2.5volt

analogWrite(11,200); // στο pin11 στειλε παλμούς, που η rms τιμή να ειναι 3.5volt

analogWrite(11,255); // στο pin11 στειλε παλμούς, που η rms τιμή να ειναι 5volt

Αν αντί για Led συνδέσουμε ένα μοτέρ τι θα γίνει?

Αν συνδέσουμε ένα buzzer? (μεγαφωνάκι)

PWMint led = 9; // the PWM pin the LED is attached to

int brightness = 0; // how bright the LED is

int fadeAmount = 5; // how many points to fade the LED by

void setup()

{

pinMode(led, OUTPUT);

}

void loop()

{

analogWrite(led, brightness);

brightness = brightness + fadeAmount;

if (brightness <= 0 || brightness >= 255)

{

fadeAmount = -fadeAmount;

}

delay(50);

} //πειραματιστείτε αλλάζοντας τις διάφορες τιμές. Τι βλέπετε?

Digital input

Τι γίνεται εδώ?

Ποια η διαδρομή του ρεύματος όταν (ΔΕΝ) πατηθεί το μπουτόν?

//Πειραματισμός….

Γραψτε ένα πρόγραμμα στο arduino IDE, που θα:

• αναβοσβήνει ένα LED στη πόρτα 3, κάθε 3 sec (δηλαδή 3sec on,

3sec off)

• αναβοσβήνει ένα LED στη πόρτα 7, κάθε 7sec (δηλαδή 7sec on,

7sec off)

• Και ταυτόχρονα θα μας γράφει στην οθόνη (serial monitor)

“LED 3 is on, LED7 is OFF”κλπ

Ψάξτε μόνοι σας τι κάνει η εντολή millis()