Raspberry Pi 63) Řízení otáček ventilátoru v RasPi přes I2C Měl jsem teď trochu volno, a tak jsem si vymyslel, že zkusím navrhnout nějaký jednoduchý obvod pro řízení otáček malého ventilátoru, který by se dal připojit k RasPi a který by v závislosti na teplotě procesoru automaticky řídil výkon ventilátoru. Nejjednodušším řešením by bylo využít jeden pin na
GPIO v Raspberry Pi, který by generoval PWM signál. Pokud vám tyto nevýhody nevadí, tak tady je popsáno toto jednoduché ovládání: Řešení s ATtiny Já jsem se ale rozhodl pro trochu složitější řešení. Abych ušetřil GPIO piny a abych nemusel RasPi zbytečně zatěžovat generováním PWM signálu, použil jsem pro řízení otáček mikrokontroler ATtiny, který bude s RasPi komunikovat přes I2C a sám se bude starat o generování PWM signálu. S mikrokontrolerem jsem měl jasno hned na začátku. Kvůli
komunikaci I2C bylo nutné zvolit alespoň ATtiny25, který v sobě
obsahuje USI (Univerzální Sériový Interfejs). V původním plánu bylo i zpětné zjišťování otáček ventilátoru pomocí vestavěného čidla ve ventilátoru. Jak se ale ukázalo, vestavěný výstup z tachometru
ventilátoru je při PWM řízení otáček téměř nepoužitelný.
Když jsem pak zjišťoval, jak to řeší profesionálové,
zjistil jsem, že podvádí. Po dobu měření otáček totiž do ventilátoru
pustí na chvíli plný výkon. V signálu z tachometru je při konstantním
napájení už jen obyčejný obdélníkový signál, jehož frekvence je
1/30 otáček ventilátoru za minutu. Takto čistý signál už není
problém zpracovávat. Nevýhoda ale je, že pokud by byl ventilátor zadřený
a pustil by se do něj plný výkon, tak by se mohl pootočit a zadřený
ventilátor by se tak nerozpoznal. Nakonec jsem tedy přistoupil k plánu "B" - přidělal
jsem k ventilátoru vlastní čidlo otáček (Hallovu sondu). Výstupem z Hallova senzoru je pak takovýto signál:
Jak je z obrázků vidět, napětí se pohybuje mezi hodnotami 2V až 3V. Takovéto úrovně jsou ale nepoužitelné. ATtiny by nedokázalo vyhodnotit 2V jako logickou "0". Podle katalogového listu by měl mít signál ve stavu
logické "1" hodnotu alespoň 2V. Ve stavu logické
"0" maximálně 1V.
Místo magnetické sondy je možné použít i optické reflexní čidlo,
takže toto řešení se hodí i pro nejmenší ventilátory, na které
stačí nalepit černobílý papírový terčík a namířit na něj fotočidlo
s LED diodou.
Popis I/O pinů a schéma ATtiny85 má k dispozici 5 vstupně výstupních pinů (+
jeden pin RESET). Protože zbyl jeden ještě nevyužitý pin, vyvedl jsem na něj signál "STOP ALARM". Tento signál se aktivuje v případě, že by se měl ventilátor otáčet (PWM výkon je větší než 0%), ale ve skutečnosti se neotáčí (motor je zadřený). Na tento pin je možné připojit signalizační LED, nebo pískák. Resetovací pin jsem nevyužil. Servisní režim se aktivuje tehdy, pokud je při zapnutí
napájení do ATtiny pin PB1 v logické "1" (připnutý na napájení). Připojením PB1 do logické "1" se zároveň přes FET tranzistor pustí napájení do motoru ventilátoru, takže by se měl roztočit na plný výkon. Když se pak zruší propoj mezi PB1 a napájením, motor se zastaví - je možné s ním ručně otáčet a nastavovat čidlo. Servisní režim trvá až do resetu ATtiny.
Software Celé řízení ventilátoru se skládá ze dvou částí. Jedna část programu (Python) se nachází v Raspberry Pi a slouží ke zjišťování teploty procesoru, přepočtu této teploty na požadovaný PWM výkon a vyhodnocování informací, které se získávají z ventilátoru. Druhá část programu je v ATtiny. Ta se stará o příjem I2C příkazů, generování PWM signálu a testování signálu z čidla otáčení. Python Před prvním použitím programu je třeba nastavit správné konstanty pro přepočet. Jedná se o : Minimální a maximální teploty se nastaví podle potřeby. Například
36 a 42°C. Tato funkce se aktivuje při spuštění programu s parametrem " test".
Pro zjišťování teploty procesoru jsem v programu použil
příkaz:
Vrácené číslo udává teplotu v tisícinách °C. Rozlišení teploty (minimální krok při změně teploty) je 0,538°C . Existuje i příkaz pro zjišťování teploty grafického
čipu, ale ten v programu nepoužívám, protože je v textové formě a
musel by se ještě převádět na číslo. Obě hodnoty jsou ale dost
podobné, tak nemá cenu se tím zatěžovat.
ATtiny: ATtiny zajišťuje hlavně nezávislé generování PWM signálu pro napájení ventilátoru. K tomu slouží 3 registry:
Dále se ATtiny stará o příjem příkazů z I2C komunikační linky a o odesílání informací zpátky do RasPi. K tomu jsem použil hotovou knihovnu pro I2C komunikaci ( https://github.com/rambo/TinyWire ). Jak se ale ukázalo, občas dochází při komunikaci k chybám. Možná je to způsobeno rychlostí generování PWM signálu, protože když jsem tuto rychlost snížil na frekvenci 4kHz, tak k výpadkům v komunikaci už nedocházelo. Problém byl pak ale v tom, že na nižší frekvenci PWM signálu už ventilátor nepříjemné pískal. Proto jsem vrátil zpátky vysokou frekvenci PWM signálu (32kHz) a v Pythonu jsem odchytával chyby v komunikaci. Když k nějaké chybě došlo, provedl program ještě několik pokusů o navázání spojení s ATtiny. Poslední věcí, kterou ATtiny hlídá, je čidlo otáčení ventilátoru. Jak jsem psal výše, nebylo při PWM řízení otáček možné použít vestavěné čidlo ve ventilátoru, ale musel jsem přidat čidlo, které bylo oddělené od PWM napájení ventilátoru. Nevýhoda je v tom, že musí být provedeny mechanické úpravy (buď vlepení Hallovy sondy dovnitř ventilátoru, nebo přilepení dalšího magnetu na rotor ventilátoru, případně nějaký držák na optočidlo). Tady je pro inspiraci několik ukázek mých pokusů o mechanické připevnění čidel:
ATtiny dokáže zpátky do RasPi posílat informace o aktuálním stavu ventilátoru. Přepnutí na požadovanou veličinu se provede speciálními příkazy odeslanými přes I2C.
Všechny ostatní hodnoty slouží ke změně výkonu PWM
generátoru.
Příkaz v Pythonu pro zjištění požadované hodnoty je pak: i2c_data = bus.read_byte(i2c_adresa)
Při odeslání příkazu pro zpožděné zastavení ventilátoru se ještě po dobu 1 minuty bude ventilátor točit na 75% výkonu a pak se výkon sníží na 0%. Tato funkce by měla být spuštěna před vypnutím RasPi. Zajistí dochlazení procesoru a automatické vypnutí. Při zjišťování otáček je třeba dát pozor na počet
impulzů, které generuje ventilátor na jednu otáčku.
Přepočet rychlosti otáčení bych se pokusil ještě
trochu objasnit.
Když jsem nastavil správnou úroveň signálu z čidla otáčení, bylo třeba ještě upravit vzorec, aby se správně vypočítaly otáčky. Po různých korekcích jsem nakonec vytvořil tento vzorec, který převádí šířku HIGH impulzu na otáčky za minutu tak, že se téměř v celém rozsahu otáček chyba pohybuje pod 10%: rpm = 10 * ((975000 / šířka_HIGH_impulzu) - 7) Při následném proměřování celého rozsahu otáček jsem dospěl k těmto rozdílům mezi skutečnými a vypočtenými otáčkami:
Programy ke stažení
Aktualizace 22.10.2016 Doplnění ještě jednoho způsobu řízení ventilátoru pomocí ATtiny13.
|
úvodní strana webu AstroMiK.org |
|
poslední úprava stránky 22.10.2016 |