Εφαρμογές Σειριακής Επικοινωνίας Εισαγωγή Στο μάθημα αυτό θα μάθουμε πώς να χρησιμοποιούμε την βιβλιοθήκη serial για την επικοινωνία από την πλατφόρμα Arduino πίσω στον υπολογιστή μέσω της θύρας usb. Τι είναι μια βιβλιοθήκη; Μια βιβλιοθήκη είναι μια συλλογή από μεθόδους, οι οποίες συνδέονται μεταξύ τους. Η βιβλιοθήκη που θα χρησιμοποιήσουμε είναι η Serial, η οποία επιτρέπει στο Arduino να στέλνει δεδομένα πίσω στον υπολογιστή. Τι είναι η σειριακή επικοινωνία; Λέμε πώς τα δεδομένα μεταφέρονται σειριακά, όταν μεταφέρουμε τα δεδομένα κατά ένα bit τη φορά, το ένα μετά το άλλο. Η πληροφορία μεταφέρεται μπρος και πίσω μεταξύ του υπολογιστή και του Arduino, ουσιαστικά θέτοντας ένα ακροδέκτη ως HIGH ή LOW. Με την ίδια τεχνική που ανάψαμε το LED μπορούμε να στείλουμε και δεδομένα. Η μια πλευρά θέτει την κατάσταση του ακροδέκτη και η άλλη την διαβάζει. Μοιάζει λίγο με τα σήματα μορς, όπου χρησιμοποιούνται τελείες και παύλες για την αποστολή μηνυμάτων μέσω του τηλέγραφου. 1 P a g e
Κάτι γνωστό: Έχουμε ήδη χρησιμοποιήσει την σειριακή επικοινωνία λίγο πολύ, γιατί αυτό είναι ο τρόπος για να στέλνουμε τα προγράμματά μας στο Arduino. Όταν κάνουμε αποσφαλμάτωση του προγράμματος αυτό που συμβαίνει στη πραγματικότητα είναι πως ο μεταγλωττιστής μετατρέπει το πρόγραμμα σε δυαδική μορφή (binary). Όταν φορτώνετε το πρόγραμμα στο Arduino, τα bits προωθούνται κατά ένα τη φορά μέσω του καλωδίου USB στο Arduino, όπου αποθηκεύονται στη μνήμη του μικροελεγκτή. Την επόμενη φορά που θα φορτώσετε ένα πρόγραμμα, παρατηρήστε προσεκτικά τα δύο LED της ψηφιακής επικοινωνίας (TX/RX), τα οποία θα αναβοσβήνουν όταν μεταδίδεται η πληροφορία. Το ένα αναβοσβήνει όταν το Arduino λαμβάνει πληροφορία (RX) ενώ το άλλο όταν στέλνει πληροφορία (TX). Η πρώτη εφαρμογή σειριακής επικοινωνίας /* Hello World Η εφαρμογή εμφανίζει μια φορά το μήνυμα hello world στο serial monitor. //τυπώνουμε το μήνυμα hello world στο serial monitor Serial.println( Hello World! ); void loop(){ Η πρώτη γραμμή του κώδικα μέσα στην συνάρτηση setup είναι : Αυτή η γραμμή είναι η διαδικασία κλήσης της βιβλιοθήκης και της διαδικασίας που θέλουμε να χρησιμοποιήσουμε. Εδώ χρησιμοποιούμε την μέθοδο begin γιατί θέλουμε να ενεργοποιήσουμε την σειριακή επικοινωνία. Όνομα βιβλιοθήκης. Όνομα μεθόδου (ορίσματα) ; Serial. begin (9600) ; Αν δεν υπάρχει το όνομα της βιβλιοθήκης, αυτό σημαίνει ότι η μέθοδος (διαδικασία) είναι στη προεπιλεγμένη (default) συλλογή διαδικασιών (μεθόδων) που χρησιμοποιούμε. Για παράδειγμα η delay(), χρησιμοποιείται τόσο συχνά που οι σχεδιαστές λογισμικού του Arduino δεν την τοποθέτησαν σε κάποια βιβλιοθήκη. Το όρισμα 9600 της begin αφορά το ρυθμό μεταφοράς δεδομένων από και προς το Arduino. Δηλαδή με την εντολή Serial.begin(9600) ρυθμίζουμε την ταχύτητα μεταφοράς των δεδομένων στα 9600 bps. Η επόμενη γραμμή κώδικα Serial.println( Hello World! ); 2 P a g e
Χρησιμοποιεί την βιβλιοθήκη Serial σε συνδυασμό με την μέθοδο println (print line) για να εμφανίσει το μήνυμα στη σειριακή οθόνη. Με τα διπλά εισαγωγικά καθορίζουμε την αρχή και το τέλος του κειμένου. Εφαρμογή Ας δούμε τώρα πως μπορούμε να συνδυάσουμε την εφαρμογή ελέγχου του LED (Blink) με το παραπάνω πρόγραμμα. Στην εφαρμογή που θα προκύψει θα ανάβουμε και θα σβήνουμε το LED μέσα από το Serial Monitor και θα εμφανίζουμε και το αντίστοιχο μήνυμα σε κάθε περίπτωση. /* Blink with Serial Η εφαρμογή ανάβει και σβήνει ένα LED, εμφανίζοντας το αντίστοιχο μήνυμα μέσα από το serial monitor. //δηλώνουμε τον ακροδέκτη που είναι συνδεδεμένο το LED int led=13; //αρχικοποιούμε τον ακροδέκτη που είναι συνδεδεμένο το LED (έξοδος) pinmode(led,output); void loop(){ //ελέγχουμε την ροή των δεδομένων if(serial.available()>0){ /*διαβάζουμε δεδομένα από το serial monitor (εισαγωγή δεδομένων από το πληκτρολόγιο στο Serial monitor και αποστολή στο arduino) int incomingbyte=serial.read(); /*Εάν ο χαρακτήρας που θα σταλεί από το serial monitor στο Arduino είναι 1, τότε θα ανάψει το LED και στην σειριακή οθόνη θα εμφανιστεί το μήνυμα «LED is ON» if(incomingbyte== 1 ){ Serial.println( LED is ON. ); // εμφάνιση μηνύματος στην σειριακή οθόνη digitalwrite(led,high); //ανάβει το LED else{ //αλλιώς Serial.println( LED is OFF. ); // εμφάνιση μηνύματος στην σειριακή οθόνη digitalwrite(led,low); //ανάβει το LED 3 P a g e
Εφαρμογή σειριακής επικοινωνίας με χρήση κουμπιού Η εφαρμογή αυτή σας δείχνει πώς να εμφανίσετε την κατάσταση ενός διακόπτη στην σειριακή οθόνη, χρησιμοποιώντας την σειριακή επικοινωνία μεταξύ του Arduino και του υπολογιστή μέσω της θύρας USB. Συγκεκριμένα, θα διαβάσουμε την κατάσταση του διακόπτη (1 ή 0) μέσα από το serial monitor του Arduino IDE. Για την υλοποίηση της εφαρμογής θα χρειαστούν τα εξής υλικά: Βήμα 1: Arduino board Καλώδιο σύνδεσης usb Καλώδια σύνδεσης Αντιστάσεις 10k (x1) Διακόπτης ή κουμπί (x1) breadboard Υλοποιούμε το κύκλωμα στην breadboard. Θεωρητικό κύκλωμα Πρακτικό κύκλωμα Για να κατασκευάσουμε το κύκλωμα θα χρειαστούμε τρία καλώδια. Το πρώτο καλώδιο θα το συνδέσουμε από την μια άκρη του κουμπιού στον ψηφιακό ακροδέκτη 2 του arduino. Έπειτα, στην ίδια άκρη αλλά από την απέναντι πλευρά συνδέουμε την αντίσταση, και από το τέλος αυτής ένα καλώδιο στη γείωση του arduino. Το τρίτο καλώδιο θα συνδεθεί με την άλλη άκρη του κουμπιού και έπειτα με τα 5v στο arduino. pushbutton Οι διακόπτες και τα κουμπιά συνδέουν δύο σημεία σ ένα κύκλωμα όταν πατηθούν. Όταν το κουμπί είναι ανοιχτό (μη πιεσμένο) δεν υπάρχει σύνδεση μεταξύ των δύο άκρων του κουμπιού. Έτσι ο ακροδέκτης είναι συνδεδεμένος στη γείωση (μέσω αντίστασης) και διαβάζεται ως LOW ή 0. Όταν το κουμπί είναι κλειστό (πατημένο), δημιουργεί μια σύνδεση μεταξύ των δύο άκρων, συνδέοντας το pin2 με τα 5V, που έχει ως αποτέλεσμα να διαβάζει την τιμή HIGH ή 1. Εάν αποσυνδέσετε τον ακροδέκτη εισόδου/εξόδου, τα led θα αναβοσβήνουν με αστάθεια. Αυτό γιατί η είσοδος «επιπλέει», γιατί δεν υπάρχει σταθερή σύνδεση με την πηγή ή τη γείωση οπότε επιστρέφει τυχαία HIGH ή LOW. Γι αυτό χρειάζεται και η αντίσταση στο κύκλωμα. 4 P a g e
Βήμα 2: Αφού κατασκευάσουμε το κύκλωμα, θα γράψουμε το κώδικα της εφαρμογής. Το πρώτο πράγμα που πρέπει να γίνει για να ξεκινήσει η σειριακή επικοινωνία, στα 9600 bits δεδομένων ανά δευτερόλεπτο (baudrate), ανάμεσα στο Arduino και τον υπολογιστή με την εντολή: Έπειτα, αρχικοποιούμε τον ψηφιακό ακροδέκτη 2, που είναι ο ακροδέκτης που θα διαβάσει την έξοδο από το κουμπί, ως είσοδο: pinmode(2,input); Αφού ολοκληρώσουμε την setup θα περάσουμε στη loop. Όταν το κουμπί είναι πατημένο, 5V θα περάσουν μέσα από το κύκλωμα και όταν δεν είναι πατημένο ο ακροδέκτης εισόδου θα συνδεθεί με τη γείωση μέσω της αντίστασης. Αυτή είναι μια ψηφιακή είσοδος, που σημαίνει πως ο διακόπτης μπορεί να βρίσκετε είτε σε κατάσταση on (1) είτε σε κατάσταση off (0). Το πρώτο πράγμα που θα πρέπει να γίνει στη loop είναι να θέσουμε μια μεταβλητή που θα κρατάει τη πληροφορία που έρχεται από το διακόπτη. Η πληροφορία αυτή είναι είτε 1 είτε 0, οπότε μπορούμε να χρησιμοποιήσουμε τύπο δεδομένων int. int sensorvalue=digitalread(2); Αφού το Arduino διαβάσει την είσοδο, τυπώνουμε τη πληροφορία πίσω στον υπολογιστή ως δεκαδική τιμή. Serial.println(sensorValue); Τώρα, ανοίγοντας το serial monitor από τον Arduino ide, μπορούμε να δούμε την κατάσταση του κουμπιού. //Δηλώνουμε την ψηφιακή είσοδο που έχουμε συνδέσει το κουμπί int pushbutton=2; //αρχικοποιούμε τον ακροδέκτη που έχουμε συνδέσει με το κουμπί ως είσοδο pinmode(pushbutton,input); void loop(){ //διαβάζουμε την κατάσταση του κουμπιού int buttonstate=digitalread(pushbutton); //τυπώνουμε (εμφανίζουμε) στο serial monitor την κατάσταση του κουμπιού Serial.println(buttonState); //περιμένουμε μεταξύ των αναγνώσεων για σταθερότητα delay(1); 5 P a g e
Ας δούμε τώρα πως μπορούμε να συνδυάσουμε την εφαρμογή ελέγχου του LED (Blink) με το παραπάνω πρόγραμμα. Με την εφαρμογή αυτή θα ανάψουμε και θα σβήσουμε το LED με την χρήση ενός κουμπιού. //δηλώνουμε την ψηφιακή είσοδο που έχουμε συνδέσει το κουμπί int pushbutton=2; //δηλώνουμε τον ακροδέκτη που είναι συνδεδεμένο το LED int led=13; //αρχικοποιούμε τον ακροδέκτη που έχουμε συνδέσει με το κουμπί ως είσοδο pinmode(pushbutton,input); void loop(){ //διαβάζουμε την κατάσταση του κουμπιού int buttonstate=digitalread(pushbutton); if(buttonstate == 1 ){ Serial.println( LED is ON. ); // εμφάνιση μηνύματος στην σειριακή οθόνη digitalwrite(led,high); //ανάβει το LED else{ //αλλιώς Serial.println( LED is OFF. ); // εμφάνιση μηνύματος στην σειριακή οθόνη digitalwrite(led,low); //ανάβει το LED 6 P a g e