Începeți să măsurați lumea din jurul vostru cu acest proiect practic și cuprinzător.
Recomandări cheie
- Raspberry Pi nu are intrare analogică, dar puteți adăuga ADC-uri externe pentru a converti tensiunile din lumea reală în formă digitală pentru înregistrare, manipulare și control.
- Opțiunile ADC populare includ MCP3004/MCP3008 pentru viteză și precizie compromise sau ADS111x pentru citiri pe 16 biți la o rată de eșantionare mai mică.
- ADS1115 de la Adafruit este o opțiune simplă cu un amplificator de câștig programabil (PGA) care vă permite să detectați diferențe mici de tensiune și să reglați câștigul în timpul programului. Conectarea acestuia cu Raspberry Pi folosind I2C este simplă.
Din cutie, Raspberry Pi nu are o intrare analogică. Acest lucru îl pune într-un dezavantaj în comparație cu plăcile bazate pe microcontrolere precum Arduino.
Dar nu disperați: există o mulțime de opțiuni de luat în considerare. Porniți-vă cu Raspberry Pi și un ADC extern.
De ce să adăugați intrări?
Lumea reală este plină de fenomene care, dacă ai circuitul potrivit, pot fi descrise cu ușurință folosind o tensiune. Obțineți acele tensiuni în formă digitală și le puteți înregistra, manipula și folosi pentru a controla alți parametri și dispozitive.
S-ar putea să căutați să monitorizați umiditatea solului, temperatura serei sau greutatea hamsterului. S-ar putea să căutați să adăugați un control de volum la Pi-ul dvs., să construiți o întreagă bancă de fadere sau să proiectați un joystick de la zero. Posibilitățile sunt, mai mult sau mai puțin, nelimitate.
Opțiuni pentru ADC-uri
Deci, care ADC este cel mai bun pentru începători?
Printre cele mai populare și simple opțiuni se numără MCP3004 (și MCP3008) cipuri de la Microcip. Veți obține patru (sau opt) canale de câte 10 biți fiecare, care pot citi până la 200 kSPS. Pe de altă parte, există dispozitivele ADS111x de la Texas Instruments, care citesc 16 biți la 860 SPS. Deci, există un compromis între viteză și precizie (și, desigur, preț).
Multe microcontrolere vin cu ADC-uri încorporate. ATMega pe care îl găsiți pe Arduino obișnuit va oferi mai multe canale pe 10 biți, pe lângă orice altceva. Acesta este ceea ce permite Arduino să ofere intrări analogice acolo unde Raspberry Pi nu poate. Dacă aveți deja un Arduino implicat în configurarea dvs. și 10 biți este suficientă fidelitate, atunci aceasta ar putea fi de fapt cea mai ușoară cale de a merge.
Aici, vom păstra totul simplu, cu un ADS1115 de la Adafruit.
Ce este un amplificator de câștig programabil?
Acest cip vine cu câteva caracteristici interesante, inclusiv un amplificator de câștig programabil (PGA). Acest lucru vă va permite să setați intervalul dorit de valori digital, până la o fracțiune de volt. Cu numărul de valori pe care 16 biți le pot reprezenta, acest lucru vă va permite să detectați diferențe de doar câțiva microvolți.
Avantajul aici este că puteți modifica câștigul la jumătatea programului. Alte cipuri, cum ar fi MCP3004, adoptă o abordare diferită; vin cu un pin suplimentar, căruia îi poți furniza o tensiune de referință.
Dar multiplexarea?
Un multiplexor (sau mux) este un comutator care vă permite să citiți mai multe intrări folosind un singur ADC. Dacă cipul ADC vine cu mulți pini de intrare, atunci are loc o multiplexare internă. Mux-ul ADS1115 permite patru intrări, pe care le puteți selecta prin registrele interne.
De-a face cu registrele
ADS1115 oferă aceste opțiuni și încă câteva în plus. Puteți să vă ocupați de multiplexor, să reglați câștigul, să activați comparatorul încorporat, să schimbați rata de eșantionare și să puneți dispozitivul în modul de repaus la consum redus, totul prin apăsarea câteva comutatoare.
Dar unde sunt acele comutatoare? Ele sunt în interiorul pachetului, sub forma unor bucăți foarte mici de memorie numite registre. Pentru a activa o anumită caracteristică, trebuie doar să setați bitul relevant la 1, nu la 0.
Uitandu-ma la fișa tehnică ADS111x, veți descoperi că aceste modele vin cu patru registre, inclusiv registrele de configurare care guvernează comportamentul dispozitivului.
De exemplu, biții de la 14 la 12 controlează multiplexorul. Folosind acești trei biți, puteți selecta dintre opt configurații. Cel pe care îl veți dori aici este „100”, care va da diferența dintre intrarea zero și masă. Pe de altă parte, biții de la 7 la 5 guvernează rata de eșantionare. Dacă doriți un maxim de 860 de mostre pe secundă, le puteți seta la „111”.
Odată ce știți ce opțiuni să setați, veți avea doi octeți de trimis către ADC. Dacă mai târziu doriți să setați un singur bit aici sau acolo, atunci le puteți trata individual folosind operatori pe biți.
Iată unde ar putea deveni confuz. În acest caz, binarul nu reprezintă o valoare, ci valorile comutatoarelor individuale. Puteți exprima aceste variabile ca un număr mare, în zecimală sau în hexazecimal. Dar dacă doriți să evitați durerile de cap, ar trebui să rămâneți la versiunea binară, care este mai ușor de citit.
Conectează-l
Puteți conecta acest dispozitiv direct la placa. Tensiunea de intrare pozitivă va accepta oriunde între 2 și 5,5 V, ceea ce înseamnă că șina de 3,3 V de pe Raspberry Pi va funcționa bine.
Conectați intrările SDA și SCL la omologii de pe RPi și faceți aceleași lucruri cu pământul și 3.3v. Obțineți un potențiometru între liniile de masă și de tensiune și puneți cablul din mijloc în prima intrare a ADC. Asta este tot ce ai nevoie pentru a merge!
Confruntarea cu I2C
Diferite ADC-uri funcționează prin diferite protocoale. În cazul ADS1115, vom folosi I2C.
Următorul exemplu va interacționa cu ADC folosind Python. Dar înainte de a face asta, va trebui să-l configurați. Versiunile recente ale sistemului de operare Raspberry Pi au făcut acest lucru foarte simplu. Îndreptați-vă spre Preferințe > Configurare Raspberry Pi. Apoi, din Interfețe filă, comutator I2C pe.
Pentru a verifica că totul funcționează, deschideți un terminal și rulați:
sudo i2cdetect -y 1
Această comandă va scoate o grilă. Presupunând că totul funcționează și l-ați conectat corect, veți vedea o nouă valoare care apare în grilă. Aceasta este adresa ADC-ului dumneavoastră. Țineți minte aici că este o valoare hexazecimală, așa că trebuie să o prefixați cu „0x” când îl folosești în codul de mai jos. Aici, este 0x48:
Odată ce aveți adresa, puteți utiliza biblioteca SMBus pentru a trimite comenzi I2C. Aici vei avea de-a face cu două metode. Primul este write_word_data(), care acceptă trei argumente: adresa dispozitivului, registrul în care scrieți și valoarea pe care doriți să o scrieți.
Al doilea este read_word_data(), care acceptă doar adresa dispozitivului și registrul. ADC va citi continuu tensiunile și va stoca rezultatul în registrul de conversie. Cu această metodă, puteți prelua conținutul acelui registru.
Puteți înfrumuseța puțin rezultatul și apoi îl puteți imprima. Înainte de a vă întoarce la începutul buclei, introduceți o scurtă întârziere. Acest lucru vă va asigura că nu sunteți copleșit de date.
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)
Cam ai terminat. Hartați gama de valori pe care o obțineți la cea pe care o preferați, apoi trunchiați la numărul dorit de zecimale. Puteți personaliza funcția de imprimare astfel încât să imprimați o valoare nouă doar atunci când este diferită de ultima valoare. Dacă nu ești sigur max, min, și rundă, puteți consultați lista noastră cu cele mai importante 20 de funcții Python!
Confruntarea cu zgomotul
Acum, dacă configurația dvs. nu este super, super îngrijită și ordonată, veți observa ceva zgomot. Acesta este dezavantajul inerent al folosirii a 16 biți în loc de doar zece: acel mic zgomot va fi mai perceptibil.
Legând intrarea adiacentă (intrarea 1) la masă și schimbând modul astfel încât să comparați intrările unu și doi, puteți obține rezultate mult mai stabile. Puteți, de asemenea, să schimbați acele cabluri jumper lungi, care colectează zgomot, cu unele mici și să adăugați câțiva condensatori în timp ce sunteți la asta. Valoarea potențiometrului tău poate face, de asemenea, o diferență.
Există și opțiuni software. S-ar putea să creați o medie rulantă sau pur și simplu să ignorați micile modificări. Dezavantajul este că codul suplimentar va impune un cost de calcul. Dacă scrieți declarații condiționate într-un limbaj de nivel înalt precum Python și luați mii de mostre în fiecare secundă, aceste costuri se vor agrava rapid.
Mergeți mai departe cu mulți pași posibili
Preluarea citirilor prin I2C este destul de simplă și același lucru este valabil în mare parte pentru alte metode, cum ar fi SPI. Deși s-ar putea părea că există diferențe mari între opțiunile ADC disponibile, adevărul este că, odată ce ați făcut una dintre ele să funcționeze, este ușor să aplicați cunoștințele celorlalți.
Deci, de ce să nu ducem lucrurile mai departe? Legați mai multe potențiometre împreună sau încercați să citiți lumina, sunetul sau temperatura. Extindeți controlerul pe care tocmai l-ați creat și creați o configurație Raspberry Pi care este cu adevărat practică!