Proiectul constă în implementarea unui sistem de siguranță pentru camioane, șoferul fiind nevoit să treacă un test de alcool pentru a putea porni motorul, pentru demonstratie contine un servo motor. Acesta utilizează o cartelă RFID pentru a verifica identitatea șoferului, dispune de un ecran LCD pentru afișarea informațiilor, un buzzer pentru a alerta utilizatorul în timpul procesului și un card SD pentru stocarea rezultatelor și prevenirea fraudei. (Ideal) Cardul SD este plasat strategic în interiorul camionului, astfel încât să fie inaccesibil.
Implementarea acestui sistem de siguranță pentru camioane este utilă pentru prevenirea accidentelor rutiere și protejarea vieților, cerința de a trece un test de alcool înainte de a porni motorul contribuind la asigurarea că șoferii sunt în stare bună și în deplină capacitate de a conduce.
Consider că proiectul reprezintă un prototip viabil, care, cu ajustări minime, ar putea fi adaptat și implementat în sistemul unui camion.
Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html
Pasii pe care soferul trebuie sa ii urmeze sunt:
Soferul trebuie sa astepte pana cand senzorul de alcool este pregatit (senzorul MQ3 are un timp necesar pentru incalzire). Soferul valideaza cardul sau la cititorul RFID pentru a confirma identitatea. Daca identitatea este confirmata atunci se va afisa numele sau si este gata sa inceapa testul. Senzorul de alcool MQ3 preia aerul suflat spre el si transmite rezultatul la arduino. Arduino-ul proceseaza rezultatul primit de la senzor si dupa procesarea calculului exista 2 situatii: nivelul de alcool este egal cu 0 sau mai mare decat 0. Pentru testul negativ se transmite prin USB “ENGINE_STARTING”, se afiseaza pe LCD ca se poate porni motorul si porneste servo motorul. In cazul in care testul este pozitiv la alcool, atunci soferul nu poate porni motorul, este afisat un mesaj conform pe LCD si primeste un delay de 15 minute pana cand va putea reincepe procesul.
Explicatii pini:
1) Pentru motorul servo SG90 am ales drept pin de semnal, pinul 6 digital PWM(orice pin digital PWM era bun).
2) Pentru senzorul de alcool MQ3 am ales sa il folosesc in mod analogic, astfel am conectat la A0, respectiv A0 la arduino (orice pin analog era ok).
3) Pentru LCD I2C am urmat varianta standard de conectare. (https://projecthub.arduino.cc/arduino_uno_guy/i2c-liquid-crystal-displays-5eb615). Am folosit pinii A4 si A5 pentru a obtine SDA respectiv SCL.
4) Buzzerul pasiv l-am conectat la pinul digital 2 deoarece imi era mai accesibil. Orice pin digital liber este perfect okay.
Problema a fost la RFID si SD card reader, ambele folosind SPI deci aveau MISO, MOSI si SCK comun. O solutie de pe internet care m-a ajutat in conectarea si cardului SD, dar si a RFID-ului simultan: https://forum.arduino.cc/t/sd-card-and-rfid-not-working-together-spi-conflict/995287/6
Astfel:
5) Pentru RFID am conectat la pinii digitali: 11 pentru MOSI, 12 pentru MISO, 13 pentru SCK, 10 pentru SDA si 9 pentru RST.
6) Pentru SD card reader am conectat la pinii digitali: 11 pentru MOSI, 12 pentru MISO, 13 pentru SCK, am adaugat rezistenta de 220 in plus pentru MISO, si 4 pentru CS.
PENTRU DEMO: Am pus link cu video pe YT la “Rezultate obtinute”
Mediul de dezvoltare folosit este Arduino IDE. Este o alegere excelenta pentru un incepator, avand un setup foarte simplu.
Stadiul actual al implementarii: Proiectul implementeaza tot ce mi-am propus, acesta are drept functionalitati software:
Motivatia alegerii bibliotecilor:
Elementul de noutate al proiectului: unicitatea este ideea de integrare a unui sistem in plus de siguranta, pentru a preveni condusul sub influenta alcoolului.
Utilizarea functionalitatilor din laborator in cadrul proiectului:
Scheletul proiectului:
setup(): am initializat lcd-ul, sd card reader-ul si rfid-ul. Am setat pinii pentru servo motor si pentru buzzer. Am afisat un mesaj de informare, ca trebuie asteptate 3 beep-uri. Am setat un delay pentru a astepta sa se incalzeasca senzorul de alcool. Dupa delay am folosit functia tone() pentru a reda 3 sunete, pentru a alerta utilizatorul ca senzorul este gata.
loop(): am folosit functia PICC_IsNewCardPresent() pentru a detecta aparitia unei cartele RFID. Cu ajutorul PICC_ReadCardSerial() este citita valoarea cartelei. Daca este egala cu o anumita valoare (cunoscuta), afisez “Hello Marian” si varsta random de 22 de ani. (Marian e ales arbitrar) Ulterior actualizez lcd-ul si apelez functia performBreathalyzerTest(). Am incercat sa folosesc functii pentru fiecare componenta pentru un coding style mai bun. Functia foloseste analogRead() si citeste valoarea de la senzorul de alcool. Aici intervine logica explicata in calibrarea elementelor de senzoristica. Dupa intoarcerea rezultatului functiei, se apeleaza saveDataToSD() care verifica initializarea cardului SD si folosind SD.open() obtine un dataFile, pe care apeleaza metoda print() si println() pentru a scrie concentratia de alcool si UID-ul soferului in fisier. Dupa salvarea rezultatului, daca valoarea a fost zero atunci apelez functia servoSpin(), care folosind 2 for uri realizeaza 10 miscari ale servo motorului. In schimb, daca valoarea este pozitiva, atunci afisez un mesaj si pun un delay de 2 minute, care folosind un while afiseaza live cat a mai ramas.
Calibrarea elementelor de senzoristica:
Ideea mea a fost sa iau o valoare de baza, senzorul depinde si de camera in care te afli, poluarea din ea, pentru ca el nu analizeaza strict alcoolul. Astfel, salvez valoarea intiala si apoi intr-un while extrag valori. Daca diferenta este mai mare de un prag intre cele doua (pragul setat este de 100) atunci inseamna ca e alcool detectat.
Probleme intalnite:
M-am incadrat in toate deadline-urile la timp. Initial, cand aveam ideea deja lucram la proiect si a fost gata inainte de deadline hard si soft. Ulterior, m-am ocupat de aranjarea site-ului de pe ocw.
Resurse software:
Laboratoare: