Εφαρμογές αναλογικών / Ψηφιακών 1 ΕΙΣΑΓΩΓΗ Σε αυτήν την ενότητα θα δούμε μερικές ακόμα εφαρμογές ψηφιακών / αναλογικών εισόδων/ εξόδων που μπορούμε να φτιάξουμε με την βοήθεια του Arduino, χρησιμοποιώντας ό,τι έχουμε μάθει ως τώρα για την διαχείριση των ψηφιακών και αναλογικών pin του Arduino. 1.1 ΨΗΦΙΑΚΟ VS ΑΝΑΛΟΓΙΚΟ ΣΗΜΑ Η βασική διαφορά που υπάρχει ανάμεσα στα αναλογικά και στα ψηφιακά σήματα, είναι το είδος των τιμών που μπορεί να λάβει το πλάτος του σήματος. Στη περίπτωση των αναλογικών σημάτων, τα οποία αναπαρίστανται ως χρονικά μεταβαλλόμενες κυματομορφές, το πλάτος του σήματος σε κάθε χρονική στιγμή, μπορεί να πάρει οποιαδήποτε τιμή, ανάμεσα σε δυο ακραίες τιμές οι οποίες υπαγορεύουν το μέγιστο πλάτος του σήματος (π.χ. και ). Αντίθετα, στη περίπτωση των ψηφιακών σημάτων, το πλάτος του σήματος μπορεί να πάρει μόνο μερικές διακριτές τιμές. Στις περισσότερες περιπτώσεις το ψηφιακό σήμα μπορεί να έχει μόνο δύο τιμές τάσης, εκ των οποίων η μια τάση αναπαριστά το δυαδικό 0 () και η άλλη το δυαδικό 1(). Ψηφιακό σήμα οι τιμές που παίρνει είναι διακριτές (0 ή 1). Αναλογικό σήμα οι τιμές που παίρνει είναι συνεχόμενες (μεταξύ και ). 1.2 ΨΗΦΙΑΚΟΙ VS ΑΝΑΛΟΓΙΚΟΙ ΑΚΡΟΔΕΚΤΕΣ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ 1.2.1 Αναλογικά Pin: Ο μικροελεγκτής της Atmel που χρησιμοποιεί το Arduino περιέχει έναν ADC 6 καναλιών αναλογικού σήματος. Ο ADC διαθέτει ανάλυση 10 bit, επιστρέφοντας ακέραιες τιμές από 0 έως 1023. Ενώ η κύρια λειτουργία τους είναι να διαβάζουν αναλογικούς αισθητήρες, μπορούν να λειτουργήσουν και ως pin εισόδου/εξόδου γενικού σκοπού, όπως ακριβώς και οι ψηφιακές. Έτσι, εάν χρειαζόμαστε περισσότερες εισόδους ή εξόδους μπορούμε να χρησιμοποιήσουμε και τα αναλογικά pin. Τα αναλογικά pin μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο που χρησιμοποιούνται και τα ψηφιακά, χρησιμοποιώντας τα ψευδώνυμα A0 για την αναλογική είσοδο 0,κτλ. π.χ. πώς μπορούμε να ρυθμίσουμε ένα αναλογικό pin να λειτουργήσει ως έξοδος pinmode(a0,output); digitalwrite(a0,high); Τα αναλογικά pin έχουν επίσης εσωτερικές αντιστάσεις, οι οποίες λειτουργούν πανομοιότυπα με αυτές που υπάρχουν στα ψηφιακά pin. Και ενεργοποιούνται από την εντολή digitalwrite(α0,high), ενώ το pin είναι εισόδου. Να θυμάστε όμως ότι η χρήση των pullup αντιστάσεων επηρεάζει τις τιμές της analogread().η εντολή analogread δεν θα λειτουργήσει σωστά εάν το pin έχει ρυθμιστεί προηγουμένως ως έξοδος. Έτσι σε αυτή την περίπτωση θα πρέπει να επαναρθμιστεί πάλι σε είσοδο πριν χρησιμοποιηθεί το analoread. Επίσης, η μικρή καθυστέρηση ανάμεσα στην ανάγνωση ενός 1 P a g e
αναλογικού pin μπορεί να προκαλέσει θόρυβο στο αναλογικό σήμα. Έτσι είναι επιθυμητή η προσθήκη μιας μικρής καθυστέρησης ανάμεσα στις αναγνώσεις. 1.2.2 Ψηφιακά pin: Τα ψηφιακά pin είναι πιο απλά αφού έχουν μόνο δύο καταστάσεις, ON ή OFF. Σε όρους του Arduino HIGH ή LOW. Μπορούμε να τις χρησιμοποιήσουμε ως pin εισόδου και εξόδου με την χρήση της εντολής pinmode και την λειτουργία του pin, INPUT ή OUTPUT. Εάν δεν χρησιμοποιήσουμε την εντολή pinmode η προεπιλεγμένη λειτουργία είναι INPUT. 1.2.3 Μέθοδος PWM Η PWM είναι μια τεχνική για τον έλεγχο του αναλογικού σήματος, χρησιμοποιώντας την ψηφιακή έξοδο ενός μικροελεγκτή (εδώ: Arduino). Η ψηφιακή έξοδος χρησιμοποιείται για τη δημιουργία ενός τετραγωνικού παλμού, όπου το σήμα εναλλάσσεται μεταξύ των τιμών 0 (off) και 1 (on). Αυτό το on/off μοτίβο, μπορεί να προσομοιώσει πλήρως τις τάσεις μεταξύ (1-on) και (0-off), αλλάζοντας το τμήμα του χρόνου που το σήμα είναι ενεργό με το τμήμα του χρόνου που είναι ανενεργό. Η διάρκεια του χρόνου λέγεται πλάτος του παλμού. Για να πάρουμε διαφορετικές αναλογικές τιμές, αρκεί να αλλάξουμε το πλάτος του παλμού. Εάν επαναλάβουμε αυτό το μοτίβο αρκετά γρήγορα με τη χρήση ενός LED για παράδειγμα, το αποτέλεσμα θα είναι σαν το σήμα να έχει μια σταθερή τάση μεταξύ 0v-, η οποία ελέγχει τη φωτεινότητα του LED. Στα παρακάτω γραφήματα οι πράσινες γραμμές αντιπροσωπεύουν μια χρονική περίοδο. Αυτή η διάρκεια ή περίοδος είναι το αντίστροφο της συχνότητας του PWM. Με άλλα λόγια, αφού η συχνότητα του PWM του arduino είναι 500HZ, η περίοδος θα είναι ίση με 2ms η καθεμία. Με την κλήση της συνάρτησης analogwrite() προσδιορίζουμε το ποσοστό του κύκλου μηχανής που καθορίζει το πόσο μένει ενεργή η περίοδος του σήματος. 0% duty cycle analogwrite(0) 25% duty cycle analogwrite(64) 50% duty cycle analogwrite(127) 75% duty cycle analogwrite(191) 100% duty cycle analogwrite(255) 2 P a g e
Η analogwrite() λειτουργεί στη κλίμακα 0 έως 255, η οποία ελέγχει και το μήκος του παλμού. Έτσι ώστε η analogwrite(255) ζητά το 100% του κύκλου λειτουργίας (πάντα ενεργό),( δηλαδή έναν παλμό που η διάρκειά του είναι ίση με όλο τον χρόνο της περιόδου μέχρι τον επόμενο παλμό,) η analogwrite(191) ζητά το 75% του κύκλου λειτουργίας, η analogwrite(127) ζητά το 50% του κύκλου λειτουργίας, η analogwrite(64) ζητά το 25% του κύκλου λειτουργίας και η analogwrite(0) ζητά το 0% του κύκλου λειτουργίας (πάντα ανενεργό). 2 TILT SENSOR 2.1 ΕΙΣΑΓΩΓΗ Οι αισθητήρες κλίσης (tilt sensor) επιτρέπουν την ανίχνευση προσανατολισμού ή κλίσης. Είναι μικροί, φθηνοί, χαμηλής ισχύος και εύκολοι στη χρήση. Αν πραγματοποιηθούν σωστά δε φθείρονται. Η απλότητά τους, τους καθιστά δημοφιλείς για παιχνίδια, gadgets ή άλλες συσκευές. Μερικές φορές αναφέρονται και ως διακόπτες υδραργύρου, διακόπτες κλίσης ή αισθητήρες κλίσης μπίλιας. Συνήθως αποτελούνται από κάποιου είδους κοιλότητα με μια αγώγιμη μάζα στο εσωτερικό, όπως μια μπίλια ή μια σταγόνα υδραργύρου. Το ένα άκρο της κοιλότητας έχει δύο αγώγιμα στοιχεία (στύλοι). Όταν ο αισθητήρας είναι προσανατολισμένος, ώστε το άκρο αυτό να είναι προς τα κάτω, η μάζα κυλά πάνω στους πόλους και τους ενώνει ενεργώντας σαν κλειστός διακόπτης. Οι διακόπτες κλίσης κάποτε συνηθιζόταν να κατασκευάζονται αποκλειστικά από υδράργυρο αλλά πλέον είναι σπάνιο, αφού αναγνωρίστηκαν ως τοξικοί. Τα οφέλη του υδραργύρου ήταν ότι η μάζα υδραργύρου είναι αρκετά πυκνή, ώστε να μην αναπηδά. Έτσι ο διακόπτης είναι λιγότερο ευαίσθητος στους κραδασμούς. Από την άλλη και οι αισθητήρες που χρησιμοποιούν μπίλια αντί για υδράργυρο, είναι εύκολοι στην κατασκευή, δε θρυμματίζονται και δεν ενέχουν τον κίνδυνο μόλυνσης. 2.2 ΕΦΑΡΜΟΓΗ : ΕΝΕΡΓΟΠΟΙΗΣΗ LED ΜΕ ΤΗΝ ΧΡΗΣΗ TILT SENSOR 2.2.1 Περιγραφή Σε αυτή την εφαρμογή θα χρησιμοποιήσουμε έναν tilt sensor σαν διακόπτη, ο οποίος θα ανάβει και θα σβήνει ένα LED. Κουνώντας δηλαδή τον αισθητήρα μπορούμε να ανάψουμε ή να σβήσουμε ένα LED σα να έχουμε χρησιμοποιήσει στην ουσία ένα κουμπί ή έναν διακόπτη. 3 P a g e
2.2.2 Υλικά Arduino Board Tilt Sensor (x1) LED (x1) Αντίσταση 220Ω (x1) Αντίσταση 1kΩ (x1) 2.2.3 Κύκλωμα Θεωρητικό κύκλωμα Πρακτικό κύκλωμα Αρχικά τοποθετούμε το LED στη Breadboard, όπως έχουμε δει και σε προηγούμενες εφαρμογές. Έπειτα συνδέουμε το θετικό άκρο του με μια αντίσταση 220Ω, και μετά με τον ψηφιακό ακροδέκτη 13. Συνδέουμε τον αρνητικό πόλο του LED με την γείωση. Αφού συνδέσουμε το LED, τοποθετούμε το tilt sensor στην breadboard. Συνδέουμε το ένα άκρο με την τροφοδοσία (), ενώ το άλλο πρώτα το συνδέουμε με τον ψηφιακό ακροδέκτη 2 του Arduino, έπειτα τοποθετούμε μια αντίσταση 1kΩ και από το τέλος της αντίστασης συνδέουμε με την γείωση. 2.2.4 Κώδικας Εφαρμογής Αφού κατασκευάσουμε το κύκλωμα, θα περάσουμε στην υλοποίηση του κώδικα αυτής. Ο κώδικας που θα χρησιμοποιήσουμε είναι ίδιος με αυτόν που χρησιμοποιήσαμε και για την διαχείριση ενός κουμπιού. /* Ενεργοποίηση LED με τη χρήση Tilt Sensor Η εφαρμογή αυτή θα ανάψει και θα σβήσει ένα LED, ανάλογα με την θέση που είναι τοποθετημένος ο tilt sensor. Breadboard προς τα πάνω --> ενεργός, άρα το LED αναμμένο Breadboard προς τα κάτω --> ανενεργός, αρά το LED σβηστό */ //Δήλωση του ψηφιακού ακροδέκτη 2,που είναι συνδεδεμένος ο tilt sensor int tiltsensorpin=2; //Δήλωση του ψηφιακού ακροδέκτη 13,που είναι συνδεδεμένο το LED 4 P a g e
int ledpin=13; //Μεταβλητή που θα αποθηκευθεί η τιμή του tilt sensor int tiltsensorstate=0; void setup(){ //Αρχικοποίηση του pin 13 ως εξόδου pinmode(ledpin,output); //Αρχικοποίηση του pin 2 ως εισόδου pinmode(tiltsensorpin,input); void loop(){ //Ανάγνωση της τιμής του αισθητήρα από τον ακροδέκτη 2 tiltsensorstate=digitalread(tiltsensorpin); //Εάν ο αισθητήρας είναι ανοιχτός (tiltsensorstate=1), τότε ανάβει το LED if(tiltsensorstate == HIGH) digitalwrite(ledpin,high); //ανάβει το LED else digitalwrite(ledpin,low); //σβήνει το LED 3 ΠΟΤΕΝΣΙΟΜΕΤΡΟ 3.1 ΕΙΣΑΓΩΓΗ Όπως αναφέραμε σε προηγούμενη ενότητα, το ποτενσιόμετρο στην ουσία είναι μια μεταβλητή αντίσταση, η οποία ρυθμίζεται με την βοήθεια μιας «στρόφιγγας». Στην εφαρμογή που ακολουθεί θα ελέγξουμε την φωτεινότητα ενός RGB LED με την χρήση ποτενσιόμετρου. 3.2 ΕΦΑΡΜΟΓΗ: ΈΛΕΓΧΟΣ RGB LED ΜΕ ΤΗΝ ΧΡΗΣΗ ΠΟΤΕΝΣΙΟΜΕΤΡΟΥ 3.2.1 Περιγραφή Σε αυτή την εφαρμογή θα ελέγξουμε την φωτεινότητα δηλαδή το χρώμα ενός RGB LED με την βοήθεια ενός ποτενσιόμετρου. Έτσι θα προσπελάσουμε όλες τις τιμές μεταξύ των τιμών 0-255 ή αλλιώς των αποχρώσεων που μπορούμε να πάρουμε μέσα από αυτό το εύρος τιμών. Καθώς λοιπόν θα στρέφουμε τον άξονα του ποτενσιόμετρου, τα χρώματα θα αλλάζουν ανάλογα με την τιμή της μεταβλητής αντίστασης. 3.2.2 Υλικά Arduino Board RGB LED (x1) 220Ω αντίσταση (x3) Ποτενσιόμετρο (x1) 5 P a g e
3.2.3 Κύκλωμα Θεωρητικό κύκλωμα Πρακτικό κύκλωμα Για την υλοποίηση του κυκλώματος θα χρειαστούμε τρία καλώδια για να συνδέσουμε το ποτενσιόμετρο με το Arduino και άλλα τέσσερα για να συνδέσουμε το RGB LED. Ένα καλώδιο θα συνδεθεί σε έναν από τους δύο ακροδέκτες που βρίσκονται στα άκρα του ποτενσιόμετρου και μετά με τον ακροδέκτη GND του Arduino, ένα άλλο καλώδιο θα συνδεθεί με το άλλο άκρο του ποτενσιόμετρου και έπειτα με τα του Arduino και το επόμενο καλώδιο θα συνδεθεί με το κεντρικό ακροδέκτη του ποτενσιόμετρου και στην αναλογική είσοδο 0 του Arduino. Στη συνέχεια με τα καλώδια που έμεινα θα συνδέσουμε το RGB LED με το Arduino. Τοποθετούμε το LED στην breadboard και τις αντιστάσεις στους ακροδέκτες του LED που αντιπροσωπεύουν τα χρώματα (βλ. σχήμα) και μετά συνδέουμε στα ψηφιακά pin του Arduino που έχουν την ένδειξη PWM(~). Ο ακροδέκτης που μένει θα συνδεθεί στα του Arduino. Έτσι περιστρέφοντας τον άξονα του ποτενσιόμετρου, θα αλλάξει το ποσό της αντίστασης που υπάρχει εντός του ποτενσιόμετρου. Αυτό αλλάζει την τάση που περνάει μέσα από το ποτενσιόμετρο. Όταν ο άξονας είναι στραμμένος προς τα, τότε ο ακροδέκτης δίνει ενώ από την αναλογική είσοδο διαβάζουμε την τιμή 1023. Αντίστοιχα, αν ο άξονας είναι στραμμένος προς την γείωση ο ακροδέκτης δίνει ενώ στην αναλογική είσοδο διαβάζουμε την τιμή 0. Σε συνδυασμό όμως με το RGB LED θα καταφέρουμε να ρυθμίσουμε την φωτεινότητα του RGB LED, δηλαδή να αλλάξουμε τα χρώματά του. 3.2.4 Κώδικας εφαρμογής Αφού κατασκευάσουμε το κύκλωμα της εφαρμογής θα περάσουμε στην υλοποίηση του κώδικα αυτής. Θα ελέγξουμε τα χρώματα του RGB LED, χρησιμοποιώντας τρία κατώφλια (threashold), όσα και τα βασικά χρώματα του LED (κόκκινο, πράσινο, μπλε). Για να μπορέσουμε να συνδυάσουμε όμως το ποτενσιόμετρο (αναλογικό) με το LED (ψηφιακό PWM), θα πρέπει να συνδυάσουμε το αναλογικό (0-1023) με το ψευδο αναλογικό (PWM) σήμα (0-255). Αυτό θα γίνει με τη χρήση της συνάρτησης του 6 P a g e
Arduino map(). Με τη συνάρτηση map() θα προσαρμόσουμε το εύρος των τιμών της αναλογικής εισόδου (0-1023) σε αυτό της ψηφιακής εξόδου PWM (0-255). Η σύνταξη της map() είναι η εξής: Συνάρτηση ( Ορίσματα ) map (value, start1, end1, start2, end2) Παράδειγμα Τύπος μεταβλητής Μεταβλητή = Συνάρτηση (Ορίσματα) ; int value = map (potvalue,0,1023,0,255) ; /*Έλεγχος φωτεινότητας RGB LED με την χρήση ποτενσιόμετρου Σε αυτή την εφαρμογή θα ελέγξουμε την φωτεινότητα ενός RGB LED χρησιμοποιώντας ένα ποτενσιόμετρο για να την ρυθμίσουμε. */ //Είσοδος: Το ποτενσιόμετρο πρέπεινα ε λιναι συνδεδεμένο στα και την γείωση int potpin=a0; //Η έξοδος του ποτενσιόμετρου συνδέεται στον αναλογικό ακροδέκτη 0 int potvalue=0; //Μεταβλητή που θα αποθηκευθεί η τιμή της εισόδου από το ποτενσιόμετρο //Έξοδος: Το RGB LED θα είναι συνδεδεμένο στους ακροδέκτες PWM 9,10,11 //Η άνοδος του LED πρέπει να είναι συνδεδεμένη με τα του Arduino int redpin=9; int greenpin=10; int bluepin=11; //Μεταβλητές του προγράμματος //Μεταβλητές που θα αποθηκευτούν οι τιμές PWM που θα σταλούν στους ακροδέκτες του LED int redvalue=0; int greenvalue=0; int bluevalue=0; void setup(){ //Αρχικοποιούμε τα pin του LED ως εξόδους pinmode(redpin,output); pinmode(greenpin,output); pinmode(bluepin, OUTPUT); void loop(){ //Ανάγνωση της τιμής του ποτενσιόμετρου από την αναλογική είσοδο potvalue=analogread(potpin); //Τροποποίηση αναλογικού εύρους σε ψευδο - αναλογικό int range= map(potvalue,0,1023,0,255); if(potvalue < 341){//Lowest third of the potentiometer's range (0-340) //Red from full (255) to off(0) redvalue=255-range; 7 P a g e
//Green from off(0) to full(255) greenvalue=range; //Blue off bluevalue=0; else if(potvalue <682){//Middle third of the potentiometer's range (341-681) //Red off redvalue=0; //Green from full to off greenvalue=255-range; //Blue from off to full bluevalue=range; else{//upper third of the potentiometer's range (682-1023) //Red from off to full redvalue=range; //Green off greenvalue=0; //Blue from full to off bluevalue=255-range; //Write values to Led pins analogwrite(redpin,redvalue); analogwrite(greenpin,greenvalue); analogwrite(bluepin,bluevalue); 8 P a g e