Jau keturis metus naudojau savos gamybos žuvų sėryklėlę ir per tą laiką išlindo keletas konstrukcijos trūkumų. Pati didžiausia naudotos konstrukcijos bėda ta, kad galima naudoti tik labai smulkų granuliuotą žuvų maistelį, kurio ne visada visur galima nupirkti, ir jo kaina gerokai didesnė nei maisto kuris parduodamas dribsnių pavidalu. Kadangi pats turiu 3d spausdintuvą paieškojau internete panašaus tipo įrenginių brėžinių. Radau du naudojančius servo variklį ir sraigtą maisto padavimui: http://www.thingiverse.com/thing:736693, http://www.thingiverse.com/thing:301532. Vienas naudoja užsukamą indelį maisto pildymui ir papildomą dribsnių smulkintuvą kitas reikiamo dydžio servo mechanizmą. Pakoregavus abiejų projektų failus ir pridėjus kažkiek savų gautas mechanizmas naudojantis mano senesnės šėryklos plokštę, ir galintis naudoti dribsnių pavidalo maistą.
Šiai konstrukcijai reikėjo perdaryti servo mechanizmą, kad galėtų suktis ratu ir pakeisti valdančios programos kodą.
Modeliai 3D spausdinimui
Dėžutė elektronikai (viršus)
Dėžutė elektronikai (apačia)
Dėžutė elektronikai (mygtukas)
Tvirtinimas prie akvariumo
Tvirtinimas prie akvariumo (piltuvėlis)
Dantratis
Sraigtas
Indelis
Vamzdžio laikiklis
Padavimo piltuvas
Dribsnių smulkintuvas
[Padavimo vamzdis
Variklio laikiklis
Vamzdžio dangtelis
Dangtelio laikiklis
stl_failai atsisiuntimui
Ne visos dalys idealiai sumaketuotos, kai kur reikia pagal vietą dilde pataisyti. Tvirtinimas prie akvariumo padarytas iš atskirų dalių tam, kad būtų paprasčiau atspausdinti ir nereikėtų daug plastiko detalių palaikymui. Dalis atspausdinus reikia suklijuoti. Mechanizmo laikiklis prie akvariumo dangčio tvirtinamas medvarščiais. Pats mechanizmas prie laikiklio tvirtinamas kanceliarinėmis gumytėmis. AVR ISP jungties kištukai patrumpinti tiek, kad tilptų į dėžutę, skyles varžtams spausdintoje plokštėje nėra tinkamoje vietoje šiai dėžutei, plokštės kampus ties varžtais reikia nupjauti. Dėžutės elektronikai, servo mechanizmui, variklio laikiklio surinkimui ir tvirtinimui panaudoti skirtingų ilgių M3 varžtai ir veržlės. Dantračio sujungimui su dribsnių smulkintuvu panaudotas ilgas M4 varžtas ir veržlės.
Programos kodas
#define F_CPU 9600000UL #define variklis PB0 #define led PB4 #define mygt PB3 #define adresas 2 #include <avr/io.h> #include <util/delay.h> #include <avr/eeprom.h> // impulso trukmė int kamp[]={400,1000}; 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 > 100 ) // jei pradinė reikšmė nenustatyta nustatom mažesnę dozę { rez = 3; irasom(3); } return rez; } void pozicija(int p, long r) // formuojame impulsus servo varikliui { for ( int k = 0; k < r; 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 if ( n > 100 ) n = 3; pozicija( kamp[ 0 ], n*16+10 ); pozicija( kamp[ 1 ], 10 ); PORTB &=~ _BV(led); //gesinam 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(10); //laukiam 10 min pilam(); laukiam(330); //laukiam 5.5 h pilam(); laukiam(330); //laukiam 5.5 h pilam(); laukiam(600); }