Introducere

Scopul proiectului este de a crea un robot cu doua roti, care sa aiba capacitatea de a isi mentine singur echilibrul.

Am ales acest proiect deoarece am vrut sa invat cat mai multe despre controlul unui motor cu ajutorul microcontrollerului si despre folosirea unor anumiti senzori.

Descriere Generala

Inima robotului este microcontrollerul ATMEGA16. La acesta se leaga driverul de motor L293D pentru a controla cele doua motoare, accelerometrul MMA7260 si LCD-ul alfanumeric.

Principiul de functionare este urmatorul: accelerometrul masoara unghiul de inclinatie al robotului, iar daca acesta nu este la verticala se pornesc motoarele in directia corespunzatoare aducerii acestuia la verticala.

Hardware Design

Pe langa placa standard, am mai folosit o placa auxiliara unde am montat driverul de motor, accelerometrul si LCD-ul. Acestea le-am legat pe pinii de extensie ai placutei standard, coform schemei:

Cele doua axe folosite ale accelerometrului sunt contectate pe doi dintre pinii portului A, pentru a putea fi folosit convertorul A/D;

Cei doi pini de enable ai driverului de motor sunt conectati la pinii: PB4 si PB5 pentru a putea beneficia de PWM

Display-ul este legat la Portul C.

Am folosit pentru partea mecanica piesa din imaginea de mai jos, deoarece avand o “cutie de viteze” permite o forta mai mare celor doua motoare, in detrimentul unei viteze mai mici.

Software Design

Problema consta in prelucrarea semnalului de la accelerometru si traducerea acestuia intr-o directie si o viteza pentru cele doua motoare.

Programul ruleaza o bucla infinita, in care se realizeaza urmatoarele lucruri:

  1. citeste de la ADC unghiul cu verticala;
  2. citeste de la ADC directia( de care parte a normalei este );
  3. regleaza PWM pentru motoare, proportional cu rezultatul obtinut de la ADC;
  4. afiseaza pe LCD parametrii, pentru debug;

Softul a fost scris pe parcur, odata cu montarea unui nou modul. Mai intai pentru LCD, apoi pentru citirea accelerometrului apoi pentru controlul motoarelor.

Principalele functii:

  1. LCD_init(): initializeaza LCD-ul;
  2. LCD_print():afiseaza un sir de caractere pe ecran;
  3. ADC_init(): initializeaza convertorul analog numeric;
  4. ADC_get() : preia de la ADC valoarea accelerometrului;
  5. pwm_init(): initializeaza timerul1 pentru output PWM;

Rezultate Obtinute

Din nefericire, datorita lipsei de timp si experienta nu am reusit sa fac robotul sa functioneze cum mi-am propus. Prezint cauzele acestui lucru:

  1. intelegere defectoasa a princpiului de functionare: nu se poate realiza robotul doar cu un accelerometru, deoarece acesta va fi perturbat de acceleratiile rezultate in urma miscarii. Este necesar si un al doilea senzor, un giroscop;
  2. lipsa unui montaj adecvat a dus la mici jocuri si dezechilibre care influenteaza miscarea robotului;

Functionalitatile pe module sunt in regula( LCD merge, Accelerometru merge, Motor merge), problema fiind sincronizarea acestora si legarea lor eficienta.

Concluzii

Acest proiect mi-a acordat sansa sa invat cate un pic din utilizarea microcontrolerelor, a senzorilor, interfatarea motoarelor. Am invatat sa lipesc componente, sa fac debug la o placa defectuasa. Datorita lipsei de timp nu am reusit sa obtin exact ce mi-am propus, dar consider ca acest proiect este o reusita si un pas inainte.

Atasez in continuare cateva imagini cu proiectul:

pm/prj2010/pgp/self_balancing_robot.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