Sunteți pe pagina 1din 18

FACULTATEA DE INGINERIE MECANICĂ, INDUSTRIALĂ ȘI MARITIMĂ

Programul de studii AUTOVEHICULE RUTIERE

PROIECT LA EEEA
ROBOT BAZAT PE MICROCONTROLLER-UL ARDUINO UNO
V.3

Grup de lucru format din studenții:


- PĂTRAȘCU LAURENȚIU
- TOMA LUCIAN
- ALEXE GEORGIAN
- MODIGA FLORIN

1
1. INTRODUCERE

Arduino Uno este un microcontroller amplasat pe un cablaj imprimat, bazat pe circuitul


integrat Atmega328P. Acesta prezintă 14 intrări/ieșiri digitale (din care șase pot fi utilizate ca
ieșiri de tip PWM), șase intrări analogice, un cuarț de 16MHz (generatorul de ceas), conector
USB, mufă pentru alimentare în curent continuu, header ICSP și buton de reset. Costul redus al
acestui ansamblu îl recomandă pentru proiecte diverse, pentru automatizarea unor procese sau
pentru monitorizarea unor echipamente automate.
2. CARACTERISTICI TEHNICE

Microcontroller ATmega328P
Tensiunea de lucru 5V
Tensiunea de alimentare (recomandată) 7-12V
Tensiunea de alimentare limită 6-20V
Pini de intrare/ieșire, digitali 14 (din care 6 oferă ieșiri de tip PWM)
Pini intrare/ieșire PWM 6
Pini intrare analogică 6
Curent continuu maxim suportat pe pinii de
20 mA
intrare/ieșire
Curent continuu maxim pentru pinul de ieșire
50 mA
de 3.3V
32 kB (ATmega328P) din care 0.5 kB utilizați de
Memoria flash
bootloader
Memorie de lucru (SRAM) 2 kB (ATmega328P)
Memorie non-volatilă EEPROM 1 kB (ATmega328P)
Frecvență tact 16 MHz
LED încorporat Pinul 13
Lungime 68.6 mm
Lățime 53.4 mm
Greutate 25 g

2
Fig. 1 Semnificația pinilor plăcii Arduino Uno v.3

3. DESCRIERE

Arduino Uno poate fi alimentat fie prin portul USB, de la un computer, fie de la un
alimentator extern (de exemplu, 7V/500mA). Microcontroller-ul are o siguranță automată,
încorporată, resetabilă, care protejează portul USB al computerului împotriva unui scurt-circuit
sau a depășirii pragului curentului maxim de 500mA. Dacă acest prag este depășit atunci
siguranța va întrerupe circuitul de alimentare în mod automat. Circuitul va fi restabilit numai la
dispariția scurt-circuitului sau a suprasarcinii.
Alimentatorul extern se va conecta în mufa pentru alimentare prin utilizarea unei mufe cu
un diametru de 2.1mm, pinul din centru pozitiv (+) sau prin conectarea bateriilor în conectorii
Vin și GND.
Microcontroller-ul poate funcționa cu un alimentator care să furnizeze între 7 și 20 volți.
Dacă se utilizează o tensiune de alimentare mai mică de 7v, atunci pinul 5V poate prezenta o
valoare mai mică de 5 volți iar microcontrolerul poate funcționa defectuos. Dacă se utilizează o
3
tensiune de alimentare mai mare de 12V, regulatorul de tensiune se poate supraîncălzi ori se
poate defecta. De aceea, gama de alimentare trebuie să fie cuprinsă între 7 și 12V.
 Pinul de alimentare Vin: se utilizează în cazul conectării unei surse externe de
alimentare.
 Pinul 5V asigură o ieșire de 5 volți care nu trece prin regulatorul de tensiune.
ATENȚIE! Dacă microcontroller-ul se alimentează prin acest pin cu o tensiune
mai mare de 5 volți se poate produce defectarea acestuia.
 3V3 este un pin de ieșire al tensiunii de 3.3V și un curent maxim de 50mA.
 GND – pinul minus.
 IOREF – pin de ieșire a tensiunii de referință cu care funcționează
microcontroller-ul. Se utilizează de către shield-uri cu scopul selectării tensiunii
de lucru optime.

Configurația pinilor plăcii Arduino Uno:


- Fiecare din cei 14 pini I/O digitali poate fi configurat ca intrare sau ieșire prin
utilizarea funcțiilor pinMode(), digitalWrite() și digitalRead(). Acești pini
funcționează la tensiunea de 5 volți. Fiecare pin poate furniza sau primi un curent de
20mA și are un rezistor pull-up, inițial deconectat, cu valoarea de 20-50kΩ.
- RS232 serial, unde pinul 0 este RX iar pinul 1 este TX. Datele transmise sunt format
TTL. Acești pini sunt conectați la circuitul integrat Atmega8U2, USB-la-TTL serial.
- Întreruperile externe 2 și 3. Acești pini pot fi configurați să declanșeze o întrerupere,
cu un prag scăzut al semnalului, scăderea sau creșterea bruscă a acestuia sau la
schimbarea valorii pragului. Se folosește funcția attachInterrupt().
- Pinii PWM 3,5,6,9,10 și 11. Ieșire PWM cu rezoluția de 8 biți prin utilizarea funcției
analogWrite().
Ieșirile (Pulse width modulation) PWM reprezintă tehnica de modulație a unui
semnal utilizat în special de motoare electrice. Variația duratei impulsurilor de amplitudine fixă
produce o variație a tensiunii medii de alimentare furnizate motorului electric. Formarea
impulsurilor presupune existența unei comutări de tip pornit/oprit la frecvențe de ordinul zecilor
de kHz.
- Interfață SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Interfață de comunicare tip
SPI, prin utilizarea bibliotecii SPI.
- Pin-ul13 este conectat la un LED încorporat. Când valoarea acestui pin este setată
HIGH led-ul este aprins iar când valoarea este LOW, led-ul este stins.
- TWI, pinul A4 SDA sau A5 SCL, reprezintă interfața de comunicare 1wire.
- Cele 6 intrări analogice, etichetate de la A0 la A5, au o rezoluție de 10 biți, adică pot
avea valori cuprinse între 0 și 1024. Măsurătorile încep implicit de la 0 volți la 5 volți,
cu 1022 de valori intermediare. Plaja de măsurători poate fi schimbată către valori
superioare prin utilizarea pin-ului AREF și a funcției analogReference().
- Pin-ul AREF reprezintă tensiunea de referință pentru intrările analogice.
4
- Pin-ul RESET se utilizează pentru reinițializarea microcontroller-ului dacă ia
valoarea LOW (de exemplu, se conectează la GND). Pin-ul este utilizat în principal
pentru facilitarea amplasării unui buton de RESET pe shield.
4. MEDIUL INTEGRAT DE PROGRAMARE

Arduino IDE
Arduino Integrated Development Environment (IDE) este format dintr-un editor de text
pentru scrierea codului, o zonă pentru afișarea mesajelor, o consolă pentru text și o bară de unelte
pentru funcțiile comune sau seturile de meniuri. Scopul principal al programului este conectarea
la Arduino, pentru încărcarea programelor și pentru comunicarea cu microcontroller-ul.

Programele scrise în mediul IDE se numesc schițe (sketches). Aceste programe sunt
scrise în editorul de texte și salvate cu extensia .ino. Editorul de texte are funcții comune cum ar
fi posibilitatea de copiere/lipire (copy/paste) și înlocuirea textelor. Zona de mesaje oferă
feedback pe timpul salvării sau exportării programelor dar arată și mesajele de eroare. Consola
afișează textul provenit de la platforma IDE, inclusiv mesajele de eroare detaliate dar și alte
tipuri de mesaje. Colțul din dreapta jos al ferestrei principale afișează microcontroller-ul care
este conectat și portul serial utilizat. Bara de unelte permite verificarea și încărcarea codului pe
microcontroller. Totodată, permite inițierea, deschiderea, salvarea schițelor și monitorizarea
conexiunii seriale.

Fig. 2 Exemplul unei ferestre nou create în IDE

5
5. CONECTARE PRIN INTERFAȚA USB

Pentru conectarea microcontroller-ului la calculator avem nevoie de un cablu USB cu


mufe de tip A și B la capete (cablu pentru imprimantă). După conectarea microcontroller-ului la
calculator trebuie selectat tipul controller-ului și portul serial utilizat de acesta pentru comunicare
(de ex. Arduino Uno, portul COM2). Portul COM este atribuit automat de sistemul de operare
(de ex. Windows), după detectarea automată a conexiunii.

Fig. 3 Tipuri de mufe USB

6. DESCRIEREA SOFTWARE-ULUI MICROCONTROLLER-ULUI

Bootloader-ul
Reprezintă un program foarte scurt, preîncărcat în memoria Arduino. Acesta permite încărcarea
codului în memoria microcontroller-ului fără utilizarea unui hardware adițional. Bootloader-ul
este activ pentru câteva secunde, până la resetarea microcontroller-ului, apoi execută programul
încărcat de către utilizator, prin intermediul platformei IDE. LED-ul de pe pinul 13 luminează
intermitent atunci când microcontroller-ul rulează bootloader-ul (de exemplu la restartarea
Arduino).
Librăriile
Reprezintă funcții suplimentare accesate de către programele ce rulează pe microcontroller (de
ex. accesarea unor elemente hardware sau manipularea seturilor de date). Se va selecta meniul
Sketch apoi Import library pentru accesarea librăriilor. Inserarea unei librării pe timpul scrierii
codului se face cu instrucțiunea #include.
Monitorul conexiunii seriale
Afișează datele trimise de către Arduino. Pentru transmiterea datelor către Arduino se va scrie
comanda apoi se apasă tasta Enter sau butonul Send. Selectarea vitezei de transmitere a datelor
se face prin utilizarea instrucțiunii Serial.begin în cadrul programului editat în platforma IDE.

6
7. CODUL UTILIZAT ÎN CADRUL PROIECTULUI

#include <IRremote.h>
- Include biblioteca Irremote.h în mediul de programare IDE în scopul facilitării
integrării instrucțiunilor pentru modulul de infraroșu, astfel încât utilizatorul nu mai
trebuie să scrie aceste instrucțiuni în codul sursă.

#define SPEED 255


- Se definește variabila SPEED cu valoarea 255, deoarece ieșirile PWM sunt
programate cu valori între 0 și 255. Astfel se specifică nivelul tensiunii de ieșire la
pinii PWM, unde 255 înseamnă tensiune maximă constantă (în cazul nostru 5V).
Deci, motoarele vor primi tensiunea maximă. Prin analogie, valoarea 127 furnizează
2.5V.

int MOTOR2_PIN1 = 3;
int MOTOR2_PIN2 = 5;
int MOTOR1_PIN1 = 6;
int MOTOR1_PIN2 = 9;
- Funcția int MOTOR definește pinii de ieșire PWM. Fiecare motor este conectat la doi
pini PWM care pot inversa comanda, deoarece este nevoie ca motorul să se poată roti
în ambele direcții.
int IR_RECV_PIN = 4;
- Stabilește pinul 4 ca pin de intrare pentru semnalul provenit de la senzorul IR

IRrecv irrecv(IR_RECV_PIN);
- Definește obiectul receptor cu un nume ales de programator
decode_results results;
- Încearcă primirea unui cod de la telecomandă. Returnează valoarea TRUE la primirea
cu success a unui cod, ori FALSE dacă nu este recepționat nici un cod. Codul
recepționat este stocat în variabila results.
long key = 0;
- Este inhibată menținerea apăsată a tastelor de pe telecomandă (repetarea codului).
void setup()

7
- Subrutina setup primește funcția void, care-i spune programului că această subrutină
nu va returna nici o valoare după executarea ei.
{
Serial.begin(9600);
- Declară viteza portului serial COM (protocolul de comunicație serială RS232), la
viteza de 9600 bauds.
pinMode(MOTOR1_PIN1, OUTPUT);
pinMode(MOTOR1_PIN2, OUTPUT);
pinMode(MOTOR2_PIN1, OUTPUT);
pinMode(MOTOR2_PIN2, OUTPUT);
- Stabilește comportamentul pinilor ca ieșire. De exemplu MOTOR1_PIN1 are stocată
valoarea 6. Sintaxa comenzii poate fi și pinMode(6, OUTPUT), adică pinul 6 este pin
de ieșire.
irrecv.enableIRIn(); // Start the receiver
- Inițializează recepția unui cod de la telecomandă
}
void dump(decode_results *results) {
- Subrutina stochează textul decodat de la telecomanda IR în variabila results
int count = results->rawlen;
- Numără de câte ori a fost primit un cod de la telecomandă.
if (results->decode_type == UNKNOWN) {
- Dacă variabila results are un cod ce nu poate fi identificat atunci este executată
instrucțiunea de mai jos.
Serial.print("Unknown encoding: ");
- Afișează mesajul ”Unknown encoding:”
}
else if (results->decode_type == NEC) {
- Altfel, tipul telecomenzii este NEC și execută instrucțiunea de mai jos.
Serial.print("Decoded NEC: ");
- Afișează mesajul ”Decoded NEC: ” și după acest mesaj afișează codul tastei apăsate.

8
}

key = results->value;

void loop() {
- Se declară o subrutină de tip buclă
//reverse direction key
- comentariu
if (key == 16716015) {
- Condiționeză valoarea variabilei key de codul tastei apăsate (practic se asociază o
valoare cunoscută variabilei)
go(-SPEED, SPEED);
- Execută comanda motoarelor, unde un motor primește o alimentare de 5V iar cel de-
al doilea primește aceeași alimentare dar cu pinii inversați, a.î. unul se va roti în
sensul acelor de ceasornic iar al doilea se va învârti în sensul invers acelor de
ceasornic. Robotul se rotește către stânga.
}

//reverse direction key


if (key == 16734885) {
go(SPEED, -SPEED);
- Robotul se va roti către dreapta.
}

//speed increase key


if (key == 16730805) {
go(SPEED, SPEED);
- Ambele motoare se învârt în același sens. Robotul se deplasează înainte.

9
}

//speed decrease key


if (key == 16718055) {
go(-SPEED, -SPEED);
- Ambele motoare se învârt în același sens. Robotul se deplasează către înapoi.
}

//stop key
if (key == 16726215) {
go(0, 0);
- Ambele motoare primesc alimentare de 0V, a.î. robotul se oprește complet
}

//Test key
- Această secvență a fost adăugată cu scopul demonstrării capacității robotului de a
executa un set de mișcări pre-programate.
if (key == 16756815) {
go(SPEED, SPEED);
delay(1000);
go (SPEED, -SPEED);
delay(1000);
go (-SPEED, SPEED);
delay (1000);
go (-SPEED, -SPEED);
delay (1000);
go (0, 0);
- La apăsarea tastei # de pe telecomandă, robotul se va deplasa înainte, apoi se va roti
la dreapta, la stânga, se va deplasa către înapoi și se va opri, ajungând, în final, în

10
punctul de pornire. Instrucțiunea delay (1000) menține fiecare comandă activă pentru
o secundă.

key = 0;

if (irrecv.decode(&results)) {
dump(&results);
- Șterge valoarea scrisă în variabila results pentru a putea primi următoarea comandă
irrecv.resume(); // Receive the next value
- Primește următoarea comandă
Serial.println(key);
- Afișează codul primit în variabila key în format ASCII
Serial.println();
}

void go(int speedLeft, int speedRight) {


- Se definește subrutina ”go” și se stabilesc condițiile de mai jos:
if (speedLeft > 0) {
- Dacă variabila speedLeft are o valoare mai mare de 0 atunci se execută cele două
instrucțiuni de mai jos.
analogWrite(MOTOR1_PIN1, speedLeft);
- Comandă pinul 6 cu valoarea PWM a variabilei speedLeft (+)
analogWrite(MOTOR1_PIN2, 0);
- Comandă pinul 9 cu valoarea PWM 0 (-)
}

11
else {
- Altfel inversează comenzile
analogWrite(MOTOR1_PIN1, 0);
- Comandă pinul 6 cu valoarea PWM 0 (-)
analogWrite(MOTOR1_PIN2, -speedLeft);
- Comandă pinul 9 cu valoarea PWM a variabilei speedLeft (+)
}

if (speedRight > 0) {
- Dacă variabila speedRight are o valoare mai mare de 0 atunci se execută cele două
instrucțiuni de mai jos.

analogWrite(MOTOR2_PIN1, speedRight);
- Comandă pinul 3 cu valoarea PWM a variabilei speedRight (+)
analogWrite(MOTOR2_PIN2, 0);
- Comandă pinul 5 cu valoarea PWM 0 (-)
}else {
- Altfel inversează comenzile:
analogWrite(MOTOR2_PIN1, 0);
- Comandă pinul 3 cu valoarea PWM 0 (-)
analogWrite(MOTOR2_PIN2, -speedRight);
- Comandă pinul 5 cu valoarea PWM a variabilei speedRight (+)
}
}

12
8. CORESPONDENȚA CODURILOR TELECOMENZII IR.

Mai jos este tabela cu asocierea codurilor IR cu tastele telecomenzii, interpretate de


microcontroller și afișate pe monitorul conexiunii seriale:

Tabelul 1 Coduri de telecomandă utilizate în cadrul proiectului

Codul comenzii Instrucțiunea executată


16718055 Înainte
16730805 Înapoi
16716015 Rotire la stânga
16734885 Rotire la dreapta

16726215 Oprire

16756815 executare mișcări predefinite


Valorile sunt afișate în sistemul zecimal

Tabela cu asocierea codurilor IR cu tastele telecomenzii, valorile fiind exprimate în sistemul


hexazecimal.
Tabelul 2. Toate codurile IR ale telecomenzii utilizate în cadrul proiectului

Codul comenzii Tasta corespunzătoare


FF38C7 OK
FF18E7 ÎNAINTE
FF4AB5 ÎNAPOI
FF10EF STÂNGA
FF5AA5 DREAPTA
FFA25D 1
FF629D 2
FFE21D 3
FF22DD 4
FF02FD 5
FFC23D 6
FFE01F 7
FFA857 8
FF906F 9
FF9867 0
FF6897 *
FFB04F #

13
Trebuie menționat faptul că aceste coduri corespund strict tipului de telecomandă utilizată în
acest proiect iar schimbarea acesteia obligă la modificarea programului încărcat pe
microcontroller, astfel încât acesta să funcționeze cu noile coduri.

9. DRIVER-UL DE MOTOARE L298

Este utilizat pentru controlul motoarelor în curent continuu folosind Arduino.


Microcontoller-ul Arduino este capabil să scoată pe porturile lui o putere foarte mică, total
insuficientă pentru a învârti un motor. Dacă vom conecta un motor electric direct la un port
Arduino, cel mai probabil vom obține arderea procesorului de pe placa Arduino.

Ca să nu se întâmple acest lucru, avem nevoie de un amplificator de putere, care să ia


putere din sursa de alimentare (baterie, de exemplu), și să o transmită motoarelor așa cum îi
comandă Arduino. Acest amplificator poartă numele generic de "driver de motoare".

Fig. 4 Driver-ul de motoare L298

Driver-ul se conectează la platforma Arduino folosind 4 pini digitali (3, 5, 6 și 9) prin


conectare directă în pinii plăcii Arduino și poate furniza un current de maxim 2 amperi pentru
motoarele electrice.

14
Fig. 5 Exemplu de conectare a motoarelor și sursei externe de alimentare (baterii) la shield

10. KIT TELECOMANDĂ INFRAROȘU

Caracteristici:
- Baterie: CR2025
- Distanța de transmisie: până la 8m
- Unghi efectiv: 60°
- Curent static: 3~5uA, Curent dinamic: 3~5mA
- Dimensiuni telecomandă:8.5 x 4 x 0.65cm

Fig. 6 Kit telecomandă cu infraroșu

15
Fig. 7 Schema bloc a receptorului IR

Receptorul IR se conectează în pinul 4 al shield-ului (acest pin este declarat și în codul


încărcat pe microcontroller) și se alimentează cu tensiunea de 5V, tot din shield, utilizând
conexiunile disponibile.

Fig. 8 Schema bloc a driver-ului de motoare L298

16
Fig. 9 Model de conectare tipică a driver-ului de motoare L298

Fig. 10 Model de conectare tipică a driver-ului de motoare L298 cu ajutorul diodelor de protecție

17
Bibliografie:
https://www.arduino.cc/

https://www.sparkfun.com/
https://www.robofun.ro/
http://www.elecrom.com/

18

S-ar putea să vă placă și