Začnite meriti svet okoli sebe s tem praktičnim in celovitim projektom.
Ključni zaključki
- Raspberry Pi nima analognega vhoda, vendar lahko dodate zunanje ADC za pretvorbo napetosti iz resničnega sveta v digitalno obliko za snemanje, manipulacijo in nadzor.
- Priljubljene možnosti ADC vključujejo MCP3004/MCP3008 za kompromis hitrosti in natančnosti ali ADS111x za 16-bitne odčitke pri počasnejši hitrosti vzorčenja.
- ADS1115 podjetja Adafruit je preprosta možnost s programirljivim ojačevalnikom ojačanja (PGA), ki vam omogoča zaznavanje majhnih napetostnih razlik in prilagajanje ojačanja med programom. Povezava z Raspberry Pi z uporabo I2C je enostavna.
Iz škatle Raspberry Pi nima analognega vhoda. To ga postavlja v slabši položaj v primerjavi s ploščami na osnovi mikrokrmilnikov, kot je Arduino.
Vendar ne obupajte: obstaja veliko možnosti, ki jih morate upoštevati. Začnite delovati z Raspberry Pi in zunanjim ADC.
Zakaj dodati vložke?
Resnični svet je poln pojavov, ki jih je mogoče zlahka opisati z uporabo napetosti, če imate pravo vezje. Prenesite te napetosti v digitalno obliko in jih lahko posnamete, manipulirate z njimi in jih uporabite za nadzor drugih parametrov in naprav.
Morda želite spremljati vlažnost vaše zemlje, temperaturo vašega rastlinjaka ali težo vašega hrčka. Morda želite svojemu Pi dodati nadzor glasnosti, zgraditi celotno banko faderjev ali oblikovati igralno palčko iz nič. Možnosti so bolj ali manj neomejene.
Možnosti za ADC
Torej, kateri ADC je najboljši za začetnike?
Med najbolj priljubljenimi in enostavnimi možnostmi so MCP3004 (in MCP3008) čipov podjetja Microchip. Dobili boste štiri (ali osem) kanalov po 10 bitov, ki lahko berejo do 200 kSPS. Na drugi strani pa so naprave ADS111x podjetja Texas Instruments, ki berejo 16 bitov pri 860 SPS. Torej obstaja kompromis med hitrostjo in natančnostjo (in, seveda, ceno).
Številni mikrokontrolerji imajo vgrajene ADC. ATMega, ki ga najdete na povprečnem Arduinu bo poleg vsega ponujal več 10-bitnih kanalov. To omogoča Arduinu, da zagotovi analogne vhode, kjer Raspberry Pi ne more. Če že imate Arduino vključen v svojo nastavitev in je 10 bitov dovolj zvestobe, je to morda najpreprostejši način.
Tukaj bomo poenostavili z ADS1115 podjetja Adafruit.
Kaj je programabilni ojačevalnik ojačanja?
Ta čip ima nekaj zanimivih funkcij, vključno s programirnim ojačevalnikom ojačanja (PGA). To vam bo omogočilo digitalno nastavitev želenega obsega vrednosti do delčka volta. S številom vrednosti, ki jih lahko predstavlja 16 bitov, vam bo to omogočilo zaznati razlike le nekaj mikrovoltov.
Prednost tukaj je, da lahko spremenite ojačanje sredi programa. Drugi čipi, kot je MCP3004, imajo drugačen pristop; imajo dodatni pin, na katerega lahko napajate referenčno napetost.
Kaj pa multipleksiranje?
Multiplekser (ali mux) je stikalo, ki vam omogoča branje številnih vhodov z enim samim ADC. Če ima vaš ADC čip veliko vhodnih zatičev, se dogaja nekaj notranjega multipleksiranja. Mux ADS1115 omogoča štiri vhode, ki jih lahko izberete prek notranjih registrov.
Ukvarjanje z registri
ADS1115 ponuja te možnosti in še nekaj drugih. Lahko se ukvarjate z multiplekserjem, prilagodite ojačanje, aktivirate vgrajeni primerjalnik, spremenite hitrost vzorčenja in preklopite napravo v način mirovanja z nizko porabo energije, vse s preklopom nekaj stikal.
Ampak kje so ta stikala? So znotraj paketa, v obliki zelo majhnih koščkov pomnilnika, imenovanega registri. Če želite aktivirati določeno funkcijo, morate ustrezen bit le nastaviti na 1 namesto na 0.
Gledati podatkovni list ADS111x, boste ugotovili, da so ti modeli opremljeni s štirimi registri, vključno s konfiguracijskimi registri, ki urejajo vedenje naprave.
Na primer, biti od 14 do 12 krmilijo multiplekser. Z uporabo teh treh bitov lahko izbirate med osmimi konfiguracijami. Tukaj boste želeli "100", kar bo dalo razliko med vhodno ničlo in tlemi. Biti od 7 do 5 na drugi strani urejajo hitrost vzorčenja. Če želite največ 860 vzorcev na sekundo, jih lahko nastavite na "111".
Ko veste, katere možnosti nastaviti, boste imeli dva bajta za pošiljanje v ADC. Če želite pozneje tu ali tam nastaviti en sam bit, jih lahko obravnavate posamezno z uporabo bitnih operaterjev.
Tukaj lahko pride do zmede. V tem primeru binarno ne predstavlja vrednosti, ampak vrednosti posameznih stikal. Te spremenljivke lahko izrazite kot eno veliko število, v decimalni ali šestnajstiški obliki. Če pa se želite izogniti preglavicam, se raje držite dvojiške različice, ki je lažja za branje.
Ožičenje
To napravo lahko priključite neposredno na ploščo. Vhod pozitivne napetosti bo sprejel kjerkoli med 2 in 5,5 V, kar pomeni, da bo 3,3 V vodilo na Raspberry Pi delovalo dobro.
Povežite vhode SDA in SCL s sorodniki na RPi in naredite iste stvari z ozemljitvijo in 3,3 V. Vzemite potenciometer med ozemljitveno in napetostno linijo ter vstavite srednji vod v prvi vhod ADC. To je vse, kar potrebujete za začetek!
Ukvarjanje z I2C
Različni ADC-ji delujejo prek različnih protokolov. V primeru našega ADS1115, uporabljali bomo I2C.
Naslednji primer bo sodeloval z ADC z uporabo Pythona. Toda preden to storite, ga boste morali nastaviti. Zadnje različice OS Raspberry Pi so to zelo poenostavile. Namenjen Nastavitve > Konfiguracija Raspberry Pi. Nato iz Vmesniki zavihek, stikalo I2C na.
Če želite preveriti, ali vse deluje, odprite terminal in zaženite:
sudo i2cdetect -y 1
Ta ukaz bo prikazal mrežo. Ob predpostavki, da vse deluje in ste pravilno povezali, se bo v mreži pojavila nova vrednost. To je naslov vašega ADC. Upoštevajte, da je to šestnajstiška vrednost, zato ji morate dodati predpono “0x” ko ga uporabite v spodnji kodi. Tukaj je 0x48:
Ko imate naslov, lahko uporabite knjižnico SMBus za pošiljanje ukazov I2C. Tukaj boste imeli opravka z dvema metodama. Prvi je write_word_data(), ki sprejme tri argumente: naslov naprave, register, v katerega pišete, in vrednost, ki jo želite zapisati.
Drugi je read_word_data(), ki sprejme le naslov naprave in register. ADC bo neprekinjeno bral napetosti in shranjeval rezultat v register pretvorbe. S to metodo lahko pridobite vsebino tega registra.
Rezultat lahko malo polepšate in nato natisnete. Preden se vrnete na začetek zanke, uvedite kratek zamik. Tako boste zagotovili, da ne boste preobremenjeni s podatki.
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)
Kmalu ste končali. Preslikajte obseg vrednosti, ki jih dobite, na tistega, ki vam je ljubši, in ga nato skrajšajte na želeno število decimalnih mest. Funkcijo tiskanja lahko prilagodite tako, da natisnete novo vrednost le, če se razlikuje od zadnje vrednosti. Če niste prepričani o maks, min, in krog, ti lahko preverite naš seznam 20 najpomembnejših funkcij Python!
Ukvarjanje s hrupom
Če vaša nastavitev ni super, super čedna in urejena, boste opazili nekaj hrupa. To je neločljiva slaba stran uporabe 16 bitov namesto le desetih: ta majhen šum bo bolj zaznaven.
Če povežete sosednji vhod (vhod 1) z ozemljitvijo in preklopite način tako, da primerjate vhoda ena in dva, lahko dobite veliko bolj stabilne rezultate. Lahko bi tudi zamenjali tiste dolge premostitvene kable, ki zbirajo hrup, za majhne in dodali nekaj kondenzatorjev, ko ste že pri tem. Tudi vrednost vašega potenciometra lahko vpliva.
Obstajajo tudi programske možnosti. Lahko ustvarite drseče povprečje ali preprosto zanemarite majhne spremembe. Slaba stran je, da bo dodatna koda povzročila računske stroške. Če pišete pogojne stavke v jeziku na visoki ravni, kot je Python, in jemljete na tisoče vzorcev vsako sekundo, se bodo ti stroški hitro povečali.
Pojdite dlje s številnimi možnimi naslednjimi koraki
Odčitavanje prek I2C je precej preprosto in enako v veliki meri velja za druge metode, kot je SPI. Čeprav se morda zdi, da obstajajo velike razlike med razpoložljivimi možnostmi ADC, je resnica, da ko enkrat zaženete eno od njih, je znanje preprosto uporabiti pri drugih.
Torej, zakaj ne bi šli stvari dlje? Povežite več potenciometrov skupaj ali poskusite odčitati svetlobo, zvok ali temperaturo. Razširite krmilnik, ki ste ga pravkar izdelali, in ustvarite nastavitev Raspberry Pi, ki je resnično praktična!