Difference between revisions of "Krúžok Robotiky na GJH"
(→Súťaž 14.11.2008) |
(→Súťaž 14.11.2008 =) |
||
| Line 339: | Line 339: | ||
---- | ---- | ||
| − | = Súťaž 14.11.2008 | + | = Súťaž 14.11.2008 = |
FLL - FIRST LEGO League | FLL - FIRST LEGO League | ||
Revision as of 09:11, 1 December 2008
Krúžok robotiky sa zaoberá stavbou a programovaním robotov zo stavebníc LEGO NXT. Učíme sa programovací jazyk NXC. V máji sa chceme zúčastniť na turnaji RoboCup Junior Slovensko v Banskej Bystrici a na jeseň na súťaži First LEGO League.
Pozri stránku RoboCup Junior Slovensko, kde sú aj pravidlá súťažných kategórií Záchranár, Futbal a Tanec robotov.
Stretnutie 22.4.2008
- Nainštalovali sme si programovací jazyk NXC s prostredím BricX
(treba stiahnuť súbor test_release.zip, rozbaliť ho a spustiť). USB driver: download
- Napísali sme prvý program pre robota, pomocou ktorého prejde o kúsok vpred:
task main()
{
OnFwd(OUT_AC, 75);
Wait(1000);
Float(OUT_AC);
}
Prvý riadok zapne motory na portoch A a C na rýchlosť 75 (najväčšia rýchlosť je 100). Druhý riadok počká 1 sekundu (ale motory sú už zapnuté, takže robot ide 1s vpred). Tretí riadok vypne motory na portoch A a C.
- Potom si krúžkari sami zmenili program tak, aby robot prešiel do štvorca, použili sme
pritom príkaz:
OnRev(OUT_AC, 75);
ktorý zapne motor v spätnom chode (rýchlosťou 75 - tú môžeme samozrejme meniť).
Videli sme, že bolo zložité vyladiť dĺžku čakania pri zatáčaní a preto sme využili príkaz
RotateMotor(OUT_A, 75, 45);
ktorý spôsobí, že motor na porte A sa otočí len o 45 stupňov a potom zastane - využíva pritom otáčkové snímače, ktoré sú zabudované do motorov.
- Napokon sme na papieri fixkou nakreslili čiaru a naprogramovali sme robota tak, aby
chodil do kola po čiare (keď sme konečne našli správne príkazy :). Tu je výsledný program:
int s;
task main()
{
SetSensorType(S1, SENSOR_TYPE_LIGHT_ACTIVE);
SetSensorMode(S1, SENSOR_MODE_PERCENT);
ResetSensor(S1);
while (1)
{
if (Sensor(S1) < 48)
{
OnFwd(OUT_A, 75);
Float(OUT_C);
}
else
{
OnFwd(OUT_C, 75);
Float(OUT_A);
}
}
}
Program najskôr nastaví typ senzora na porte 1 (čiže S1) na aktívny svetelný senzor. Potom opakuje donekonečna (lebo podmienka 1 je vždy splnená) jeden jednoduchý test: ak je intenzita odrazeného svetla menšia ako 45, robot je na čiernej čiare a má zatáčať vpravo. V opačnom prípade je robot na bielom papieri a má zatáčať vľavo. Takto robot sleduje hranu čiary medzi bielou a čiernou... Tento program treba prispôsobiť podľa toho, aká tmavá je čiara (hodnota 48 v podmienke) a podľa toho, na ktorých portoch má robot pripojené motory a ktorým smerom sú otočené (t.j. vymeniť časti podmienok).
Spoločné stretnutia pre všetkých zaújemcov budú pokračovať každý týždeň v utorok o 14.
Stretnutia 24. - 27. 4. 2008
Nasledujúci program vypisuje hodnoty ultrazvukového snímača na porte 1 na meranie vzdialenosti na LCD:
int s;
task main()
{
SetSensorType(S1, SENSOR_TYPE_LOWSPEED);
ClearScreen();
while(1)
{
ClearScreen();
NumOut(10,10,SensorUS(S1));
Wait(500);
}
}
Typy senzorov:
SENSOR_TYPE_TOUCH tlakový snímač (tlačidlo) SENSOR_TYPE_TEMPERATURE tepelný snímač (doplnkový senzor) SENSOR_TYPE_LIGHT svetelný snímač zo stavebnice RCX SENSOR_TYPE_ROTATION otáčkový snímač zo stavebnice RCX SENSOR_TYPE_LIGHT_ACTIVE svetelný NXT snímač v aktívnom režime SENSOR_TYPE_LIGHT_INACTIVE svetelný NXT snímač v pasívnom režime (dióda nesvieti) SENSOR_TYPE_SOUND_DB zvukový snímač SENSOR_TYPE_SOUND_DBA zvukový snímač (iné jednotky) SENSOR_TYPE_LOWSPEED ultrazvukový snímač
Snímače sa v programe čítajú pomocou funkcíí Sensor(S1) - Sensor(S4),
ale ultrazvukový snímač sa číta pomocou SensorUS(S1) - SensorUS(S4).
Na začiatku programu treba snímače nastaviť pomocou príkazu:
SetSensorType(S1,jeden_z_tychto_typov); SetSensorMode(S1,SENSOR_MODE_PERCENT); ResetSensor(S1);
Ak nechceme hodnoty 0-100, môžeme použiť iný mód, jeden z nasledujúcich:
SENSOR_MODE_RAW priama "surová" hodnota od 0 do 1023 SENSOR_MODE_BOOL 0 alebo 1 SENSOR_MODE_EDGE počíta koľkokrát prejde senzor z 0 do 1 alebo z 1 do 0 SENSOR_MODE_PULSE počíta koľkokrát prejde senzor z 0 do 1 a naspäť SENSOR_MODE_PERCENT hodnota 0 až 100 SENSOR_MODE_FAHRENHEIT jednotky F (pre tepelný snímač) SENSOR_MODE_CELSIUS stupne C (pre tepelný snímač) SENSOR_MODE_ROTATION počet otáčok (pre RCX otáčkový snímač)
Senzory HiTechnic na snímanie IR lotpy, farby, naklonenia a smeru (kompasový) sa nastavujú ako keby boli ultrazvukový senzor. Ak potrebujeme čítať hodnoty aj z iných I2C adries, ako 42H (pozri dokumentáciu k senzorom), môžeme použiť takýto program: accel.nxc - číta presné hodnoty naklonenia akceleračného snímača podľa troch osí X,Y,Z.
Podobne nasledujúci program číta presné hodnoty R,G,B zo svetelného senzora: color.nxc, a nasledujúci prečíta hodnoty pre všetkých 5 IR senzorov zabudovaných do IRSeeker senzora vrátane smeru 1-9: irseeker.nxc
Nasledujúca funkcia prikáže motorom urobiť zadaný počet otáčok v zadanom výkone:
void go(int powerA, int powerB, int rotations)
{
SetOutput(OUT_A,
TachoLimit, rotations,
Power, powerA,
OutputMode,
OUT_MODE_MOTORON,
RunState,
OUT_RUNSTATE_RUNNING,
UpdateFlags, UF_UPDATE_MODE + UF_UPDATE_SPEED + UF_UPDATE_TACHO_LIMIT );
SetOutput(OUT_B,
TachoLimit, rotations,
Power, powerB,
OutputMode,
OUT_MODE_MOTORON,
RunState,
OUT_RUNSTATE_RUNNING,
UpdateFlags, UF_UPDATE_MODE + UF_UPDATE_SPEED + UF_UPDATE_TACHO_LIMIT );
while( GetOutput ( OUT_A, RunState ) != OUT_RUNSTATE_IDLE);
}
napríklad:
go(75,75,1000); - prejdi 1000 krokov (stupňov otočenia motora) vpred rýchlosťou 75 go(-75,-75,1000); - prejdi 1000 krokov vzad... go(75,-75,1000); - otáčaj sa jedným smerom... go(-75,75,1000); - otáčaj sa druhźm smerom...
Nasledujúci program zapne motory v spätnom chode a ked robot narazí na prekážku, t.j. motory sa začnú prešmykovať, tak začne pískať:
task main ()
{
int rot0, x;
OnRev(OUT_BC,100);
do
{
rot0 = GetOutput(OUT_C, TachoCount);
Wait(15);
x = GetOutput(OUT_C, TachoCount);
if ((x - rot0) > -7) PlayTone(200,200);
}
while (true);
}
|
|
|
|
|
| (+) | (+) | (+) | (+) | (+) |
Nasledujúca funkcia využíva kompasový senzor na porte 1 a vráti uhol 0-180 - smer oproti začiatočnému smeru pri odštartovaní programu.
int r;
int uhol()
{
int u, mensi, vacsi, roz1, roz2;
u = SensorUS(S1);
if (u > r) { mensi = r; vacsi = u; }
else { mensi = u; vacsi = r; }
roz1 = vacsi - mensi;
roz2 = mensi + 180 - vacsi;
if (roz1 < roz2) return 2*roz1;
return 2*roz2;
}
Môžeme ju v programe použiť takto:
task main ()
{
SetSensorType(S1,SENSOR_TYPE_LOWSPEED); // compass
Wait(1000); // pocka 1 sekundu
r = (SensorUS(S1)); // nacita pociatocnu hodnotu snimaca
while(ButtonPressed(BTN2,true) == false); // pocka na stlacenie sipky vpravo
PlayTone(2000,500); // potom zapiska
...
if (uhol() < 90)
{
// robot je otoceny spravnym smerom
}
else
{
// robot je otoceny opacnym smerom
}
}
V dňoch 1. a 2. mája sme sa zúčastnili Súťaže v stavbe a programovaní robotov RoboCup Junior Slovensko 2008 v Banskej Bystrici s týmami v kategóriách Futbal 2-na-2 a Záchranár. Hoci náš záchranársky robot nedopadol veľmi dobre - keďže sme mali na prípravu menej ako 2 týždne, futbalové roboty boli postavené a naprogramované spoľahlivo a získali pekné 3. miesto (2. v kategórii stredných škôl). Tu sú súťažné roboty:
Záchranárske roboty odvtedy vylepšujeme/staviame odznova. Tu sú dve verzie z polovičky mája, ktoré čoskoro otestujeme:
Staviame i novú verziu futbalistických robotov, ktoré v prototypoch vyzerajú takto:
Stretnutie 20.5.2008
Prvý dnešný program hľadá ľudí dookola a keď niekoho nájde, ide za ním, až kým nepríde bližšie, keď zastane: hladac.nxc.
Druhý program naopak chodí vpred dokiaľ nepríde k prekážke, ktorej sa vyhne a pokračuje ďalej:vyhybac.nxc.
A takto vyzerá zábava s robotom:
Stretnutie 24.6.2008
Tvoríme 3D model zachranárskych robotov v programe LEGO Digital Designer. Tu je skoro kompletný model robota:
Vymýšľame algoritmus pre futbalistické roboty:
1.Nacitanie vstupnych udajov
kam som otoceny
na ktorej som polke(svetla/tmava)
cakanie na stlacanie startovneho tlacidla
nekonecny cyklus(do vypnutia programu):
{
2. Ak nevidim loptu :
Hladanie :
Otocka na mieste 360 deg
ked ju stale nevidi pojde na svoju polku kontrolujuc
prekazku (ktore obide) natoci sa na supera
a bude pozerat po lopte
ak vidi loptu :
a)je otoceny na svoju polku:
- obide ju: skusi ju obist nalavo,
ak je tam prekazka tak ju obide napravo
pocas obchadzania kontroluje prekazku
// a pojde na superovu branku
b)je otoceny na supera- utoci:
- ak je lopta daleko (t.j. prekazkovy senzor dava hodnotu > 5 cm):
nastavi motory tak, aby sa robot tocil na loptu
- ak je lopta blizko, plnou rychlostou vpred na kratku vzdialenost,
a potom zastavit na chvilku
}
3.spracovanie prekazky : ak je predo mnou prekazka a
nie je to lopta treba sa jej vyhnut:
zastat,
vratit sa o kusok spat
otocit sa smerom k superovej strane (vlavo alebo vpravo o 60 stupnov)
Tu je program, ktorý otočí robotom na mieste o 360 stupňov, pričom počas otáčania beží cyklus while a tak robot môže priebežne reagovať na vnemy zo snímačov: otocka.nxc
|
|
|
|
|
| (+) | (+) | (+) | (+) | (+) |
Stretnutie 13.10.2008
Marek: Navrh robota pre RoboCup 2009
Miso, Miro, Lubo: Balancujuci robot
Súťaž 14.11.2008
FLL - FIRST LEGO League
|
|
|
|
| (+) | (+) | (+) | (+) |
Stretnutie 27.11.2008
Pripravuje sa robot na RoboCup Rescue, pozri osobitnú stránku: Team GJH Rescue 2009 a roboty na RoboCup Soccer, pozri stránku Team GJH Soccer 2009.
- M&Ms začali robit na projekte kontroly kvality výrobkov pomocou ultrazvukového senzora - zobrazili sme si pekne nameraný profil v grafe.
Naprogramovali sme prvú verziu merania profilov pomocou ultrazvukového senzora: kontrola.nxc - Tomáš pripravil ružicu pre Sbota, takže teraz budeme musieť naprogramovať riadenie rýchlosti servomotorov, lebo doteraz vieme len zapnúť/vypnúť a zmeniť smer. Toto treba naštudovať v manuáli o ATmega128 a upraviť firmware...
- Preskúmali sme novú hračku - robota iSobot, ktorý ako sa ukázalo nechcel ísť, lebo je vyberavý - potebuje veľmi silné batérie - ani alkalické mu nestačia!! (ale už funguje, takže ho nabudúce prinesiem)
- Chalani pracovali na svojom Rescue robotovi.
























