Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul este un radar care functioneaza pe distante mici, folosind ultrasunete in loc de unde radio. Afisarea se va face pe un PC, intrucat permite o grafica mai avansata. Miscarea se va face cu un singur servotomor (doar pe orizontala) la 180 de grade. Cred ca acest dispozitiv ar putea fi util pentru robotei autonomi pentru a se orienta in spatiu,
Procesorul ATmega324 va transmite semnale periodice catre servomotor astfel incat aceasta sa faca cicluri de 180 de grade periodic. Senzorul cu ultrasunete va transmite periodic datele la procesorul ATmega324 care le va transmite mai departe pe interfata seriala catre PC.
Lista de piese:
Denumire | Cantitate |
---|---|
Placa de baza | 1 |
Micro Servomotor S3003 180º | 1 |
Senzor ultrasonic HC-SR04 | 1 |
Convertor Port Serial-USB (PL2303) | 1 |
Lista componente de baza:
1x Microcontroller ATMEGA324PA-PU 1x Soclu microcontroller 2x Diode ZENER 2x Condensator 100nF 2x Condensator 15pF 1x Rezistenta 10K 1x Rezistenta 1.5K 2x Rezistente 100K 3x Rezistente 470K 2x Push Button 1x Quartz
Codul este destul de complex, folosind elemente cam din toate laboratoarele.
Voi lua pe Rand cele 3 componente in parte: servomotorul, senzorul si transmiterea datelor la PC.
Servomotorul (S3003):
Controlez servomotorul folosind PWM. Servomotarele in general funcioneaza in felul urmator: Au o frecventa bine definita si in functie de duty cycleul primit stau la un anumit unghi. In cazul meu frecventa este de 50HZ. Realizez aceasta frecventa folosind un timer de tipul Fast PWM.
ICR1 = F_CPU / PRESCALER / F_MOTOR_S3003;
ICR1 fiind topul meu, acesta regleza frecventa, denumirile variabilelor fiind sugestive. Dupa aceasta setarea voi avea frecventa F_MOTOR_S3003. Pentru duty cycle, setez un pim de PWM pe high la overflow, si pe low la comparatia cu OCR1B, astfel prin OCR1B pot controla duty cycle-il si implicit unchiul motorului.
Senzorul(HC-SR04):
Este un senzor clasic de ultrasunete care funcioneaza in felul urmator. Acesta primeste un impuls pe pinul de trigger al sau, consantand intr-o tensiune de 5v timp de 10 microsecunde, iar in urma acesetui impuls se trimit unde (ultrasunete, la frecventa de 40kHZ) si se asteapta reintoarcerea undelor. In functie de cat de repede detecteaza undele de feedback senzorul raspunde cu o tensiune de 5v pe pinul echo, pe o durata direct proportionala cu distanta masurata. (distanta mare→ sta mai mult pinul pe high, in general maxim 35 ms). Asadar partea de cod pentru acest senzor a constat in trimiterea semnalului si apoi cronometrarea pe pinul de echo a duratei semnalului de la senzor. Am folosit pentru asta un timer plus intreruperi externe (schimbarea voltajului pe pinul de echo declanseaza o intrerupere externa). Calculez distanta in centimetri in functie de durata semnalului astfel:
distance_cm = ((uint32_t)timer_value * 256 + (uint32_t)TCNT0) / 16 / 58;
Transmiterea datelor la PC:
Am folsoit un conertor UART/TTL la USB, modele PL2303 mai exact. Am facut acest lucru clasic, asemenator cu in laborator. Setez baudrateul, bitii de paritate, de stop si apoi scriu intr-un registru distanta proaspat masurata de senzorul cu ultrasunete.
De asemenea a mai fost si partea de cod de pe PC, cu gui-ul si luarea datelor. Pe aceasta nu o voi mai descriue intru-cat am plecat de la codul colegului meu din an anterior si l-am adaptat pentru proiectul meu.
teodor_mihai.cotet.zip video included
Senzor HC-SR040: 13959
Servomotor S3003: s3003
Convertor UART/TTL → USB PL2303: usb-to-ttl-adapter-based-on-prolific-pl2303
Cod pentru GUI (modificat): bogdan.folea
GNU plot: www.gnuplot.info