This shows you the differences between two versions of the page.
pm:prj2021:abirlica:mcb_car [2021/04/25 20:32] andrei.macadon |
pm:prj2021:abirlica:mcb_car [2021/06/04 16:02] (current) andrei.macadon |
||
---|---|---|---|
Line 2: | Line 2: | ||
**Autor**: Macadon Andrei-Cristian | **Autor**: Macadon Andrei-Cristian | ||
===Introducere=== | ===Introducere=== | ||
- | *Proiectul este reprezentat de o masinuta care poate fi controlata dintr-o aplicatie Arduino. Acest lucru este posibil printr-un modul bluetooth HC-05 conectat la placuta arduino uno. Aceasta se afla pe un sasiu de robot. | + | *Proiectul este reprezentat de o masinuta care poate fi controlata dintr-o aplicatie Arduino. Acest lucru este posibil printr-un modul bluetooth HC-05 conectat la placuta arduino uno. De asemenea, atunci cand masinuta da cu spatele un LED verde va palpai. Exista comanda 'A' care va pune masinuta pe avarii. Avariile pot fi oprite dand, din nou, comanda 'A' sau dand comanda 'S'(ce opreste si motoarele). Aceasta se afla pe un sasiu de robot. |
*Masinuta poate avea mai multe scopuri: | *Masinuta poate avea mai multe scopuri: | ||
- Poate fi folosita pe post de vehicul transport/poate cara anumite chestii: Ex: Iti poti aduce o ciocolata din bucatarie in sufragerie doar cu ajutorul telefonului | - Poate fi folosita pe post de vehicul transport/poate cara anumite chestii: Ex: Iti poti aduce o ciocolata din bucatarie in sufragerie doar cu ajutorul telefonului | ||
Line 10: | Line 10: | ||
**Lista componente** | **Lista componente** | ||
-Arduino Uno | -Arduino Uno | ||
- | -Placa de control motoare | + | -Placa de control motoare L298n |
+ | -4 motoare | ||
-Baterie | -Baterie | ||
-Modul Bluetooth HC-05 | -Modul Bluetooth HC-05 | ||
Line 18: | Line 19: | ||
===Schema Bloc=== | ===Schema Bloc=== | ||
{{:pm:prj2021:abirlica:schemablocpm.png?400|}} | {{:pm:prj2021:abirlica:schemablocpm.png?400|}} | ||
+ | |||
+ | ===Software Design=== | ||
+ | *Implementarea codului este destul de simpla. Prin intermediul calculatorului ma conectez la modulul bluetooth, iar printr-un terminal trimit comenzi precum 'F'(masina merge in fata), 'B'(masina da cu spatele), 'L'(masina face stanga), 'R'(masina face dreapta), 'S'(masina se opreste, avariile se opresc), 'A'(se pornesc sau se sting avariile). | ||
+ | *Pentru a folosi modulul bluetooth am inclus libraria SoftwareSerial.h. | ||
+ | *In setup() setez pinii de output. In loop() verific mereu requestul primit de la terminal si actionez corespunzator(misc masina sau activez avariile). Folosesc doua flag-uri: "avarii" si "backwardsLights" pentru a gestiona aprinderea si inchiderea LED-urilor. | ||
+ | ===Codul masinii=== | ||
+ | <code>#include <SoftwareSerial.h> | ||
+ | SoftwareSerial hc05(0, 1); | ||
+ | |||
+ | int m1pin1 = 8; | ||
+ | int m1pin2 = 9; | ||
+ | int m2pin1 = 10; | ||
+ | int m2pin2 = 11; | ||
+ | int avarii = 0; | ||
+ | int backwardsLights = 0; | ||
+ | char request; | ||
+ | |||
+ | void setup() { | ||
+ | |||
+ | Serial.begin(9600); | ||
+ | hc05.begin(9600); | ||
+ | // put your setup code here, to run once: | ||
+ | pinMode(m1pin1, OUTPUT); | ||
+ | pinMode(m1pin2, OUTPUT); | ||
+ | pinMode(m2pin1, OUTPUT); | ||
+ | pinMode(m2pin2, OUTPUT); | ||
+ | |||
+ | pinMode(4, OUTPUT); | ||
+ | pinMode(5, OUTPUT); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | |||
+ | request = ' '; | ||
+ | if(hc05.available() > 0){ | ||
+ | request = hc05.read(); | ||
+ | Serial.write(Serial.read()); | ||
+ | } | ||
+ | |||
+ | if (request == 'F') { | ||
+ | | ||
+ | //Make the motors run forward: | ||
+ | digitalWrite(m1pin1, HIGH); | ||
+ | digitalWrite(m1pin2, LOW); | ||
+ | | ||
+ | digitalWrite(m2pin1, HIGH); | ||
+ | digitalWrite(m2pin2, LOW); | ||
+ | |||
+ | backwardsLights = 0; | ||
+ | |||
+ | analogWrite(4, 255); //ENA pin | ||
+ | analogWrite(5, 255); //ENB pin | ||
+ | } | ||
+ | if(backwardsLights == 1){ | ||
+ | digitalWrite(6, HIGH); | ||
+ | delay(500); | ||
+ | digitalWrite(6, LOW); | ||
+ | delay(500); | ||
+ | } | ||
+ | if (request == 'B') { | ||
+ | |||
+ | //Make the motors run backwards | ||
+ | digitalWrite(m1pin1, LOW); | ||
+ | digitalWrite(m1pin2, HIGH); | ||
+ | | ||
+ | digitalWrite(m2pin1, LOW); | ||
+ | digitalWrite(m2pin2, HIGH); | ||
+ | // set the flag for the backwardsLights | ||
+ | backwardsLights = 1; | ||
+ | | ||
+ | digitalWrite(6, HIGH); | ||
+ | delay(1000); | ||
+ | digitalWrite(6, LOW); | ||
+ | delay(1000); | ||
+ | | ||
+ | analogWrite(4, 255); //ENA pin | ||
+ | analogWrite(5, 255); //ENB pin | ||
+ | } | ||
+ | |||
+ | if (request == 'L') { | ||
+ | |||
+ | //Make only the left motors run | ||
+ | digitalWrite(m1pin1, HIGH); | ||
+ | digitalWrite(m1pin2, LOW); | ||
+ | | ||
+ | digitalWrite(m2pin1, LOW); | ||
+ | digitalWrite(m2pin2, LOW); | ||
+ | |||
+ | backwardsLights = 0; | ||
+ | |||
+ | analogWrite(4, 255); //ENA pin | ||
+ | analogWrite(5, 255); //ENB pin | ||
+ | } | ||
+ | | ||
+ | if (request == 'R') { | ||
+ | |||
+ | //Make only the right motors run | ||
+ | digitalWrite(m1pin1, LOW); | ||
+ | digitalWrite(m1pin2, LOW); | ||
+ | |||
+ | digitalWrite(m2pin1, HIGH); | ||
+ | digitalWrite(m2pin2, LOW); | ||
+ | |||
+ | backwardsLights = 0; | ||
+ | |||
+ | analogWrite(4, 255); //ENA pin | ||
+ | analogWrite(5, 255); //ENB pin | ||
+ | } | ||
+ | |||
+ | //check the avarii flag to see if the red LED should be flickering or not | ||
+ | if(avarii == 1){ | ||
+ | digitalWrite(7, HIGH); | ||
+ | delay(500); | ||
+ | digitalWrite(7, LOW); | ||
+ | delay(500); | ||
+ | } | ||
+ | |||
+ | if (request == 'S') { | ||
+ | | ||
+ | // stop all the motors | ||
+ | digitalWrite(m1pin1, LOW); | ||
+ | digitalWrite(m1pin2, LOW); | ||
+ | |||
+ | digitalWrite(m2pin1, LOW); | ||
+ | digitalWrite(m2pin2, LOW); | ||
+ | |||
+ | //stop avarii | ||
+ | digitalWrite(7, LOW); | ||
+ | |||
+ | analogWrite(4, 0); //ENA pin | ||
+ | analogWrite(5, 0); //ENB pin | ||
+ | //set the flags accordingly | ||
+ | avarii = 0; | ||
+ | backwardsLights = 0; | ||
+ | } | ||
+ | if(request == 'A'){ | ||
+ | // turn on avarii | ||
+ | digitalWrite(7, HIGH); | ||
+ | delay(1000); | ||
+ | digitalWrite(7, LOW); | ||
+ | delay(1000); | ||
+ | // if avarii were already turned on, turn them off | ||
+ | if(avarii == 0){ | ||
+ | avarii = 1; | ||
+ | } else { | ||
+ | avarii = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ===Poze=== | ||
+ | {{:pm:prj2021:abirlica:poza_andrei_macadon_2.jpeg?nolink&300|}} | ||
+ | {{:pm:prj2021:abirlica:poza_andrei_macadon_3.jpeg?nolink&300|}} | ||
+ | {{:pm:prj2021:abirlica:poza_andrei_macadon_1.jpeg?nolink&300|}} | ||
+ | {{:pm:prj2021:abirlica:poza_andrei_macadon_4.jpeg?nolink&300|}} | ||
+ | ===Demo=== | ||
+ | [[https://youtu.be/WCbSVXxYX_Y]] | ||
===Bibliografie=== | ===Bibliografie=== | ||
+ | [[https://www.youtube.com/watch?v=tujih1afqiE]] | ||
[[https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/mcb_car]] | [[https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/mcb_car]] | ||
[[https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/mcb_car?do=export_pdf]] | [[https://ocw.cs.pub.ro/courses/pm/prj2021/abirlica/mcb_car?do=export_pdf]] |