Vous êtes sur la page 1sur 15

5.

Aplicaii 2012
1. Aplicaia micarea n cerc Aceast micare se realizeaz foarte simplu, iar principiul de acionare este uor de dedus. Pentru a realiza o micare n cerc este nevoie ca doar unul din cele dou motoare ale robotului s fie pus n micare. Programul RobotC care realizeaz aceast micare este urmtorul:

Programul este alctuit din funcia principal main(), cele dou acolade(una deschis i cealalt nchis) i corpul funciei, unde sunt scrise comenzile necesare robotului pentru a executa micarea dorit.

Cele dou comenzi de mai sus, realizeaz miarea n cerc a robotului, spunndu-i s mite doar motorul C (corespunztor roii din partea stng) la puterea sa maxim, timp de trei secunde. Rezultatul programului va fi cel indicat n urmtoarea imagine.

2. Aplicaia micarea n cerc - pe loc

5. Aplicaii 2012
Aceast aplicaie se realizeaz la fel ca cea de la punctul 1., cu diferena c, de aceast data, robotul nu va mai descrie cercul n prelung, ci l va executa pe loc.

Pentru a realiza micarea dorit, valorile puterilor motoarelor trebuie sa fie opuse, adic, valoarea puterii motorului C (corespunztor roii de partea stnga) va trebui s fie pozitiv (100), iar valoarea motorului B (corespunztor roii de partea dreapt) va trebui s fie negativ (-100). Micarea, mai exact, va fi, n cerc, pe loc, spre partea dreapt, micare exemplificat prin imaginea urmtoare.

3. Aplicaia micarea nainte (forward). Aceast aplicaie i propune s evidenieze aciunea de micare nainte a robotului un anumit interval de timp, aciune ce va fi explicat rnd-cu-rnd.

5. Aplicaii 2012
Codul de mai sus i spune robotului s execute o micare de cerc. Mai exact i spune robotului s mite motorul C (corespunztor roii din stnga) nainte timp de trei secunde. Astfel, acionnd un singur motor, va face ca robotul s se mite n cerc. Detaliile fiecrei comenzi sunt urmtoarele:

Comanda motor[] i spune robotului s seteze un motor pentru a-l rula la o anumit valoare a puterii acestuia. Pentru aplicaia considerate, valoarea puterii este de 100, adic 100% din puterea motorului va fi folosit pentru motorul stng.

Comanda wait1Msec() i spune robotului s atepte un timp exprimat n milisecunde, a crui valoare este nscris ntre paranteze. n cazul nostrum, 3000 milisecunde semnific trei secunde, deci robotul execut micarea timp de trei secunde. nainte de a merge mai departe, vom salva programul curent. Pentru acest lucru, mergem n meniul File, selectm Save as, dup care redenumim programul cu numele Labyrinth. Procedm ca n imaginea urmtoare.

n continuare, vom aduga o nou linie n programul nostru.

5. Aplicaii 2012

Pentru a face robotul s se mite conform aplicaiei, trebuie ca ambele motoare s se mite ctre nainte. Aa cum am vzut mai sus, comanda motor[motorC]=100; face ca motorul C (corespunztor roii din stnga) s se mite nainte cu 100% din puterea motorului. Pentru a face i ca motorul B (corespunztor roii din dreapta) s se mite nainte cu 100% din puterea motorului, va trebui s folosim aceeai comand, cu diferena c n loc de motorC va trebui s folosim motorB.

Asigurai-v c robotul este pornit i conectat la PC prin cablul USB. Dup aceasta, se merge la meniul Robot, de unde se va selecta submeniul Compile and Download.

Odat ce programul a fost descrcat i rulat, robotul se va mica pe direcia nainte timp de trei secunde. Se poate deconecta robotul de la cablul USB, putndu-se re-rula programul Labyrinth.

5. Aplicaii 2012

4. Aplicaia Traseul O sarcin tipic pentru a inventaria robotul este aceea de a-l face s se mite pe un traseu, eventual fcnd ca acesta s ntlneasc i un obstacol. Robotul nefiind suficient de avansat pentru a-i determina singur traseul corect pentru a ajunge la destinaie, va avea nevoie de asisten uman, pentru a gsi acea soluie. De exemplu, se consider urmtorul traseu, prezentat n figura de mai jos:

n scopul de a urma calea de mai sus, robotul are nevoie de o modalitate de a se orienta n mediu din exemplul considerat. i cum distana dintre rafturi este neregulat, nseamn c mprirea traseului dup

5. Aplicaii 2012
distan nu reprezint o soluie. n schimb acesta se poate baza pe marcajele existente pe podea, ca n imaginea de mai jos.

S aruncm o privire asupra traseului pe care l are de ndeplinit robotul. Se presupune c robotul trebuie s ajung n punctul marcat cu X.

Cum poate robotul ajunge la punctul dorit?

5. Aplicaii 2012

Ar putea ajunge la destinaie utiliznd traseul din figura 1? Sau poate utiliznd unul dintre traseele descrise n figura 2? Este evident c toate din aceste trasee reprezint o soluie de urmat pentru robot pentru a ndeplini sarcina impus. S aruncm o privire asupra traseului descris de linia albastra, din figura 1. Acest traseu se poate mpri n mai multe comportamente consecutive, mai mici.

5. Aplicaii 2012
n acelai mod i traseul verde din figura 2, poate fi mprit n mai multe comportamente mai mici.

Este de remarcat, c cele dou comportamente, au mai multe sub-comportamente asemntoare.

5. Aplicaii 2012
Pentru traseul albastru vom creea, pentru fiecare sub-comportament, cte o funcie care s ncapsuleze ntreaga sarcin pe care o are robotul de executat, ntr-un pachet reutilizabil. Se va proceda dup cum urmeaz: 1. Se deschide programul RobotC, apoi File > New pentru a creea un nou editor de cod.

2. Se creeaz o sarcin nou (task main), dar fr a se introduce nc vreo linie de cod.

3. nainte de task main() se vor insera cteva spaii blank, unde se vor edita funciile necesare.

4. Se va creea un schelet al unei funcii numite turnLeft. void este un cuvnd cheie ce va fi folosit pentru a ncepe declararea funciei. Se vor folosi dou acolade (una deschis i cealalt nchis), n interiorul crora se va scrie codul funciei.

5. Aplicaii 2012

5. Plasm comenzile specifice unei aciuni de ntoarcere, ntre cele dou accolade ale funciei. Aceast funcie folosete senzorul de rotaie pentru a deternima gradul de rotaie al robotului.

Aadar, a fost creeat funcia turnLeft i specificate comenzile pe care robotul trebuie s le urmeze, atunci cnd funcia va fi apelat. Pentru a folosi funcia, aceasta va fi apelat cu numele su, n funcia principal main.

5. Aplicaii 2012

Rezultatul, dup apelul funciei, va fi:

Funcia turnLeft pare s funcioneze bine. Acum, vom creea funcia turnRight, bazat pe codul funciei turnLeft, dup cum urmeaz.

5. Aplicaii 2012

Aa cum se vede, funcia turnRight este bazat pe codul funciei turnLeft, cu deosebirile c, numele celei de-a doua funcie este schimbat, se contorizeaz numrul de grade parcurse pentru motorul C, puterea transmis celor dou roi este aceeai, cu deosebirea c, de aceast data, roata de parte stng (corespunztoare motorului C) se va nvrti spre nainte, iar roata din dreapta (corespunztoare motorului B) se va nvrti spre napoi, executnd o ntoarcere ctre dreapta. n continuare vom face apelarea funciei turnRight.

5. Aplicaii 2012

Dup cum se observ, ntre cele dou linii de cod ce fac apelul celor dou funcii, s-a introdus comanda wait1Msec(1000). Aceasta este necesar pentru a-i transmite robotului s se opreasc timp de o secund, dup ce executa codul funciei turnLeft(), astfel fcnd mai vizibile sub-comportamenele acestuia.

5. Aplicaii 2012
Va trebui s declarm dou funcii, moveForward1 i moveForward2, pentru a descrie cele dou micri nainte pe care trebuie s le execute robotul.
void moveForward1 () { motor[motorC] = 50; motor[motorB] = 50; wait1Msec(2000); } void moveForward2 () { motor[motorC] = 25; motor[motorB] = 25; wait1Msec(2000); }

Prima funcie, moveForward1(), realizeaz micarea robotului nainte, din momentul n care acesta pleac de pe loc, pn n momentul n care va trebui s se opreasc, pentru a realiza ntoarcerea ctre stnga. Aceast funcie va fi folosit i dup momentul n care robotul realizeaz ntoarcerea ctre stnga, pentru a realiza cea de-a doua micare nainte. Puterea transmis roilor va fi de 50% din capacitate, iar durata de timp pe care se vor mica roile va fi de dou secunde. Cea de-a doua funcie, moveForward2(),realizeaz micarea robotului nainte, dup momentul n care acesta realizeaz ntoarcerea la dreapta. Puterea transmis roilor de ctre motoare va fi de 25% din capacitate, iar durata de timp pe care se vor mica roile va fi de dou secunde, realiznd, deci, o micare pe o distan egal cu jumtate din distana parcurs de robot, dup apelul funciei moveForward1. Traseul robotului, mprit n funcii arat astfel: 1. micare nainte, moveForward1(); 2. ateapt dou secunde, wait1Msec(2000); 3. ntoarcere la stnga, turnLeft(); 4. ateapt dou secunde, wait1Msec(2000); 5. micare nainte, moveForward1(); 6. ateapt dou secunde, wait1Msec(2000); 7. ntoarcere la dreapta, turnRight(); 8. ateapt dou secunde, wait1Msec(2000); 9. micare nainte, moveForward2(); Programul complet al aplicaiei este urmtorul:
void moveForward1 () { motor[motorC] = 50; motor[motorB] = 50; wait1Msec(2000); } void turnLeft() {

5. Aplicaii 2012
nMotorEncoder[motorB] = 0; while (nMotorEncoder[motorB] < 160) { motor[motorC] = -50; motor[motorB] = 50; } motor[motorC] = 0; motor[motorB] = 0; } void turnRight() { nMotorEncoder[motorC] = 0; while (nMotorEncoder[motorC] < 160) { motor[motorC] = 50; motor[motorB] = -50; } motor[motorC] = 0; motor[motorB] = 0; } void moveForward2() { motor[motorC] = 25; motor[motorB] = 25; wait1Msec(2000); } task main() { moveForward1(); wait1Msec(2000); turnLeft(); wait1Msec(2000); moveForward1(); wait1Msec(2000); turnRight(); wait1Msec(2000); moveForward2(); }

Vous aimerez peut-être aussi