Acest proiect consta in crearea unei masinute teleghidate cu ajutorul unei comunicare seriala radio (HC-12).
Controller-ul trimite comenzile sub forma de un sir de caractere care mai apoi dupa ce sunt primite de masina, sunt decodificate si se actioneaza asupra ele. Comenzile se trimit cu ajutorul bibliotecii SoftwareSerial care face conexiunea prin serial intre Arduino-uri. Pentru a controla am optat pentru un motor shield deoarece ce foloseam de obicei (L298N dual H-bridge) nu-mi ajunge pentru a controla 4 motoare si un servo. Carcasa masinii e printata 3d cu filament PLA (Daca o lasi in masina vara, nici ca o mai vezi).
In viitor poate adaug un ecran Nokia 5110 pe controller si senzori infrarosu (Un fel de radar pentru cand vizibilitatea e redusa).
In imaginea de mai sus, modulul RF este in realitate modulul HC-12 dar nu puteam gasi componenta exacta in aplicatie (Data Reciever = RX, Data Transmitter = Tx). La driver-ul pentru motoare, nu puteam conecta la GND-ul bun asa ca le am conectat una langa alta. Bateria din litiu e conectata la shield la EXT_PWR. Joystick shield-ul este reprezentat de un buton si un joystick unde pinii de la joystick sunt pinii si in cod (la fel si pentru buton).
Lista de componente:
Concepte folosite:
SoftwareSerial hc12(A3, A4); // TX and RX PIN AF_DCMotor motorfl(1); AF_DCMotor motorfr(2); AF_DCMotor motorbl(3); AF_DCMotor motorbr(4);
Aici am declarat modulul HC-12 de transmitere prin pinii A3 si A4 inloc de pinii RX si TX. Motoarele le am declarat cu 'f' ca fata, 'b' spate, 'l' stanga si 'r' dreapta.
Serial.begin(9600); hc12.begin(9600);
void loop() { String in = comEnc(analogRead(PIN_ANALOG_X), analogRead(PIN_ANALOG_Y)); hc12.print(in); Serial.println(in); delay(100); } String comEnc(int x, int y) { String cmd = ""; if (y < 516) { cmd += "s"; } else if (y > 521) { cmd += "w"; } if (x < 513) { cmd += "a"; } else if (x > 516) { cmd += "d"; } cmd += '\n'; return cmd; }
Aici am citit valorile de pe joystick si in functia comEnc am transformat acele valori intr-un sir de caractere care vor fi trimise la masina pentru a o controla.
void loop() { // put your main code here, to run repeatedly: if (hc12.available()) { String input = hc12.readStringUntil('\n'); Serial.println(input); if (input.indexOf('s') != -1) { motorfl.run(FORWARD); motorfr.run(FORWARD); motorbl.run(BACKWARD); motorbr.run(BACKWARD); } else if (input.indexOf('w') != -1){ motorfl.run(BACKWARD); motorfr.run(BACKWARD); motorbl.run(FORWARD); motorbr.run(FORWARD); } else if (input.indexOf('a') != -1){ motorfl.run(BACKWARD); motorfr.run(FORWARD); motorbl.run(FORWARD); motorbr.run(BACKWARD); } else if (input.indexOf('d') != -1){ motorfl.run(FORWARD); motorfr.run(BACKWARD); motorbl.run(BACKWARD); motorbr.run(FORWARD); } else { motorfl.run(RELEASE); motorfr.run(RELEASE); motorbl.run(RELEASE); motorbr.run(RELEASE); } } }
Aici masina primeste comenzile transmise in forma de string si efectueaza miscarile de motor. Viteza se poate modifica in setup cu motorX.setSpeed().
Implementarea a implicat gestionarea intrarilor analogice cum ar fi joystick ul.
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.