Alustage ümbritseva maailma mõõtmist selle praktilise ja kõikehõlmava projektiga.
Võtmed kaasavõtmiseks
- Raspberry Pi-l puudub analoogsisend, kuid saate lisada väliseid ADC-sid, et teisendada reaalmaailma pinged digitaalseks vorminguks salvestamiseks, manipuleerimiseks ja juhtimiseks.
- Populaarsete ADC-valikute hulka kuuluvad MCP3004/MCP3008 kiiruse ja täpsuse kompromissi jaoks või ADS111x 16-bitiste lugemiste jaoks aeglasema diskreetimissagedusega.
- Adafruiti ADS1115 on lihtne valik koos programmeeritava võimenduse võimendiga (PGA), mis võimaldab tuvastada väikseid pingeerinevusi ja reguleerida võimendust programmi ajal. Selle ühendamine Raspberry Pi-ga I2C abil on lihtne.
Karbist välja võttes puudub Raspberry Pi-l analoogsisend. See seab selle ebasoodsasse olukorda võrreldes mikrokontrolleripõhiste tahvlitega, nagu Arduino.
Kuid ärge heitke meelt: kaaluda on palju võimalusi. Alustage Raspberry Pi ja välise ADC-ga.
Miks lisada sisendeid?
Reaalne maailm on täis nähtusi, mida saab õige vooluahela olemasolu korral pinge abil hõlpsasti kirjeldada. Võtke need pinged digitaalsel kujul ja saate neid salvestada, nendega manipuleerida ja kasutada neid muude parameetrite ja seadmete juhtimiseks.
Võimalik, et soovite jälgida oma mulla niiskust, kasvuhoone temperatuuri või hamstri kaalu. Võib-olla soovite lisada oma Pi-le helitugevuse regulaatori, luua terve hulga fadereid või kujundada nullist juhtkangi. Võimalused on enam-vähem piiramatud.
ADC-de valikud
Niisiis, milline ADC on algajatele parim?
Kõige populaarsemate ja arusaadavamate valikute hulgas on MCP3004 (ja MCP3008) Microchipi kiibid. Saate neli (või kaheksa) 10-bitist kanalit, mis suudavad lugeda kuni 200 kSPS. Teisest küljest on Texas Instrumentsi ADS111x-seadmed, mis loevad 16 bitti kiirusega 860 SPS. Seega on kiiruse ja täpsuse (ja loomulikult ka hinna) vahel kompromiss.
Paljudel mikrokontrolleritel on sisseehitatud ADC-d. ATMega, mille leiate keskmisest Arduinost pakub lisaks kõigele veel mitut 10-bitist kanalit. See võimaldab Arduinol pakkuda analoogsisendeid seal, kus Raspberry Pi ei saa. Kui teie seadistusse on juba kaasatud Arduino ja 10 bitist piisab, siis võib see olla kõige lihtsam viis.
Adafruiti ADS1115 abil teeme selle lihtsaks.
Mis on programmeeritav võimendusvõimendi?
Sellel kiibil on mõned huvitavad funktsioonid, sealhulgas programmeeritav võimendusvõimendi (PGA). See võimaldab teil määrata soovitud väärtuste vahemiku digitaalselt, kuni murdosa volti. Väärtuste arvuga, mida 16 bitti võib esindada, võimaldab see tuvastada vaid mõne mikrovoldi erinevusi.
Siin on eeliseks see, et saate võimendust programmi keskel muuta. Teised kiibid, nagu MCP3004, kasutavad teistsugust lähenemist; nendega on kaasas lisatihvt, millele saab anda võrdluspinge.
Aga multipleksimine?
Multiplekser (või mux) on lüliti, mis võimaldab lugeda paljusid sisendeid ühe ADC abil. Kui teie ADC kiibil on palju sisendkontakte, siis toimub sisemine multipleksimine. ADS1115 mux võimaldab nelja sisendit, mida saate valida sisemiste registrite kaudu.
Registritega tegelemine
ADS1115 pakub neid valikuid ja lisaks veel mõnda. Saate tegeleda multiplekseriga, reguleerida võimendust, aktiveerida sisseehitatud komparaatorit, muuta diskreetimissagedust ja lülitada seade vähese energiatarbega unerežiimile – seda kõike vaid mõne lüliti keeramisega.
Aga kus need lülitid on? Need on pakendi sees väga väikeste mälutükkide kujul registrid. Antud funktsiooni aktiveerimiseks peate lihtsalt määrama vastavaks bitiks 1, mitte 0.
Vaatan ADS111x andmeleht, leiate, et neil mudelitel on neli registrit, sealhulgas konfiguratsiooniregistrid, mis reguleerivad seadme käitumist.
Näiteks bitid 14 kuni 12 juhivad multiplekserit. Neid kolme bitti kasutades saate valida kaheksa konfiguratsiooni hulgast. See, mida siin soovite, on "100", mis annab erinevuse sisendi nulli ja maanduse vahel. Bitid 7 kuni 5 reguleerivad seevastu diskreetimissagedust. Kui soovite maksimaalselt 860 näidist sekundis, võite seada need väärtusele 111.
Kui teate, milliseid valikuid määrata, on teil kaks baiti ADC-le saata. Kui soovite hiljem määrata ühe biti siia või sinna, saate neid bitipõhiseid operaatoreid kasutades eraldi käsitleda.
Siin võib see segadusse ajada. Sel juhul ei esinda binaar väärtust, vaid üksikute lülitite väärtusi. Saate neid muutujaid väljendada ühe suure arvuna, kümnend- või kuueteistkümnendsüsteemis. Kuid kui soovite peavalu vältida, peaksite jääma binaarversioonile, mida on lihtsam lugeda.
Ühendage see üles
Saate selle seadme otse leivaplaadiga ühendada. Positiivne pingesisend võtab vastu 2–5,5 V, mis tähendab, et Raspberry Pi 3,3 V siinil töötab kenasti.
Ühendage SDA ja SCL sisendid RPi analoogidega ning tehke samad asjad maanduse ja 3,3 V pingega. Võtke potentsiomeeter maandus- ja pingeliinide vahele ning asetage keskmine juhe ADC esimesse sisendisse. See on kõik, mida vajate, et alustada!
I2C-ga tegelemine
Erinevad ADC-d töötavad erinevate protokollide kaudu. Meie ADS1115 puhul hakkame kasutama I2C.
Järgmine näide suhtleb Pythoni abil ADC-ga. Kuid enne selle tegemist peate selle seadistama. Raspberry Pi OS-i hiljutised versioonid on selle väga lihtsaks teinud. Suunduge Eelistused > Raspberry Pi konfiguratsioon. Siis alates Liidesed vahekaart, lüliti I2C peal.
Et kontrollida, kas kõik töötab, avage terminal ja käivitage:
sudo i2cdetect -y 1
See käsk väljastab ruudustiku. Eeldades, et kõik töötab ja olete selle õigesti ühendanud, näete ruudustikus uut väärtust. See on teie ADC aadress. Pidage siinkohal meeles, et see on kuueteistkümnendsüsteem, seega peate selle eesliidese lisama "0x" kui kasutate seda allolevas koodis. Siin, see on 0x48:
Kui teil on aadress, saate I2C-käskude saatmiseks kasutada SMBusi teeki. Siin käsitlete kahte meetodit. Esimene on write_word_data(), mis aktsepteerib kolme argumenti: seadme aadress, register, kuhu kirjutate, ja väärtus, mida soovite kirjutada.
Teine on read_word_data(), mis aktsepteerib ainult seadme aadressi ja registrit. ADC loeb pidevalt pingeid ja salvestab tulemuse teisendusregistrisse. Selle meetodi abil saate selle registri sisu alla laadida.
Saate tulemust veidi kaunistada ja seejärel printida. Enne tsükli algusesse naasmist viige sisse lühike viivitus. See tagab, et te ei ole andmetega üle koormatud.
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)
Olete just valmis. Kaardistage saadav väärtuste vahemik eelistatavaga ja seejärel kärpige soovitud arvu komakohtadeni. Saate kohandada printimisfunktsiooni nii, et prindite uus väärtus ainult siis, kui see erineb viimasest väärtusest. Kui te pole kindel max, min, ja ümmargune, sa saad vaadake meie 20 kõige olulisema Pythoni funktsiooni loendit!
Müraga tegelemine
Nüüd, kui teie seadistus pole ülihea, ülipuhas ja korras, märkate mõningast müra. See on 16 biti, mitte ainult kümne biti kasutamise omane negatiivne külg: see väike müra on paremini tajutav.
Seoses külgneva sisendi (sisend 1) maandusega ja lülitades režiimi nii, et võrdlete sisendeid üks ja kaks, saate palju stabiilsemaid tulemusi. Samuti võite need pikad müra koguvad hüppavad kaablid väikeste vastu välja vahetada ja lisada paar kondensaatorit. Ka teie potentsiomeetri väärtus võib muutuda.
Samuti on tarkvara valikud. Võite luua jooksva keskmise või jätta väikesed muudatused lihtsalt tähelepanuta. Negatiivne külg on see, et lisakood põhjustab arvutuskulusid. Kui kirjutate tingimuslauseid kõrgetasemelises keeles (nt Python) ja võtate igas sekundis tuhandeid proove, suurenevad need kulud kiiresti.
Jätkake paljude võimalike järgmiste sammudega
I2C kaudu näitude võtmine on üsna lihtne ja sama kehtib suures osas ka muude meetodite, näiteks SPI kohta. Ehkki võib tunduda, et saadaolevate ADC valikute vahel on suuri erinevusi, on tõde see, et kui üks neist on tööle saanud, on teadmisi lihtne teistele rakendada.
Niisiis, miks mitte asju edasi viia? Ühendage mitu potentsiomeetrit kokku või proovige lugeda valgust, heli või temperatuuri. Laiendage äsja loodud kontrollerit ja looge Raspberry Pi seadistus, mis on tõeliselt praktiline!