Vlad-Adrian ŞTEFĂNESCU (78339) - Spălătorie Auto 🏎️🚿

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Î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:

  • Cum își curăță micii proprietari mașinuțele de jucărie?
  • Cum își pot întretine cât mai bine micii lor bolizi?
  • Se pot realiza oare aceste lucruri complet automat?

Răspunsul este aici: spălătoria automată pentru mașini de jucărie.

Descriere generală

Spălătoria automată este formată din:

  • 6 stâlpi circulari, cu perii (3 pe o parte și 3 pe alta)
  • o platformă la intrarea căreia se va afla un senzor de proximitate cu infraroșu
  • un buzzer și LED-uri pentru alertarea micului șofer
  • un sistem de curățare de ultimă generație, format din 2 pompițe:
    • cu apă
    • cu detergent

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.

Hardware Design

1. Listă de piese:

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

2. Schemă electrică:

Software Design

1. Mediu de dezvoltare:

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

2. Biblioteci incluse:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include <stdlib.h>
#include <stdio.h>

3. Funcții de inițializare:

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();

4. Funcții de control:

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();

5. Întreruperi:

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();
    }
}

6. Control Buzzer:

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);
    }
}

Observații:

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.

Rezultate Obţinute

Cred că cel mai bine rezultatele pot fi evidențiate prin intermediul unor imagini și a unui filmuleț sugestiv:

OBS 1: Din motive de siguranță, nu am folosit apă când am surprins imaginile de mai sus!

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

Concluzii

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.

Download

Bibliografie/Resurse

pm/prj2018/adraghici/vstef.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0