Raspberry Pi
28) Teplotní čidlo SMT160
Na diskusním fóru na stránkách RasPi.cz, u článku
pojednávajícím o měření teploty se řešily výhody
a nevýhody různých způsobů měření. Já jsem se pokusil
zprovoznit ještě jeden typ teplotního čidla, který by měl být hodně
odolný proti rušení, takže umožňuje měřit teplotu i na vzdálených
místech.
To teplotní čidlo má označení SMT160 a pracuje na
principu změny střídy obdélníkového signálu.
Při běžné pokojové teplotě je výstupem z čidla obdélníkový
signál s frekvencí asi 3kHz.
Tento signál má poměr mezi délkou trvání logické "1" a délkou
periody dán vztahem:
T1 /
T = 0.320 + 0.00470 * t
|
T1
je délka trvání logické "1"
T
je délka celé periody
t je teplota ve °C
Při první rozvaze před vytvořením programu jsem se
domníval, že nejjednodušší bude zjišťovat, kdy dochází k překlápění
signálu mezi logickými úrovněmi.
Přesný čas překlápění jsem chtěl
zaznamenávat a počítat z něj poměr T1
/ T.
Nakonec se ukázalo, že tudy cesta nevede. Python ani
BASH nebyly dostatečně rychlé programovací jazyky, aby zaznamenaly přesné
časy překlápění.
Když už jsem se chystal na to, že zkusím program sepsat v "Céčku",
objevil jsem na internetu naprosto jednouché řešení.
Základem je, že se načte dostatečně velký počet vzorků na portu,
ke kterému je připojené čidlo. Některé z těchto vzorků se trefí
do doby, kdy je signál v "1", jiné vzorky se trefí do "0". Pokud je počet vzorků dostatečně velký (např. 100
000), stačí pak už jen spočítat kolik vzorků bylo v "1" a
vydělit tuto hodnotu celkovým počtem vzorků.
Existuje sice teoretická možnost, že se
rychlost čtení dat sesynchronizuje s frekvencí (nebo přesným násobkem
frekvence), na které čidlo vysílá signál. Je to ale velice nepravděpodobné.
V tom případě by byl vypočtený poměr 1:1 (nebo 0:1).
Upravený (trochu zjednodušený) program z výše uvedených
stránek je tady.
Nesnažte se měnit druhou část podmínky, která se zdá být zbytečná
(else: count+=0). Ta podmínka je tam kvůli tomu, aby byl stejný čas výpočtu
při čtení logické "0", jako je při čtení logické
"1".
Pokud se do některé větve podmínky vřadí libovolný příkaz navíc,
posune to výslednou hodnotu teploty o několik °C.
#!/usr/bin/python
# puvodni program: http://ndinev.alle.bg/
import RPi.GPIO as GPIO
# to use Raspberry Pi board pin numbers
GPIO.setmode(GPIO.BOARD)
# define board pin
pin=15 # cislo pinu 15 na konektoru odpovida GPIO22
# set up the GPIO channels - one input and one output
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_OFF)
# read pin 100000 times
count=0
cycles=100000
for i in range(cycles):
if (GPIO.input(pin)):
count+=1
else:
count+=0
# calculate temp
dc=count/float(cycles)
temp=round( ((dc-0.32)/0.0047), 1)
print temp
|
Program běží perfektně. Rozdíl mezi dvěma po sobě následujícími
měřeními byl maximálně 0,2°C a tato teplota odpovídala teplotě naměřené
jinými teploměry.
Schéma připojení čidla na krátkou vzdálenost:
Problém však nastal při připojení čidla s dlouhým kabelem.
Je dost nebezpečné, připojovat dlouhý kabel přímo ke GPIO portu.
Na dlouhých vodičích se mohou indukovat různé
napěťové špičky, které by mohly Raspíčko zničit. Proto je dobré
použít nějaký oddělovač mezi RasPi a dlouhý drát.
Já jsem zkusil jako oddělovač použít běžný levný optočlen PC-817.
Tento optočlen obsahuje na výstupu pouze jeden tranzistor, takže obrací fázi vstupního
signálu.
Když je na vstupu "1", LEDka svítí. Tranzistor je
proto sepnutý, a na jeho kolektoru je nízká úroveň napětí (logická
"0").
Když je na vstupu "0", LEDka nesvítí, tranzistor je rozepnutý
a na jeho kolektoru je udržována přes odpor 1k logická
"1".
Kvůli tomu obracení fáze je třeba v programu upravit vzorec pro výpočet:
.
.
.
# calculate temp
dc=(cycles-count)/float(cycles)
.
.
.
|
Jenže to nefungovalo. Rapíčko začalo hlásit asi o 10°C vyšší teplotu.
Kouknul jsem se tedy osciloskopem, co se děje se signálem
před a za optočlenem:
Horní červený průběh (CH1) je vstup optočlenu, žlutý (CH2) je výstup.
Z těchto průběhů je vidět, že běžný optočlen je
pro oddělení nepoužitelný. Sepnutí tranzistoru je sice velice rychlé
(přechod žluté křivky z logické "1" do "0"), ale
rozepnutí tranzistoru trvá strašně dlouho. Kvůli této nesymetrii
mezi sepnutím a rozepnutím tranzistoru se mění i střída
signálu (Duty) a proto RasPi vyhodnotí špatnou teplotu.
Na základě těchto zjištění, jsem provedl ještě
jeden pokus.
Zkusil jsem zapojit dva optočleny za sebe. Předpokládal jsem, že se tímto
způsobem zpozdí i ta hrana, která za prvním optočlenem strmě padá z
"1" na "0", takže se
celkově signál jen trochu posune, ale střída zůstane stejná.
Jenže ani to nepomohlo. Sice se ten poměr trochu zlepšil, ale jen o málo.
Takto vypadá průběh signálů na vstupu prvního a výstupu
druhého optočlenu.
Je to sice o hodně lepší, než při použití
jednoho optočlenu, ale pořád to není ono.
Ve třetím pokusu jsem koupil rychlý optočlen 6N137.
Je sice proti předchozímu o trochu dražší (asi 20Kč v TME.cz
), ale s tímto optočlenem už je přenos signálu bezproblémový.
Jediná nevýhoda je, že zůstávají nechráněné napájecí
vodiče pro čidlo. Ty jsou ale mnohem odolnější vůči krátkým napěťovým
špičkám, než GPIO vývody procesoru.
Průběhy zaznamenané osciloskopem na vstupu a výstupu
optočlenu (červený průběh je vstup optočlenu, žlutý je průběh na
GPIO22):
Při "pokojové" teplotě (něco přes 20°C).
Po zahřátí čidla horkovzdušnou pistolí.
Jako poslední možnost jsem zkusil "extrémní"
řešení.
Místo obyčejného
optočlenu jsem použil speciální oddělovací obvod od firmy Analog Devices, který má označení
ADuM5402
Výhodou je, že má kromě 4kanálového oddělovače ještě
navíc DC-DC konvertor pro oddělení napájecího napětí pro čidlo.
Největší nevýhodou je cena. Obvod stojí kolem 10$
(1000ks prodávají přímo
u výrobce po 5$).
Když
jsem jim ale vysvětlil, že ho chci použít jen pro testování a odpřísáhnul
jsem, že ho nepoužiju pro vojenské účely, poslali
mi jeden kus jako vzorek zdarma.
Pouzdro obvodu je SOIC16. Musel jsem ho proto před použitím připájet na přechodku:
(tyto přechodky mám od futurlec.com)
Pak už jsem to celé zapojil podle tohoto schématu:
Průběh je sice trochu zašumělý, ale na přesnost převodu to nemá
vliv.
Šum je možné omezit přidáním dalších kondenzátorů paralelně k
DC-DC převodníku (viz obrázek).
Tohle zapojení má už bezpečně oddělené všechny
dlouhé vodiče od Raspíčka a měří stejně dobře,
jako zapojení s
rychlým optočlenem.
Měřící pracoviště - čidlo na 40m dlouhém stíněném kabelu (LiYCY 8x0,14).
|