Βιβλιοθήκη για οθόνη LCD

Σχετικά έγγραφα
Παραδείγµατα χρήσης του µικροελεγκτή Arduino Εφαρµογές για το εργαστήριο Μέρος 4 ο :

ΑΣΚΗΣΗ 2 (29 Νοεμβρίου 2016)

ΑΣΚΗΣΗ 1 (22 Νοεμβρίου 2017)

ΣΤΟΙΧΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ARDUINO

ΕΡΓΑΣΤΗΡΙΟ 6 ΟΔΗΓΗΣΗ ΑΠΕΙΚΟΝΙΣΕΩΝ SSD ΚΑΙ LCD

Το κύκλωμα σε breadboard

Εφαρμογές Αναλογικών Ε/Ε PWM (pulse Width Modulation)

Εφαρμογές Σειριακής Επικοινωνίας

Τεχνολογικό+Eκπαιδευτικό+Ίδρυμα+Kρήτης+ TMHMA+MHXANOΛOΓIAΣ+ (

Ενσωματωμένα Συστήματα

Ψηφιακά Αντικείμενα Μάθημα 1 Δραστηριότητα 1. Προγραμματισμός Φυσικών Συστημάτων. Νέα Ψηφιακά Αντικείμενα

Απλή Δομή Επιλογής. Ο κώδικας. //με χρήση μεταβλητών. delay (3000);

Εφαρμογές βασισμένες στο Arduino

Έλεγχος με Μικροϋπολογιστές Εργαστήριο ενσωματωμένων συστημάτων

Arduino Teachers Workshop

ΕΙΣΑΓΩΓΗ ΣΤΟ ARDUINO. Υποψήφιος Διδάκτωρ

ΔΡΑΣΤΗΡΙΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΟ ARDUINO- 01a

Φύλλο εργασίας 9 - Αυτόνομο ρομποτικό όχημα αποφυγής εμποδίων

Φύλλο εργασίας 7 - Δημιουργώ τα δικά μου χρώματα με το RGB LED

2017 Κατασκευάζω και Προγραμματίζω με τον μικροελεγκτή Arduino

Μ.Π.Σ. «ΠΡΟΗΓΜΕΝΕΣ ΜΕΘΟΔΟΙ ΚΑΤΑΣΚΕΥΗΣ ΠΡΟΙΟΝΤΩΝ ΑΠΟ ΞΥΛΟ» Μάθημα: Σχεδίαση και Εφαρμογές Διαδραστικών Συστημάτων. Διδάσκοντας: Α.

Πλακέτα Arduino. 1ο ΕΠΑΛ Περάματος - 7ο ΕΚ Πειραιά

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 1. Arduino + LabVIEW: Μέτρηση Έντασης Φωτός με Φωτοαντίσταση. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

Εφαρμογές αναλογικών / Ψηφιακών

Προγραμματισμο ς σε Arduino

Φύλλο εργασίας 3 - Χριστουγεννιάτικα φωτάκια (σταδιακή αύξηση και μείωση φωτεινότητας ενός LED) Το κύκλωμα σε breadboard

Ενσωματωμένα Συστήματα

Μέτρηση Θερμοκρασίας με τον αισθητήρα TMP36. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων. Βασική δομή ενός προγράμματος στο LabVIEW.

Έλεγχος κινητήρα συνεχούς ρεύματος με τρανζίστορ και Arduino

Φύλλο εργασίας 4 - Δημιουργώ τα δικά μου χρώματα με το RGB LED

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 4. Οδηγώντας έναν DC Κινητήρα. Το κύκλωμα της Λειτουργίας DC Κινητήρα

ΔΙΔΑΚΤΙΚΟ ΣΕΝΑΡΙΟ ΔΗΜΙΟΥΡΓΙΑ ΣΥΣΤΗΜΑΤΟΣ ΔΙΕΞΑΓΩΓΗΣ ΠΑΙΧΝΙΔΙΟΥ ΕΡΩΤΗΣΕΩΝ/ΑΠΑΝΤΗΣΕΩΝ ΜΕ ΧΡΗΣΗ ARDUINO - QUIZ GAME ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 3

Γνωριμία με το Arduino

ΕΡΓΑΣΤΗΡΙΟ 4 ΕΙΣΑΓΩΓΗ ΣΤΟN ARDUINO: ΨΗΦΙΑΚΗ ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ

12. Διακοπές Interrupts (IRQ)

Κωνσταντίνος Γκαλονάκης. Arduino: Προγραμματισμός στην πράξη

Φύλλο εργασίας 6 - Θερμόμετρο εξωτερικού χώρου. Το κύκλωμα σε breadboard

Φύλλο εργασίας 4 - Αυτόματο φωτάκι νυκτός

ΡΟΜΠΟΤΙΚΗ ΜΕ ARDUINO - ARDUINO ΚΑΙ ΕΙΚΟΝΑ. Δημιουργός: Δρ.Αθανάσιος Μπαλαφούτης Επιβλέπων: Πετεινάτος Ηλίας Υποψήφιος Διδάκτωρ

Project 5: Συνθέτοντας μουσική

ΕΝΟΤΗΤΑ 3 ΕΚΦΡΑΣΕΙΣ, ΑΝΑΜΟΝΕΣ (DELAYS), ΗΧΟΙ

Παραδείγµατα χρήσης του µικροελεγκτή Arduino Εφαρµογές για το εργαστήριο Μέρος 2 ο :Οδήγηση Κινητήρων DC(PM)

Α. Βασική Χρήση κινητήρα - Servo με τη βιβλιοθήκη <Servo.h>

Σκοπός. Προγραμματίζοντας τον Arduino ΙΙ Εντολή Εκχώρησης & Εντολές. Συλλογή & Επεξεργασία Δεδομένων. Πρόγραμμα. Εντολές Επεξεργασίας Δεδομένων

ΑΣΚΗΣΗ ΜHΧΑΤΡΟΝΙΚΗΣ. Τέλος όταν εισάγετε ένας σωστός συνδυασμός η ένδειξη του display να μηδενίζετε.

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 5. Ρυθμίζοντας τη Φορά Περιστροφής. Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

Εκπαιδευτική Ρομποτική με ARDUINO. για εκπαιδευτικούς και μαθητές. 1o Μέρος: Απλά Κυκλώματα

Δρ. Π. Ασβεστάς Τμήμα Μηχανικών Βιοϊατρικής Τεχνολογίας Τ.Ε

Ψηφιακά Αντικείμενα Μάθημα 1 Δραστηριότητα 2. Προγραμματισμός Φυσικών Συστημάτων. Συστήματα Πραγματικών Εφαρμογών. Νέα Ψηφιακά Αντικείμενα

Μετρήσεις και συλλογή δεδομένων (Data acquisition) με μικροελεγκτές. Εισαγωγή στο Arduino. Ηλεκτρομηχανολογικός εξοπλισμός διεργασιών

Εφαρμογές Arduino Σεμινάριο Ηλεκτρονικού Τομέα

Ενσωµατωµένα Συστήµατα

Μάθημα 2 Δραστηριότητα 2: Δημιουργώντας το Μετεωρολογικό Σταθμό. Επανεξέταση των βασικών εννοιών της C και του προγραμματισμού.

Μάθημα 1 ΑΙΣΘΗΤΗΡΕΣ Ο Αισθητήρας Δύναμης. Επανεξέταση των βασικών εννοιών της C και του προγραμματισμού.

ΠΕΡΙΕΧΟΜΕΝΑ ΚΕΦΑΛΑΙΟ I: ΕΙΣΑΓΩΓΗ ΣΤΑ ΗΛΕΚΤΡΟΝΙΚΑ

ΕΝΟΤΗΤΑ 10: ΟΔΗΓΗΣΗ ΚΙΝΗΤΗΡΩΝ

Συλλογή & Επεξεργασία Δεδομένων Εργαστήριο 8. Μετρώντας Επιτάχυνση με το Accelerόμετρο (ADXL 335) Σύστημα Συλλογής & Επεξεργασίας Μετρήσεων

Συλλογή & Επεξεργασία Δεδομένων Εξαμηνιαία ΡομποΚαθαριστής Μέρος Β : Το Πρόγραμμα. Σχεδίαση Συστήματος Πραγματικής Εφαρμογής (Prototyping).

Lab 1: Experimenting on Arduino & AI Sense

ΕΡΓΑΣΤΗΡΙΑΚΗ ΕΦΑΡΜΟΓΗ 1 ΤO ΡΟΜΠΟΤ INTELLITEK ER-2u

ΕΝΟΤΗΤΑ 6 LCD ΟΘΟΝΕΣ

ΔΙΔΑΣΚΑΛΙΑ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΜΕ ΧΡΗΣΗ ΤΟΥ ΠΑΚΕΤΟΥ ΡΟΜΠΟΤΙΚΗΣ LEGO MINDSTORMS NXT

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

ΕΝΟΤΗΤΑ 5 Αναλογικά σήματα

Συλλογή & Επεξεργασία Δεδομένων. Προγραμματίζοντας τον Arduino Μέρος Ι: Μεταβλητές, Εντολές Εισόδου & Εξόδου. Ολοκληρωμένο Περιβάλλον Ανάπτυξης (IDE)

Εξαμηνιαία Εργασία 2013 Προγραμματίζοντας τον Arduino στη C Μέρος Β : Επικοινωνία Υπολογιστή με Μικροελεγκτή

Πακέτο Lego Mindstorms

Έργο 1 LED που αναβοσβήνει (LED Flasher)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Παράρτημα Φύλλο εργασίας 1: Δραστηριότητα 1 : Να αναβοσβήνει η φωτοδίοδος ανά ένα δευτερόλεπτο. Μέλη της ομάδας :

ΛΟΓΙΚΑ ΔΙΑΓΡΑΜΜΑΤΑ. Και εφαρμογές με τα καλώδια δεδομένων. 9 ο Μάθημα

1ο ΕΠΑΛ Περάματος -7ο ΕΚ Πειραιά. Εφαρμογές Arduino. Σεμινάριο Ηλεκτρονικού Τομέα. Φεβρουάριος 2014

ΠΑΛΜΟΓΡΑΦΟΣ ΤΡΟΦΟ ΟΤΙΚΟ ΓΕΝΝΗΤΡΙΑ

Εξαμηνιαία Εργασία 2013 Προγραμματίζοντας τον Arduino στη C Μέρος Α : Υλικά

ΜΙΚΡΟΕΛΕΓΚΤΗΣ PICAXE 18M2

Πακέτο Lego Mindstorms NXT

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό

4 Εισαγωγή στο Arduino

ΧΡΩΜΑΤΙΚΟΣ ΤΑΞΙΝΟΜΗΤΗΣ ΜΕ ΡΟΜΠΟΤΙΚΟ ΒΡΑΧΙΟΝΑ ΚΑΙ ΧΡΗΣΗ ΤΟΥ ΜΙΚΡΟΕΛΕΓΚΤΗ BASIC STAMP ΤΗΣ PARALLAX

Κεφάλαιο 4 Σύνδεση Μικροεπεξεργαστών και Μικροελεγκτών ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

ΕΡΓΑΣΤΗΡΙΟ ΗΛΕΚΤΡΟΝΙΚΩΝ ΕΦΑΡΜΟΓΩΝ

Μάθημα 3.8 Τεχνικές μεταφοράς δεδομένων Λειτουργία τακτικής σάρωσης (Polling) Λειτουργία Διακοπών DMA (Direct Memory Access)

Διπλωματική Εργασία του φοιτητή του Τμήματος Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών της Πολυτεχνικής Σχολής του Πανεπιστημίου Πατρών

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

6.1 Θεωρητική εισαγωγή

Σειριακό Τερματικό Serial Terminal (Dumb Terminal)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

10. Πληκτρολόγιο matrix 4x4

Εμμανουήλ Πουλάκης. Προγραμματίζοντας με τον μικροελεγκτή Arduino

2ο Γυμνάσιο Καβάλας. Κατασκευές και προγραμματισμός με το scratch for Arduino (s4a)

Έλεγχος στροφών κινητήρα DC με ελεγκτή PI, και αντιστάθμιση διαταραχής.

Οδηγώντας μια οθόνη υγρών κρυστάλλων Liquid Crystal Display

Εγχειρίδιο Χρήσης Μετατροπέα Τάσης / Φορτιστή Συσσωρευτών

Έλεγχος με Μικροϋπολογιστές Εργαστήριο ενσωματωμένων συστημάτων

Σεμινάριο Ηλεκτρονικών Πρακτικές εφαρμογές με μικροελεγκτή

ΡΟΜΠΟΤΙΚΗ ΜΕ ΧΡΗΣΗ ΤΟΥ ΠΑΚΕΤΟΥ LEGO MINDSTORMS NXT. ΚΕΦΑΛΑΙΟ 7ο. Δραστηριότητες για το ΝΧΤ-G και το Robolab

Σηµαντικές παρατηρήσεις σχετικά µε το backround:

Μια πρόταση διδασκαλίας για το μάθημα του προγραμματισμού Η/Υ στο Λύκειο με τη μεθοδολογία STEM

Τ.Ε.Ι Λαμίας Τμήμα Ηλεκτρονικής Σ.Τ.ΕΦ ΑΙΣΘΗΤΗΡΕΣ-ΙΝTERFACES Υλοποίηση κύκλωματος απεικόνισης μεταβολής γραμμικού ποτενσιομέτρου

Transcript:

Βιβλιοθήκη για οθόνη LCD Η βιβλιοθήκη LCD βρίσκεται προεγκατεστημένη στο περιβάλλον προγραμματισμού του Arduino (IDE) και για την ορθή της λειτουργία ακολουθούμε την παρακάτω διαδικασία: Ø Δηλώνουμε τη χρήση της βιβλιοθήκης στην αρχή του κώδικα π.χ. #include <LiquidCrystal.h> Ø Δηλώνουμε τις θύρες (pin) στις οποίες θα συνδέσουμε την οθόνη π.χ. LiquidCrystal lcd(rs_pin, Enable_pin, Dpin4, Dpin5, Dpin6, Dpin7) για το συγκεκριμένο παράδειγμα έχουμε LiquidCrystal lcd(12, 11, 5, 4, 3, 2) (η δήλωση αυτή γίνεται πριν την συνάρτηση setup()). Ø Χρησιμοποιώντας την εντολή lcd.begin(); στην συνάρτηση setup() ορίζουμε τις γραμμές και τις στήλες της οθόνης που χρησιμοποιούμε, π.χ. lcd.begin(αριθμός στηλών, αριθμός γραμμών), η οθόνη που χρησιμοποιείται ως παράδειγμα μέσα στην βιβλιοθήκη έχει 16 στήλες και 2 γραμμές. Ø Με την εντολή lcd.print(); στην συνάρτηση loop() μπορούμε να εκτυπώσουμε οποιοδήποτε μήνυμα στην οθόνη π.χ. lcd.print("hello, world!"); Ø Τέλος με την εντολή lcd.setcursor(); στην συνάρτηση loop() ορίζουμε την θέση του κέρσορα π.χ. lcd.setcursor(0, 1); θέτουμε τον κέρσορα στην πρώτη στήλη της οθόνης και στην δεύτερη γραμμή αφού η αρίθμηση ξεκινά από το μηδέν. Παράδειγμα χρήσης της βιβλιοθήκης για οθόνη «LCD» Παρακάτω παραθέτουμε ένα απλό παράδειγμα της χρήσης της βιβλιοθήκης της οθόνης LCD, ώστε να γίνει αντιληπτός ο τρόπος με τον οποίο δηλώνουμε της θύρες του Arduino και της οθόνης αλλά και οι συναρτήσεις της βιβλιοθήκης. Το ποτενσιόμετρο χρησιμοποιείται για την ρύθμιση της αντίθεσης των χαρακτήρων.

1- pin 2- pin 3 4 5 6 7 8 9 10 11 12 13 14! Εικόνα: Συνδεσμολογία της οθόνης LCD, Εικόνα: Σχηματικό διάγραμμα της οθόνης LCD #include <LiquidCrystal.h> // δήλωση της βιβλιοθήκης LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // δηλώνουµε τα PIN της οθόνης //(rs,enable,d4,d5,d6, d7) void setup(){ { lcd.begin(16, 2); // ορίζουµε τις στήλες και τις γραµµές της οθόνης lcd.print("hello,world!"); // εκτυπώνουµε το µήνυµα «hello,world» void loop(){ lcd.setcursor(0, 1); //θέτουµε τον κέρσορα στην επιθυµητή θέση (1 η στήλη, 2 η γραµµή lcd.print(millis()/1000); // εκτυπώνουµε τα δευτερόλεπτα από τηντελευταία επαναφορά Μηχατρονικά συστήματα ΙΙ Ο μικροελεγκτής «Arduino Uno» και τα εξωτερικά «Interrupt» Η υπολογιστική πλατφόρμα Arduino Uno χρησιμοποιεί μέχρι και δύο εξωτερικά interrupt, τα ΙΝΤ0 και ΙΝΤ1, τα οποία εκ κατασκευής είναι ορισμένα στις θύρες (PIN) 2 και 3 αντίστοιχα. Τo εξωτερικό interrupt είναι ένα σήμα που δέχεται ο μικροελεγκτής οποιαδήποτε χρονικά στιγμή, για ένα γεγονός το οποίο χρειάζεται άμεση προσοχή και όταν ένα interrupt ενεργοποιηθεί ο μικροελεγκτής σταματά οποιαδήποτε εργασία πράττει και εκτελεί την ρουτίνα του interrupt (interrupt service routine). Μετά την εκτέλεση της ρουτίνας του interrupt η εκτέλεση του προγράμματος συνεχίζει από την εντολή στην οποία προέκυψε η διακοπή. Τα interrupt είναι πολύ χρήσιμα καθώς μας επιτρέπουν να εκτελούμε μια συνάρτηση άμεσα και ταχύτατα. Για να χρησιμοποιήσουμε ένα εξωτερικό interrupt αρκεί να χρησιμοποιήσουμε την συνάρτηση π.χ. attachinterrupt στην οποία πρέπει να δηλώσουμε τον αριθμό του interrupt,την συνάρτηση του interrupt και τον τρόπο λειτουργίας του interrupt, δηλαδή attachinterrupt (interrupt, function_name, mode). Προφανώς στη θέση του interrupt επιλέγουμε ανάμεσα από το INT0 και INT1, η συνάρτηση του interrupt (interrupt service routine) καλείται κάθε φορά που ενεργοποιείται το interrupt, δεν χρειάζεται κάποια παράμετρο και δεν επιστρέφει τίποτα. Στη θέση του function_name γράφουμε το όνομα της συνάρτησης του interrupt, ενώ όσον αφορά τον τρόπο λειτουργίας (mode) του interrupt υπάρχουν τέσσερις επιλογές οι οποίες είναι:

Ø LOW : το interrupt ενεργοποιείται όταν στη θύρα (PIN) που είναι συνδεδεμένο το interrupt υπάρξει σήμα LOW. Ø CHANGE : το interrupt ενεργοποιείται όταν στη θύρα που είναι συνδεδεμένο το interrupt υπάρξει αλλαγή sτο σήμα οποιαδήποτε και αν είναι αυτή. Ø RISING : το interrupt ενεργοποιείται όταν έχουμε ανερχόμενο μέτωπο δηλαδή, όταν στη θύρα που είναι συνδεδεμένο το interrupt υπάρξει σήμα που μετατρέπεται από LOW σε HIGH. Ø FALLING: το interrupt ενεργοποιείται όταν έχουμε κατερχόμενο μέτωπο δηλαδή, όταν στη θύρα που είναι συνδεδεμένο το interrupt υπάρξει σήμα που μετατρέπεται από HIGH σε LOW. Τέλος, μέσα στη συνάρτηση του interrupt η συνάρτηση delay() δεν λειτουργεί, οι τιμές της εντολής millis() δεν αυξάνονται. Οι μεταβλητές που χρησιμοποιούνται μέσα και έξω από τη συνάρτηση του interrupt πρέπει να είναι μορφής volatile. Στον παρακάτω πίνακα παρουσιάζονται διάφορα μοντέλα μικροελεγκτών με τις αντίστοιχες ακίδες των interrupts. Παράδειγμα χρήσης των εξωτερικών Interrupt («Interrupt Service Routine») Η χρήση των εξωτερικών Interrupt («Interrupt Service Routine») γίνεται αντιληπτή με το παρακάτω παράδειγμα, με το οποίο το LED 13, που βρίσκεται πάνω στην υπολογιστική πλατφόρμα του Arduino, εναλλάσσεται η κατάσταση του («HIGH- LOW») κάθε φορά που ενεργοποιείται το Interrupt 0 (INT0). // Ακολουθούν η συνάρτηση αρχικών ρυθµίσεων του µικροελεγκτή int pin = 13; //δήλωση του LED volatile int state = LOW;//δήλωση της µεταβλητής state // Ακολουθεί η συνάρτηση αρχικών ρυθµίσεων του µικροελεγκτή void setup(){ pinmode(pin, OUTPUT); //δήλωση του LED ως έξοδο attachinterrupt(0, blink, CHANGE); //δήλωση της συνάρτησης του //interrupt (INT0) στο Pin2 // Ακολουθεί η κύρια ρουτίνα του προγράµµατος που εκτελείται συνεχώς void loop(){ digitalwrite(pin, state); //εγγραφή της κατάστασης του LED // Ακολουθεί η Ρουτίνα εξυπηρέτησης της διακοπής void blink() { state =!state; //αναστροφή της κατάστασης του LED

Παράδειγμα 3: Άναμμα και σβήσιμο Led ελεγχόμενο από εξωτερικό button με την διαδικασία Interrupt (Η διαφορά με την προηγούμενη περίπτωση είναι ότι πρίν η ενεργοποίηση γίνεται μετά το loop ενώ τώρα άμεσα με την ενεργοποίηση της διακοπής) const int LED = 13; // Ορίζουµε µία σταθερά τύπου Integer (Ακεραίου) µε όνοµα //LED και της δίνουµε την τιµή 13 µε σκοπό να την //χρησιµοποιήσουµε παρακάτω στον κώδικα και να δηλώσουµε που //θα συνδέσουµε το led. const int BUTTON = 9; // Ορίζουµε µία σταθερά τύπου Integer (Ακεραίου) µε όνοµα // BUTTON και της δίνουµε την τιµή 9 µε σκοπό να την // χρησιµοποιήσουµε παρακάτω στον κώδικα και να δηλώσουµε // που θα συνδέσουµε το button. // Ακολουθεί η συνάρτηση αρχικών ρυθµίσεων του µικροελεγκτή void setup () { pinmode (LED, OUTPUT); // Ορίζουµε χρησιµοποιώντας την µεταβλητή LED, // ότι το pin 13 θα λειτουργεί σαν ψηφιακή // έξοδος 0-5V pinmode (BUTTON, INPUT); digitalwrite (BUTTON, HIGH); //ενεργοποιώ την internal pull-up resistor attachinterrupt (0, // Ορίζουµε χρησιµοποιώντας την µεταβλητή // BUTTON, ότι το pin 9 // θα λειτουργεί σαν ψηφιακή είσοδος 0-5V ISRpinChange, CHANGE);// Ενεργοποίηση της ρουτίνας // που θα εξυπηρετεί την // διακοπή. Η πρώτη παράµετρος // µε τιµή 0 (0 => ΙΝΤ0=> pin 2)µας // ορίζει την πηγή της εξωτερικής //διακοπής (για τιµή 1=> ΙΝΤ1=> pin 3). //Η δεύτερη παράµετρος µε // τιµή ISRpinChange µας ορίζει το // όνοµα της ρουτίνα εξυπηρέτησης // της διακοπής ISR που δηµιουργήσαµε // παραπάνω. Η τρίτη παράµετρος µε // τιµές LOW, RISING, FALLING, CHANGE µας ορίζει το // είδος της αλλαγής λογικής στάθµης που ενεργοποιεί // την διακοπή. // Ακολουθείται η κύρια ρουτίνα του προγράµµατος που εκτελείται συνεχώς void loop () { // Δεν εκτελείται καµία εντολή αρά δεν γίνεται τίποτα και // περιµένουµε να συµβεί µία διακοπή // Ακολουθεί η Ρουτίνα εξυπηρέτησης της διακοπής // Interrupt Service Routine (ISR) // Ακολουθεί η δηµιουργία ρουτίνας εξυπηρέτησης διακοπής µε όνοµα pinchange (µπορεί να δηλωθεί µετά τις µεταβλητές και πριν την ρουτίνα αρχικών ρυθµίσεων του µικροελεγκτή ή και µετά την συνάρτηση void loop() όπως κάνουµε εδώ) void ISRpinChange(){ nointerrupts (); // Απενεργοποίηση των υπόλοιπων διακοπών µε σκοπό // να µην συµβεί κάποια άλλη διακοπή για όσο χρόνο // εξυπηρετείται η παρούσα διακοπή. Άν έχουµε µόνο // µία ISR τότε δεν απαιτείται να γράψουµε αυτήν την // εντολή. Επίσης µέσα στις ρουτίνες ISR δέν //επιτρέπεται η χρήση της συνάρτησης delay(). if (digitalread (BUTTON) == HIGH) // Διαβάζουµε την ψηφιακή τιµή // που έχει το Pin 9 (εκεί που // συνδέεται το button) και // ελέγχουµε αν το button είναι // πατηµένο, αν ναι τότε digitalwrite (LED, HIGH); // Βγάλε λογικό 1 (5V) στο pin 13, // δηλαδή άναψε το led else digitalwrite (LED, LOW);//Αλλιώς: Βγάλε λογικό 0

//(0V) στο pin 13, δηλαδή σβήσε το led interrupts (); // Ενεργοποίηση των διακοπών Στην συνέχεια θα παρουσιάσουμε τον κινητήρα που χρησιμοποιείται στο εμπορικά διαθέσιμο πακέτο της LEGO και θα χρησιμοποιήσουμε τον οπτικό κωδικοποιητή που διαθέτει ο κινητήρας προκειμένου με την βοήθεια των interrupts να υπολογίζουμε την γωνία της περιστροφικής άρθρωσης. Ας ξεκινήσουμε όμως βλέποντας από τι αποτελείται ο κινητήρας. Περιγραφή του κινητήρα «NXT» της Lego Ο κινητήρας NXT της Lego έχει ενσωματωμένο περιστροφικό κωδικοποιητή («rotary encoder») δύο καναλιών που αποτελείται από ένα στρεφόμενο δίσκο που είναι διαιρεμένος σε τομείς οι οποίοι είναι εναλλάξ διαφανείς και μη- διαφανείς. Στη μια πλευρά του δίσκου υπάρχει μια φωτεινή πηγή και στην άλλη ένα φωτοκύτταρο. Όταν ο δίσκος περιστρέφεται, κάθε μεταβολή του φωτός που προσπίπτει στο φωτοκύτταρο παράγει ένα παλμό εξόδου. Το πλήθος των παλμών αυτών ανά μονάδα χρόνου είναι ανάλογο προς τη γωνιακή ταχύτητα του άξονα και το ολικό πλήθος παλμών σε κάθε χρονική στιγμή είναι ανάλογο προς την ολική γωνιακή μετατόπιση του μετρούμενου άξονα. Ο κωδικοποιητής έχει δύο φωτοκύτταρα ανίχνευσης στον ίδιο δίσκο, τα οποία είναι τοποθετημένα κατά τέτοιο τρόπο, ώστε οι έξοδοι να έχουν διαφορά φάσης 90 η μία, σε σχέση με την άλλη. Η φορά περιστροφής προσδιορίζεται με τη βοήθεια κατάλληλου λογικού κυκλώματος, το οποίο δέχεται σαν εισόδους τις δυο ακολουθίες παλμών, όπως φαίνεται και στο παρακάτω σχήμα (Εικ.3.4.1). Εικόνα 3.4.1 Απεικόνιση των καναλιών (Α, Β) του περιστροφικού κωδικοποιητή του κινητήρα NXT Από την έξοδο του κινητήρα η σχέση μετάδοσης, δηλαδή ο λόγος των διαμέτρων συνεργαζόμενων γραναζιών εσωτερικά του κινητήρα μπορεί να βρεθεί με βάση την εικόνα (Εικ.3.3.2.3) και τον παρακάτω πίνακα ο οποίος περιγράφει την σχέση των γραναζιών. 10:30:40 = 1:4 9:27 = 1:3 10:20 = 1:2 10:13:20 = 1:2 Overall 1:48 Πίνακας 3.4.2

Εικόνα 3.4.3 Εσωτερική όψη του κινητήρα "NXT" Προκύπτει από τον παραπάνω πίνακα (Πίν.3.4.2) ότι η σχέση μετάδοσης είναι 1:48 δηλαδή για μια περιστροφή του άξονα «Λ» (hub) ο άξονας «Κ» πρέπει να κάνει 48 περιστροφές. Η σχέση μετάδοσης μεταξύ του γραναζιού στο οποίο βρίσκεται ο κωδικοποιητής (z=32) και του γραναζιού(z=10) που βρίσκεται πάνω στον άξονα «Κ» είναι 10:32, άρα για μία περιστροφή του άξονα «Λ»(hub) ο κωδικοποιητής κάνει 48*10:32=15 περιστροφές. Εικόνα 3.4.4 Αποσυναρμολογημένη όψη του κινητήρα NXT Ο κωδικοποιητής του NXT έχει 12 σχισμές, οπότε οι οπτικοί ανιχνευτές «βλέπουν» 12*15=180 παλμούς, χρησιμοποιώντας και τα δύο κανάλια του κωδικοποιητή έχουμε 360 παλμούς ανά περιστροφή και καθώς ο κωδικοποιητής του NXT είναι τετραπεριοδικής διεύθυνσης («quadrature encoder») το μέγιστο πλήθος παλμών που μπορεί να παράγει ο αποκωδικοποιητής είναι 720 παλμοί ανά περιστροφή. Χρησιμοποιώντας το γρανάζι των 8 δοντιών στην έξοδο του κινητήρα (άξονας «Λ»(hub)) του εκπαιδευτικού πακέτου Lego, και στον βραχίονα αυτό των 56 δοντιών, η μεταξύ τους σχέση μετάδοσης είναι η εξής: z1 8 1 i = = = = 0.14 z 2 56 7

όπου i η σχέση μετάδοσης των γραναζιών, z1 ο αριθμός δοντιών του κινητήριου τροχού και z2 ο αριθμός δοντιών του κινούμενου τροχού[14]. Εικόνα 3.4.5 Τα γρανάζια του εκπαιδευτικού πακέτου Lego Mindstorms ΝΧΤ Όπως και όλα τα υπόλοιπα μέρη του πακέτου Lego Mindstorms NXT, ο κινητήρας χρησιμοποιεί για την σύνδεση του το καλώδιο «RJ12», το οποίο είναι ένα διεθνές πρότυπο σύνδεσης σταθερών τηλεφώνων και άλλων παρόμοιων εφαρμογών. Έτσι για την σύνδεση του με την υπολογιστική πλατφόρμα Arduino Uno χρειάστηκε να αφαιρέσουμε την μια άκρη του καλωδίου ώστε να συνδέσουμε το κάθε καλώδιο στις θύρες (pin) του Arduino. Την ίδια διαδικασία ακολουθήσαμε σε όλα τα μέρη του πακέτου της Lego που χρησιμοποιούν το συγκεκριμένο καλώδιο(«rj12»). Παραθέτουμε παρακάτω τον πίνακα με τις πληροφορίες για το καλώδιο «RJ12». Επεξήγηση των ακροδεκτών του καλωδίου «RJ12»

Θύρες/Pin Ονομασία Χαρακτηριστικά καλωδίου Χρώμα καλωδίου Αρίθμηση Θυρών/Pin 1 ANALOG +9V Τροφοδοσία Άσπρο 2 GND Γείωση Μαύρο 3 GND Γείωση Κόκκινο 4 IPOWERA +5V Τροφοδοσία Πράσινο Εικόνα 3.4.6 Καλώδιο «RJ12» 5 DIGIAI0 Κανάλι Α οπτικού κωδικοποιητή Κίτρινο 6 DIGIAI1 Κανάλι Β οπτικού κωδικοποιητή Μπλε Όπως φαίνεται στη παραπάνω πίνακα η συνδεσμολογία για το καλώδιο «RJ12» είναι η εξής: Ø Το άσπρο καλώδιο(pin 1) είναι η τροφοδοσία (9V) Ø Το μαύρο καλώδιο(pin 2) η γείωση Ø Το κόκκινο καλώδιο(pin 3) η γείωση του αισθητηρίου(εάν υπάρχει) Ø Το πράσινο καλώδιο(pin 4) η τροφοδοσία (4.3V) του αισθητηρίου(εάν υπάρχει) Ø Το κίτρινο καλώδιο(pin 5) το κανάλι (Β) Ø Το μπλε καλώδιο(pin 6) το κανάλι (Α) Με το παρακάτω πρόγραμμα μπορούμε να διαβάσουμε τον encoder του κινητήρα και να τυπώσουμε στην σειριακή θύρα του υπολογιστή την γωνία περιστροφής του κινητήρα αξιοποιώντας τα ΙΝΤ0 και ΙΝΤ1 του μικροελεγκτή Arduino UNO. Για περισσότερες πληροφορίες μπορείτε να ανατρέξετε στην διεύθυνση: http://playground.arduino.cc/main/rotaryencoders#example3

#define encoder0pina 2 #define encoder0pinb 3 volatile unsigned int encoder0pos = 32768; unsigned int tmp = 0; //temporary position unsigned int Aold = 0; unsigned int Bnew = 0; volatile double angle = 0; // motor s angle void setup() { pinmode(encoder0pina, INPUT); pinmode(encoder0pinb, INPUT); attachinterrupt(0, doencodera, CHANGE); // encoder pin on interrupt 0 (pin 2) attachinterrupt(1, doencoderb, CHANGE); // encoder pin on interrupt 1 (pin 3) Serial.begin (115200); void loop(){//check each changes in position if (encoder0pos!= tmp) { angle = (360.0/720.0)*(encoder0Pos-32768); Serial.println(angle); Serial.print("\t"); Serial.println(encoder0Pos, DEC); tmp = encoder0pos; delay(10); void doencoderb(){// Interrupt on B changing state Bnew=digitalRead(encoder0PinB); Bnew^Aold? encoder0pos++:encoder0pos--; void doencodera(){ // Interrupt on A changing state Bnew^Aold? encoder0pos++ : encoder0pos--; //Ternary operator (condition? Evaluated_when_true : evaluated_when_false) Aold=digitalRead(encoder0PinA); για την καλύτερη κατανόηση του παραπάνω προγράμματος παραθέτουμε το παρα- κάτω σχήμα το οποίο αναπαριστά την κεντρική ιδέα του αλγορίθμου των interrupts. Aold% Aold% Bnew% Bnew%