Robotas voras

Sumaniau sukonstruoti paprastą ir nebrangų robotuką vaikams. Pasirinkta šešiakojė sistema, kuriai judinti užtenka trijų servo mechanizmų. Kaip distancinio valdymo pultas naudojamas televizoriaus pultelis. Roboto smegenys Atmel atmega328p procesorius. Dabartiniam programos variantui užtektų ir atmega8, bet jų kainos beveik nesiskiria ir yra planas išplėsti roboto galimybes. Planuojamas automatinis kliūčių apėimas, papildomi servo mechanizmai, šviesos jutikliai linijos sekimui. Robotas surinktas nenaudojant jokių papildomų detalių mechanizmų tvirtinimui, viskas suklijuota dvipuse lipnia juosta. Valdančios programos rašymui naudota arduino programavimo aplinka.

Robotukas supranta 27 pultelio komandas, galima keisti kojų judėjimo greitį ir amplitudę.

Trumpas demonstracinis filmukas

Detalių sąrašas:

1. servo mechanizmas SG90 (3 vienetai)
 2. AA baterijų laikiklis (keturių vietų) (1 vienetas)
 3. atmega328p (1 vienetas)
 4. kvarcas 16MHz (1 vienetas)
 5. kondensatorius 22pF (2 vienetai)
 6. TSOP3438 IR imtuvas (1 vienetas)
 7. LED3R šviesos diodas (1 vienetas)
 8. 1K5 varža (1 vienetas)
 9. 7805 stabilizatorius (1 vienetas)
 10. 100uF 10V kondensatorius (1 vienetas)
 11. karpomos jungtys
 12. jungiklis
 13. universali spausdintinė plokštė 70x25mm
 14. dvipusė lipni juosta
 15. 3mm viela kojoms
 16. AA elementai arba akumuliatoriai (4 vienetai)
 17. laidai schemos sujungimui

Programos kodas

#include
#include //paimta iš čia: http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo servok; //kairė
Servo servoc; //centras
Servo servod; //desinė
int c = 90; //variklių centrinė padėtis
int z = 5; //pasukimo žingsnis
int koj = 21; //kojos kėlimo aukštis
int p = 100; //pauzės trukmė
int k = 0; //judėjimo kryptis
unsigned long rez; //ir dekoderio rezultatas
int kr[18][6]; /* servo mechanizmų judėjimo tvarka

 0 - nedarom nieko

 pasukimai su pauze
 1 - kairio mechanizmo pasukimo kampas (c + z)
 2 - centrinio mechanizmo pasukimo kampas (c + koj)
 3 - dešinio mechanizmo pasukimo kampas (c + z)
-1 - kairio mechanizmo pasukimo kampas (c - z)
-2 - centrinio mechanizmo pasukimo kampas (c - koj)
-3 - dešinio mechanizmo pasukimo kampas (c - z)
 4 - kairio mechanizmo pasukimo kampas (c)
 5 - centrinio mechanizmo pasukimo kampas (c)
 6 - dešinio mechanizmo pasukimo kampas (c)

pasukimai be pauzės
 11 - kairio mechanizmo pasukimo kampas (c + z)
 12 - centrinio mechanizmo pasukimo kampas (c + koj)
 13 - dešinio mechanizmo pasukimo kampas (c + z)
-11 - kairio mechanizmo pasukimo kampas (c - z)
-12 - centrinio mechanizmo pasukimo kampas (c - koj)
-13 - dešinio mechanizmo pasukimo kampas (c - z)
 14 - kairio mechanizmo pasukimo kampas (c)
 15 - centrinio mechanizmo pasukimo kampas (c)
 16 - dešinio mechanizmo pasukimo kampas (c) */

void setup()
{
   kr = {
    {14,15,16,0,0,0}, //stop
    {2,11,3,-2,-11,-3}, //pirmyn
    {-2,11,3,2,-11,-3}, //atgal
    {2,11,-3,-2,-11,3}, //kairėn
    {2,-11,3,-2,11,-3}, //dešinėn
    {4,2,6,4,-2,6}, //kilnojam kojas
    {12,3,-3,0,0,0}, //mojam1
    {-12,1,-1,0,0,0}, //mojam2
    {11,-3,-11,3,0,0}, //makaluojamės
    {13,-11,0,0,0,0}, //stop kojos priekin
    {-13,11,0,0,0}, //stop kojos atgal
    {2,0,0,0,0,0}, //keliam kairę pusę
    {-2,0,0,0,0,0}, //keliam dešinę pusę
    {5,0,0,0,0,0}, //nusileidžiam
    {3,0,0,0,0,0}, //kairė koja priekin
    {-3,0,0,0,0,0}, //kairė koja atgal
    {-1,0,0,0,0,0}, //dešinė koja priekin
    {1,0,0,0,0,0} //dešinė koja atgal
  };
  irrecv.enableIRIn();
  servok.attach(9);
  servoc.attach(10);
  servod.attach(11);
}

void judam()
 {
   int kk,pp;
   for (int i=0; i < 6; i++) { pp = 1; kk = kr[k][i]; if (kk >= 10) {
    kk = kk - 10;
    pp = 0;
   }
  if (kk <= -10) { 
    kk = kk + 10; 
    pp = 0; 
  }
  switch ( kk ) { 
    case 0: pp = 0; break; 
    case 1: servok.write(c+z); break; 
    case -1: servok.write(c-z); break; 
    case 2: servoc.write(c+koj); break; 
    case -2: servoc.write(c-koj); break; 
    case 3: servod.write(c+z); break; 
    case -3: servod.write(c-z); break; 
    case 4: servok.write(c); break; 
    case 5: servoc.write(c); break; 
    case 6: servod.write(c); break; 
  } 
  if (pp == 1) delay(p); 
 } 
} 

void loop() { 
  if (irrecv.decode(&results)) { 
    rez = results.value; 
    if (rez > 2048) rez = rez - 2048;
    irrecv.resume();
  }
  switch (rez) {
    case 1321: k = 0; break;
    case 1312: k = 1; break;
    case 1313: k = 2; break;
    case 1297: k = 3; break;
    case 1296: k = 4; break;
    case 1292: k = 5; break;
    case 1333: k = 6; break;
    case 1334: k = 7; break;
    case 1328: k = 8; break;
    case 1330: k = 9; break;
    case 1332: k = 10; break;
    case 1294: k = 11; break;
    case 1280: k = 12; break;
    case 1290: k = 13; break;
    case 1037: k = 14; break;
    case 1041: k = 15; break;
    case 1040: k = 16; break;
    case 1061: k = 17; break;
    case 1281: p = 50; break;
    case 1282: p = 100; break;
    case 1283: p = 150; break;
    case 1284: p = 200; break;
    case 1285: p = 300; break;
    case 1286: p = 500; break;
    case 1287: z = 4; break;
    case 1288: z = 15; break;
    case 1289: z = 30; break;
   }
 judam();
}

1 komentaras

Parašykite komentarą

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