Ψηφιακή είσοδος και εξοδος

Ένας τρόπος υλοποίησης ενός ηλεκτρονικού κυκλώματος, είναι με τη χρήση του breadboard. Το breadboard είναι μια πλαστική βάση, με κατακόρυφα συνδεμένες υποδοχές. Τα breadboard παράγονται σε διάφορα μεγέθη, σχήματα και χρώματα, όπως φαίνονται στο σχήμα

Σε ένα breadboard οι κάθετες στήλες στο κεντρικό διάκενο συνδέονται μεταξύ τους, ενώ οι δυο οριζόντιες σειρες στα άκρα του breadboard συνδέονται μεταξύ τους

Παράδειγμα: Σε αυτή την εργασία θα επιδείξουμε κυματοειδές αναβόσβημα LEDs σε εν σειρά σύνδεση με αντιστάσεις για την δημιουργία εφέ. Θα χρησιμοποιήσουμε πέντε LEDs για να προσομοιώσουμε το εφέ που υπάρχει στο μπροστινό μέρος του αυτοκινήτου της δημοφιλής TV σειράς knight rider.

Το  φυσικό διάγραμμα του κυκλώματος, όπως φαίνεται στην επόμενη εικόνα:

Ο κώδικας: Εισήγαγε τον ακόλουθο κώδικα στο IDE

// Project 1 – creating a Blinking LED wave
void setup(){
   pinMode(2, OUTPUT);  // LED 1 control pinisset up as an    output
   pinMode(3, OUTPUT);     // same for LED 2 to LED 5
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
}
void loop()
{
   digitalWrite(2, HIGH);   // Turn LED 1 on
   delay(500);                      // wait half a second
   digitalWrite(2, LOW);      // Turn LED 1 off
   digitalWrite(3, HIGH);     // and repeat for LED 2 to 5
   delay(500);
   digitalWrite(3, LOW);
   digitalWrite(4, HIGH);
   delay(500);
   digitalWrite(4, LOW);
   digitalWrite(5, HIGH);
   delay(500);
   digitalWrite(5, LOW);
   digitalWrite(6, HIGH);
   delay(500);
   digitalWrite(6, LOW);
   digitalWrite(5, HIGH);
   delay(500);
   digitalWrite(5, LOW);
   digitalWrite(4, HIGH);
   delay(500);
   digitalWrite(4, LOW);
   digitalWrite(3, HIGH);
   delay(500);
   digitalWrite(3, LOW);
// the loop will now loop around and start from the top again
}

Για να στείλουμε τάση σε ένα ψηφιακό πίν π.χ. το πιν 2, πρέπει πρώτα να το δηλώσουμε σαν OUTPUT με την ακόλουθη εντολή:

pinMode(2, OUTPUT);

Στην συνάρτηση void setup(), με την εντολή αυτή, τα ψηφιακά Ι/Ο πινς τίθενται σαν έξοδοι, διότι θέλουμε αυτά να στέλνουν ρεύμα στα επιθυμητά LEDs.

Ορίζουμε πότε ένα LED ανάψει ή σβήσει χρησιμοποιώντας την συνάρτηση digitalWrite() μέσα στην συνάρτηση void loop() του κώδικα.

digitalWrite(2, LOW);  // turn the pin 2 as 0V   
digitalWrite(3, HIGH); // turn the pin 3 as 5V   

 Για παράδειγμα όταν χρησιμοποιούμε την συνάρτηση (εντολή) digitalWrite(2, HIGH), μια τάση 5V προκαλεί τη ροή του ρεύματος από το ψηφιακό πιν 2 και δια μέσου από  του LED στην αντίσταση περιορισμού ρεύματος στη γείωση (GND) του Arduino και έτσι το αντίστοιχο LED ανάβει. Όταν χρησιμοποιήσουμε την συνάρτηση digitalWrite(3, LOW) η  έξοδος του πιν 3 γίνεται 0V και έτσι η ροή του ρεύματος σταματά και το LED σβήνει.

Για να δούμε πως δουλεύει ο κώδικας, σύνδεσε το Arduino board (εδώ χρησιμοποιούμε το Arduino Uno)  με το PC και στο Arduino IDE επέλεξε την σειριακή πόρτα στην οποία είναι συνδεμένο το Arduino, καθώς επίσης επέλεξε το board του Arduino που χρησιμοποιείς. Ανέβασε τον κώδικα στο IDE και τρέξε τον. Αν δεν υπάρχουν λάθη, μετά από ένα ή δύο δευτερόλεπτα τα LEDs θα ανάβουν και θα σβήνουν από αριστερά προς δεξιά και ξανά πίσω.

Χρησιμοποιώντας μεταβλητές: Στα προγράμματα ηλεκτρονικών υπολογιστών χρησιμοποιούμε μεταβλητές για την αποθήκευση δεδομένων. Για παράδειγμα στον κώδικα του προηγούμενου προγράμματος χρησιμοποιούμε τη συνάρτηση delay(500); για να κρατήσουμε τα LEDs αναμμένα για ορισμένο χρονικό διάστημα. Το πρόβλημα με αυτόν τον κώδικα είναι ότι δεν είναι ευέλικτος. Εάν θέλουμε να κάνουμε μια αλλαγή στο χρόνο καθυστέρησης, θα πρέπει να αλλάξουμε την χρονική καθυστέρηση σε κάθε συνάρτηση χειροκίνητα. Για να διευθετήσουμε αυτό το πρόβλημα, θα δημιουργήσουμε μια μεταβλητή που θα αντιπροσωπεύει την τιμή για την delay() συνάρτηση.

Εισήγαγε την επόμενη γραμμή στον προηγούμενο κώδικα, πριν την συνάρτηση void setup() και μόλις μετά το αρχικό σχόλιο.

int d = 250;

Αυτή η έκφραση (εντολή) εκχωρεί τον αριθμό 250 στην μεταβλητή που ονομάζεται d. Τώρα αντικατάστησε την τιμή 500 σε κάθε συνάρτηση καθυστέρησης delay() με τη μεταβλητή d. Όταν ανεβάσεις τον κώδικα μετά που θα κάνεις αυτές τις αλλαγές, τα LEDs θα αναβοσβήνουν με μεγαλύτερο ρυθμό. Αν θέλεις να αλλάξεις τον ρυθμό που αναβοσβήνουν τα LEDs αρκεί μα αλλάξεις την τιμή της μεταβλητής d στην κατάλληλη τιμή.

Η λέξη int ορίζει ότι η μεταβλητή περιέχει ένα ακέραιο (ένα ακέραιο αριθμό μεταξύ -32,768 και 32,767). Δηλαδή κάθε ακέραια τιμή εξ ορισμού δεν έχει δεκαδικό μέρος. Τώρα για να αλλάξεις την τιμή της καθυστέρησης απλά άλλαξε την τιμή εκχώρησης της μεταβλητής στην αρχή του κώδικα μας. Για παράδειγμα η εισαγωγή όπως

int d=100;

ορίζει καθυστέρηση 0,1 δευτερόλεπτα σε όλες τις συναρτήσεις καθυστέρησης delay(d); Πειραματίσου με αυτό τον κώδικα για διάφορες τιμές καθυστέρησης με την εντολή delay(d), Επίσης και με την σειρά των σταθερών HIGH και A LOW.

Ο βρόγχος επανάληψης for: Όταν γράφεις κώδικα, πολλές φορές βλέπεις οτι επαναλαμβάνεις το ίδιο τμήμα κώδικα. Θα μπορούσες απλά να αντιγράψεις και να εναποθέσεις την συνάρτηση αντί να την γράψεις χειροκίνητα, αλλά αυτό δεν είναι αποδοτικό και σπαταλάει την μνήμη του Arduino. Αντί για αυτό μπορείς να χρησιμοποιήσεις for βρόγχους. Το όφελος της χρήσης του βρόγχου for είναι ότι μπορείς να ορίσεις πόσες φορές ο κώδικας μέσα στον βρόγχο θα επαναληφθεί.

Για να δεις πώς ένας βρόγχος for λειτουργεί, εισήγαγε και τρέξε τον ακόλουθο κώδικα:

// Project 2 – Repeating with for loops
int d=100;
void setup()
{
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
}
void loop()
{
    for(int a=2; a<7; a++)
    {
         digitalWrite(a, HIGH);
         delay(d);
         digitalWrite(a, LOW);
         delay(d);
    }
}

Η εντολή for επαναλαμβάνει τον κώδικα που βρίσκεται μέσα στις αγκύλες που ενσωματώνονται στον βρόγχο και εφόσον η συνθήκη μέσα στην παρένθεση είναι αληθής. Εδώ έχουμε χρησιμοποιήσει μια καινούργια ακέραια μεταβλητή, που αρχίζει με την τιμή 2. Κάθε φορά που ο κώδικας μέσα στον βρόγχο εκτελείται, η έκφραση a++ προσθέτει τον αριθμό 1 στην τιμή της μεταβλητής a. Ο βρόγχος επαναλαμβάνεται με τον ίδιο τρόπο όσο η τιμή της μεταβλητής α είναι μικρότερη από τον αριθμό 7. Μόλις η τιμή της a γίνει μεγαλύτερη ή ίση από 7, το Arduino ξεπερνά τον βρόγχο και συνεχίζει με τις εντολές που ακολουθούν τον βρόγχο for.

Παράδειγμα:  Σε αυτή την εργασία έχουμε ένα διακόπτη, ο οποίος ανάβει ένα LED για μισό δευτερόλεπτο όταν πατηθεί.

Το σχηματικό κύκλωμα: Πρώτα σχηματίζουμε το κύκλωμα πάνω στο breadboard όπως στο σχηματικό της παρακάτω εικόνας. Δώσε προσοχή στο πως η αντίσταση 10kΩ συνδέεται μεταξύ GND και στο ψηφιακό πιν 7. Ονομάζουμε αυτή την αντίσταση pull-down γιατί “τραβά” την τάση του ψηφιακού πιν σχεδόν στο μηδέν. Περεταίρω, με την τοποθέτηση ενός πυκνωτή 100nF παράλληλα στην αντίσταση 10kΩ δημιουργούμε ένα κύκλωμα απαλλαγμένο από αναπηδήσεις.

Όταν ο διακόπτης πιέζεται το ψηφιακό πιν τίθεται αμέσως σε δυναμικό HIGH. Αλλά όταν ο διακόπτης απελευθερώνεται, το ψηφιακό πιν 7, “τραβιέται κάτω στο GND δια μέσου της αντίστασης 10kΩ και μαζί με τον εκτυπωτή 100nF δημιουργούν μια πολύ μικρή καθυστέρηση. Με αυτό τον τρόπο εξαλείφονται οι αναπηδήσεις και αποτρέπονται στο λάθος διάβασμα των τάσεων.

Η παρακάτω εικόνα δείχνει την υλοποίηση του κυκλώματος στο breadboard.

Ο κώδικας

//Project 4 -Demonstrating a Digital Input
#define LCD 12
#define BUTTON 7
void setup()
{
    pinMode(LED, OUTPUT);  // output for the LED
    pinMode(BUTTON, INPUT);  //input for the button
}
void loop()
{
     if(digitalRead(BUTTON)==HIGH)
     {
           digitalWrite(LED, HIGH);  // turn on the LED
           delay(500);
           digitalWrite(LED, LOW);  // turn off the LED
     }
}

Μετά που ανεβάσεις τον κώδικα πάτησε στιγμιαία το μπουτόν και τότε το LED θα ανάψει για μισό δευτερόλεπτο.

Δημιουργώντας σταθερές με την #define: Πριν την συνάρτηση void setup() έχουμε χρησιμοποιήσει την έκφραση #define για την δημιουργία σταθερών μεταβλητών. Καθώς ο κώδικας μεταφράζεται από τον κομπάιλερ, το περιβάλλον IDE αντικαθιστά κάθε υπόδειγμα που ορίζεται από την define με τον αριθμό που ακολουθεί στην έκφραση αυτή. Για παράδειγμα, στον παραπάνω κώδικα, όταν το IDE βλέπει τη λέξη LED στην έκφραση digitalWrite(LED, LOW) τη αντικαθιστά με τον αριθμό 12.

Βασικά χρησιμοποιούμε την εντολή #define για να δώσουμε όνομα στα ψηφιακά πινς στα οποία είναι συνδεμένα το LED και το button. Ας σημειώσουμε ότι δεν χρησιμοποιούμε ερωτηματικό στο τέλος μετά την #define. Είναι καλή τακτική να δίνομε ετικέτες στο ψηφιακά πινς και στις άλλες σταθερές τιμές (όπως στη χρονική καθυστέρηση). Με αυτό τον τρόπο, για τον λόγο που η ίδια η μεταβλητή χρησιμοποιείται επαναλαμβανόμενα στο κώδικα, δεν θα χρειαστεί να την αλλάξεις περισσότερες από μια φορές. Σε αυτό το παράδειγμα  ο όρος LED χρησιμοποιείται τρεις φορές στο κώδικα και για να επέμβεις σε αυτές τις τιμές απλά άλλαξε την τιμή στην έκφραση #define.

Διάβασμα πιν ψηφιακής εισόδου: Για το διάβασμα της κατάστασης ενός διακόπτη, πρέπει να δηλώσουμε ως INPUT το πίν στο οποίο είναι συνδεδεμένος ο διακόπτης, μέσα στη συνάρτηση  void setup() χρησιμοποιώντας την ακόλουθη έκφραση

pinMode(BUTTON, INPUT);

Μετά, για να δούμε εάν ο διακόπτης που είναι συνδεμένος σε ένα ψηφιακό πιν, το οποίο τροφοδοτείται με μια τάση, είναι πατημένος χρησιμοποιούμε, την εντολή

digitalRead(pin) ;

όπου pin είναι η ψηφιακή είσοδος πιν που πρόκειται να διαβαστεί. Η συνάρτηση επιστρέφει είτε HIGH (τάση κοντά στα 5V) ή LOW (τάση κοντά στα 0V) στο ψηφιακό πιν

Κάνοντας επιλογές με την εντολή if: Χρησιμοποιώντας την εντολή if μπορούμε να κάνουμε επιλογές στον κώδικα μας και να πούμε στο Arduino να τρέξει διαφορετικό κώδικα, βασισμένο στην επιλογή if. Για παράδειγμα  στον κώδικα

// Listing 4 -2
if(digitalRead(BUTTON) == HIGH)
{
   digitalWrite(LED, HIGH);   //  turn on the LED
   delay(500);
    digitalWrite(LED, LOW);   // turnoff the LED
}

Η πρώτη γραμμή στον κώδικα ξεκινά με την εντολή if η οποία ελέγχει μια συνθήκη. Εάν η συνθήκη είναι αληθείς (δηλαδή η τάση είναι HIGH), αυτό σημαίνει ότι το μπουτόν έχει πατηθεί και ο κώδικας που ακολουθεί μέσα στις αγκύλες θα τρέξει. Για να ορίσουμε εάν το μπουτόν έχει πατηθεί χρησιμοποιούμε την εντολή

digitalRead(BUTTON);

Που επιστρέφει LOW ή HIGH αν η τάση στην είσοδο BUTTON είναι 0 volts ή 5 Volts αντίστοιχα. Προσέξτε το διπλό ίσον (==) που είναι ο λογικός τελεστής ισότητας.. Εάν στον κώδικα αντικαταστήσουμε το == με != (όχι ίσο με), τότε το LED θα σβήσει όταν το μπουτόν πατηθεί.

Δεν θα πρέπει να συγχέουμε το απλό σύμβολο ισότητας (=)που σημαίνει “κάνε ίσο με” με τον τελεστή σύγκρισης (==) που σημαίνει “έλεγξε εάν είναι ίσο με”.