Aloita ympäröivän maailman mittaaminen tällä käytännöllisellä ja kattavalla projektilla.
Key Takeaways
- Raspberry Pi: stä puuttuu analoginen tulo, mutta voit lisätä ulkoisia ADC: itä muuntaaksesi todellisen maailman jännitteet digitaaliseen tallennusta, käsittelyä ja ohjausta varten.
- Suosittuja ADC-vaihtoehtoja ovat MCP3004/MCP3008 nopeuden ja tarkkuuden kompromisseihin tai ADS111x 16-bittisiin lukemiin hitaammalla näytetaajuudella.
- Adafruitin ADS1115 on yksinkertainen vaihtoehto, jossa on ohjelmoitava vahvistusvahvistin (PGA), jonka avulla voit havaita pienet jänniteerot ja säätää vahvistusta ohjelman aikana. Sen kytkeminen Raspberry Pi: llä I2C: n avulla on yksinkertaista.
Raspberry Pi: stä puuttuu analoginen tulo. Tämä asettaa sen epäedulliseen asemaan verrattuna mikrokontrolleripohjaisiin levyihin, kuten Arduino.
Mutta älä masennu: harkitsevia vaihtoehtoja on monia. Ota käyttöön Raspberry Pi ja ulkoinen ADC.
Miksi lisätä tuloja?
Tosimaailma on täynnä ilmiöitä, jotka voidaan helposti kuvata jännitteen avulla, jos sinulla on oikea piiri. Saat nämä jännitteet digitaaliseen muotoon, ja voit tallentaa niitä, käsitellä niitä ja käyttää niitä muiden parametrien ja laitteiden ohjaamiseen.
Saatat haluta seurata maaperäsi kosteutta, kasvihuoneesi lämpötilaa tai hamsterin painoa. Haluat ehkä lisätä äänenvoimakkuuden säätimen Pi-laitteeseen, rakentaa kokonaisen fader-pankin tai suunnitella ohjaussauvan tyhjästä. Mahdollisuudet ovat enemmän tai vähemmän rajattomat.
Vaihtoehdot ADC: ille
Joten mikä ADC on paras aloittelijoille?
Suosituimpia ja yksinkertaisimpia vaihtoehtoja ovat MCP3004 (ja MCP3008) Microchipin sirut. Saat neljä (tai kahdeksan) 10-bitistä kanavaa, jotka voivat lukea jopa 200 kSPS. Toisaalta on olemassa Texas Instrumentsin ADS111x-laitteita, jotka lukevat 16 bittiä 860 SPS: llä. Nopeuden ja tarkkuuden (ja luonnollisesti hinnan) välillä on siis kompromissi.
Monissa mikro-ohjaimissa on sisäänrakennettu ADC. ATMega, jonka löydät keskimääräisestä Arduinosta tarjoaa useita 10-bittisiä kanavia kaiken muun lisäksi. Tämä antaa Arduinolle mahdollisuuden tarjota analogisia tuloja siellä, missä Raspberry Pi ei pysty. Jos sinulla on jo Arduino mukana asennuksessasi ja 10 bittiä riittää, tämä saattaa itse asiassa olla helpoin tapa edetä.
Tässä pidämme asian yksinkertaisena Adafruitin ADS1115:n avulla.
Mikä on ohjelmoitava vahvistusvahvistin?
Tässä sirussa on muutamia mielenkiintoisia ominaisuuksia, kuten ohjelmoitava vahvistusvahvistin (PGA). Näin voit asettaa halutun arvoalueen digitaalisesti voltin murto-osaan asti. 16 bitin arvojen lukumäärän ansiosta voit havaita vain muutaman mikrovoltin erot.
Etuna tässä on, että voit muuttaa vahvistusta ohjelman puolivälissä. Muut sirut, kuten MCP3004, käyttävät erilaista lähestymistapaa; niissä on ylimääräinen nasta, johon voit syöttää referenssijännitteen.
Entä multipleksointi?
Multiplekseri (tai mux) on kytkin, jonka avulla voit lukea useita tuloja yhdellä ADC: llä. Jos ADC-sirussasi on monta tulonastaa, sisäistä multipleksointia on meneillään. ADS1115:n mux mahdollistaa neljä tuloa, jotka voit valita sisäisten rekisterien kautta.
Rekistereiden käsittely
ADS1115 tarjoaa nämä vaihtoehdot ja muutama muu. Voit käsitellä multiplekserin, säätää vahvistusta, aktivoida sisäänrakennetun komparaattorin, muuttaa näytteenottotaajuutta ja laittaa laitteen virransäästötilaan kääntämällä muutamaa kytkintä.
Mutta missä ne kytkimet ovat? Ne ovat pakkauksen sisällä hyvin pienten muistinpätkien muodossa rekisterit. Aktivoidaksesi tietyn ominaisuuden sinun tarvitsee vain asettaa asiaankuuluva bitti 1:ksi 0:n sijaan.
katsomassa ADS111x-tietolomake, huomaat, että näissä malleissa on neljä rekisteriä, mukaan lukien konfigurointirekisterit, jotka ohjaavat laitteen toimintaa.
Esimerkiksi bitit 14-12 ohjaavat multiplekserin. Näitä kolmea bittiä käyttämällä voit valita kahdeksasta kokoonpanosta. Haluat tässä on "100", joka antaa eron tulon nollan ja maan välillä. Toisaalta bitit 7 - 5 ohjaavat näytteenottotaajuutta. Jos haluat enintään 860 näytettä sekunnissa, voit asettaa ne arvoon "111".
Kun tiedät määritettävät asetukset, sinulla on kaksi tavua lähetettäväksi ADC: lle. Jos haluat myöhemmin asettaa yhden bitin tänne tai sinne, voit käsitellä niitä yksitellen bittikohtaisilla operaattoreilla.
Tässä se voi olla hämmentävää. Tässä tapauksessa binääri ei edusta arvoa, vaan yksittäisten kytkimien arvoja. Voit ilmaista nämä muuttujat yhtenä suurena numerona, desimaali- tai heksadesimaalilukuna. Mutta jos haluat välttää päänsärkyä, sinun tulee pysyä binääriversiossa, joka on helpompi lukea.
Johdotus
Voit kytkeä tämän laitteen suoraan leipälevyyn. Positiivinen jännitetulo hyväksyy missä tahansa välillä 2–5,5 V, mikä tarkoittaa, että Raspberry Pi: n 3,3 voltin kisko toimii hienosti.
Kytke SDA- ja SCL-tulot RPi: n vastaaviin ja tee samat asiat maan ja 3,3 voltin kanssa. Ota potentiometri maadoitus- ja jännitelinjojen väliin ja aseta keskijohdin ADC: n ensimmäiseen tuloon. Siinä on kaikki mitä tarvitset päästäksesi liikkeelle!
I2C: n käsittely
Eri ADC: t toimivat eri protokollien kautta. ADS1115:n tapauksessa aiomme käyttää I2C: tä.
Seuraava esimerkki on vuorovaikutuksessa ADC: n kanssa Pythonin avulla. Mutta ennen kuin teet sen, sinun on määritettävä se. Raspberry Pi OS: n uusimmat versiot ovat tehneet tästä erittäin yksinkertaisen. Suunnata Asetukset > Raspberry Pi -kokoonpano. Sitten alkaen Liitännät välilehti, kytkin I2C päällä.
Tarkistaaksesi, että kaikki toimii, avaa pääte ja suorita:
sudo i2cdetect -y 1
Tämä komento tulostaa ruudukon. Olettaen, että kaikki toimii ja olet kytkenyt sen oikein, näet uuden arvon ruudukossa. Tämä on ADC: n osoite. Muista tässä, että se on heksadesimaaliarvo, joten sinun on liitettävä se etuliitteeseen "0x" kun käytät sitä alla olevassa koodissa. Tässä, se on 0x48:
Kun sinulla on osoite, voit käyttää SMBus-kirjastoa I2C-komentojen lähettämiseen. Käsittelet täällä kahta tapaa. Ensimmäinen on write_word_data(), joka hyväksyy kolme argumenttia: laitteen osoite, rekisteri, johon kirjoitat, ja arvo, jonka haluat kirjoittaa.
Toinen on read_word_data(), joka hyväksyy vain laiteosoitteen ja rekisterin. ADC lukee jatkuvasti jännitteitä ja tallentaa tuloksen muunnosrekisteriin. Tällä menetelmällä voit noutaa kyseisen rekisterin sisällön.
Voit kaunistaa tulosta hieman ja tulostaa sen sitten. Ennen kuin palaat silmukan alkuun, ota käyttöön lyhyt viive. Tämä varmistaa, että et ole hukkunut dataan.
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)
Olet juuri valmis. Kartoita saamasi arvoalue haluamaasi arvoon ja katkaise sitten haluttuun määrään desimaaleja. Voit räätälöidä tulostustoiminnon niin, että tulostat uuden arvon vain, kun se eroaa viimeisestä arvosta. Jos olet epävarma max, min, ja pyöristää, sinä pystyt tutustu luetteloomme 20 tärkeimmästä Python-funktiosta!
Käsittely melun kanssa
Nyt huomaat jonkin verran melua, elleivät asetuksesi ole erittäin siistit ja siistit. Tämä on 16 bitin käytön luontainen haittapuoli 10 bitin sijaan: pieni kohina on havaittavissa paremmin.
Sitomalla viereisen tulon (tulo 1) maahan ja vaihtamalla tilan siten, että vertaat tuloja yksi ja kaksi, saat paljon vakaampia tuloksia. Voit myös vaihtaa nuo pitkät, melua keräävät jumpperikaapelit pieniin ja lisätä muutaman kondensaattorin samalla kun olet siinä. Potentiometrisi arvo voi myös vaikuttaa.
Tarjolla on myös ohjelmistovaihtoehtoja. Voit luoda liukuvan keskiarvon tai jättää pienet muutokset huomioimatta. Huono puoli on, että ylimääräinen koodi aiheuttaa laskentakustannuksia. Jos kirjoitat ehdollisia lausekkeita korkean tason kielellä, kuten Python, ja otat tuhansia näytteitä sekunnissa, nämä kustannukset kasvavat nopeasti.
Mene pidemmälle monien mahdollisten seuraavien vaiheiden avulla
Lukemien ottaminen I2C: n kautta on melko yksinkertaista, ja sama pätee suurelta osin muihin menetelmiin, kuten SPI: hen. Vaikka saattaa vaikuttaa siltä, että käytettävissä olevien ADC-vaihtoehtojen välillä on suuria eroja, totuus on, että kun olet saanut yhden niistä toimimaan, on helppoa soveltaa tietoa muihin.
Joten miksi ei viedä asioita pidemmälle? Yhdistä useita potentiometrejä yhteen tai yritä lukea valoa, ääntä tai lämpötilaa. Laajenna juuri tekemääsi ohjainta ja luo Raspberry Pi -kokoonpano, joka on todella käytännönläheinen!