Pats dažnokai nebūnu namie, kad ir būnu kartais pamirštu pašerti žuvytes akvariume. Kad jos neliktų alkanos ir nesuėstų savo mailiaus sumaniau padaryti automatinę šėryklą. Internete rastos nesudėtingos sistemos su mechaniniu laikrodžiu ir plastikiniu indeliu netenkino mano poreikių, nepakankamai tikslus dozavimas ir maitinimo laiko nustatymas perdaug sudėtingas ir netikslus. Akvariume naudojama laiko relė junginėjanti lempas, maitinimą nutariau surišti su ja, žuvys pirmą kart pašeriamos praėjus 30 minučių po šviesos įsijungimo, antrą kart po 10 valandų nuo pirmo maitinimo, dar po valandos gesinamos lempos ir išjungiama šėrykla. Surinkta nesudėtinga elektroninė schema su attiny13 mikrovaldikliu. Mechaninius judesius sistemoje atlieka standartinis servo mechanizmas. Šėryklos korpusas ir dozavimo mechanizmas pagamintas iš organinio stiklo, maisto rezervuaras plastikinis užsukamas ~30 ml tūrio indelis. Dozatorius mechanizmas pagamintas iš 6mm storio, o dėžutė su servomechanizmu ir elektronine schema iš 2,5mm storio organinio stiklo. Šėrykla turi du informacinius šviesos diodus, žalias dega visada kai yra maitinimas, raudonas mirkteli kas 5s laukimo režimu ir kas 1s keičiant maisto dozę. Taip pat yra mygtukas, kurį trumpai nuspaudus išpilame vieną pašarų porciją, laikant ilgiau kaip 3s pakeičiame porcijos dydį. Kiek kartų mirkteli diodas nuspaudus mygtuką, tiek dozių maisto sudaro viena maitinimo porcija. Porcijos dydis saugomas mikrovaldiklio EEPROM atmintyje, todėl nustatymai išlieka ir išjungus schemos maitinimą. Dėl vidinio mikrovaldiklio taktinio dažnio generatoriaus netikslumo šėrimo laikas nėra visai tikslus, 18 laipsnių temperatūroje programa skuba ~16s per valandą, bet tokiam prietaisui šis tikslumas yra daugiau negu pakankamas.
Trumpas demonstracinis filmukas
Schema
Maitinimui paimtas 9v transformatorius nuo seno modemo su išmesta nebeveikiančia srovės lygintuvo ir stabilizatoriaus schema. Vietoje jo galima apimti bet kokį kintamos ar pastovios srovės šaltinį, kurio įtampa 7-15V. Nuo didesnės įtampos labiau kais maitinimo stabilizatorius.
Spausdintinė plokštė
Vienpusė spausdintinė plokštė gaminta „lazeriniu-lygintuviniu” metodu. Plokštės didžioji dalis detalių SMD technologijos, išskyrus maitinimo dalies komponentus. Visos detalės sumontuotos viršutinėje plokštės pusėje, mėlynai pažymėtos dalys – laidai iš apatinės plokštės pusės. Plokštėje yra AVR ISP lizdas mikrovaldiklio programos pakeitimui, jeigu to prireiktų norint pakeisti šėrimų skaičių ar laiką.
Detalių sąrašas
EAGLE Version 5.12.0 Copyright (c) 1988-2011 CadSoft Part Value Device Package Library Sheet C1 100uF CPOL-EUTT2D7L TT2D7L rcl 1 C2 100uF CPOL-EUTT2D7L TT2D7L rcl 1 C3 1uF C-EUC1210 C1210 rcl 1 C4 50pF C-EUC0805 C0805 rcl 1 D1 1N4004 1N4004 DO41-10 diode 1 D2 1N4004 1N4004 DO41-10 diode 1 D3 1N4004 1N4004 DO41-10 diode 1 D4 1N4004 1N4004 DO41-10 diode 1 IC1 TINY13-20SU TINY13-20SU 8S2 atmel 1 IC2 7805T 7805T TO220H linear 1 JP1 AVR-ISP-6VERT AVR-ISP-6VERT AVR-ISP-6 avr-7 1 LED1 LEDSML0805 SML0805 led 1 LED2 LEDSML0805 SML0805 led 1 PAD1 WIREPAD3,81/1,4 WIREPAD3,81/1,4 3,81/1,4 wirepad 1 PAD2 WIREPAD3,81/1,4 WIREPAD3,81/1,4 3,81/1,4 wirepad 1 R1 1k R-EU_M0805 M0805 rcl 1 R2 1k R-EU_M0805 M0805 rcl 1 R3 20k R-EU_M0805 M0805 rcl 1 R4 10k R-EU_M0805 M0805 rcl 1 R5 100 R-EU_M0805 M0805 rcl 1 S2 SKHMPSE010 SKHMPSE010 SKHMPXE010 switch 1 SV1 MA03-1 MA03-1 con-lstb 1
Programa
Programa mikrovaldikliui attiny13 kompiliuota AVR-GCC kompiliatoriumi.
#define F_CPU 9600000UL #define variklis PB0 #define led PB4 #define mygt PB3 #define adresas 1 #include <avr/io.h> #include <util/delay.h> #include <avr/eeprom.h> // impulso trukmė ir pauzė jei reikia int kamp[]={780,710,780,710,780,710,780,440,500,440,500,440,500,440,500,440,700,780}; uint8_t laikas = 0; void irasom( uint8_t n ) // išsaugom naują porcijų skaitliuko vertę { n = ( n / 10 ) - 2; eeprom_busy_wait(); __EEPUT( adresas, n ); } uint8_t skaitom( void ) // skaitom porcijų skaitliuko vertę iš eeprom { uint8_t rez; eeprom_busy_wait(); __EEGET( rez, adresas ); if ( rez == 255 ) // jei pradinė reikšmė nenustatyta nustatom minimalią dozę { rez = 1; irasom(31); } return rez; } void pozicija(int p) // formuojame impulsus servo varikliui { for ( int k = 0; k < 16; k++) { PORTB |= _BV(variklis); for ( int j = 0; j < p; j++) _delay_us(1); PORTB &=~ _BV(variklis); _delay_ms(10); } } void pilam(void) //judesių seka maisto išpylimui { PORTB |= _BV(led); //uždegam diodą uint8_t n = skaitom(); //perskaitom nustatymus for (uint8_t j = 0; j < n; j++) //kartojam seką tiek kartų, kiek maisto porcijų reikia for (int i = 0; i < 18; i++) //vienos porcijos pylimo seka pozicija( kamp[ i ] ); PORTB &=~ _BV(led); //gesiman diodą } int laukiam ( int p) //laukiam p minučių arba mygtuko paspaudimo { PORTB &=~ _BV(led); for ( int i = 0; i < p; i++ ) { for ( int j = 0; j < 600; j++ ) { if (PINB & _BV(mygt)) //jei mygtukas paspaustas skaičiuojam paspaudimo laiką, //jei ne laukiam ar apdorojam mygtuko paspaudimo laiką { _delay_ms(101.5); // laukiam 1/10 s (pataisa dėl taktinio dažnio netiklumo) if ( laikas == 0 ) // jei mygtukas nebuvo nuspaustas mirktelim kas 5 s { if ( ( j % 50) == 0 ) //mirktelim kas 5 s PORTB |= _BV(led); if ( ( j % 50) == 1 ) PORTB &=~ _BV(led); } else // jei mygtukas nuspaustas buvo trumpiau 3 s pilam maistą, //jei ilgiau rašom naują reikšmę į eeprom { if ( laikas < 30 ) pilam(); else irasom(laikas); laikas = 0; //mygtuko paspaudimas apdorotas } } else //mygtukas paspaustas { laikas++; if (laikas >= 30) // po 3s pradedam mirksėt { if ( ( laikas % 10) == 0 ) //mirktelim kas 1 s PORTB |= _BV(led); if ( ( laikas % 10) == 1 ) PORTB &=~ _BV(led); } _delay_ms(101.5); } } } return 0; } int main(void) { DDRB |= _BV(variklis); DDRB |= _BV(led); PINB |= _BV(variklis); PINB |= _BV(led); PORTB &=~ _BV(led); PORTB &=~ _BV(variklis); PORTB &=~ _BV(mygt); laukiam(30); //laukiam 30 min pilam(); laukiam(600); //laukiam 10 h pilam(); laukiam(600); return 0; }