This is an old revision of the document!


Roomba

Introducere

Voi implementa un robot de aspirat. Spre deosebire de un Roomba adevărat, robotul de aspirat are forma unei mașinuțe, va folosi un senzor ultrasonic si un servomotor ca sa evite obstacolele, si va face viraje pe loc, deoarece fiecare roata va fi controlată independent folosind PWM.
Pentru partea de aspirat, voi folosi o sticla ca suport și un motoraș cu ventilator.
Considerând camera dreptunghiulară, robotul va încerca sa o parcurgă pe toată in zig-zag. Se deplasează înainte, pana de de un obstacol (peretele), moment în care virează, se deplasează lateral pe o distanță scurtă, si virează iar in aceeași direcție. Acum robotul o va lua înapoi, pe o noua banda de aspirat.
Scopul robotului e sa automatizeze curățenia prin casa.

Probleme ce pot apărea:

  • Cu cât sunt mai multe obstacole in camera, cu atât robotul va da mai puțin randament, deoarece ii trebuie un algoritm mai inteligent de evitare a obstacolelor si recalcularea traiectoriei.
  • Nu se creează suficient vid in recipient pentru a aspira.

Descriere generală

O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează.

Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html

Schema bloc

Hardware Design

Aici puneţi tot ce ţine de hardware design:

Lista de piese
Schema electrica

Conexiuni între pini

Shield-ul pentru motoare se atașează direct pe Arduino. În urma consultării datasheet-ului pentru Adafruit Motor Shield V1, acesta folosește următorii pini:

  • M1 - D11
  • M2 - D3
  • M3 - D5
  • M4 - D6

Pinii menționați mai sus sunt folosiți pentru controlul PWM al motoarelor.

Următorii pini sunt folosiți mereu de shield, indiferent dacă sunt conectate motoare sau indiferent de câte sunt conectate, deoarece sunt conectați la latch-ul 74HC595:

  • D4
  • D7
  • D8
  • D11

Pinii senzorului ultrasonic au fost legați astfel:

  • TRIG (2) - D13 pe Arduino
  • ECHO (3) - D2 pe Arduino
  • VCC (1) - 5V pe Arduino
  • GND (4) - GND pe Arduino

Servomotorul se leagă pe shield la S1, iar conform datasheet-ului:

  • Control (3) - D10 pe Arduino
  • VCC (2) - 5V pe Arduino
  • GND (1) - GND pe Arduino

Bateriile se leagă la EXT_PWR de pe shield.

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Mediu de dezvoltare

  • VSCode + PlatformIO

Librarii

  • Adafruit Motor Shield Library - AFMotor.h

Librăria AFMotor.h expune o interfața pentru a controla motoare prin intermediul shield-ului ales.
Librăria pune la dispoziție clasa AF_DCMotor, care primește ca parametru un număr de motor, scris pe shield, si oferă funcții pentru controlul motoarelor, precum run sau setSpeed.
AFMotor.h este un wrapper pentru PWM.

  • Arduino Servo Library - Servo.h

Librăria Servo.h expune o interfața pentru a lucra mai ușor cu servomotoarele.
Librăria pune la dispoziție clasa Servo, si o serie de metode prin care servomotorul este configurat si utilizat.
Pentru a specifica pin-ul unde e conectat servomotorul se folosește metoda attach.
Pentru a controla servomotorul, avem metoda write, care folosește in spate PWM si Timere.

Structura codului

Robotul Roomba va funcționa pe baza unui FSM, cu următoarele stări:

  • Deplasare înainte - starea în care robotul trebuie sa stea cât mai mult
  • Scanare mediu - după observarea unui obstacol, robotul va încerca sa observe mediul înconjurător pe o raza scurta, pentru a decide in ce direcție e mai bine sa meargă
  • Viraj la stanga - starea in care se efectuează virajul la stânga
  • Viraj la dreapta - starea in care se efectuează virajul la dreapta
  • Mișcare laterală - pentru ca robotul va face un traseu in zig-zag, pentru a acoperi toată suprafața, e nevoie de mici mișcări laterale, de durată scurtă
  • Oprit - starea in care se
Controlul Motoarelor

Funcțiile pentru controlul motoarelor sunt in headerul MotorControl.h.
Am scris niște API-uri pentru a controla mai ușor mișcarea robotului, folosindu-ma de metodele expuse in AFMotor.h:

void stopMotors();
void forwardMotors();
void backwardMotors();
void turnLeftMotors();
void turnRightMotors();
Măsurarea distanței

Funcțiile pentru măsurarea distanței sunt in headerul Sonar.h.
Am creat un API pentru a controla senzorul ultrasonic, folosind cunoștiințele dobândite in laboratoarele de GPIO, Timere și Întreruperi.

void initSonar(void);
void initTimer2(void);
void initEchoInterrupt(void);
 
void sendTriggerPulse(void);
uint16_t measureDistance(void);
void checkObstacle(void);

Cum funcționează ?

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Resurse Hardware
Resurse software
Cod sursa
pm/prj2025/eradu/cristian.tudor1607.1748567348.txt.gz · Last modified: 2025/05/30 04:09 by cristian.tudor1607
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