Autorul poate fi contactat la adresa: Login pentru adresa
În zilele noastre, pe piața jucăriilor, există o grămadă de mașinuțe, teleghidate sau nu, care au un real succes în lumea copiilor. Cu toate acestea însă, ne punem urmatoarele intrebari:
Răspunsul este aici: spălătoria automată pentru mașini de jucărie.
Spălătoria automată este formată din:
Mod de funcționare:
Când senzorul de la intrarea spălătoriei detectează prezența mașinii pe rampă, periile controlate de motoare încep să se rotească, iar un led se aprinde pe culoarea roșie - semn că spălătoria este momentan ocupată cu un client. Pompele de apă și săpun sunt și ele controlate de motoare și vor uda și curăța mașina după un program de spălare prestabilit. De asemenea, va exista și un buzzer care va confirma sonor începerea și terminarea procesului de spălare.
La final, periile și pompele se opresc, iar un led verde se aprinde pentru a confirma terminarea procesului. Apoi, șoferul poate părăsi platforma și își poate vedea în continuare de drum.
Denumire Componentă | Număr | Preț |
---|---|---|
Placă de bază | x1 | 8 RON |
ATmega 324A + piese obligatorii | x1 | 27 RON |
Shield driver motoare L298N | x2 | 19.98 RON |
Senzor de proximitate cu infraroșu | x1 | 4.49 RON |
Motor de curent continuu | x1 | Găsit prin mașinuțe |
Mini pompă de apă 3-6V | x2 | 19.98 RON |
Acumulatori 1.5V | x4 | Găsite prin casă |
Soclu acumulatori | x1 | 4.99 RON |
Buzzer | x1 | 5.49 RON |
Cablu USB | x1 | 3.49 RON |
LED | x2 | 0.98 RON |
Bigudiuri (pe post de perii) | x6 | Neprețuite |
Multimetru digital | x1 | 13.99 RON |
Fire tată - tată | x65 | 9.99 RON |
Fire mamă - tată | x10 | Donație |
Fire mamă - mamă | x25 | 10 RON |
Eprubete (pe post de stâlpi pentru perii) | x6 | Just don't ask |
Furtune de oxigen (pentru alimentarea cu apă) | x2 | Just don't ask |
Cap de aspirator dentar (pentru direcționarea jetului de apă) | x2 | Just don't ask |
Sistem de operare: Windows
Editare: Programmer's Notepad (WinAVR Edition)
Biblioteci AVR și comunicarea cu placa: WinAVR Toolkit
Încărcarea programului: HID Boot Flash (GUI version)
Creare schemă electrică: Autodesk Eagle 9.0.0
Creare schemă bloc: www.draw.io
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h>
Inițiere porturi de intrare (senzor de proximitate - PB2):
void init_in_ports();
Inițiere porturi de ieșire (cele 2 LED-uri de confirmare vizuală - PB3 și PB4, buzzerul - PB5, cele 3 direcții pentru motoare - PA0, PA1 și PA2, LED-ul USER de pe plăcuță - PD7):
void init_out_ports();
Inițiere timer pe 16 biți, care dă câte o întrerupere la fiecare secundă (secundele sunt salvate în variabila no_overflows):
volatile uint8_t no_overflows; void timer1_init();
Activare/dezactivare întreruperi pe porturile de intrare (INT2 pentru senzorul de proximitate de pe PB2):
void in_int_enable(); void in_int_disable();
Activare/dezactivare motoare (activare/dezactivare PA0, PA1, PA2, care controleaza direcția motoarelor conectate la driverele L298N; daca pinul de direcție este 0, motorul se oprește, iar dacă este 1 motorul se rotește în sensul acelor de ceasornic):
void set_motor1(); void reset_motor1(); void set_motor2(); void reset_motor2(); void set_motor3(); void reset_motor3();
La fiecare secundă, se verifică în ce stadiu al ciclului de spălare ne aflăm. În primele 60 de secunde de la intrarea mașinii în spălătorie, motoarele sunt oprite sau pornite în funcție de cum se dorește a fi spălată mașina. După 60 de secunde se semnalează faptul că ciclul de spălare s-a terminat și că mașina ar trebui să părăsească spălătoria. Apoi, alte 30 de secunde trebuie să se scurgă pentru ca o nouă mașină să poată fi spălată (timp de 90 de secunde întreruperea venită de la senzorul de proximitate este dezactivată).
ISR(TIMER1_OVF_vect) { // count seconds-ish no_overflows++; // the car is inside if (PORTB & (1 << PB3)) { // start brushes after 5 seconds if (no_overflows >= 5) { set_motor3(); } // after 10 seconds, water will be pumped in (10 sec duration) if (no_overflows >= 10 && no_overflows < 20) { set_motor1(); // after 20 seconds, add some soap as well (10 sec duration) } else if (no_overflows >= 20 && no_overflows < 30) { set_motor2(); // after 30 seconds, stop pumping anything (5 sec duration) } else if (no_overflows >= 30 && no_overflows < 35) { reset_motor1(); reset_motor2(); // after 35 seconds, add some water again (10 sec duration) } else if (no_overflows >= 35 && no_overflows < 45) { set_motor1(); // after 45 seconds, just brush that tiny car ('till the end) } else if (no_overflows >= 45) { reset_motor1(); } // stop brushes 5 seconds before the end of the wash cycle if (no_overflows <= 55) { reset_motor3(); } } // 1 minute passed if (no_overflows >= 60) { // start toggling the test LED PORTD ^= (1 << PD7); // if stop LED is enabled if (PORTB & (1 << PB3)) { // disable the stop LED PORTB &= ~(1 << PB3); // enable the confirmation LED PORTB |= (1 << PB4); } } // another 30 seconds must pass before allowing another car in if (no_overflows >= 90) { // reset the number of overflows (seconds) no_overflows = 0; // enable interrupts again in_int_enable(); } }
Când senzorul de proximitate detectează mișcare, trimite un semnal 1 pe PB2, activănd o rutină de tratare a întreruperii asociate. Dacă nu se află deja o mașină în spălătorie, semnalează intrarea unei mașini și dezactivează întreruperile (ele vor fi reactivate după un total de 90 de secunde). Apoi, ciclul de spălare începe.
ISR(INT2_vect) { // if confirmation LED is active if (PORTB & (1 << PB4)) { // enable the stop LED PORTB |= (1 << PB3); // deactivate the confirmation LED PORTB &= ~(1 << PB4); // reset timer counter TCNT1 = 0; // reset number of overflows (Seconds) no_overflows = 0; // deactivate the proximity sensor interrupt // (90 seconds must pass) in_int_disable(); } }
Controlul buzzerului se face în funcția main, la începutul ciclului de spălare, dar și la finalul acestuia. Beep-ul generat durează 2 secunde.
while(1) { // run the buzzer for 2 seconds when the car comes in // and when the washing cycle finishes if ( (no_overflows <= 2 && (PORTB & (1 << PB3))) || (no_overflows >= 60 && no_overflows <= 62 && !(EIMSK & (1 << INT2)))) { // generate buzzer beep PORTB ^= (1 << PB5); _delay_ms(50); // turn off the buzzer, otherwise } else { PORTB |= (1 << PB5); } }
Faptul că driverul L298N are 2 pini de direcție (00 - stopped, 01 - clockwise, 10 - counterclockwise) m-a ajutat foarte mult. Neinteresându-mă direcția în care se învârt motoarele, am folosit acești pini pentru a le porni sau opri.
Cred că cel mai bine rezultatele pot fi evidențiate prin intermediul unor imagini și a unui filmuleț sugestiv:
OBS 2: Din păcate, nu am reușit să învârt și a 3-a perie din setul de 3.
Bonus Video: https://www.youtube.com/watch?v=uYiI3Rs1dh0
Proiectul mi s-a părut foarte interesat, în primul rănd, pentru că am trecut prin toate etapele dezvoltării unei aplicații embedded, punând în aplicare cunoștințele din mai multe domenii: electronică, hardware design, programare etc. Pe lângă asta, a fost un adevărat challenge să construiesc cadrul spălătoriei și să simulez efectiv procesele care au loc într-o spălătorie de mașini reală.
Overall, sunt destul de mulțumit de rezultatul final, știind că am plecat de la a lipi niște rezistențe pe un PCB la o mașinărie funcțională cu care mă pot mândri.
ATmega324A Datasheet
L298N Datasheet
Atmel AVR Tutorial
Documentația în format PDF