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(); }
Noriu kad taip butu musu mieste, aciu uz straipsni