Začněte měřit svět kolem vás pomocí tohoto praktického a komplexního projektu.
Klíčové věci
- Raspberry Pi postrádá analogový vstup, ale můžete přidat externí ADC pro převod napětí z reálného světa do digitální podoby pro záznam, manipulaci a ovládání.
- Mezi oblíbené možnosti ADC patří MCP3004/MCP3008 pro kompromis rychlosti a přesnosti nebo ADS111x pro 16bitové čtení při nižší vzorkovací frekvenci.
- ADS1115 od Adafruit je jednoduchá volba s programovatelným zesilovačem zesílení (PGA), který vám umožní detekovat malé rozdíly napětí a upravit zesílení během programu. Propojení s Raspberry Pi pomocí I2C je jednoduché.
Po vybalení postrádá Raspberry Pi analogový vstup. To jej znevýhodňuje ve srovnání s deskami založenými na mikrokontrolérech, jako je Arduino.
Ale nezoufejte: existuje spousta možností, které je třeba zvážit. Začněte pracovat s Raspberry Pi a externím ADC.
Proč přidávat vstupy?
Skutečný svět je plný jevů, které, pokud máte správné obvody, lze snadno popsat pomocí napětí. Získejte tato napětí do digitální podoby a můžete je zaznamenávat, manipulovat s nimi a používat je k ovládání dalších parametrů a zařízení.
Možná budete chtít sledovat vlhkost půdy, teplotu skleníku nebo váhu vašeho křečka. Možná budete chtít přidat ovladač hlasitosti k vašemu Pi, postavit celou sadu faderů nebo navrhnout joystick od začátku. Možnosti jsou víceméně neomezené.
Možnosti pro ADC
Takže, které ADC je nejlepší pro začátečníky?
Mezi nejoblíbenější a nejjednodušší možnosti patří MCP3004 (a MCP3008) čipy od Microchip. Získáte čtyři (nebo osm) kanály po 10 bitech, které mohou číst až 200 kSPS. Na druhé straně jsou zařízení ADS111x od Texas Instruments, která čtou 16 bitů při 860 SPS. Existuje tedy kompromis mezi rychlostí a přesností (a samozřejmě cenou).
Mnoho mikrokontrolérů je dodáváno s vestavěnými ADC. ATMega, který najdete na průměrném Arduinu nabídne několik 10bitových kanálů nad rámec všeho ostatního. To umožňuje Arduinu poskytovat analogové vstupy tam, kde Raspberry Pi nemůže. Pokud již máte ve svém nastavení zapojeno Arduino a 10 bitů je dostatečná věrnost, pak to může být ve skutečnosti nejjednodušší způsob, jak jít.
Zde to zjednodušíme s ADS1115 od Adafruit.
Co je to programovatelný zesilovač zesílení?
Tento čip přichází s několika zajímavými funkcemi, včetně PGA (Programmable Gain Amplifier). To vám umožní digitálně nastavit požadovaný rozsah hodnot až na zlomek voltu. S počtem hodnot, které může reprezentovat 16 bitů, vám to umožní detekovat rozdíly pouhých několika mikrovoltů.
Výhodou je, že můžete změnit zisk v polovině programu. Jiné čipy, jako je MCP3004, mají jiný přístup; jsou dodávány s extra pinem, na který můžete přivést referenční napětí.
A co multiplexování?
Multiplexer (neboli mux) je přepínač, který vám umožňuje číst mnoho vstupů pomocí jediného ADC. Pokud je váš čip ADC dodáván s mnoha vstupními kolíky, dochází k určitému vnitřnímu multiplexování. Mux ADS1115 umožňuje čtyři vstupy, které můžete vybrat pomocí interních registrů.
Práce s registry
ADS1115 poskytuje tyto možnosti a několik dalších navíc. Můžete si poradit s multiplexerem, upravit zesílení, aktivovat vestavěný komparátor, změnit vzorkovací frekvenci a uvést zařízení do režimu spánku s nízkou spotřebou, to vše přepnutím několika přepínačů.
Ale kde jsou ty spínače? Jsou uvnitř balení ve formě velmi malých kousků paměti tzv registrů. Chcete-li aktivovat danou funkci, stačí nastavit příslušný bit na 1, nikoli na 0.
Při pohledu na datový list ADS111x, zjistíte, že tyto modely jsou dodávány se čtyřmi registry, včetně konfiguračních registrů, které řídí chování zařízení.
Například bity 14 až 12 řídí multiplexor. Pomocí těchto tří bitů si můžete vybrat z osmi konfigurací. Ten, který zde budete chtít, je „100“, což dá rozdíl mezi vstupní nulou a zemí. Na druhé straně bity 7 až 5 řídí vzorkovací frekvenci. Pokud chcete maximum 860 vzorků za sekundu, můžete je nastavit na „111“.
Jakmile budete vědět, které možnosti nastavit, budete mít dva bajty k odeslání do ADC. Pokud později budete chtít nastavit jeden bit sem nebo tam, můžete se s nimi vypořádat individuálně pomocí bitových operátorů.
Tady to může být matoucí. V tomto případě binární soubor nepředstavuje hodnotu, ale hodnoty jednotlivých přepínačů. Tyto proměnné můžete vyjádřit jako jedno velké číslo, v desítkové nebo šestnáctkové soustavě. Pokud se ale chcete vyhnout bolestem hlavy, měli byste se držet binární verze, která se lépe čte.
Zapojení
Toto zařízení můžete zapojit přímo do prkénka. Vstup kladného napětí bude akceptovat kdekoli mezi 2 a 5,5 V, což znamená, že 3,3 V kolejnice na Raspberry Pi bude fungovat dobře.
Připojte vstupy SDA a SCL k protějškům na RPi a proveďte totéž se zemí a 3,3V. Získejte potenciometr mezi zemní a napěťové vedení a vložte střední vodič do prvního vstupu ADC. To je vše, co potřebujete, abyste mohli začít!
Jednání s I2C
Různé ADC pracují prostřednictvím různých protokolů. V případě našeho ADS1115, budeme používat I2C.
Následující příklad bude komunikovat s ADC pomocí Pythonu. Ale než to uděláte, musíte to nastavit. Nedávné verze operačního systému Raspberry Pi to velmi zjednodušily. Vydejte se Předvolby > Konfigurace Raspberry Pi. Poté z Rozhraní karta, přepínač I2C na.
Chcete-li zkontrolovat, zda vše funguje, otevřete terminál a spusťte:
sudo i2cdetect -y 1
Tento příkaz vygeneruje mřížku. Za předpokladu, že vše funguje a že jste to správně zapojili, uvidíte v mřížce novou hodnotu. Toto je adresa vašeho ADC. Zde mějte na paměti, že se jedná o hexadecimální hodnotu, takže ji musíte přidat předponu "0x" když jej použijete v kódu níže. Tady to je 0x48:
Jakmile budete mít adresu, můžete použít knihovnu SMBus k odesílání I2C příkazů. Zde se budete zabývat dvěma způsoby. První je write_word_data(), který přijímá tři argumenty: adresu zařízení, registr, do kterého zapisujete, a hodnotu, kterou chcete zapsat.
Druhá je read_word_data(), který přijímá pouze adresu zařízení a registr. ADC bude nepřetržitě číst napětí a ukládat výsledek do převodního registru. Pomocí této metody můžete načíst obsah tohoto registru.
Výsledek můžete trochu zkrášlit a poté vytisknout. Než se vrátíte na začátek smyčky, zaveďte krátké zpoždění. Tím zajistíte, že nebudete zahlceni daty.
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)
Právě jste hotovi. Namapujte rozsah hodnot, které získáváte, na ten, který preferujete, a poté zkraťte na požadovaný počet desetinných míst. Funkci tisku můžete přizpůsobit tak, abyste novou hodnotu vytiskli pouze tehdy, když se liší od poslední hodnoty. Pokud si nejste jisti max, min, a kolo, můžeš podívejte se na náš seznam 20 nejdůležitějších funkcí Pythonu!
Zacházení s hlukem
Nyní, pokud vaše nastavení není super, super čisté a uklizené, zaznamenáte nějaký hluk. To je inherentní nevýhoda použití 16 bitů místo pouhých deseti: ten malý šum bude vnímatelnější.
Propojením sousedního vstupu (vstup 1) se zemí a přepnutím režimu tak, že porovnáváte vstupy jedna a dva, můžete získat mnohem stabilnější výsledky. Můžete také vyměnit ty dlouhé startovací kabely pohlcující hluk za malé a přidat pár kondenzátorů, když už jste u toho. Hodnota vašeho potenciometru může také ovlivnit.
Existují také softwarové možnosti. Můžete vytvořit klouzavý průměr nebo jednoduše ignorovat malé změny. Nevýhodou je, že další kód bude vyžadovat výpočetní náklady. Pokud píšete podmíněné příkazy v jazyce na vysoké úrovni, jako je Python, a berete tisíce vzorků každou sekundu, tyto náklady se rychle zvýší.
Jděte dále s mnoha dalšími možnými kroky
Odečítání přes I2C je docela jednoduché a totéž do značné míry platí o jiných metodách, jako je SPI. I když se může zdát, že mezi dostupnými možnostmi ADC jsou velké rozdíly, pravdou je, že jakmile jednu z nich zprovozníte, je snadné tyto znalosti aplikovat na ostatní.
Proč to tedy neposunout dále? Spojte více potenciometrů dohromady nebo zkuste odečíst světlo, zvuk nebo teplotu. Rozšiřte ovladač, který jste právě vytvořili, a vytvořte nastavení Raspberry Pi, které je skutečně praktické!