Εργαστηριακή Άσκηση 7 : Ρύθμιση Έντασης Φωτεινότητας LED
Θεωρία: Συναρτήσεις analogRead(), analogWrite() και map()
analogRead()
Οι μικροελεγκτές Atmega που χρησιμοποιούνται στην πλατφόρμα Arduino περιέχουν έναν αναλογικό σε ψηφιακό (ADC) μετατροπέα 6 καναλιών που αντιστοιχούν στις αναλογικές εισόδους Α0 έως Α5. Ο μετατροπέας διαθέτει ανάλυση 10 bit, δηλαδή, όταν εφαρμόζεται μια αναλογική τάση σε κάποια από τις αναλογικές εισόδους του, την μετατρέπει σε έναν 10 bit δυαδικό αριθμό. Η εντολή analogRead(pin) επιστρέφει στο πρόγραμμα τον 10 bit δυαδικό αριθμό ως έναν ακέραιο δεκαδικό αριθμό από 0 έως 1023. Για να μπορούμε να επεξεργαστούμε αυτήν την τιμή θα πρέπει να την αποθηκεύσουμε σε κάποια ακέραια μεταβλητή που θα ορίσουμε για το σκοπό αυτό.
Η κύρια λειτουργία των αναλογικών ακίδων του Arduino είναι για τη σύνδεση αισθητήρων και την μετατροπή των σημάτων τους σε ψηφιακή μορφή. Οι αναλογικές ακίδες όμως, μπορούν να λειτουργήσουν και ως απλές ψηφιακές είσοδοι έξοδοι αν τις αρχικοποιήσουμε κατάλληλα.
Έστω ότι έχουμε συνδέσει μια αναλογική συσκευή (π.χ. ένα ποτενσιόμετρο), σε μια αναλογική ακίδα του arduino. Τα βήματα που ακολουθούμε συνήθως για τη χρήση της εντολής analogRead(pin) είναι τα εξής:
- Ορίζουμε μια μεταβλητή για την ακίδα που συνδέεται το ποτενσιόμετρο και μια για να αποθηκεύσουμε την τιμή της εισόδου.
int value;
int pot = A1;
- Ορίζουμε το pin που θα χρησιμοποιήσουμε ως αναλογική είσοδο στη ρουτίνα setup().
pinMode(pot, INPUT);
- Διαβάζουμε την τιμή της αναλογικής εισόδου και την αποθηκεύουμε στην μεταβλητή που έχουμε ορίσει.
value = analogRead(pot); /(η μεταβλητή value θα πάρει μια τιμή 0 έως 1023)
analogWrite()
Κάποια από τα 14 Pins του Arduino έχουν την ένδειξη PWM, δηλαδή μπορούν να προσομοιώσουν την αναλογική έξοδο μέσω διαμόρφωσης εύρους παλμών. Έτσι, με τιμές από το 0 μέχρι το 255 προσομοιώνουμε αναλογικές τάσεις στο διάστημα από 0 έως 5V. Αυτό γίνεται με χρήση της συνάρτησης analogWrite(pin, value), όπου το όρισμα Pin αναφέρεται στο νούμερο της θύρας για την οποία θα δώσουμε τάση εξόδου. Το όρισμα value μπορεί να πάρει τιμές από 0 που αντιστοιχεί σε τάση 0V έως 255 που αντιστοιχεί σε τάση 5V στην έξοδο (pin). Αναλογικά μπορούμε να δώσουμε όλες τις ενδιάμεσες τάσεις (π.χ. 127 για τάση 2,5V).
H συνάρτηση analogWrite(pin, value) γράφει την αναλογική τιμή value σε μια από τις PWM ακίδες (3, 5, 6, 9, 10, 11) του Arduino, με αποτέλεσμα στην ακίδα να δημιουργηθεί ένα σταθερό τετραγωνικό κύμα (PWM κύμα με συχνότητα 490Hz) του οποίου ο κύκλος λειτουργίας (duty cycle) εξαρτάται από την τιμή value (από 0 έως 255).

map()
Η συνάρτηση map() πραγματοποιεί γραμμικό μετασχηματισμό ορίων. Για παράδειγμα, αν η μεταβλητή value παίρνει τιμές στο πεδίο τιμών (0 – 1023) και θέλουμε οι τιμές της να κυμαίνονται μεταξύ των ορίων (0 – 255), τότε αυτό το επιτυγχάνουμε με τη βοήθεια της συνάρτησης map(value, 0, 1023, 0, 255).
Παράδειγμα
value = analogRead(pot);
value = map(value, 0, 1023, 0, 255);
Εφαρμογή: Ρύθμιση Έντασης Φωτεινότητας LED
1.Κατασκευή κυκλώματος ελέγχου φωτεινότητας led, το οποίο θα ρυθμίζει την φωτεινότητα ενός led ανάλογα με την τάση που υπάρχει στον δρομέα του ποτενσιόμετρου που συνδέεται στην αναλογική είσοδο Α0. Πραγματοποιήστε την συνδεσμολογία του παρακάτω σχήματος και γράψτε των κώδικα στο περιβάλλον εργασίας του Arduino IDE. Να αποθηκεύσετε το αρχείο του προγράμματος στο φάκελό σας με τίτλο fade_led.
- Να ορίσετε ακέραιες μεταβλητές potpin (για την είσοδο Α0 που συνδέεται το ποτενσιόμετρο) και led1pin (για την έξοδο 3 που συνδέεται το led).
- Να ορίσετε μια ακέραια μεταβλητή potvalue στην οποία θα αποθηκεύεται η τιμή της αναλογικής εισόδου Α0 (potpin) που είναι συνδεδεμένο το ποτενσιόμετρο.
- Να ορίσετε μια ακέραια μεταβλητή led1value στην οποία θα αποθηκεύεται η τιμή της μαθηματικής συνάρτησης map.
- Να προσθέσετε μια χρονοκαθυστέρηση 30 ms στο τέλος του προγράμματος.
Απαραίτητα υλικά:
- Ηλεκτρονικός Υπολογιστής με εγκατεστημένο το Arduino IDE
- Arduino Uno board και καλώδιο usb
- Breadboard
- dupont/jumper wires
- 2 led
- 2 αντιστάσεις 220Ω
- 1 ποτενσιόμετρο 10 ΚΩ


Προσομοίωση λειτουργίας του κυκλώματος
2.Να συνδέσετε στο κύκλωμα 2ο led στο pin 5, του οποίου η φωτεινότητα θα μεταβάλλεται αντίστροφα από το 1ο ανάλογα με την αντίσταση στη μεσαία λήψη του ποτενσιόμετρου. Να τροποποιήσετε κατάλληλα το πρόγραμμα και να ορίσετε τις κατάλληλες μεταβλητές led2pin και led2value.
