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).


 

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 23.1.2013