Ξεκινήστε να μετράτε τον κόσμο γύρω σας με αυτό το πρακτικό και ολοκληρωμένο έργο.
Βασικά Takeaways
- Το Raspberry Pi δεν έχει αναλογική είσοδο, αλλά μπορείτε να προσθέσετε εξωτερικούς ADC για να μετατρέψετε τάσεις από τον πραγματικό κόσμο σε ψηφιακή μορφή για εγγραφή, χειρισμό και έλεγχο.
- Οι δημοφιλείς επιλογές ADC περιλαμβάνουν το MCP3004/MCP3008 για ανταλλαγή ταχύτητας και ακρίβειας ή το ADS111x για μετρήσεις 16 bit με χαμηλότερο ρυθμό δειγματοληψίας.
- Το ADS1115 της Adafruit είναι μια απλή επιλογή με προγραμματιζόμενο ενισχυτή απολαβής (PGA) που σας επιτρέπει να ανιχνεύετε μικρές διαφορές τάσης και να ρυθμίζετε το κέρδος κατά τη διάρκεια του προγράμματος. Η καλωδίωση με το Raspberry Pi χρησιμοποιώντας το I2C είναι απλή.
Από το κουτί, το Raspberry Pi δεν διαθέτει αναλογική είσοδο. Αυτό το θέτει σε μειονεκτική θέση σε σύγκριση με πλακέτες που βασίζονται σε μικροελεγκτές όπως το Arduino.
Αλλά μην απελπίζεστε: υπάρχουν πολλές επιλογές που πρέπει να εξετάσετε. Ξεκινήστε με το Raspberry Pi και έναν εξωτερικό ADC.
Γιατί να προσθέσετε εισόδους;
Ο πραγματικός κόσμος είναι γεμάτος από φαινόμενα που, αν έχετε το σωστό κύκλωμα, μπορούν εύκολα να περιγραφούν χρησιμοποιώντας μια τάση. Μεταφέρετε αυτές τις τάσεις σε ψηφιακή μορφή και μπορείτε να τις καταγράψετε, να τις χειριστείτε και να τις χρησιμοποιήσετε για να ελέγξετε άλλες παραμέτρους και συσκευές.
Μπορεί να ψάχνετε να παρακολουθείτε την υγρασία του εδάφους σας, τη θερμοκρασία του θερμοκηπίου σας ή το βάρος του χάμστερ σας. Μπορεί να ψάχνετε να προσθέσετε ένα χειριστήριο έντασης στο Pi σας, να δημιουργήσετε μια ολόκληρη ομάδα faders ή να σχεδιάσετε ένα joystick από την αρχή. Οι δυνατότητες είναι, λίγο πολύ, απεριόριστες.
Επιλογές για ADC
Λοιπόν, ποιο ADC είναι καλύτερο για αρχάριους;
Μεταξύ των πιο δημοφιλών και απλών επιλογών είναι το MCP3004 (και MCP3008) μάρκες από τη Microchip. Θα λάβετε τέσσερα (ή οκτώ) κανάλια των 10 bit το καθένα, τα οποία μπορούν να διαβάσουν έως και 200 kSPS. Από την άλλη, υπάρχουν οι συσκευές ADS111x της Texas Instruments, οι οποίες διαβάζουν 16 bit στα 860 SPS. Έτσι, υπάρχει μια αντιστάθμιση μεταξύ ταχύτητας και ακρίβειας (και, φυσικά, τιμής).
Πολλοί μικροελεγκτές διαθέτουν ενσωματωμένους ADC. Το ATMega που βρίσκετε στο μέσο Arduino θα προσφέρει πολλά κανάλια 10-bit, πάνω από όλα τα άλλα. Αυτό είναι που επιτρέπει στο Arduino να παρέχει αναλογικές εισόδους όπου το Raspberry Pi δεν μπορεί. Εάν έχετε ήδη ένα Arduino που συμμετέχει στην εγκατάσταση σας και τα 10 bit είναι αρκετή πιστότητα, τότε αυτός μπορεί να είναι στην πραγματικότητα ο πιο εύκολος τρόπος.
Εδώ, θα το κρατήσουμε απλό, με ένα ADS1115 από την Adafruit.
Τι είναι ένας προγραμματιζόμενος ενισχυτής απολαβής;
Αυτό το τσιπ διαθέτει μερικά ενδιαφέροντα χαρακτηριστικά, συμπεριλαμβανομένου ενός προγραμματιζόμενου ενισχυτή απολαβής (PGA). Αυτό θα σας επιτρέψει να ορίσετε το επιθυμητό εύρος τιμών ψηφιακά, σε κλάσμα του βολτ. Με τον αριθμό των τιμών που μπορούν να αντιπροσωπεύουν τα 16 bit, αυτό θα σας επιτρέψει να ανιχνεύσετε διαφορές μόλις λίγων microvolt.
Το πλεονέκτημα εδώ είναι ότι μπορείτε να αλλάξετε το κέρδος στη μέση του προγράμματος. Άλλα τσιπ, όπως το MCP3004, ακολουθούν διαφορετική προσέγγιση. έρχονται με μια επιπλέον ακίδα, στην οποία μπορείτε να τροφοδοτήσετε μια τάση αναφοράς.
Τι γίνεται με την πολυπλεξία;
Ένας πολυπλέκτης (ή mux) είναι ένας διακόπτης που σας επιτρέπει να διαβάσετε πολλές εισόδους χρησιμοποιώντας ένα μόνο ADC. Εάν το τσιπ ADC σας διαθέτει πολλές ακίδες εισόδου, τότε υπάρχει κάποια εσωτερική πολυπλεξία σε εξέλιξη. Το mux του ADS1115 επιτρέπει τέσσερις εισόδους, τις οποίες μπορείτε να επιλέξετε μέσω των εσωτερικών καταχωρητών.
Αντιμετώπιση Μητρώων
Το ADS1115 παρέχει αυτές τις επιλογές, καθώς και μερικές ακόμη. Μπορείτε να αντιμετωπίσετε τον πολυπλέκτη, να προσαρμόσετε το κέρδος, να ενεργοποιήσετε τον ενσωματωμένο συγκριτή, να αλλάξετε τον ρυθμό δειγματοληψίας και να θέσετε τη συσκευή σε κατάσταση αναστολής λειτουργίας χαμηλής κατανάλωσης, όλα γυρίζοντας μερικούς διακόπτες.
Αλλά πού είναι αυτοί οι διακόπτες; Βρίσκονται μέσα στη συσκευασία, με τη μορφή πολύ μικρών κομματιών μνήμης που ονομάζονται μητρώα. Για να ενεργοποιήσετε μια δεδομένη δυνατότητα, πρέπει απλώς να ορίσετε το σχετικό bit σε 1 και όχι 0.
Κοιταζώ το φύλλο δεδομένων ADS111x, θα διαπιστώσετε ότι αυτά τα μοντέλα διαθέτουν τέσσερις καταχωρητές, συμπεριλαμβανομένων των καταχωρητών διαμόρφωσης που διέπουν τη συμπεριφορά της συσκευής.
Για παράδειγμα, τα bit 14 έως 12 ελέγχουν τον πολυπλέκτη. Χρησιμοποιώντας αυτά τα τρία bit, μπορείτε να επιλέξετε από οκτώ διαμορφώσεις. Αυτό που θα θέλετε εδώ είναι το "100", το οποίο θα δώσει τη διαφορά μεταξύ εισόδου μηδέν και γείωσης. Τα bit 7 έως 5, από την άλλη πλευρά, διέπουν τον ρυθμό δειγματοληψίας. Εάν θέλετε το μέγιστο των 860 δειγμάτων ανά δευτερόλεπτο, μπορείτε να τα ορίσετε σε "111".
Μόλις μάθετε ποιες επιλογές να ορίσετε, θα έχετε δύο byte για αποστολή στο ADC. Εάν αργότερα θέλετε να ορίσετε ένα μεμονωμένο bit εδώ ή εκεί, τότε μπορείτε να το αντιμετωπίσετε μεμονωμένα χρησιμοποιώντας τελεστές bitwise.
Εδώ είναι που μπορεί να γίνει σύγχυση. Σε αυτήν την περίπτωση, το δυαδικό δεν αντιπροσωπεύει μια τιμή, αλλά τις τιμές των μεμονωμένων διακοπτών. Θα μπορούσατε να εκφράσετε αυτές τις μεταβλητές ως έναν μεγάλο αριθμό, σε δεκαδικό ή δεκαεξαδικό. Αλλά αν θέλετε να αποφύγετε τους πονοκεφάλους, θα πρέπει να επιμείνετε στη δυαδική έκδοση, η οποία είναι πιο ευανάγνωστη.
Καλωδίωση
Μπορείτε να συνδέσετε αυτήν τη συσκευή απευθείας στο breadboard. Η είσοδος θετικής τάσης θα δέχεται μεταξύ 2 και 5,5v, πράγμα που σημαίνει ότι η ράγα 3,3v στο Raspberry Pi θα λειτουργεί καλά.
Συνδέστε τις εισόδους SDA και SCL σε αντίστοιχες στο RPi και κάντε τα ίδια πράγματα με τη γείωση και τα 3,3v. Πάρτε ένα ποτενσιόμετρο μεταξύ των γραμμών γείωσης και τάσης και βάλτε το μεσαίο καλώδιο στην πρώτη είσοδο του ADC. Αυτό είναι το μόνο που χρειάζεστε για να προχωρήσετε!
Αντιμετώπιση του I2C
Διαφορετικά ADC λειτουργούν μέσω διαφορετικών πρωτοκόλλων. Στην περίπτωση του ADS1115 μας, θα χρησιμοποιήσουμε το I2C.
Το παρακάτω παράδειγμα θα αλληλεπιδράσει με το ADC χρησιμοποιώντας Python. Αλλά προτού το κάνετε αυτό, θα πρέπει να το ρυθμίσετε. Οι πρόσφατες εκδόσεις του Raspberry Pi OS το έχουν κάνει πολύ απλό. Κατευθύνομαι προς Προτιμήσεις > Διαμόρφωση Raspberry Pi. Στη συνέχεια, από το Διεπαφές καρτέλα, διακόπτης I2C επί.
Για να ελέγξετε ότι όλα λειτουργούν, ανοίξτε ένα τερματικό και εκτελέστε:
sudo i2cdetect -y 1
Αυτή η εντολή θα παράγει ένα πλέγμα. Υποθέτοντας ότι όλα λειτουργούν και τα έχετε συνδέσει σωστά, θα δείτε μια νέα τιμή να εμφανίζεται στο πλέγμα. Αυτή είναι η διεύθυνση του ADC σας. Λάβετε υπόψη σας εδώ ότι είναι μια δεκαεξαδική τιμή, επομένως πρέπει να την προσθέσετε "0x" όταν το χρησιμοποιείτε στον παρακάτω κώδικα. Εδώ, είναι 0x48:
Αφού έχετε τη διεύθυνση, μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη SMBus για να στείλετε εντολές I2C. Εδώ θα έχετε να κάνετε με δύο μεθόδους. Το πρώτο είναι write_word_data(), το οποίο δέχεται τρία ορίσματα: τη διεύθυνση της συσκευής, το μητρώο στο οποίο γράφετε και την τιμή που θέλετε να γράψετε.
Το δεύτερο είναι read_word_data(), το οποίο δέχεται μόνο τη διεύθυνση της συσκευής και το μητρώο. Το ADC θα διαβάζει συνεχώς τις τάσεις και θα αποθηκεύει το αποτέλεσμα στον καταχωρητή μετατροπής. Με αυτήν τη μέθοδο, μπορείτε να ανακτήσετε τα περιεχόμενα αυτού του μητρώου.
Μπορείτε να ομορφύνετε λίγο το αποτέλεσμα και μετά να το εκτυπώσετε. Πριν επιστρέψετε στην αρχή του βρόχου, εισάγετε μια μικρή καθυστέρηση. Αυτό θα διασφαλίσει ότι δεν θα κατακλύζεστε με δεδομένα.
from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))# define the top of the range
TOP = 26300whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
# subtract half the range to set ground to zero
b -= 0x8000# divide the result by the range to give us a value between zero and one
b /= TOP# cap at one
b = min(b, 1)# bottom is zero
b = max(b, 0)
# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)
Μόλις τελειώσατε. Αντιστοιχίστε το εύρος των τιμών που λαμβάνετε σε αυτήν που προτιμάτε και, στη συνέχεια, περικόψτε τον επιθυμητό αριθμό δεκαδικών ψηφίων. Μπορείτε να προσαρμόσετε τη λειτουργία εκτύπωσης έτσι ώστε να εκτυπώνετε μια νέα τιμή μόνο όταν αυτή διαφέρει από την τελευταία τιμή. Εάν δεν είστε σίγουροι για Μέγιστη, ελάχ, και γύρος, μπορείς ρίξτε μια ματιά στη λίστα μας με τις 20 πιο σημαντικές συναρτήσεις της Python!
Αντιμετώπιση του θορύβου
Τώρα, εκτός κι αν η ρύθμισή σας είναι σούπερ, εξαιρετικά τακτοποιημένη και τακτοποιημένη, θα παρατηρήσετε κάποιο θόρυβο. Αυτό είναι το εγγενές μειονέκτημα της χρήσης 16 bit και όχι μόνο δέκα: αυτός ο μικρός θόρυβος θα είναι πιο αντιληπτός.
Δένοντας τη διπλανή είσοδο (είσοδος 1) στη γείωση και αλλάζοντας τη λειτουργία έτσι ώστε να συγκρίνετε τις εισόδους ένα και δύο, μπορείτε να έχετε πολύ πιο σταθερά αποτελέσματα. Θα μπορούσατε επίσης να αλλάξετε αυτά τα μακριά καλώδια που συλλέγουν θόρυβο με μικρά και να προσθέσετε μερικούς πυκνωτές ενώ βρίσκεστε σε αυτό. Η τιμή του ποτενσιόμετρου σας μπορεί επίσης να κάνει τη διαφορά.
Υπάρχουν επίσης επιλογές λογισμικού. Μπορεί να δημιουργήσετε έναν κυλιόμενο μέσο όρο ή απλώς να αγνοήσετε μικρές αλλαγές. Το μειονέκτημα είναι ότι ο επιπλέον κώδικας θα επιβάλει ένα υπολογιστικό κόστος. Εάν γράφετε δηλώσεις υπό όρους σε μια γλώσσα υψηλού επιπέδου όπως η Python και παίρνετε χιλιάδες δείγματα κάθε δευτερόλεπτο, αυτό το κόστος θα αυξηθεί γρήγορα.
Προχωρήστε παρακάτω με πολλά πιθανά επόμενα βήματα
Η λήψη μετρήσεων μέσω I2C είναι αρκετά απλή και το ίδιο ισχύει σε μεγάλο βαθμό για άλλες μεθόδους, όπως το SPI. Παρόλο που μπορεί να φαίνεται ότι υπάρχουν μεγάλες διαφορές μεταξύ των διαθέσιμων επιλογών ADC, η αλήθεια είναι ότι όταν έχετε μία από αυτές να λειτουργεί, είναι εύκολο να εφαρμόσετε τη γνώση στις άλλες.
Λοιπόν, γιατί να μην προχωρήσουμε τα πράγματα; Συνδέστε πολλά ποτενσιόμετρα μεταξύ τους ή δοκιμάστε να διαβάσετε φως, ήχο ή θερμοκρασία. Επεκτείνετε το χειριστήριο που μόλις φτιάξατε και δημιουργήστε μια εγκατάσταση Raspberry Pi που είναι πραγματικά πρακτική!