Αναλογικό απέναντι στό ψηφιακό σήμα

Σε αυτή την ενότητα, θα μάθεις την διαφορά μεταξύ ψηφιακών και αναλογικών σημάτων καθώς και πως θα μετράς αναλογικά σήματα μέ τα πινς αναλογικής εισόδου του Arduino.

Μέχρι τώρα, στο κώδικα που γράψαμε για το Arduino, χρησιμοποιήσαμε ψηφιακά σήματα, στα οποια η τάση μπορεί να είναι ένα από δυο διακριτά επίπεδα HIGH και LOW. Ειδικότερα, χρησιμοποιούμε τις εντολές digitalWrite(pin, HIGH) και digitalWrite(pin, LOW) για να αναβοσβήνουμε ένα LED και την digitalRead() για να μετρήσουμε εάν ενα ψηφιακό πιν έχει τάση αναφορικα σε HIGH ή LOW. Η παρακάτω εικόνα είναι μια οπτική αναπαράσταση ενός ψηφιακού σήματος που εναλλάσσεται μεταξύ high και low.

Ανόμοια με τα ψηφιακά σήματα, τα αναλογικά σήματα μπορεί να μεταβάλλονται με αναρίθμητο αριθμό από βήματα σε μια περιοχή μεταξύ δυο τάσεων. Για παράδειγμα η επόμενη εικόνα δείχνει ένα αναλογικό σήμα ενός ημιτονοειδούς κύματος. Σημείωση: αυτό το σήμα, με την πάροδο του χρόνου, η τάση αλλάζει ομαλά μεταξύ των επιπέδων high και low.

Αναλογές εισόδοι

Στην πλατφόρμα Arduino, το επίπεδο HIGH είναι κοντά στα 5V και το επίπεδο LOW είναι κοντά στα 0V ή GND. Μπορούμε να μετρήσουμε το επίπεδο της τάσης ενός αναλογικού σήματος χρησιμοποιώντας τις έξι αναλογικές εισόδους του Arduino. Αυτές οι αναλογικές είσοδοι μπορούν να μετρούν τάσεις με ασφάλεια όταν κυμαίνονται μεταξύ 0V και 5V.

Χρησιμοποιώντας την συνάρτηση analogRead(), το Arduino επιστρέφει ένα αριθμό μεταξύ 0 και 1.023 σε αναλογία με την τάση που εφαρμόζεται στο αντίστοιχο αναλογικό πιν. Για παράδειγμα, μπορείς να χρησιμοποιήσεις την συνάρτηση analogRead(0) για να αποθηκεύσεις την τιμή του αναλογικού πιν μηδέν (0) στην ακέραια μεταβλητή a:

int a;
a = analogRead(0); //read analog input pin 0 (A0)
                                //returns 0 to 1023 which is usually 0.000 to 4.995

Εργασία 5 – Δοκιμαστής μπαταρίας

Οι μπαταρίες μονής κυψέλης έχουν μεγάλη διάδοση, που αναφέρονται με τους τύπους ΑΑ, ΑΑΑ, C ή D και χρησιμοποιούνται στα χειριστήρια απομακρυσμένου ελέγχου, στα ρολόγια ή στα παιδικά παιχνίδια. Αυτές οι μπαταρίες αναπτύσσουν τάση στα άκρα τους λιγότερο από 5V, έτσι μπορούμε να μετρήσουμε την τάση που δίνουν αυτές οι μπαταρίες, με ασφάλεια, με την πλατφόρμα του Arduino

Ο στόχος

Οι μπαταρίες μονής κυψέλης όπως οι ΑΑ έχουν αρχική τάση περίπου 1.6V όταν είναι καινούργιες και μετά η τάση τους μειώνεται με τη χρήση. Σε αυτή την εργασία θα μετρήσουμε την τάση της μπαταρίας και θα την εκφράσουμε με την ένδειξη τριών LEDs. Θα χρησιμοποιήσουμε την τιμή που επιστρέφει η συνάρτηση analogRead() μετατρέποντας την σε volts. Η μεγίστη τάση που μπορεί να διαβάσει είναι 5V, έτσι διαιρώντας την τιμή 5 δια 1,024 (ο αριθμός των πιθανών τιμών) δίνει τιμή ίση με 0,0048. Επομένως εάν η συνάρτηση analogRead() επιστρέφει 512, πολλαπλασιάζουμε αυτή την τιμή με 0,0048 η οποία δίνει τάση 2.4576V.

Ο αλγόριθμος

Παρακάτω φαίνεται ο αλγόριθμος που χρησιμοποιούμε στον δοκιμαστή μπαταρίας:

1] Διάβασε την τιμή από το αναλογικό πιν μηδέν
2] Πολλαπλασίασε την ένδειξη με 0.0048 για να την εκφράσεις σε volts
3] Εάν η τάση είναι μεγαλύτερη ή ίση με 1.6V άναψε αμέσως το πράσινο LED
4] Εάν η τάση είναι μεγαλύτερη από 1.4V και μικρότερη από 1.6V τότε άναψε αμέσως το κίτρινο LED
5] Εάν η τάση είναι μικρότερη από 1.4V τότε άναψε αμέσως το κόκκινο LED.
6] Ατέρμονη επανάληψη.

Το σχηματικό

Το σχηματικό του δοκιμαστή μπαταρίας φαίνεται στο παρακάτω σχήμα. Στο αριστερό μέρος της, όπως μπορείς να δεις, υπάρχουν δυο ακροδέκτες σημειούμενοι με + και -. Σε αυτά τα δυο σημεία συνδέεται η υπό έλεγχο μπαταρία. Η θετική πλευρά της μπαταρίας πρέπει να συνδεθεί στον θετικό ακροδέκτη του δοκιμαστή και η αρνητική πλευρά με τον αρνητικό ακροδέκτη.

Ο κώδικας

// Project 5 - Creating a Single – Cell Battery Tester
#define newLED 2  // green LED ‘new’
#define okLED  4    // yellow LED ‘ok’
#define redLED  6 // red LED ‘old’
int analogValue = 0;
float voltage = 0;
int ledDelay = 2000;
void setup()
{
    pinMode(newLED, OUTPUT);
    pinMode(okLED, OUTPUT);
    pinMode(oldLED, OUTPUT);
}
void loop()
{
    analogValue = analogRead(0);
    voltage = 0.0048*analogValue;
    if(voltage >= 1.6)
    {
         digitalWrite(newLED, HIGH);
         delay(ledDelay);
         digitalWrite(newLED, LOW);
     }
      else if(voltage < 1.6  &&  voltage > 1.4)
      {
          digitalWrite(okLED, HIGH);
          delay(ledDelay);
           digitalWrite(okLED, LOW);
       }
       else if(voltage <=1.4)
        {
             digitalWrite(oldLED, HIGH);
             delay(ledDelay);
             digitalWrite(oldLED, LOW);
         }
}

Στον προηγούμενο κώδικα το Arduino παίρνει την τιμή που μετρά στο αναλογικό πιν 0 και το μετατρέπει σε τάση. Θα μάθεις ένα καινούργιο τύπο δεδομένων στην επόμενη ενότητα. Παρακάτω θα δεις εκφράσεις που έχουμε συζητήσει, όπως οι εντολές if – else και μερικά καινούργια πράγματα όπως η αριθμητική μεταβλητών και αριθμών και τη χρήση τελεστών σύγκρισης για την σύγκριση αριθμών, που όλα αυτά θα τα συζητήσουμε στις ενότητες που ακολουθούν.

Κάνοντας αριθμητικούς υπολογισμούς με το Arduino

Όπως με κομπιουτεράκι τσέπης έτσι και το Arduino μπορεί να εκτελέσει αριθμητικούς υπολογισμούς για εμάς, όπως πολλαπλασιασμός, διαίρεση, πρόσθεση και αφαίρεση. Ακολουθούν μερικά παραδείγματα:

int a = 100;
int b, c, d;
b = a +20;
c = b – 200;
d = c + 80;  // d θα είναι ίσο με 0

Μια μεταβλητή έχει ένα “τύπο” για να γνωρίζει το Arduino πως να τις χειρίζεται και να τις αποθηκεύει. Οι τύποι μεταβλητών που υποστηρίζει το Arduino είναι: boolean, char, byte, int, word, long, float.

Στο προηγούμενο παράδειγμα οι μεταβλητές a, b, c, d είναι τύπου int. Ο τύπος int έχει μέγεθος δύο byte και μπορούμε να αποθηκεύσουμε σ΄αυτόν ακέραιες τιμές στο εύρος από -32,768 έως 32,767.

Μεταβλητές τύπου float

Όταν χρειάζεται να χρησιμοποιήσεις αριθμούς με δεκαδικά ψηφία, τότε μπορείς να ορίσεις μεταβλητές τύπου float. Οι τιμές που μπορείς να αποθηκεύσεις σε μια float μεταβλητή μπορεί να είναι μεταξύ 3.4028235 x 1038 και -3.4028235 x 10–38 και γενικά έχουν ακρίβεια που περιορίζονται με έξι ή επτά δεκαδικά ψηφία. Στους υπολογισμούς μπορείς να χρησιμοποιήσεις μαζί integers και float αριθμούς. Για παράδειγμα, θα μπορούσες να προσθέσεις τον float αριθμό f στον integer a και το αποτέλεσμα μπορείς να το αποθηκεύσεις στην μεταβλητή f τύπου float.

int a = 100;
float f;
float g;
    f = a /3;  //  f = 33.3333333
    g = a +f;  //  g = 133.333333

Τελεστές σύγκρισης για αριθμητικές πράξεις

Χρησιμοποιήσαμε τους λογικούς τελεστές σύγκρισης όπως == και != μαζί με την εντολή if σε προηγούμενα παραδείγματα. Επίσης έχουμε χρησιμοποιήσει αριθμητικούς τελεστές σύγκρισης, για την σύγκριση αριθμητικών τιμών και μεταβλητών.

< μικρότερο από
> μεγαλύτερο από
<= μικρότερο ή ίσο με
>= μεγαλύτερο ή ίσο με

Με αυτούς τους τελεστές μπορούμε να συγρίνουμε αριθμητικές τιμές. Το αποτέλεσμα τους είναι μια boolean τιμή, που μπορεί να χρησιμοποιηθεί από εντολές που παίρνουν όρισμα boolean τιμές, όπως η if όπως είδαμε σε προηγούμενη ενότητα.

Βελτιώνοντας την ακρίβεια αναλογικών μετρήσεων

Όπως επιδείξαμε στην εργασία 5 η συνάρτηση analogRead() επιστρέφει μια τιμή αναλογα με την τάση μεταξύ 0 και 5V στην αναλογική είσοδο. Η ανώτερη τιμή (5V) είναι η τάση αναφοράς, που είναι η μέγιστη τάση που η αναλογική είσοδο του Arduino δέχεται στην οποία η συνάρτηση επιστρέφει την υψηλότερη τιμή που είναι 1,023.

Για να αυξήσουμε την ακρίβεια για το διάβασμα μικρότερων τάσεων, μπορούμε να χρησιμοποιήσουμε μια μικρότερη τάση αναφοράς. Για παράδειγμα αν η τάση αναφοράς είναι για παράδειγμα 2V, η τάση από 0 έως 2V στην αναλογική είσοδο παρίσταται αναλογικά από την συνάρτηση analogRead() με μια τιμή μέσα στο εύρος 0 έως 1,023 με την τιμή 1,023 να αντιστοιχεί στα 2V

Χρησιμοποιώντας μια εξωτερική τάση αναφοράς

AREF pin

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

Οι τιμές των αντιστάσεων R1 και R2 ορίζουν την τάση αναφοράς σύμφωνα με τη σχέση:

Vout είναι η τάση αναφοράς και Vin η τάση τροφοδοσίας. Οι R1 και R2 είναι αντιστάσεις εκφρασμένες σε ohms.

Ο απλούστερος τρόπος για να διαιρέσεις την τάση Vin στο μισό, είναι εκλέγοντας τις αντιστάσεις R1 και R2 στην ίδια τιμή, για παράδειγμα 10kΩ η κάθε μια. Εδώ θα πρέπει να χρησιμοποιήσεις αντιστάσεις με την μικρότερη ανοχή που μπορείς να βρεις, για παράδειγμα 1 τοις εκατό. Θα πρέπει να επιβεβαιώσεις τις τιμές τους μετρώντας τες με ένα πολύμετρο και θεωρούμε την τιμή των αντιστάσεων αυτή που δίνει το πολύμετρο. Περαιτέρω είναι καλή ιδέα να τοποθετήσεις ένα πυκνωτή 100nF μεταξύ AREF και GND για την αποφυγή του θορύβου.

Όταν χρησιμοποιείς εξωτερική τάση αναφοράς, εισήγαγε την επόμενη γραμμή μέσα στην συνάρτηση void setup() του κώδικα.

analogReference(EXTERNAL); // select ARFF pin for reference voltage

Χρησιμοποιώντας την εσωτερική τάση αναφοράς

Το Arduino Uno έχει μια εσωτερική τάση αναφοράς ίση με 1.1V. Εάν αυτό σας βολεύει δεν χρειάζονται επιπρόσθετα εξαρτήματα. Σε αυτή την περίπτωση πρόσθεσε την ακόλουθη γραμμή στή συνάρτηση void setup() του κώδικα.

analogeReference(INTERNAL); // select internal 1.1V reference voltage.

Εργασία 6: Δοκιμάζοντας ένα πιεζοηλεκτρικό μεγάφωνο

Αν έχεις ένα πιεζοηλεκτρικό μεγάφωνο και θέλεις να το δοκιμάσεις, σχημάτισε το κύκλωμα στο οποίο ο ένας ακροδέκτης να συνδεθεί στο GND και ο άλλος στο ψηφιακό πιν που υποστηρίζει PWM λειτουργία και ανέβασε τον ακόλουθο κώδικα:

// Project 6 Trying Out a Piezo Buffer
#define PIEZO 3  // pin 3 is capable of PWM output to drive tones
int del = 500;
void setup(){
{
     pinMode(PIEZO, OUTPUT);
}
void loop()
{
     analogWrite(PIEZO, 128);  // 50 percent duty cycle tone to the piezo
     delay(del);
     digitalWrite(PIEZO, LOW);  // turn the piezo off
     delay(del);
}

Ο παραπάνω κώδικας χρησιμοποιεί τη μέθοδο διαμόρφωσης παλμών στο ψηφιακό πιν τρία. Αν αλλάξεις το duty cycle στη συνάρτηση analogWrite() (τώρα έχει τιμή 128 που είναι 50% on) μπορείς να μεταβάλεις την ένταση ήχου του βομβητή.

Για να αυξήσεις περαιτέρω την ένταση ήχου του βομβητή, αύξησε την τάση που εφαρμόζεται σε αυτό. Τώρα η εφαρμοζόμενη τάση περιορίζεται στα 5V, αλλά ο ήχος θα είναι δυνατότερος, αν ο βομβητής τροφοδοτηθεί με τάση 9 ή 12V. Επειδή αυτές οι τάσεις δεν μπορούν ανά παραχθούν από το Arduino, θα πρέπει να χρησιμοποιήσεις εξωτερική τάση τροφοδοσίας για τον βομβητή όπως με μια 9V μπαταρία. Για να τροφοδοτήσεις με παλμούς τον βομβητή, χρησιμοποίησε ένα τρανζίστορ σαν ηλεκτρικό διακόπτη. Μπορείς να χρησιμοποιήσεις τον ίδιο κώδικα όπως τον παρουσιάσαμε πριν.