Automatinė akvariumo šėrykla 2

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); 
}

 

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *