Automatické krmítko pro psa

 

Tohle je jednoduché zařízení, které velice potěšilo našeho psa.

Je to automatické krmítko, které mu 1x denně vysype do misky hrst granulí. 
Samozřejmě mimo to dostává každý den pořádně nažrat, ale tohle je jen takové přilepšení na večer.

V současné době to tedy zatím sype granule na zem, ale časem to ještě mechanicky vylepším.

Také jsem chtěl vyzkoušet, za jak dlouho se naučí reagovat na pískání, které vždycky předchází vysypání granulí do misky.
Pochopil to skoro okamžitě. Když teď uslyší zapískání, hned všeho nechá a běží k boudě, kde je krmítko nainstalované. 

Celé krmítko je řízeno pomocí RTC modulu s obvodem PCF8563 a ATtiny13.
O vysypání obsahu zásobníku se stará miniaturní servo SG90.

Jak je vidět na úvodní fotografii, mechanika je totální BASTL na kousku dřevěné laťky...  

Při konstruování jsem kladl velký důraz hlavně na minimální odběr proudu z baterie.
Krmítko 23 hodin, 59 minut a 50 sekund denně neodebírá z baterie žádný proud. Pak jen na chvíli zapíská a pohne servem. Pak se opět automaticky na celý den vypne. 

Tady je schéma:

 
(verze pro EAGLE zde)


Princip činnosti:

RTC obvod počítá aktuální čas. Je napájen vlastní knoflíkovou baterií, která má životnost několik let.
V jeho alarmových registrech je nastaven čas, kdy má dojít k aktivaci krmítka.
Pokud se aktuální čas a čas alarmu shoduje, dojde k sepnutí výstupního tranzistoru na INT vývodu RTC obvodu.

Tento logický signál na INT vývodu způsobí sepnutí P-FET tranzistoru a tím připnutí napájení k obvodu ATtiny13.

V ATtiny se začne vykonávat následující program:

 1) 3x zapíská pomocí akustického měniče na pinu PB1 (tento měnič je spínaný přes N-FET tranzistor)
Zapískání by mělo přivolat psa ke krmítku.
 
 2) Přes druhý N-FET tranzistor na PB2 se připne napájení (GND) k servu.
 
 3) PWM signál na pinu PB0 se nastaví tak, aby délka trvání logické "1" v PWM signálu byla asi 2,5ms při 36Hz.
To způsobí natočení serva do jedné krajní polohy (dojde k vysypání obsahu misky).
 
 4) PWM signál na pinu PB0 se nastaví tak, aby délka trvání logické "1" v PWM signálu byla asi 0,5ms při 36Hz.
To způsobí natočení serva do druhé krajní polohy (miska se vrátí do původní polohy).
 
 5) Dojde k odpojení napájení serva (GND) pomocí pinu PB2.
 
 6) Pomocí sekvence logických stavů na pinech PB3 a PB4 dojde k odeslání příkazu pro odpojení INT výstupu v RTC obvodu.
(I2C komunikací se odešle příkaz pro nastavení hodnoty 0b00010010 do registru 0x01 v zařízení s I2C adresou 0x51).
 
 7) Program se zacyklí v nekonečné smyčce, která je přerušena až výpadkem napájení. 


Softwarové smazání Alarm Flagu v RTC obvodu způsobí odpojení INT výstupu a tím pádem i rozepnutí P-FETu.
ATtiny ztratí napájení a program se ukončí. 
V tomto stavu neodebírá ATtiny ani RTC modul z baterie žádný proud.
Servo i akustický měnič jsou pomocí svých N-FET tranzistorů také odpojené.

 

Prvotní nastavení aktuálního času a času alarmu jsem prováděl přes Pythoní skript v Raspberry Pi:  rtc8563_set.py

 

 

Video s automatickým vysypáním misky:
 


 

Několik problémů, které jsem musel řešit.



 1) Původně jsem měl napájení RTC modulu přímo na 4,5V baterii. Problém ale byl v tom, že se toto napájecí napětí přes Pull-Up odpory dostávalo na komunikační piny PB3 a PB4.
Z těchto pinů se to napětí přenášelo dál do ATtiny a způsobovalo, že program v ATtiny nešel ukončit vypnutím napájení pomocí P-FETu.
V tomto stavu ATtiny odebíralo trvale proud z 4,5V baterie - to bylo nepřijatelné.

Zkusil jsem vyhodit Pull-Upy v RTC modulu na pinech SDA a SCL. To ale nepomohlo.
Bylo proto nutné provést úpravu napájení RTC obvodu tak, aby bateriové napájení bylo k modulu přivedeno až po sepnutí P-FETu.



 2) Podobný problém byl i s pinem PB0 (PWM řízení serva) V tomto případě pomohlo mezi pin PB0 a servo zařadit diodu, která zabránila přenosu napětí ze serva do ATtiny.


 3) Problém, se kterým jsem si dlouho nevěděl rady, se projevoval tím, že při najetí serva do pozice vysypání misky se program na několik sekund zastavil.
Pak se zase rozběhnul a servo vrátilo misku do původní polohy.
Důležité je zmínit, že se program neresetoval. Opravdu se jen asi na 5 sekund pozastavil a pak pokračoval.
Že nedošlo k resetu jsem poznal podle toho, že pískák po opětovném spuštění nezapípal. 
Při různých pokusech jsem zjistil, že když připojím servo trvale na napájení (zkratuji natvrdo vývody D a S u jeho spínacího N-FETu), tak k problému nedochází a miska se vysype a znova vrátí okamžitě.
Po dlouhém bádání jsem usoudil, že to bude mít nějakou souvislost se zvýšeným odběrem serva při jeho pohybu.
Připojil jsem tedy přímo na napájecí vývody ATtiny velký kondenzátor, který vykrývá krátkodobé poklesy napájení a tím se problém vyřešil.

 


Dost času mi zabrala I2C komunikace. Nepoužíval jsem žádné knihovny. ATtiny má jen omezenou paměť a tak by byl problém s instalací kompletní knihovny pro I2C komunikaci. Já jsem potřeboval jen odeslat jednu hodnotu do konkrétního registru.
Výsledkem byla tato sekvence logických stavů na PB3 (SCL) a PB4 (SDA):

 

A ještě jedno video jak jsem cvičil psa:
  (Tlačítkem simuluji sepnutí výstupního tranzistoru na vývodu INT v RTC obvodu.)

 

Zdroják celého programu je tady: attiny_krmitko.ino

 


Doplnění:

Takhle se pes naučil reagovat na pískání krmítka.

Video YouTube:


úvodní strana webu AstroMiK.org

poslední úprava stránky 6.10.2016