Διευκρίνηση για MAP & τις πόρτες Αnalog/Digital/PWM του Arduino UNO Το Board Arduino Uno, Διαθέτει 6 Αναλογικές Εισόδους pins (Α0,Α1,Α2,Α3,Α4,Α5) στις οποίες μπορούμε να συνδέσουμε μια τάση(ή σήμα) που θα κυμαίνεται από 0v εως 5v. *καποια αλλα μοντελα δέχονται εως 3.3v Λέγοντας αναλογική είσοδος, εννοούμε ότι μπορουμε να εισάγουμε π.χ. τιμές τάσης(σήμα) όχι μόνο 0v ή 5v, αλλα και οποιαδήποτε ενδιάμεση τιμή ανάμεσα στο 0volt και στο 5volt. *αν βάλω 5.6v ίσως καεί η πόρτα. Η ακρίβεια της τιμής του σήματος που μπορεί να διαβάστει στην αναλογική είσοδο, εξαρτάται από το ADC ( Analog to Digital Converter) του Arduino. Το ADC του Arduino Uno εχει δυνατότητα 10bit. *Τα Arduino Due,Zero,MKR έχουν 12bit Mπορεί να ξεχωρίσει στο σήμα που θα του δώσουμε 2^10= 1024 στάθμες 5v/1024=0.0048828125v. Αν του δώσουμε ένα σήμα 0-5v, θα το μετατρέψει (διαβάσει) σαν ένα ακέραιο αριθμό 0-1023. π.χ. τάση 0ν ακέραιος 0 τάση 0,0048828125ν ακέραιος 1 τάση 0,009765625ν ακέραιος 2 τάση 4,9951171875 ακέραιος 1022. τάση 5ν ακέραιος 1023 Για να διαβάσουμε τη τάση στην αναλογική πόρτα, χρησιμοποιούμε το metabliti=analogread(α0);
Το Arduino Uno, Διαθέτει 14 ψηφιακές Εισόδους / Εξόδους pins (0,1,2,3,4,5,6,7,8,9,10,11,12,13) Μπορούν να χρησιμοποιηθουν ειτε σαν εισοδοι, ειτε σαν εξοδοι. Η διαφορα αναλογικές με ψηφιακές πόρτες, είναι ότι: Οι ψηφιακές πόρτες (σαν εισόδοι), καταλαβαίνουν μονο 2 στάθμες σήματος. Θα ξεχωρίσουν στο σήμα που θα τους δώσουμε, μόνο αν είναι 0v ή 5v. Αν παω σε μια ψηφιακή είσοδο και του βάλω 0.5v ή 2v ή 1.5v αυτό θα καταλάβει ότι βάλαμε 0v (LOW). Ενώ αν του βάλω 3v ή μεγαλύτερη τάση, θα διαβάσει ότι του βάλαμε 5v (HIGH). *Τα Mega,Due έχουν 54 πόρτες *αν δώσω περισσότερο από 5.5v ίσως καταστραφεί η πόρτα του arduino. *Κάποια board (Due,Zero,MKR) δέχονται μέγιστο 3.3v, αλλιώς καταστρέφονται. *Αν βάλω κάποια ταση μεταξύ 1.5v 3v, θα έχουμε αμφίβολη κατάσταση Low/ High. *Αν μια είσοδος είναι ασύνδετη, γίνεται κεραία, και πιανει RF θόρυβο - αμφίβολο L/H. Για να διαβάσουμε τη τιμή της τάσης(low/high) που υπάρχει σε μια ψηφιακή πόρτα εισόδου πχ τη 4, χρησιμοποιούμε το metabliti=digitalread(4); *Πρέπει να έχουμε δηλώσει pinmode (4,INPUT); στο setup();
Οι ψηφιακές πόρτες σαν έξοδοι, δίνουν μονο 2 στάθμες σήματος 0v (LOW) ή 5v (HIGH) δηλαδή ανάλυση 1bit. Αν γράψουμε digitalwrite(9,high); το arduino θα στείλει στο ποδαράκι 9, μια τάση 5v (HIGH). ενώ γράφοντας digitalwrite(9,low); >> θα στείλει στο ποδαράκι 9, μια τάση 0v (LOW). *Πρέπει να έχουμε δηλώσει pinmode (9,OUTPUT); στο setup(); Στη περίπτωση που συνδέαμε ένα led στην ψηφιακή πόρτα 9(με αντίσταση πάντα) και τρέχαμε στη loop: digitalwrite(9,high); // θα αναβε το led στην πόρτα 9, delay (1000); // θα περιμενε 1sec, digitalwrite(9,low); //θα το έσβηνε το led στην πόρτα 9, delay (2000);, // και θα το κρατούσε σβηστό για 2sec. Αν τωρα οι χρόνοι delay γίνουνε πάρα πολύ μικροί, το LED, θα αναβοσβήνει τόσο γρήγορα, που δε θα μπορούμε να το αντιληφτούμε. Θα το καταλαβαίναμε όμως, σαν το led να άναβε με λιγότερη φωτεινότητα. Λογικό, αφού παίρνει λιγότερη ενέργεια από τους HIGH παλμούς(μικρότερο width του θετικού παλμού). Επειδή τεχνικά δε μπορούμε να εξάγουμε από τις ψηφιακές εξόδους, του arduino αναλογική τάση(τιμή μικρότερη από 5v) κάνουμε ένα τρικ. Το PWM( Pulse width Modulation) Το PWM ( Pulse width Modulation) επιτρέπεται μόνο στις πόρτες 3,5,6,9,10,11 με το σύμβολο ~
Όταν κάνουμε PWM σε μια ψηφιακή PWM έξοδο απλά στέλνουμε ένα σήμα περίπου 490-980Hz, ρυθμίζοντας τo λόγο HIGH/LOW (duty cycle). Δεν μας ενδιαφέρει, ούτε επεμβαίνουμε στη συχνότητα ή τη περίοδο του. π.χ δίνουμε: analogwrite(9,255); αν θέλουμε το led στην ψηφιακή έξοδο PWM 9 αναμμένο στο μέγιστο της φωτεινότητας. analogwrite(9,127); αν θέλουμε το led στην ψηφιακή έξοδο PWM 9 αναμμένο με μισή φωτεινότητα. *στέλνεται μια παλμοσειρά με διάρκεια παλμών 50% HIGH και 50% LOW analogwrite(9,0); αν θέλουμε το led στην ψηφιακή έξοδο P WM 9 σβηστό, (στέλνουμε ένα συνεχές LOW) ή στέλνουμε οποιαδήποτε τιμή 0-255 ανάλογα με τη φωτεινότητα που θέλουμε να έχει το led (ή ίσως οι στροφές κάποιου μοτέρ) Σημείωση! Το analogwrite(, ) δεν είναι εντολή για τις αναλογικές πόρτες ΕΙΣΟΔΟΥ(Α0-Α5) απλά γράφουμε «αναλογικό σήμα» μόνο στις ψηφιακές πόρτες 3,5,6,9,10,11 με το σύμβολο ~ ΜΑΡ Επειδή oι αναλογικές είσοδοι (Α0 εως Α5) έχουν ανάλυση 10 bit(0 έως 1023 άρα 1024 πιθανές τιμές), ενώ οι ψηφιακές έξοδοι PWM (3,5,6,9,10,11) έχουν ανάλυση 8bit (0 έως 255 άρα 256 πιθανές τιμές), ένας εύκολος τρόπος για να γίνει αντιστοίχιση του σήματος εισόδου στην έξοδο, είναι η εντολή map. συντάσσεται: nea_timi=map(arxiki_timi, fromlow, fromhigh, tolow, tohigh);
Π.χ. Val2 = map(val, 0, 1023, 0, 255); Αυτή η εντολή, παίρνει την ακέραια τιμή της μεταβλητής val(που κυμαίνεται από 0-1023) και την μετατρέπει σε μια ακέραια τιμή(0-255) που είναι μέσα στο εύρος τιμών που μπορεί να δεχτεί το analogwrite. π.x, πρακτικά, μπορούμε να διαβάσουμε ένα ποτενσιόμετρο σε μια αναλογική είσοδο, και να μεταβάλουμε τη φωτεινότητα σε ένα LED συνδεμένο σε μια ψηφιακή PWM έξοδο. Αν δε κάναμε αυτή την αντιστοίχηση και πηγαίναμε π.χ να γράψουμε απευθείας τις (0-1024) τιμές του val στην έξοδο analogwrite(9,val); τότε, μόλις η val γινότανε μεγαλύτερη από 255, έστω 256, θα έκανε rollover άρα θα ήταν σα να βάζαμε 0. Δηλαδή 256-512=0-255, κοκ. δηλαδή χωρίζεται το 0-1023 σε τέσσερεις περιόδους εύρους 255 η καθεμία οι οποιες επαναλαμβάνονται. Σημείωση: Πολλές φορές, μας εξυπηρετεί να δηλώσουμε το pinmode(11,input_pullup) αντί για το pinmode(11,input) στη setup(); Αυτό που πετυχαίνουμε, με αυτή την αλλαγή, είναι το arduino να πάει και να συνδέσει εσωτερικά(μέσα στο chip) μια αντίσταση 20KΩ στην πόρτα που του λέμε(π.χ στην 11) στο 5v. (Αντιστρέφουμε τη λειτουργιά της) Έτσι η πόρτα θα είναι μόνιμα σε ένα HIGH δυναμικό (5v),από μόνη της. Χωρίς να συνδέσουμε κάποιο καλώδιο. Άρα αν θέλουμε να εισάγουμε ένα σήμα στο arduino, και να το καταλάβει, θα πρέπει να είναι 0v(LOW). *αντι για INPUT_PULLUP θα μπορούσε να παρέμενε INPUT και να συνδεθεί εξωτερικά στο pin 11, μια αντίσταση 20ΚΩ στο +5v Αυτό μας χρησιμεύει καθώς αν χρησιμοποιήσουμε κάποια πόρτα σαν digital INPUT στο πρόγραμμα μας, και τύχει σε αυτή να μην έχει συνδεθεί κάποιο σήμα όπως π.χ. όταν έχουμε ένα καλώδιο στον αέρα, τότε αυτή η πόρτα θα δρα σαν μια μικρή κεραία, και οι τιμές που θα παίρνουμε είναι τυχαίες(ανάλογες του θορύβουπαράσιτα). Αν δηλωθεί INPUT_PULLUP θα είναι πιο αναίσθητο στο θόρυβο, και θα διεγείρεται με αρνητικές στάθμες (0v). * φτιάξτε ένα λογαριασμό στο www.tinkercad.com για την εξάσκηση σας! Μτπ192