Documente Academic
Documente Profesional
Documente Cultură
PROIECT LA EEEA
ROBOT BAZAT PE MICROCONTROLLER-UL ARDUINO UNO
V.3
1
1. INTRODUCERE
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.
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.
5
5. CONECTARE PRIN INTERFAȚA USB
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ă.
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.
}
9
}
//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();
}
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.
16726215 Oprire
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.
14
Fig. 5 Exemplu de conectare a motoarelor și sursei externe de alimentare (baterii) la shield
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
15
Fig. 7 Schema bloc a receptorului IR
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