Kezdje el mérni az Önt körülvevő világot ezzel a praktikus és átfogó projekttel.

Kulcs elvitelek

  • A Raspberry Pi nem rendelkezik analóg bemenettel, de külső ADC-ket is hozzáadhat a valós világból származó feszültségek digitális formába alakításához rögzítéshez, manipulációhoz és vezérléshez.
  • A népszerű ADC opciók közé tartozik az MCP3004/MCP3008 a sebesség és a precízió kompromisszumához, vagy az ADS111x a 16 bites leolvasáshoz lassabb mintavételezéssel.
  • Az Adafruit ADS1115 egy egyszerű opció programozható erősítéssel (PGA), amely lehetővé teszi a kis feszültségkülönbségek észlelését és az erősítés beállítását a program során. A Raspberry Pi-vel az I2C segítségével történő bekötése egyszerű.

A dobozból kivéve a Raspberry Pi nem rendelkezik analóg bemenettel. Ez hátrányos helyzetbe hozza az olyan mikrokontroller-alapú kártyákhoz képest, mint az Arduino.

De ne essen kétségbe: rengeteg lehetőséget kell megfontolni. Kezdje el és futtassa a Raspberry Pi-vel és egy külső ADC-vel.

Miért kell bemeneteket hozzáadni?

instagram viewer

A való világ tele van olyan jelenségekkel, amelyek megfelelő áramkörrel könnyen leírhatók egy feszültség segítségével. Tegye ezeket a feszültségeket digitális formába, és rögzítheti, manipulálhatja őket, és más paraméterek és eszközök vezérlésére használhatja őket.

Lehetséges, hogy figyelemmel kíséri a talaj nedvességtartalmát, az üvegház hőmérsékletét vagy a hörcsög súlyát. Lehet, hogy hangerőszabályzót szeretne hozzáadni a Pi-hez, egy teljes fader-készletet szeretne felépíteni, vagy a semmiből tervez egy joystick-ot. A lehetőségek többé-kevésbé korlátlanok.

Lehetőségek ADC-khez

Tehát melyik ADC a legjobb kezdőknek?

A legnépszerűbb és legegyszerűbb lehetőségek közé tartozik a MCP3004 (és MCP3008) chipek a Microchiptől. Négy (vagy nyolc) egyenként 10 bites csatornát kap, amelyek akár 200 kSPS-t is képesek olvasni. Másrészt vannak a Texas Instruments ADS111x eszközei, amelyek 16 bitet olvasnak 860 SPS-sel. Tehát kompromisszum van a sebesség és a pontosság (és természetesen az ár) között.

Sok mikrokontroller beépített ADC-vel érkezik. Az ATMega, amelyet az átlagos Arduino-n talál több 10 bites csatornát kínál majd minden más mellett. Ez az, ami lehetővé teszi az Arduino számára, hogy analóg bemeneteket biztosítson ott, ahol a Raspberry Pi nem tud. Ha már van egy Arduino a beállításban, és 10 bit is elég hűség, akkor valójában ez a legegyszerűbb út.

Itt az Adafruit ADS1115-jével maradunk egyszerűek.

Mi az a programozható erősítésű erősítő?

Ez a chip néhány érdekes funkcióval rendelkezik, beleértve a programozható erősítésű erősítőt (PGA). Ez lehetővé teszi a kívánt értéktartomány digitális beállítását a volt töredékéig. A 16 bit által képviselt értékek számával ez lehetővé teszi, hogy mindössze néhány mikrovoltos eltérést észleljen.

Ennek az az előnye, hogy az erősítést a program felénél módosíthatja. Más chipek, mint például az MCP3004, más megközelítést alkalmaznak; jár hozzájuk egy extra tű, amire referencia feszültséget lehet táplálni.

Mi a helyzet a multiplexeléssel?

A multiplexer (vagy mux) egy olyan kapcsoló, amely lehetővé teszi számos bemenet olvasását egyetlen ADC használatával. Ha az ADC chip sok bemeneti érintkezőt tartalmaz, akkor valami belső multiplexelés történik. Az ADS1115 mux-ja négy bemenetet tesz lehetővé, amelyeket a belső regisztereken keresztül választhat ki.

Regiszterekkel való foglalkozás

Az ADS1115 ezeket a lehetőségeket kínálja, és még néhányat. Kezelheti a multiplexert, beállíthatja az erősítést, aktiválhatja a beépített komparátort, módosíthatja a mintavételi frekvenciát, és alacsony fogyasztású alvó üzemmódba helyezheti az eszközt, mindezt néhány kapcsoló átfordításával.

De hol vannak ezek a kapcsolók? A csomagban vannak, nagyon kis memóriadarabok formájában regisztereket. Egy adott szolgáltatás aktiválásához a megfelelő bitet 1-re kell állítania 0 helyett.

Ránéz az ADS111x adatlapot, látni fogja, hogy ezek a modellek négy regiszterrel rendelkeznek, köztük a konfigurációs regiszterekkel, amelyek szabályozzák az eszköz viselkedését.

Például a 14-12. bitek vezérlik a multiplexert. Ezzel a három bittel nyolc konfiguráció közül választhat. A „100”-at szeretné itt használni, ami megadja a különbséget a nulla bemenet és a föld között. A 7-től 5-ig terjedő bitek viszont szabályozzák a mintavételezési sebességet. Ha másodpercenként maximum 860 mintát szeretne, akkor ezeket „111”-re állíthatja.

Ha tudja, hogy mely beállításokat kell beállítani, két bájtja lesz az ADC-nek küldendő. Ha később be akarunk állítani egy bitet ide vagy oda, akkor azokat külön-külön is kezelhetjük bitenkénti operátorok segítségével.

Itt lehet, hogy ez zavaró lehet. Ebben az esetben a bináris nem egy értéket képvisel, hanem az egyes kapcsolók értékeit. Ezeket a változókat egyetlen nagy számként is kifejezheti, decimális vagy hexadecimális formában. De ha el akarod kerülni a fejfájást, akkor ragaszkodj a könnyebben olvasható bináris verzióhoz.

Bekötés

Ezt az eszközt közvetlenül a kenyérsütőtáblához csatlakoztathatja. A pozitív feszültség bemenet bárhol 2 és 5,5 V között fogad, ami azt jelenti, hogy a Raspberry Pi 3,3 V-os sínje szépen fog működni.

Csatlakoztassa az SDA és SCL bemeneteket az RPi megfelelőihez, és tegye ugyanezt a földdel és a 3,3 V-tal. Szereljen egy potenciométert a föld és a feszültségvezeték közé, és helyezze a középső vezetéket az ADC első bemenetébe. Ennyi kell az induláshoz!

Az I2C kezelése

A különböző ADC-k különböző protokollokon keresztül működnek. Az ADS1115 esetében I2C-t fogunk használni.

A következő példa kölcsönhatásba lép az ADC-vel a Python használatával. De mielőtt ezt megtenné, be kell állítania. A Raspberry Pi OS legújabb verziói ezt nagyon egyszerűvé tették. Irány Beállítások > Raspberry Pi konfiguráció. Aztán a Interfészek fül, kapcsoló I2C tovább.

Annak ellenőrzéséhez, hogy minden működik, nyisson meg egy terminált, és futtassa:

sudo i2cdetect -y 1

Ez a parancs egy rácsot fog kiadni. Feltételezve, hogy minden működik, és helyesen kötötte be, egy új érték jelenik meg a rácsban. Ez az ADC címe. Ne feledje, hogy ez egy hexadecimális érték, ezért előtagként kell megadnia "0x" amikor az alábbi kódban használja. Íme, ez van 0x48:

Ha megvan a cím, használhatja az SMBus könyvtárat I2C parancsok küldésére. Itt két módszerrel lesz dolgod. Az első az write_word_data(), amely három argumentumot fogad el: az eszköz címét, a regisztert, amelybe ír, és a beírni kívánt értéket.

A második az read_word_data(), amely csak az eszköz címét és a regisztert fogadja el. Az ADC folyamatosan olvassa a feszültségeket, és az eredményt a konverziós regiszterben tárolja. Ezzel a módszerrel lekérheti a regiszter tartalmát.

Kicsit szépítheti az eredményt, majd kinyomtathatja. Mielőtt visszatérne a ciklus elejére, vezessen be egy rövid késleltetést. Ez biztosítja, hogy ne legyen túlterhelve az adatokkal.

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 = 26300

whileTrue:
# 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)

Mindjárt készen vagy. Térképezze fel a kapott értéktartományt a kívánt értékre, majd csonkolja le a kívánt számú tizedesjegyre. A nyomtatási funkciót testreszabhatja úgy, hogy csak akkor nyomtatjon új értéket, ha az eltér az utolsó értéktől. Ha nem biztos abban max, min, és kerek, tudsz nézze meg a 20 legfontosabb Python-függvény listáját!

A zaj kezelése

Most, ha a beállítás nem szuper, szuper ügyes és rendezett, akkor észre fog venni némi zajt. Ez a benne rejlő hátránya annak, hogy 16 bit helyett csak tíz bitet használunk: ez a kis zaj jobban érzékelhető lesz.

Ha a szomszédos bemenetet (1. bemenet) a földhöz köti, és az üzemmódot úgy váltja, hogy az első és a második bemenetet összehasonlítja, sokkal stabilabb eredményeket érhet el. Kicserélheti azokat a hosszú, zajt gyűjtő jumperkábeleket is kicsire, és közben hozzáadhat néhány kondenzátort. A potenciométer értéke is változtathat.

Vannak szoftveres lehetőségek is. Létrehozhat egy gördülő átlagot, vagy egyszerűen figyelmen kívül hagyhatja a kis változtatásokat. A hátránya az, hogy az extra kód számítási költséget jelent. Ha feltételes kijelentéseket ír egy magas szintű nyelven, mint például a Python, és másodpercenként több ezer mintát vesz, ezek a költségek gyorsan növekedni fognak.

Menjen tovább a sok lehetséges következő lépéssel

Az I2C-n keresztüli leolvasás meglehetősen egyszerű, és ugyanez igaz más módszerekre is, például az SPI-re. Bár úgy tűnhet, hogy nagy különbségek vannak a rendelkezésre álló ADC-beállítások között, az igazság az, hogy miután az egyik működik, könnyen alkalmazható a tudás a többire.

Szóval miért nem viszi tovább a dolgokat? Kössön össze több potenciométert, vagy próbálja meg leolvasni a fényt, a hangot vagy a hőmérsékletet. Bővítse ki az imént elkészített vezérlőt, és hozzon létre egy igazán praktikus Raspberry Pi beállítást!