Pradėkite matuoti jus supantį pasaulį su šiuo praktišku ir visapusišku projektu.
Key Takeaways
- Raspberry Pi trūksta analoginės įvesties, tačiau galite pridėti išorinių ADC, kad konvertuotumėte realaus pasaulio įtampą į skaitmeninę formą, skirtą įrašyti, manipuliuoti ir valdyti.
- Populiarios ADC parinktys apima MCP3004 / MCP3008, skirtą greičio ir tikslumo kompromisui, arba ADS111x, skirtą 16 bitų skaitymui esant lėtesniam atrankos dažniui.
- Adafruit ADS1115 yra paprastas pasirinkimas su programuojamu stiprinimo stiprintuvu (PGA), kuris leidžia aptikti nedidelius įtampos skirtumus ir reguliuoti stiprinimą programos metu. Sujungti jį su Raspberry Pi naudojant I2C yra nesudėtinga.
Iš dėžutės Raspberry Pi trūksta analoginės įvesties. Dėl to ji atsiduria nepalankioje padėtyje, palyginti su mikrovaldikliais pagrįstomis plokštėmis, tokiomis kaip „Arduino“.
Tačiau nenusiminkite: yra daugybė variantų, kuriuos reikia apsvarstyti. Pradėkite ir paleiskite naudodami Raspberry Pi ir išorinį ADC.
Kodėl pridėti įvesties?
Tikrasis pasaulis pilnas reiškinių, kuriuos, jei turite tinkamą grandinę, galima lengvai apibūdinti naudojant įtampą. Įveskite tas įtampas į skaitmeninę formą ir galėsite jas įrašyti, valdyti ir valdyti kitus parametrus bei įrenginius.
Galbūt norėsite stebėti dirvožemio drėgmę, šiltnamio temperatūrą arba žiurkėnų svorį. Galbūt norėsite pridėti garsumo valdiklį prie savo Pi, sukurti visą faderių banką arba sukurti vairasvirtę nuo nulio. Galimybės daugiau ar mažiau neribotos.
ADC parinktys
Taigi, kuris ADC yra geriausias pradedantiesiems?
Tarp populiariausių ir paprasčiausių variantų yra MCP3004 (ir MCP3008) lustai iš Microchip. Jūs gausite keturis (arba aštuonis) kanalus po 10 bitų, kurie gali nuskaityti iki 200 kSPS. Kita vertus, yra „Texas Instruments“ ADS111x įrenginiai, kurie skaito 16 bitų esant 860 SPS. Taigi, yra kompromisas tarp greičio ir tikslumo (ir, žinoma, kainos).
Daugelis mikrovaldiklių yra su įmontuotais ADC. ATMega, kurį rasite vidutiniame Arduino be viso kito pasiūlys kelis 10 bitų kanalus. Tai leidžia „Arduino“ teikti analogines įvestis ten, kur „Raspberry Pi“ negali. Jei sąrankoje jau naudojate „Arduino“ ir 10 bitų pakanka, tai iš tikrųjų gali būti lengviausias būdas.
Čia mes tai padarysime paprastai, naudodami ADS1115 iš „Adafruit“.
Kas yra programuojamas stiprinimo stiprintuvas?
Šis lustas turi keletą įdomių funkcijų, įskaitant programuojamą stiprinimo stiprintuvą (PGA). Tai leis jums skaitmeniniu būdu nustatyti norimą verčių diapazoną iki volto dalies. Turėdami 16 bitų reikšmių skaičių, galėsite aptikti vos kelių mikrovoltų skirtumus.
Privalumas yra tas, kad galite pakeisti padidėjimą programos viduryje. Kiti lustai, tokie kaip MCP3004, laikosi kitokio požiūrio; jie yra su papildomu kaiščiu, į kurį galite tiekti atskaitos įtampą.
Ką apie multipleksavimą?
Multiplekseris (arba mux) yra jungiklis, leidžiantis nuskaityti daugybę įėjimų naudojant vieną ADC. Jei jūsų ADC lustas turi daug įvesties kaiščių, tada vyksta vidinis tankinimas. ADS1115 mux leidžia keturis įėjimus, kuriuos galite pasirinkti per vidinius registrus.
Darbas su registrais
ADS1115 suteikia šias parinktis ir dar keletą. Galite susidoroti su multiplekseriu, reguliuoti stiprinimą, suaktyvinti įtaisytąjį lyginamąjį įrenginį, pakeisti mėginių ėmimo dažnį ir įjungti įrenginį į mažos galios miego režimą – visa tai galite pasukti kelis jungiklius.
Bet kur tie jungikliai? Jie yra pakuotės viduje kaip labai maži atminties fragmentai, vadinami registrai. Norėdami suaktyvinti nurodytą funkciją, tereikia atitinkamą bitą nustatyti į 1, o ne į 0.
Žiūrėti į ADS111x duomenų lapą, pamatysite, kad šiuose modeliuose yra keturi registrai, įskaitant konfigūracijos registrus, kurie valdo įrenginio veikimą.
Pavyzdžiui, 14–12 bitai valdo multiplekserį. Naudodami šiuos tris bitus galite pasirinkti iš aštuonių konfigūracijų. Čia norėsite „100“, kuris parodys skirtumą tarp įvesties nulio ir žemės. Kita vertus, 7–5 bitai reguliuoja mėginių ėmimo dažnį. Jei norite maksimaliai 860 mėginių per sekundę, galite nustatyti juos į „111“.
Kai žinosite, kurias parinktis nustatyti, turėsite du baitus siųsti į ADC. Jei vėliau norėsite nustatyti vieną bitą čia arba ten, galite juos tvarkyti atskirai naudodami bitų operatorius.
Štai kur tai gali sukelti painiavą. Šiuo atveju dvejetainis yra ne reikšmė, o atskirų jungiklių reikšmės. Šiuos kintamuosius galite išreikšti vienu dideliu skaičiumi dešimtainiu arba šešioliktainiu. Bet jei norite išvengti galvos skausmo, turėtumėte laikytis dvejetainės versijos, kurią lengviau skaityti.
Sujungimas
Šį įrenginį galite prijungti tiesiai prie duonos lentos. Teigiama įtampos įvestis bus priimtina nuo 2 iki 5,5 V, o tai reiškia, kad Raspberry Pi 3,3 V bėgis veiks gerai.
Sujunkite SDA ir SCL įvestis su RPi analogais ir atlikite tuos pačius veiksmus su žeme ir 3,3 V. Paimkite potenciometrą tarp įžeminimo ir įtampos linijų, o vidurinį laidą įkiškite į pirmąją ADC įvestį. Tai viskas, ko jums reikia norint pradėti!
Darbas su I2C
Skirtingi ADC veikia skirtingais protokolais. Mūsų ADS1115 atveju, mes naudosime I2C.
Šis pavyzdys sąveikaus su ADC naudojant Python. Tačiau prieš tai darydami turėsite jį nustatyti. Naujausios Raspberry Pi OS versijos padarė tai labai paprasta. Eikite į Parinktys > Raspberry Pi konfigūracija. Tada iš Sąsajos skirtukas, jungiklis I2C įjungta.
Norėdami patikrinti, ar viskas veikia, atidarykite terminalą ir paleiskite:
sudo i2cdetect -y 1
Ši komanda išves tinklelį. Darant prielaidą, kad viskas veikia ir teisingai sujungėte, tinklelyje pamatysite naują reikšmę. Tai yra jūsų ADC adresas. Turėkite omenyje, kad tai šešioliktainė reikšmė, todėl ją reikia įrašyti prieš jį "0x" kai naudojate jį toliau pateiktame kode. Štai, tai 0x48:
Kai turėsite adresą, galite naudoti SMBus biblioteką I2C komandoms siųsti. Čia susidursite su dviem būdais. Pirmasis yra write_word_data(), kuris priima tris argumentus: įrenginio adresą, registrą, į kurį rašote, ir reikšmę, kurią norite įrašyti.
Antrasis yra read_word_data(), kuris priima tik įrenginio adresą ir registrą. ADC nuolat skaitys įtampą ir išsaugos rezultatą konversijos registre. Naudodami šį metodą galite nuskaityti to registro turinį.
Galite šiek tiek pagražinti rezultatą, o tada jį atsispausdinti. Prieš grįždami į ciklo pradžią, įveskite trumpą delsą. Tai užtikrins, kad nesate perkrautas duomenimis.
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)
Jūs ką tik baigėte. Susiekite gautą verčių diapazoną su pageidaujama verte, tada sutrumpinkite iki norimo skaičių po kablelio. Galite pritaikyti spausdinimo funkciją taip, kad naują reikšmę spausdintumėte tik tada, kai ji skiriasi nuo paskutinės reikšmės. Jei nesate tikri dėl maks, min, ir apvalus, tu gali peržiūrėkite mūsų 20 svarbiausių Python funkcijų sąrašą!
Kova su triukšmu
Dabar, nebent jūsų sąranka yra super, itin tvarkinga ir tvarkinga, pastebėsite tam tikrą triukšmą. Tai yra būdingas 16 bitų, o ne tik dešimties, trūkumas: tas nedidelis triukšmas bus labiau juntamas.
Susieję gretimą įvestį (1 įvestį) su įžeminimu ir perjungę režimą taip, kad palygintumėte pirmą ir antrą įvestis, galite gauti daug stabilesnių rezultatų. Taip pat galite pakeisti tuos ilgus triukšmą sugeriančius trumpiklius į mažus ir pridėti kelis kondensatorius. Jūsų potenciometro vertė taip pat gali turėti įtakos.
Taip pat yra programinės įrangos parinkčių. Galite sukurti slenkantį vidurkį arba tiesiog nepaisyti nedidelių pakeitimų. Neigiama yra tai, kad papildomas kodas pareikalaus skaičiavimo išlaidų. Jei rašote sąlyginius teiginius aukšto lygio kalba, pvz., Python, ir kas sekundę imsite tūkstančius pavyzdžių, šios išlaidos greitai padidės.
Atlikite daug galimų tolesnių veiksmų
Skaityti per I2C yra gana paprasta ir tas pats pasakytina apie kitus metodus, pvz., SPI. Nors gali atrodyti, kad tarp galimų ADC parinkčių yra didelių skirtumų, tiesa ta, kad kai tik viena iš jų veikia, žinias bus lengva pritaikyti kitoms.
Taigi, kodėl gi ne toliau? Sujunkite kelis potenciometrus arba pabandykite nuskaityti šviesą, garsą ar temperatūrą. Išplėskite ką tik sukurtą valdiklį ir sukurkite „Raspberry Pi“ sąranką, kuri tikrai būtų praktiška!