Následující projekt ukáže, jak lze vytvořit Ohmmetr na minipočítači Raspberry Pi 3, kterému pro tento projekt chybí to nejzásadnější – analogový vstup. Program bude ukázán v pythonu, ale v podstatě je (alespoň základní varianta programu) docela jednoduchý, takže zorientovat by se v něm měl každý.
Než začnu ukazovat, tak pokud chcete si projekt vytvořit podle návodu (seznam potřebných součástek je na konci) přesvědčte se že používá aktuální Raspbian Stretch se všemi aktualizacemi. Pro aktualizaci spusťte následující příkazy.
sudo apt update
sudo upgrade
Nic víc instalovat není třeba, v podstatě si vystačíte z úplně obyčejným čerstvým obrazem Raspbianu. Jediná věc, která je potřeba je povolení SPI v konfiguraci Raspberry Pi.
Problém chybějících analogových vstupů
Raspberry Pi je digitálně založený počítač na procesoru Broadcom. Takový čip se soustředí zejména na vysoký výpočetní výkon a nikoli jako univerzální čipy, které nepřekypují výkonem, ale funkcemi. Procesor BCM2837 neobsahuje žádný analogově digitální převodník (ADC) a je tak tedy nutno použít externí.
Externí ADC se vyrábí různé, různě přesné, s různým rozlišením, s více či méně kanály (počtem kolik veličin dokáží měřit najednou) a různým přístupovým rozhraním. Já jsem zvolil MCP3208, což je ADC od společnosti Microchip, který měří s rozlišením 12 bitů (vrací hodnoty 0 až 4095, které nám však knihovna převede na desetinné číslo od 0 do 1), má 8 kanálů (8 veličin lze měřit najednou, nám bude stačit jen jedna) a s okolím komunikuje pomocí přístupového rozhraní SPI. Jako bonus je komunikace s ním naimplementováno přímo v moderní a oficiálně podporované knihovně gpiozero.
Zapojení
Zapojení je jednoduché je třeba připojit ADC k napětí (modrý vodič je zem, červený je 3.3V) a nastavit mu referenční zem (hnědý) a horní napětí (fialový vodič) a připojit ho pomocí 4 vodičů SPI k malině (žlutý, zelený, oranžový, růžový). K orientaci v pinech můžete využít v terminálu utilitu pinout a web http://pinout.xyz.
Popis řešení
Pozn. Pokud elektrotechnice neholdujete tuto sekci klidně přeskočte, jedná se pouze o odvozování. Znalosti to jsou však velmi zásadní a užitečné.
A to je výsledný vzorec, který použijeme v programu, kde Rmer označíme jako proměnou x, Rref jako Rr a Umer jako y. Do proměnné Rr uložte hodnotu odporu, který používáte jako referenční.
Nejjednodušší varianta programu
from gpiozero import MCP3208
from time import sleep
mcp = MCP3208(channel=0)
Rr = 100.0 # referenční odpor
while True:
y = mcp.value
if y == 1:
print("inf Ω");
else:
x = float(y) * Rr / (1.0 - float(y))
print(str(round(x, 2)) + " Ω")
sleep(0.25)
Program je jednoduchý. Importuje knihovny, inicializuje komunikaci s ADC, nastavuje hodnotu proměnné referenčního odporu pro výpočet a v nekonečném cyklu čte hodnotu z převodníku MCP. S tou počítá podle výše uvedeného vzorce a hodnotu vypíše do terminálu. Ošetří ještě dělení nulou pro případ odpojeného měřeného rezistoru.
Softwarové vylepšení
Po tom, co jsme se se prohrabali teorií, hardwarem, elektrotechnikou (trochu matematikou), tak je na čase na trochu softwaru.
Vylepšíme výpis o funkci, která vypíše hodnotu odporu tak jak se označuje. Tzn. 5600 Ω vypíše jako 5K6. Celý kód je
from gpiozero import MCP3208
from time import sleep
from math import modf
mcp = MCP3208(channel=0)
Rr = 100000.0 # referenční odpor
def format_ohm(ohms):
if (ohms < 1000.0):
return str(round(ohms)) + "Ω"
if (ohms < 1000000.0):
ohms = round(ohms / 1000, 1)
return str(ohms).replace(".", "K")
else:
ohms = round(ohms / 1000000, 1)
return str(ohms).replace(".", "M")
while True:
y = mcp.value
if y == 1:
print("inf Ω");
else:
x = float(y) * Rr / (1.0 - float(y))
print(format_ohm(x))
sleep(0.25)
Přibyla funkce format_ohm, která formátování pomocí podmínky, zaokrouhlování a nahrazování desetinné tečky za K nebo M zajistí. Tato funkce se pak v hlavní smyčce samozřejmě ještě volá.
Závěr
Výstupem je velmi jednoduchý ohmmetr. Jeho přesnost závisí na přesnosti referenčního odporu a odporu vodičů. Pokud se Vám zdá hodně nepřesný zkuste vzdálenosti vodičů od sebe zkrátit. Rozsah ohmmetru je libovolný, záleží na referenčním odporu. Čím víc se hodnota měřeného odporu blíží hodnotě referenčního odporu, tím víc je ohmmetr přesný. Mě se po podařilo dosáhnout 1% tolerance při měření přesných (0.1% tolerance) stejných odporů. Prakticky však přesnost bývá o trochu menší.
Zdrojový kód naleznete ke stažení zde.
Seznam součástek