Table of Contents

Senzor de Parcare

Introducere

Senzorul de Parcare este un dispozitiv care se foloseste de 2 senzori ultrasonici care vor detecta obiectele ce se afla in vecinatatea lor. Un LED se va aprinde atunci cand unul dintre senzori va detecta un obiect apropiat de autovehicul. Acesta isi va schimba culoarea incepand cu verde(obiectul nu este inca un pericol) ajungand, treptat, la culoarea rosie(obiectul este un pericol pentru masina). De asemenea, distanta pana la cel mai apropiat obiect detectat (daca un obiect este detectat) va fi afisata pe un ecran LCD. Pentru a atrage atentia soferului, voi folosi un buzzer pasiv care isi va schimba frecventa in functie de distanta obiectului. Cu cat obiectul este mai aproape, cu atat frecventa buzzer-ului va creste.

Ideea de la care am pornit in dezvoltarea proiectului a fost masina. Cand am parcat masina, am parcat-o foarte aproape de un stalp. Din fericire nu am atins stalpul, dar un senzor de parcara m-ar fi ajutat sa las mai mult spatiu.

Consider ca acest dispozitiv este unul foarte util in masina orcarei persoane, ajutand soferul sa evite deteriorarea masinii in timpul parcarii sau chiar in timpul navigarii in spatii inguste.

Descriere generală

ParkingSensorDiagram.drawio.html

Senzorii HC-SR04 transmit informatia colectata catre microcontroller. Acesta va transmite informatia catre LCD, va seta frecventa buzzer-ului si va aprinde LED-ul corespunzator senzorului.

Hardware Design

Componente utilizate:

Nimic detectat:

nothing.jpg

Un obiect detectat la o distanta mai mare de 30 cm:

medium.jpg

Un obiect detectat la o distanta mai mica de 30cm:

close.jpg

Doua obiecte detectate, la distante diferite:

button.jpg

Este oprit prin intrerupere:

off.jpg

Software Design

Am inceput prin rezolvarea proiectului pentru a verifica daca functioneaza toate componentele. Apoi, am implementat, pe rand, fiecare functionalitate astfel (in Platform IO):

1. LCD display: Am implementat I2C pentru a putea comunica cu display-ul si functiile necesare pentru a afisa pe display. Am folosit urmatoarele exemple pentru a putea implementa: https://github.com/denisgoriachev/liquid_crystal_i2c_avr/tree/master https://github.com/gpg/wk-misc/blob/master/ebus/i2c-lcd.c

2. Am implementat functionarea senzorilor ultrasonici. Pentru a detecta distanta de la cel mai apropiat obiect a fost nevoie de trimiterea unui impuls si asteptarea primirii acestuia. Astfel, prin diferenta de la momentul trimiterii pana la momentul primirii (si inca un calcul scurt) va fi chiar distanta dorita.

void ultrasonic_trigger(void) {
    // Send trigger signal
    PORTB |= _BV(TRIG);
    _delay_us(10);
    PORTB &= ~_BV(TRIG); 
}

Pinul de trigger este put pe HIGH (1) pentru 10 microsecunde, apoi pus inapoi pe LOW (0).

uint16_t ultrasonic_calculate_distance(void) {
    if(turn == 0) {
        while(!(PINB & _BV(ECHO1)));
        TCNT1 = 0;
 
        TCCR1B |= _BV(CS11);
 
        while(PINB & _BV(ECHO1));
    } else {
        while(!(PINB & _BV(ECHO2)));
        TCNT1 = 0;
 
        TCCR1B |= _BV(CS11);
 
        while(PINB & _BV(ECHO2));
    }
        TCCR1B &= ~_BV(CS11);
        return TCNT1 / 58;
}

Pinul corespunztor senzorului asteapta semnalul trimis de trigger si calculeaza distanta. Deoarece, pinii PWM de pe microcontroller sunt limitati, am folosit acelasi pin de trigger pentru ambii senzori. Astfel, pinii ce “asculta” semnalul vor face cu randul pentru a putea detecta amandoi distanta. Pentru a calcula timpul am folosti Timer1.

3. Buton si LED LED-ul isi schimba culoarea din verde in rosu in functie de distanta minima. Daca distanta minima este mai mica de 30, LED-ul va fi rosu, altfel soferul stie ca nu prea mai are spatiu. Daca distanta minima este intre 30 si 50, LED ul va fi verde, astfel soferul stie ca mai are putin spatiu. Daca distanta este mai mare de 50, LED-ul va fi stins.

void set_color(uint16_t distance) {
    if(active) {
        if(distance < 20) {
            PORTD |= _BV(RED); // Turn on red LED
            PORTD &= ~_BV(GREEN); // Turn off green LED
        } else if (distance < 50){
            PORTD &= ~_BV(RED); // Turn off red LED
            PORTD |= _BV(GREEN); // Turn on green LED
        } else {
           turn_off_LED();
        }
    } else {
        turn_off_LED();
    }
}

Butonul poate aprinde sau stinge LED-ul si Buzzer-ul. Acest lucru a fost facut prin intrerupere.

ISR(INT0_vect) {
    if(button_debounce_count == 0) {
        active ^= 1;
        button_debounce_count = 100;
    }
}

Am facut si debouncing pentru buton:

ISR(TIMER2_COMPA_vect) {
    static uint8_t last_button_state = 0;
    uint8_t current_button_state = (PIND & _BV(BUTTON)) == 0;

    if (button_debounce_count > 0) {
        --button_debounce_count;
        if (button_debounce_count == 0) {
            if (current_button_state != button_state) {
                button_state = current_button_state;
                last_button_state = current_button_state;
            }
        }
    }
}

M-am folosti de timer2 pentru debouncing.

4. Buzzer Pentru buzzer m-am folosti de timer0 setat pe Fast PWM cu Clear on Compare. Astfel, am setat TCCR0B pentru a-l porni/opri.

void start_buzzer(void) {
    // Turn on buzzer
    TCCR0B |= _BV(CS01) | _BV(CS00); // Set prescaler to 64
}
 
void stop_buzzer(void) {
    // Turn off buzzer
    TCCR0B &= ~_BV(CS01) & ~_BV(CS00); // Set prescaler to 0
}
 
void ping_buzzer(uint8_t time) {
    start_buzzer();
    _delay_ms(time);
    stop_buzzer();
}

Cea mai mare problema a fost LCD-ul, nu pentru ca nu mergea, dar a fost cel mai greu de implementat. Alta problema a fost numarul de pini de PWM disponimbil. Am improvizat prin folosirea unui singur pin Trigger pentru ambii senzori ultrasonici.

Rezultate Obţinute

Am invatat cum sa ma documentez pentru compatibilitatea componentelor pentru a putea alege componentele potrivite proiectului. Dupa alegerea componentelor, am realizat cat de usor este codul Arduino fata de codul AVR. Codul arduino a fost facut in 2 ore, in timp ce codul AVR a fost facut in 2 zile.

Am perfectionat lucrul cu registrii prin urmarirea atat datasheet-ului microcontroller-ului cat si diferitele documentatii ale celorlalte componente.

Concluzii

A fost un proiect interesant, si chiar util din punctul meu de vedere. Acesta ar putea fi folosit la o masina (desi nu recomand deoarece este cam mare). Initial am crezut ca va fi mult mai dificil de “construit” si implementat. Au fost si parti usoare de care am trecut repede, dar si parti mai grele cu care m-am luptat cateva zile.

Download

parkingsensor_iliescu_vlad-toma.zip

OR Download/View the code using GitHub:

https://github.com/vladtoma2003/ParkingSensor-Atmega328P

Jurnal

* Am ales tema. * M-am informat de componentele necesare si le-am cumparat.

* Am facut schema in TinkerCad.

* Am asamblat proiectul folosindu-ma de schema de pe TinkerCad.

* Am facut codul Arduino pentru a testa componentele.

* Am facut si codul AVR in Platform IO.

Bibliografie/Resurse

https://handsontec.com/dataspecs/sensor/SR-04-Ultrasonic.pdf

https://content.arduino.cc/assets/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

https://github.com/denisgoriachev/liquid_crystal_i2c_avr/tree/master

https://github.com/gpg/wk-misc/blob/master/ebus/i2c-lcd.c