Πρώτα βήματα

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

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

Εργασία 1:

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

Το Σχηματικό κύκλωμα

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

Ο Αλγόριθμος:

Ο αλγόριθμος της κατασκευής μας είναι ο εξής:
1] Άναψε το LED 1.
2] Περίμενε για μισό δευτερόλεπτο.
3] Σβήσε το LED 1.
4] Άναψε το LED2.
5] Περίμενε μισό δευτερόλεπτο.
6] Σβήσε το LED 2.
7] Συνέχισε με την διαδικασία μέχρι το LED 5 να ανάψει.
8] Με τον ίδιο τρόπο η αντίστροφη διαδικασία από το LED5 εως το LED1.
9] Συνεχής επανάληψη.

Ο κώδικας

Εισήγαγε τον ακόλουθο κώδικα στο 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, HIGH), μια τάση 5V προκαλεί τη ροή του ρεύματος από το ψηφιακό πιν 2 και δια μέσου από την αντίσταση περιορισμού ρεύματος στο LED, από την άνοδο του LED στην κάθοδο του και τελικά πίσω στη γείωση (GND) του Arduino. Όταν χρησιμοποιήσουμε την συνάρτηση digitalWrite(2, LOW) η ροή του ρεύματος σταματά και το LED σβήνει.

Τώρα σύνδεσε το Arduino board (εδώ χρησιμοποιούμε το Arduino Uno) και στο 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.

Ο αριθμός των βρόγχων που η εντολή βρόγχου for εκτελεί μπορεί να οριστεί με αντίστροφη μέτρηση από μια μεγαλύτερη τιμή σε μια μικρότερη. Για να το επιδείξουμε πρόσθεσε τον ακόλουθο βρόγχο στον κώδικα της εργασίας 2 και μετά τον πρώτο βρογχο for.

for(int a=5; a>1; a--)
{
     digitalWrite(a, HIGH);
     delay(d);
     digitalWrite(a, LOW);
     delay(d);
}

Σε αυτόν το βρόγχο for η μεταβλητή a που ορίζεται μέσα στις παρενθέσεις έχει αρχική τιμή 5 και κάθε φορά που εκτελείται ο βρόγχος, μειώνεται κατά ένα με την έκφραση a– . Ο βρόγχος for συνεχίζει να εκτελείται όσο η μεταβλητή a είναι μεγαλύτερη από 1 (a>1) και τελειώνει μόλις η τιμή της μεταβλητής a φτάσει στο 1 ή όταν γίνει μικρότερη από 1.

Έχουμε δημιουργήσει ξανά την εργασία 1 χρησιμοποιώντας λιγότερο κώδικα. Ανέβασε τον κώδικα και δες πως δουλεύει.

Αλαλαγή της φωτεινότητας του LED χρησιμοποιώντας την τεχνική της διαμόρφωσης πλάτους παλμών.

Θα μπορούσαμε να ορίσουμε την φωτεινότητα των LEDs συνδεομένων στο Arduino, με άναμμα και σβήσιμο χρησιμοποιώντας την εντολή digitalWrite(), αλλά ένας άλλος καλύτερος τρόπος είναι η διαμόρφωση πλάτους παλμών PWM. Για να δημιουργήσουμε το σήμα PWM χρησιμοποιούμε την συνάρτηση analogWrite(x, y); Με αυτή την συνάρτηση στέλνουμε παλμούς ίδιας συχνότητας περίπου 500 κύκλους το δευτερόλεπτο. Το όρισμα x της συνάρτησης ορίζει το πιν εξόδου και το όρισμα y ορίζει το duty cycle του τετραγωνικού σήματος. Το duty cycle ορίζεται το ως προς τις εκατό που το σήμα είναι HIGH σε σχέση με την περίοδο του σήματος.

Στην εικόνα φαίνονται διάφορα PWM duty cycles. Η γεμάτη γκρί περιοχή παριστάνει το χρόνο του το LED ανάβει. Όπως μπορείς να δεις ο χρόνος ανά κύκλο που το LED ανάβει αυξάνει με το duty cycle.

Στον προγραμματισμό Arduino, στη συνάρτηση digitalWrite(pin, duty_cycle) η τιμή x είναι το πιν που παίρνουμε το PWM σήμα και θα πρέπει να είναι ένα πιν που εκφράζετε με την περισπωμένη πάνω στο σχηματικό του Arduino (Στο Arduino Uno τα ψηφιακά πινς 3,5,6,9,10 και 11 μπορούν να λειτουργήσουν σαν PWM).

Το δεύτερο όρισμα της συνάρτησης digitalWrite(pin, duty_cycle) εκφράζει το duty cycle και είναι μια τιμή μεταξύ των ορίων 0 και 255. Η τιμή 0 εκφράζει 0% duty cycle ενώ η τιμή 255 εκφράζει 100% duty cycle.

Εργασία 3:

Τώρα ας κάνουμε τα άνω πράξη στο κύκλωμα από την εργασία 2. Εισήγαγε τον επόμενο κώδικα στο IDE και μετά ανέβασε το στο Arduino:

// Project 3 – Demonstrating PWM
int d = 5;
void setup()
{
pinMode(3, OUTPUT);  //LED control pin is 3, a PWM capable pin
}
void loop()
{
    for(int a=0; a<256; a++)
    {
        analogWrite(3, a);
        delay(d);
     }
     for(int a=255; a>=0; a--)
      {
          analogWrite(3, a);
          delay(d);
      }
      delay(200);
}

Το LED το οποίο είναι συνδεμένο στο πιν 3 επιδεικνύει το “εφέ της αναπνοής” καθώς το duty cycle αυξάνει και μειώνεται. Με άλλα λόγια, το LED ανάβει με αυξανόμενη φωτεινότητα μέχρι να λάμψει πλήρως και μετά αντίστροφα.