Ενσωματωμένα Συστήματα για εφαρμογές πραγματικού χρόνου Εφαρμογές με τον Arduino Ιωάννης Καλόμοιρος Αναπληρωτής Καθηγητής Τμήμα Μηχανικών Πληροφορικής Μάθημα 10 1
Συναρτήσεις αναλογικής εξόδου: PWM Το σήμα PWM έχει συχνότητα 490 Hz, αλλά στα pin5 και 6 έχει συχνότητα 980 Hz. Δεν χρειάζεται κλήση στην pinmode() για καθορισμό του pinως έξοδος, πριν την κλήση στην analogwrite(). 2
Αυξομείωση έντασης φωτισμού LED με αποστολή σήματος PWM // Πρόγραμμα σε ψηφιακή θύρα. intled= 9; // ψηφιακή θύρα intbrightness= 0; intfadeamount= 5; // παράγοντας αυξομείωσης φωτεινότητας voidsetup() { pinmode(led, OUTPUT); } voidloop() { //αποστολή PWM σήματος στο pin 9 analogwrite(led, brightness); brightness = brightness + fadeamount; // Αλλαγή της τιμής της φωτεινότητας if (brightness <= 0 brightness >= 255){ fadeamount= -fadeamount; } delay(30); } 3
Οδήγηση servo motor 4
Οδήγηση servo motor Τα servo motorsλειτουργούν με σήματα PWMστα 50 Hz, δηλαδή η περίοδος του παλμού PWM είναι 20ms. Η θέση του servoεξαρτάται από το εύρος του παλμού ON. Τα περισσότερα servoβρίσκονται στην ακραία αριστερή θέση με διάρκεια παλμού ΟΝ περίπου 1ms. Αυτό αντιστοιχεί στο 5% της συνολικής περιόδου, δηλαδή το Duty cycle στην περίπτωση αυτή είναι 5 με μέγιστο το 100. Τα περισσότερα servoβρίσκονται στην μεσαίαθέση με διάρκεια παλμού περίπου 1.5ms. Αυτό αντιστοιχεί στο 7.5% της συνολικής διάρκειας ή αλλιώς, το duty cycle είναι 7.5 με μέγιστο το 100. Τα περισσότερα servoβρίσκονται στην ακραία δεξιά θέση με διάρκεια παλμού περίπου 2ms. Αυτό αντιστοιχεί στο 10% της συνολικής διάρκειας, ή αλλιώς σε duty cycle10 με μέγιστο το 100. Άρα, η παράμετρος duty cycleθα πρέπει να μεταβάλλεται γραμμικά από 5 έως 10 για να αλλάζει διαδοχικά η θέση του άξονα του μοτέρ από τη θέση αριστερά μέχρι τη θέση δεξιά.οι τιμές αυτές μπορεί να είναι λίγο διαφορετικές, για κάθε μοτέρ. 5
Παλμοί PWM για την οδήγηση servo motor 6
Σχέση γωνίας περιστροφής με Duty Cycle (DC) VEX servo-motor τα όρια για τη μεταβολή του duty cycleγια περιστροφή από 0 έως 180 μοίρες, βρέθηκαν περίπου 2 και 12%. H μεταβολή της γωνίας καθώς μεταβάλλεται το duty cycleείναι περίπου γραμμική: y=ax+b Άρα, από τα ζεύγη (0,2) και (180, 12), λαμβάνουμε: DC=(10/180)angle+2. 7
Μετατροπή του servo σε μοτέρ ελεύθερης περιστροφής DC μοτέρ δύο ακροδεκτών 8
DC motor driver: L298 9
Λογική οδήγησης με τη γέφυρα L298 10
Οδήγηση μοτέρ με γέφυρα L298 Μοτέρ με γρανάζια υποδιπλασιασμού στροφών Γέφυρα οδήγησης μοτέρ L298 11
Σύνδεση Arduino με γέφυρα L298 12
Άλλες συναρτήσεις Συνάρτηση tone() Σύνταξη: tone(pin,frequency); ή tone(pin,frequency,duration); Ενέργεια: Παράγει στο συγκεκριμένο pinέναν τετραγωνικό παλμό καθοριζόμενηςσυχνότητας και σταθερού κύκλου λειτουργίας (duty cycle) ίσου με 50%. Παράμετροι: int pin: ο αριθμός του ψηφιακού pin(0..13) στο οποίο θα παραχθεί ο παλμός. int frequency: η συχνότητα του παλμού σε Hz. Οι επιτρεπτές τιμές είναι από 31 έως 65535, αλλά το αυτί μας ακούει έως περίπου τα 20000Hz (20KHz). int duration: η διάρκεια του παλμού σε msec(προαιρετική παράμετρος). Αν δεν καθοριστεί διάρκεια, τότε ο παλμός παράγεται συνέχεια έως ότου γίνει μία κλήση στην συνάρτηση notone(), ή μέχρι να κληθεί ξανά η tone(). 13
Δημιουργία τόνου με την tone() Παράδειγμα: tone(8,5000); delay(2000); notone(); Το pinμπορεί να συνδεθεί με ένα buzzer, ή με ένα μεγαφωνάκι, ώστε να παραχθεί ήχος. Μόνο ένας τόνος μπορεί να παράγεται ανά πάσα στιγμή σε όλα τα pin. Για να παραχθεί άλλος τόνος σε άλλο pin πρέπει να κληθεί η notone() και μετά η tone() στο άλλο pin. Η επανάκλησητης tone() για το ίδιο pin, χωρίς κλήση στην notone() απλά αλλάζει την συχνότητα του παλμού. 14
PulseIn() Συνάρτηση pulsein() Σύνταξη: duration = pulsein(pin, value); ή duration = pulsein(pin, value, timeout); Ενέργεια: Διαβάζει από το συγκεκριμένο ψηφιακό pinτην διάρκεια ενός παλμού, είτε υψηλού (HIGH) είτε χαμηλού (LOW) και την επιστρέφει. Παράμετροι: int pin: ο αριθμός του ψηφιακού pin(0..13) στο οποίο θα διαβαστεί ο παλμός εισόδου. int value: το είδος του παλμού (HIGH ή LOW). Αν η παράμετρος είναι HIGH τότε η συνάρτηση περιμένει μέχρι το pinνα γίνει HIGH, και χρονομετράτη διάρκεια του παλμού μέχρι η είσοδος να γίνει LOW.Αν η παράμετρος είναι LOW τότε η συνάρτηση περιμένει μέχρι το pinνα γίνει LOW, και χρονομετράμέχρι η είσοδος να γίνει HIGH. int timeout: προαιρετική παράμετρος που περιμένει συγκεκριμένο διάστημα για μετάπτωση του παλμού, και αν παρέλθει επιστρέφει 0. 15
PulseIn() Επιστρεφόμενη τιμή: ακέραια τιμή που εκφράζει την διάρκεια του παλμού σε μsec. Επιστρέφει 0 αν δεν λήφθηκε πλήρης παλμός πριν εκπνεύσει η διάρκεια της παραμέτρου timeout. Λειτουργεί για παλμούς διάρκειας από 10μsec έως 3min. Να σημειωθεί ότι για ανάγνωση π.χ. HIGH παλμού, αν το pin είναι ήδη σε κατάσταση HIGH, η συνάρτηση θα περιμένει μέχρι το pin να γίνει LOW και μετά HIGH, ώστε να αρχίσει την χρονομέτρηση. 16
Παράδειγμα: Μέτρηση απόστασης 17
Αισθητήρας HC-SR04 18
Αισθητήρας HC-SR04 Ο αισθητήρας αυτός έχει 4 pinπου είναι: VCC: Σύνδεση της τάσης τροφοδοσίας που είναι τυπικά 5V Trig: Στο pinαυτό παρέχουμε σύντομο παλμό HIGH διάρκειας τυπικά 10μsec για να παραχθεί ο υπερηχητικός παλμός και να ξεκινήσει η μέτρηση χρόνου επιστροφής (και άρα απόστασης από το αντικείμενο που ανακλά την δέσμη) Echo: στο pinαυτό το HC-SR04 παράγει έναν θετικό παλμό (HIGH) από την στιγμή αποστολής του υπερηχητικού παλμού έως και την λήψη της ανάκλασης, οπότε το pinαυτό γίνεται LOW. Με μέτρηση της διάρκειας αυτού του παλμού μπορούμε να υπολογίσουμε τον συνολικό χρόνο αποστολής και ανάκλασης του υπερηχητικού παλμού. GND: Η γείωση για την τροφοδοσία του αισθητήρα. 19
// Καθορισμός των pin για Trigger και Echo const inttrigpin= 9; const intechopin= 8; void setup() { Serial.begin(9600); Κώδικας μέτρησης pinmode(trigpin, OUTPUT); // Ορισμός του pin 9 ως έξοδος pinmode(echopin, INPUT); // Ορισμός του pin 8 ως είσοδος } void loop() { long duration, distance; // Παρέχουμε έναν σύντομο παλμό LOW για να αποσταλεί ένας καθαρός παλμός HIGH: digitalwrite(trigpin, LOW); delaymicroseconds(2); digitalwrite(trigpin, HIGH); delaymicroseconds(10); digitalwrite(trigpin, LOW); duration = pulsein(echopin, HIGH,30000); distance_cm=duration/29/2; //(29=1/0,0340) Serial.println(duration); Serial.print( cm );} 20