Začnite merať svet okolo seba pomocou tohto praktického a komplexného projektu.

Kľúčové informácie

  • Raspberry Pi nemá analógový vstup, ale môžete pridať externé ADC na konverziu napätia z reálneho sveta do digitálnej podoby na nahrávanie, manipuláciu a ovládanie.
  • Populárne možnosti ADC zahŕňajú MCP3004/MCP3008 pre rýchlosť a presnosť kompromisu alebo ADS111x pre 16-bitové čítania pri nižšej vzorkovacej frekvencii.
  • ADS1115 od Adafruit je jednoduchá možnosť s programovateľným zosilňovačom zosilnenia (PGA), ktorý vám umožňuje zistiť malé rozdiely v napätí a upraviť zosilnenie počas programu. Zapojenie s Raspberry Pi pomocou I2C je jednoduché.

Raspberry Pi po vybalení nemá analógový vstup. To ho znevýhodňuje v porovnaní s doskami založenými na mikrokontroléroch, ako je Arduino.

Ale nezúfajte: existuje veľa možností, ktoré treba zvážiť. Začnite pracovať s Raspberry Pi a externým ADC.

Prečo pridávať vstupy?

Skutočný svet je plný javov, ktoré, ak máte správne obvody, možno ľahko opísať pomocou napätia. Dostaňte tieto napätia do digitálnej podoby a môžete ich zaznamenávať, manipulovať s nimi a používať ich na ovládanie iných parametrov a zariadení.

instagram viewer

Možno budete chcieť sledovať vlhkosť pôdy, teplotu skleníka alebo hmotnosť škrečka. Možno chcete pridať ovládač hlasitosti do svojho Pi, zostaviť celú skupinu faderov alebo navrhnúť joystick od začiatku. Možnosti sú viac-menej neobmedzené.

Možnosti pre ADC

Takže, ktoré ADC je najlepšie pre začiatočníkov?

Medzi najobľúbenejšie a najjednoduchšie možnosti patria MCP3004 (a MCP3008) čipy od Microchip. Získate štyri (alebo osem) kanálov po 10 bitoch, ktoré dokážu čítať až 200 kSPS. Na druhej strane sú tu zariadenia ADS111x od Texas Instruments, ktoré čítajú 16 bitov pri 860 SPS. Existuje teda kompromis medzi rýchlosťou a presnosťou (a samozrejme cenou).

Mnoho mikrokontrolérov sa dodáva so vstavanými ADC. ATMega, ktorý nájdete na priemernom Arduine okrem všetkého ostatného ponúkne niekoľko 10-bitových kanálov. To umožňuje Arduinu poskytovať analógové vstupy tam, kde to Raspberry Pi nedokáže. Ak už máte vo svojom nastavení zapojené Arduino a 10 bitov je dostatočná vernosť, potom to môže byť v skutočnosti najjednoduchší spôsob.

Tu to urobíme jednoducho, s ADS1115 od Adafruit.

Čo je to programovateľný zosilňovač zisku?

Tento čip prichádza s niekoľkými zaujímavými funkciami, vrátane programovateľného zosilňovača zosilnenia (PGA). To vám umožní nastaviť požadovaný rozsah hodnôt digitálne, až na zlomok voltu. S počtom hodnôt, ktoré môže reprezentovať 16 bitov, vám to umožní zistiť rozdiely len niekoľkých mikrovoltov.

Výhodou je, že môžete zmeniť zisk v polovici programu. Iné čipy, ako napríklad MCP3004, majú iný prístup; dodávajú sa s dodatočným kolíkom, na ktorý môžete priviesť referenčné napätie.

A čo multiplexovanie?

Multiplexer (alebo mux) je prepínač, ktorý vám umožňuje čítať veľa vstupov pomocou jedného ADC. Ak je váš čip ADC dodávaný s mnohými vstupnými kolíkmi, dochádza k určitému internému multiplexovaniu. Mux ADS1115 umožňuje štyri vstupy, ktoré si môžete vybrať pomocou interných registrov.

Práca s registrami

ADS1115 poskytuje tieto možnosti a niekoľko ďalších. Môžete si poradiť s multiplexerom, upraviť zosilnenie, aktivovať vstavaný komparátor, zmeniť vzorkovaciu frekvenciu a uviesť zariadenie do režimu spánku s nízkou spotrebou energie, a to všetko prepnutím niekoľkých prepínačov.

Ale kde sú tie spínače? Sú vo vnútri balenia vo forme veľmi malých kúskov pamäte, tzv registrov. Ak chcete aktivovať danú funkciu, stačí nastaviť príslušný bit na 1, nie na 0.

Pozerajúc sa na katalógový list ADS111x, zistíte, že tieto modely sa dodávajú so štyrmi registrami vrátane konfiguračných registrov, ktoré riadia správanie zariadenia.

Napríklad bity 14 až 12 riadia multiplexer. Pomocou týchto troch bitov si môžete vybrať z ôsmich konfigurácií. Ten, ktorý tu budete chcieť, je „100“, čo dá rozdiel medzi vstupnou nulou a zemou. Bity 7 až 5 na druhej strane riadia vzorkovaciu frekvenciu. Ak chcete maximálne 860 vzoriek za sekundu, môžete ich nastaviť na „111“.

Keď budete vedieť, ktoré možnosti nastaviť, budete mať dva bajty na odoslanie do ADC. Ak neskôr budete chcieť nastaviť jeden bit tu alebo tam, môžete s nimi zaobchádzať individuálne pomocou bitových operátorov.

Tu je miesto, kde to môže byť mätúce. V tomto prípade binárny súbor nepredstavuje hodnotu, ale hodnoty jednotlivých prepínačov. Tieto premenné môžete vyjadriť ako jedno veľké číslo, v desiatkovej sústave alebo v šestnástkovej sústave. Ak sa však chcete vyhnúť bolestiam hlavy, mali by ste sa držať binárnej verzie, ktorá je ľahšie čitateľná.

Wiring It Up

Toto zariadenie môžete zapojiť priamo do kontaktnej dosky. Vstup kladného napätia bude akceptovať kdekoľvek medzi 2 a 5,5 V, čo znamená, že 3,3 V koľajnica na Raspberry Pi bude fungovať dobre.

Pripojte vstupy SDA a SCL k náprotivkom na RPi a urobte to isté so zemou a 3,3 V. Získajte potenciometer medzi zem a napäťové vedenie a vložte stredný vodič do prvého vstupu ADC. To je všetko, čo potrebujete, aby ste mohli začať!

Zaobchádzanie s I2C

Rôzne ADC pracujú prostredníctvom rôznych protokolov. V prípade nášho ADS1115, budeme používať I2C.

Nasledujúci príklad bude interagovať s ADC pomocou Pythonu. Ale skôr ako to urobíte, musíte to nastaviť. Nedávne verzie operačného systému Raspberry Pi to veľmi zjednodušili. Zamierte k Predvoľby > Konfigurácia Raspberry Pi. Potom z Rozhrania záložka, prepínač I2C na.

Ak chcete skontrolovať, či všetko funguje, otvorte terminál a spustite:

sudo i2cdetect -y 1

Tento príkaz vytvorí výstup mriežky. Za predpokladu, že všetko funguje a že ste to správne pripojili, uvidíte v mriežke novú hodnotu. Toto je adresa vášho ADC. Majte na pamäti, že ide o hexadecimálnu hodnotu, takže ju musíte zadať ako predponu "0x" keď ho použijete v kóde nižšie. Tu to je 0x48:

Keď máte adresu, môžete použiť knižnicu SMBus na odosielanie príkazov I2C. Tu sa budete zaoberať dvoma spôsobmi. Prvým je write_word_data(), ktorý akceptuje tri argumenty: adresu zariadenia, register, do ktorého zapisujete, a hodnotu, ktorú chcete zapísať.

Druhá je read_word_data(), ktorý akceptuje iba adresu zariadenia a register. ADC bude nepretržite čítať napätia a ukladať výsledok do konverzného registra. Pomocou tejto metódy môžete získať obsah tohto registra.

Výsledok môžete trochu skrášliť a potom vytlačiť. Predtým, ako sa vrátite na začiatok cyklu, zaveďte krátke oneskorenie. Tým sa zabezpečí, že nebudete zahltení údajmi.

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)

Práve ste skončili. Namapujte rozsah hodnôt, ktoré získate, na ten, ktorý uprednostňujete, a potom ho skráťte na požadovaný počet desatinných miest. Funkciu tlače môžete prispôsobiť tak, že novú hodnotu vytlačíte len vtedy, keď sa bude líšiť od poslednej hodnoty. Ak si nie ste istý max, min, a okrúhly, môžeš pozrite si náš zoznam 20 najdôležitejších funkcií Pythonu!

Zaobchádzanie s hlukom

Teraz, ak vaše nastavenie nie je super, super čisté a upratané, všimnete si nejaký hluk. Toto je inherentná nevýhoda použitia 16 bitov namiesto iba desiatich: ten malý šum bude vnímateľnejší.

Priviazaním susedného vstupu (vstup 1) k zemi a prepnutím režimu tak, aby ste porovnávali vstupy jedna a dva, môžete získať oveľa stabilnejšie výsledky. Môžete tiež vymeniť tieto dlhé štartovacie káble pohlcujúce hluk za malé a pridať niekoľko kondenzátorov. Hodnota vášho potenciometra môže tiež znamenať rozdiel.

Existujú aj softvérové ​​​​možnosti. Môžete vytvoriť kĺzavý priemer alebo jednoducho ignorovať malé zmeny. Nevýhodou je, že dodatočný kód bude vyžadovať výpočtové náklady. Ak píšete podmienené príkazy v jazyku vysokej úrovne, ako je Python, a každú sekundu odoberáte tisíce vzoriek, tieto náklady sa rýchlo zvýšia.

Choďte ďalej s mnohými možnými ďalšími krokmi

Odčítanie údajov cez I2C je celkom jednoduché a to isté do značnej miery platí pre iné metódy, ako je SPI. Aj keď by sa mohlo zdať, že medzi dostupnými možnosťami ADC sú veľké rozdiely, pravdou je, že keď už jedna z nich funguje, je ľahké aplikovať znalosti na ostatné.

Tak prečo neposunúť veci ďalej? Spojte viacero potenciometrov alebo skúste čítať svetlo, zvuk alebo teplotu. Rozšírte ovládač, ktorý ste práve vytvorili, a vytvorte si nastavenie Raspberry Pi, ktoré je skutočne praktické!