This is an old revision of the document!
Robot cu sistem de parcare automat
Introducere
Acest proiect implementeaza o masinuta controlata prin telecomanda, echipata cu optiunile de controlare a directiei si de parcare automata.
Scopul proiectului este acela de a facilita parcarea unei masini și de a preveni o eventuala coliziune.
Descriere generală
Functionalitatea de baza a proiectului este detectia de obstacole in spatele, cat si in partile laterale ale masinutei. Aceasta va fi dotata cu un senzor cu ultrasunete, montat pe un suport, pentru a determina distanta fata de obiecte. Sasiul se poate controla printr-un senzor de captare a luminii infrarosii de la o telecomanda comuna (de televizor) si un motor driver L298N folosit pentru a pune in miscare cele 2 roti. Datorita rotii ajutatoare din fata (cea de a treia roata), masinuta se va putea si rotii. De asemenea, apasand un buton ales arbitrar de pe telecomanda, masinuta va intra in modul de parcare automata si se va deplasa cu spatele pana cand va detecta o coliziune, caz in care placuta Arduino va solicita oprirea motoarelor.
Schema bloc
Hardware Design
Lista de piese:
Arduino UNO
Kit de Robot Premium din Aluminiu
Doua Motoare DC
Driver de Motoare Dual L298N
Modul Receptor Telecomandă Infraroșu
Senzor ultrasonic HC-SR04
Suport pentru Senzorul Ultrasonic HC-SR04
Jumper Cables
Suport baterie 9V
Baterie 9V
Schema Electrica
Software Design
Descrierea codului aplicaţiei (firmware):
mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
librării şi surse 3rd-party (e.g. Procyon AVRlib)
algoritmi şi structuri pe care plănuiţi să le implementaţi
(etapa 3) surse şi funcţii implementate
Program Flow
Odata ce circuitul masinutei este alimentat de la baterie, in setup() se vor initializa senzorul ultrasonic si de captare a luminii infrarosii, precum si pinii motoarelor DC care asteapta semnale de la telecomanda.
Pentru o organizare mai buna a logicii programului, am creat cateva functii ajutatoare:
bool detectCollision();
void controlMotors(int IN1_val, int IN2_val, int IN3_val, int IN4_val);
void stopMotors();
Detectarea coliziunilor
Verificam daca masinuta este in miscare deoarece stand pe loc nu exista posibilitatea de lovire;
Daca merge cu fata, masinuta se va indeparta de obiectul din spatele acesteia, deci ii permitem miscarea;
Masinuta se va opri daca detecteaza vreun obiect la o distanta mai mica sau egala cu 10cm.
bool detectCollision()
{
if (isRunning && (distance > 0 && distance <= 10) && !goFront)
return true;
return false;
}
Biblioteca <NewPing.h> implementeaza calcularea distantei in asa fel incat daca un obiect este mai departe decat distanta maxima la care este setat senzorul, acesta va intoarce distanta 0.
Controlul motoarelor
Daca exista vreun obstacol in directia spre care urmeaza sa porneasca masinuta, motoarele nu vor porni deoarece vor fi imediat oprite in bucla loop();
In cazul in care motoarele pornesc, semnalizam faptul ca masinuta se afla in miscare.
void controlMotors(int IN1_val, int IN2_val, int IN3_val, int IN4_val)
{
if (distance == 0 || distance > 10 || goFront) {
digitalWrite(IN1, IN1_val);
digitalWrite(IN2, IN2_val);
digitalWrite(IN3, IN3_val);
digitalWrite(IN4, IN4_val);
isRunning = true;
}
}
► loop() ⇒ aici se verifica daca se detecteaza vreo coliziune si se trateaza semnalele de la telecomanda.
Verificam daca senzorul ultrasonic detecteaza vreun obiect, caz in care oprim motoarele si semnalam ca masinuta s-a oprit;
Daca masinuta nu este in miscare sau merge cu fata, nu vom opri niciodata motoarele.
if (detectCollision()) {
stopMotors();
isRunning = false;
}
Rutina de detectare si tratare a semnalelor de la telecomanda;
Butoanele controleaza diferit motoarele masinutei, in functie de directia de mers pe care ne-o dorim sau daca vrem sa ne oprim;
Modificam variabila conditie daca masinuta porneste cu fata sau nu.
if (IrReceiver.decode()) {
switch (IrReceiver.decodedIRData.decodedRawData) {
case 3810328320:
// Backwards ==> 'OK' BUTTON
controlMotors(HIGH, LOW, LOW, HIGH);
goFront = false;
break;
case 3877175040:
// Go in front ==> '^' BUTTON
controlMotors(LOW, HIGH, HIGH, LOW);
goFront = true;
break;
case 4144561920:
// Left ==> '<' BUTTON
controlMotors(HIGH, LOW, HIGH, LOW);
goFront = false;
break;
case 2774204160:
// Right ==> '>' BUTTON
controlMotors(LOW, HIGH, LOW, HIGH);
goFront = false;
break;
case 3860463360:
// STOP ==> '0' BUTTON
stopMotors();
goFront = false;
isRunning = false;
}
IrReceiver.resume(); // Enable receiving of the next value
}
Medii de dezvoltare
Biblioteci
Rezultate Obţinute
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Concluzii
Download
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună

.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Jurnal
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
Bibliografie/Resurse
Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.
Export to PDF