You are on page 1of 6

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

Περιγραφή της Άσκησης

Ο σκοπός της πρώτης άσκησης είναι κυρίως η εξοικείωση με το περιβάλλον προγραμματισμού του
Arduino, γι αυτό και δεν είναι ιδιαίτερα σύνθετη.

Αρχικά, θα “φορτώσουμε” και θα εκτελέσουμε το πρόγραμμα “Blink” από τα έτοιμα παραδείγματα


που προσφέρει το Arduino. Εν συνεχεία, θα τροποποιήσουμε κατάλληλα το πρόγραμμα αλλά και το
κύκλωμα ώστε να λειτουργεί με μεταβλητή συχνότητα. Στο τέλος, θα κάνουμε μια πολύ μικρή
εισαγωγή πάνω στη σειριακή οθόνη του Arduino, τη σύνδεση περιφερειακών (ειδiκότερα, πλήκτρων
pushbuttons) αλλά και το PWM, στοιχείο που αργότερα θα χρησιμοποιήσουμε αρκετά.

Υλοποίηση στο Εργαστήριο

Το πρώτο βήμα είναι να “φορτώσουμε” το παράδειγμα “Blink”. Αυτό γίνεται μέσα από το περι-
βάλλον προγραμματισμού του Arduino, επιλέγοντας File → Examples → 01. Basics → Blink.

Να σημειωθεί πως, τόσο σε περιβάλλον Apple OS X,όσο και σε Microsoft Windows, οι επιλογές παραμένουν ίδιες.

Αυτό θα ανοίξει ένα νέο παράθυρο όπου θα έχει φορτωθεί ο κώδικας του παραδείγματος. Ας
εξετάσουμε τη λογική του, βήμα-προς-βήμα:

void setup()
{
pinMode(13, OUTPUT);
}

Μέσα στη συνάρτηση setup() καλούμε την pinMode(). Αυτή “ορίζει” για κάθε pin του Arduino εάν θα
χρησιμοποιηθεί ως είσοδος (INPUT) ή έξοδος (OUTPUT). Σε αυτή την περίπτωση θέλουμε να
χρησιμοποιήσουμε το pin 13 ως έξοδο.

Να υπενθυμίσουμε πως η συνάρτηση setup() καλείται και τρέχει μόνο μία φορά, τη στιγμή που θα
τροφοδοτηθεί η πλακέτα του Arduino με ρεύμα.

void loop()
{
digitalWrite(13, HIGH);
delay(1000);

digitalWrite(13, LOW);
delay(1000);
}

Μέσα στην loop(), η συνάρτηση digitalWrite() δίνει τιμή HIGH (δηλαδή τάση 5V) στο pin 13. Εν
συνεχεία, η συνάρτηση delay() “παγώνει” τον μικροελεγκτή του Arduino για 1000 χιλιοστά του
δευτερολέπτου. Καλείται ξανά η digitalWrite(), η οποία όμως αυτή τη φορά δίνει LOW (δηλαδή 0V)
στο pin 13. Τέλος, η delay(), προκαλεί ακόμα μία παύση του 1 δευτερολέπτου.

Η loop() θα συνεχίσει να εκτελείται επ’ αόριστον, έως ότου διακοπεί η τροφοδοσία του Arduino, ή
έως ότου πατηθεί το πλήκτρο “RESET”.

Το επόμενο βήμα, είναι να υλοποιήσουμε το


κύκλωμα της άσκησης στο breadboard. Το μόνο
που θα χρειαστούμε είναι μία δίοδος εκπομπής
φωτός (LED) και ένας αντιστάτης κατάλληλης τιμής
(100 με 330 Ohm).

Για τις ασκήσεις εξοικείωσης που θα πραγ-


ματοποιήσουμε στο εργαστήριο τα υλικά σας
παρέχονται ήδη στους πάγκους.

Όπως στο σχήμα, συνδέουμε το pin 13 με την


άνοδο του LED. Η κάθοδός του, θα συνδεθεί με τη
γείωση (GND) με την αντίσταση να παρεμβάλλεται.

Σε αυτό το σημείο, καλό θα ήταν να φωνάξετε


κάποιον από τους βοηθούς του εργαστηρίου να
ελέγξει το κύκλωμά σας για τυχόν λάθη, ΠΡΙΝ
συνδέσετε το Arduino με τον υπολογιστή.

Εφόσον δεν υπάρχει κανένα πρόβλημα, προχωράμε


στη σύνδεση του Arduino με τον υπολογιστή με το καλώδιο USB. Από το μενού του προγράμματος,
επιλέγουμε το μοντέλο του Arduino που κρατάμε στα χέρια μας. Στους περισσότερους πάγκους
είναι το Arduino UNO, ενώ σε κάποιο πάγκο μπορεί να υπάρχει το Arduino MEGA 2560.

Επόμενο βήμα είναι να επιλέξουμε τη σωστή θύρα στην οποία είναι συνδεδεμένο το Arduino. Αυτή
θα εμφανιστεί ως COM1, COM2, κλπ στο μενού Tools → Serial Port. Εάν επιλέξετε τη λάθος
θύρα, το πρόγραμμα δε θα μπορεί να “μιλήσει” με το Arduino, και συνεπώς, δε θα μπορεί να το
προγραμματίσει.

Έπειτα επιλέγουμε File → Upload στο κεντρικό παράθυρο, ή πατάμε Ctrl + U στο το πληκτρο-
λόγιο.

Εφόσον είναι όλα εντάξει, σε ελάχιστα δευτερόλεπτα το Arduino θα προγραμματιστεί και θα


μπορέσουμε να δούμε το LED να αναβοσβήνει κάθε 1 δευτερόλεπτο.

Εάν υπάρχει κάποιο πρόβλημα στον κώδικα ή στον προγραμματισμό του Arduino θα εμφανιστεί
ακριβώς κάτω από τον editor:

Για το δεύτερο κομμάτι της άσκησης θέλουμε να κάνουμε τη συχνότητα που αναβοσβήνει το LED
ρυθμιζόμενη.

Για το σκοπό αυτό, θα χρειαστούμε μία ρυθμιζόμενη αντίσταση (ποτενσιόμετρο) και τη δυνατότητα
του Arduino να “διαβάζει” αναλογικές τιμές.


Η σύνδεση του ποτενσιόμετρου
είναι λίγο πιο περίπλοκη, καθώς
απαιτεί τροφοδοσία (+5V), γείωση
(GND) και ένα τρίτο σημείο (wiper)
ώστε το Arduino να διαβάσει την
διαιρεμένη τάση.

Εννοείται πως ο τρόπος σύνδεσης


του LED δεν αλλάζει.

Υπενθυμίζουμε πως έως ότου να


εξοικειωθείτε με την πλατφόρμα,
καλό θα ήταν να ελεγχθεί το
κύκλωμά σας πριν τροφοδοτήσετε
το Arduino!

“Κάτω” από τις αναλογικές


εισόδους του Arduino, υπάρχει ένα
κύκλωμα που ονομάζεται ADC
(Analog-to-Digital Converter).

Αυτό αναλαμβάνει να “διαβάσει”


μία τάση από 0 έως 5 volt και να
την μετρατρέψει σε έναν αριθμό
αξιοποιήσιμο από τον χρήστη. Η ανάλυση του ADC διαφέρει από μοντέλο σε μοντέλο, αλλά για το
Arduino UNO, μας δίνει 1024 διαφορετικές τιμές. Είναι αυτονόητο πως αναλογικές τιμές μπορούν
να διαβάσουν μόνο τα pins “ANALOG IN” του Arduino και όχι τα απλά I/O pins.

Η συνάρτηση analogRead() παίρνει ως όρισμα την αναλογική είσοδο που θέλουμε να διαβάσουμε,
και επιστρέφει έναν ακέραιο με μια τιμή 0-1023. Συνεπώς, το πρόγραμμα του Arduino θα πρέπει να
τροποποιηθεί ως εξής:

int pot_value;

void setup()
{
pinMode(13, OUTPUT);
}

void loop()
{
pot_value = analogRead(A0);

digitalWrite(13, HIGH);
delay(pot_value);

digitalWrite(13, LOW);
delay(pot_value);
}

Πλέον η delay() δεν έχει ως όρισμα μια προκαθορισμένη τιμή όπως πριν αλλά την τιμή που έχει
επιστρέψει η analogRead(). Θα πρέπει γυρίζοντας το ποτενσιόμετρο να αλλάζει η συχνότητα που
αναβοσβήνει το LED.

Έπειτα, θα δοκιμάσουμε να εμφανίζουμε τις τιμές της μεταβλητής pot_value στη σειριακή οθόνη
(Serial Monitor) του Arduino.

Η σειριακή (bit-προς-bit) επι-κοινωνία,


το TWI και το I2C, λόγω της έκτασής
τους δε μπορούν να καλυφθούν
πλήρως μέσα από τον εργαστηριακό
οδηγό, οπότε αναγκαστικά θα
ασχοληθούμε μόνο με το πρακτικό
κομμάτι.

Για να μπορέσει να μιλήσει το Arduino


στο Serial Monitor (αλλά και με
οποιοδήποτε άλλο περιφερειακό επι-
κοινωνεί σειριακά μέσω UART), πρέπει
να ρυθμιστεί σωστά το baud rate. Αυτό
είναι ο αριθμός των συμβόλων ανά δευ-
τερόλεπτο, και πρέπει να είναι ίδιος και στα δύο “άκρα” τα οποία προσπαθούν να μιλήσουν.

Για την άσκηση, θα “ανοίξουμε” την σειριακή επικοινωνία με το Serial Monitor στα 9600 baud, ως
εξής:

void setup()
{
Serial.begin(9600);
// υπόλοιπος κώδικας
}

Μέσα στο loop μετά, κάθε φορά που θέλουμε να στείλουμε την τιμή που διαβάσαμε από το
ποτενσιόμετρο στο Serial Monitor, αρκεί η εντολή:

void loop() {
// υπόλοιπος κώδικας
Serial.println(pot_value);
}

Έτσι, σε κάθε επανάληψη του loop() θα εμφανίζεται η τιμή του pot_value στο Serial Monitor. Είναι
σαφές πως η συχνότητα εμφάνισης θα αλλάζει με το ποτενσιόμετρο, καθώς έτσι ρυθμίζουμε κάθε
πότε θα επαναλαμβάνεται το loop().

Έως τώρα έχουμε εξοικειωθεί αρκετά με τον προγραμματισμό του Arduino, οπότε μπορούμε να
μεταβούμε σε μία πιο σύνθετη έννοια, αυτή του PWM (pulse width modulation).

Η μεγαλύτερη μερίδα μικροελεγκτών και αναπτυξιακών πλατφορμών, δεν επιτρέπουν να


εγγράψουμε μία αναλογική τάση σε κάποια ψηφιακή έξοδο, πράγμα αυτονόητο, καθότι οι ψηφιακές
έξοδοι επιτρέπουν τάσεις μόνο 5V / 0V. Τη δυνατότητα αυτή “συμπληρώνει” η τεχνική PWM, μέσω
της οποίας μπορούμε να προσομοιώσουμε μία αναλογική έξοδο.

Αλλάζοντας γρήγορα την κατάσταση μίας ψηφιακής εξοδου (HIGH/LOW), η συνολική ενέργεια που
θα αντλήσει το φορτίο από το αναπτυξιακό μας θα είναι συνολικά μικρότερη, άρα θα δει μία
“προσομοιωμένη” αναλογική τάση.

Το Arduino υλοποιεί την τεχνική PWM στις ψηφιακές εξόδους με την ένδειξη “~”, οι οποίες στο
Arduino UNO είναι οι 3, 5, 6, 9, 10 και 11.

Στη γλώσσα Processing, διαχειριζόμαστε το PWM με τη συνάρτηση analogWrite(PIN, [0…255]).

Σημειώσεις για τα push-buttons

Τα push-buttons είναι πλήκτρα, που για όσο κρατιούνται πατημένα, κλείνουν κύκλωμα ανάμεσα σε
δύο (ή περισσότερες) επαφές τους. Τα χρησιμοποιούμε για να πάρουμε είσοδο από τον χρήστη του
συστήματος.

Το κάθε μοντέλο push-button μπορεί να συνδέει


διαφορετικούς ακροδέκτες του όταν το πατάμε, γι
αυτό καλό θα ήταν να αναζητούμε το datasheet
για όλα τα υλικά που χρησιμοποιύμε. Αυτά που
έχουμε στο εργαστήριο πάντως, όταν πατιούνται,
ενώνουν τους διαγώνιους ακροδέκτες τους. Η
συν-δεσμολογία τους, έχει ως εξής:

Η αντίσταση των 100Ω ανάμεσα στο ψηφιακό pin


είναι προεραιτική.

Για ανάγνωση της κατάστασης του push-button, χρησιμοποιούμε τη συνάρτηση digitalRead(), αφού
προηγουμένως έχουμε δηλώσει το pin που συνδέσαμε ως είσοδο στο setup() του κώδικά μας.

Προετοιμασία στο Σπίτι

Δημιουργήστε ένα πρόγραμμα σε Arduino, το οποίο θα “εγγράφει” σε μία PWM έξοδο την τιμή που
διαβάζει από ένα ποτενσιόμετρο. Στην PWM έξοδο θα είναι συνδεδεμένο ένα LED το οποίο θα
πρέπει να μεταβάλλει τη φωτεινότητά του.

Ένα πλήκτρο (push-button) θα απαγορεύει στο LED να ανάψει για όσο κρατιέται πατημένο.

Στη σειριακή οθόνη θέλουμε να εμφανίζεται η τιμή που εγγράφεται στην PWM έξοδο, αλλά και η
κατάσταση του πλήκτρου, ως εξής:

PWM speed: 55%.


Button: pressed.

You might also like