Documente Academic
Documente Profesional
Documente Cultură
Seciuni lucrare:
Configuraia intern a pinilor I/O
Utilizarea software a pinilor I/O
Conectarea unu led la un pin I/O
Proiect joc de lumini (conectare individual)
Proiect joc de lumini (shift-register)
Utilizarea pinilor I/O pentru comand analogic
Proiect joc de lumini (comand analogic)
Referine online
Pinii plcii de dezvoltare Arduino pot fi configurai sau ca intrri sau ca ieiri. Mai jos este
prezentat structura intern electric a unui pin a microcontrolerului ATmega328P. Implicit
pinii sunt configurai ca intrri deci doar n momentul n care sunt folosii ca ieiri trebui
configurai n mod expres. Din punct de vedere extern pinii se afl implicit ntr-o stare de
impedan mare nefiind vizibili ca ieiri.
Culoare
Negru
Maro
Rou
Portocaliu
Galben
Verde
Albastru
Violet
Gri
Alb
Auriu
Argintiu
Fr culoare
Banda 1
Banda 2
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
Banda 3
X1
X 10
X 100
X 1,000
X 10,000
X 100,000
X 10^6
X 10^7
X 10^8
X 10^9
X 0.1
X 0.01
Banda 4
(toleran)
5%
10%
20%
Jocul 2 va aprinde ledurile pe rnd i apoi le va stinge pe rnd (ca un efect de umplere i golire).
Jocul 3 va muta un led aprins de pe poziia 1 pn pe poziia a 8-a iar jocul 4 va aprinde i va
stinge ledurile n mod aleatoriu.
Funcia setup() a programului va trebui s configureze toi cei opt pini utilizai ca fiind pini de
ieire i s seteze viteza de comunicaie serial.
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
}
Funcia principal loop() va prelua prin comunicaie serial selecia efectuat de utilizator
(un ntreg ntre 1 i 4) i va rula la infinit jocul de lumini ales prin apelarea funciei
corespondente. Reluarea alegerii jocului de lumini se poate face doar prin resetare hardware a
plcii care va conduce la reiniializarea programului.
void loop() {
int alege = 0;
Serial.println("Joc de lumini");
Serial.println("Alegeti varianta de joc (1-4)");
while (alege<'1' || alege>'4') {
alege = Serial.read();
delay(1000);
}
alege = alege - 48;
Serial.print("Ati ales jocul: ");
Serial.print(alege,DEC);
Serial.println();
Serial.println("Pentru reinitializare apasati
placii");
switch (alege) {
case 1:
joc1();
case 2:
joc2();
butonul
Reset
al
case 3:
joc3();
case 4:
joc4();
}
}
Jocul 2 de lumini va aprinde unul cte unul (pornind de la led-ul 1 pn la led-ul 8) toate ledurile i apoi le va stinge n mod similar (n ordine invers). Operaia de aprindere sau stingere a
unui led se va efectua la un interval de 500 milisecunde.
void joc2() {
while (1) {
for (int i=2;i<10;i++) {
digitalWrite(i,HIGH);
delay(500); }
for (int i=9;i>1;i--) {
digitalWrite(i,LOW);
delay(500);
}
}
}
Jocul 3 de lumini va aprinde cte un led pornind de la poziia 1 pn la poziia 8. Mutarea ledului aprins de pe o poziie pe alta se va face la un interval de 100 milisecunde.
void joc3() {
while (1) {
for (int i=2;i<10;i++) {
for (int j=2;j<10;j++) {
if (j==i) {
digitalWrite(i,HIGH);
}
else {
digitalWrite(j,LOW);
}
delay(100);
}
delay(100);
}
}
}
Jocul 4 de lumini va aprinde sau va stinge total aleatoriu cte un led la un interval de 100
milisecunde.
void joc4() {
int pozitie;
int aprins;
while (1) {
pozitie = random(2,10);
aprins = random(0,2);
digitalWrite(pozitie,aprins);
delay(100);
}
}
TPIC6B595 [4]
10
11
12
Programul va conine definirea celor trei pini de comand i comunicaie pentru registrul de
shiftare:
const int latchPin = 4;
const int clockPin = 3;
const int dataPin = 2;
Funcia de iniializare va configura cei trei pini ca ieiri, va seta viteza de comunicaie serial i
va iniializa coninutul registrului cu 0.
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}
Valorile transmise ctre registru sunt echivalente cu starea dorit a celor 8 leduri (170 n binar
10101010 aprins/stins/aprins/stins/aprins/stins/aprins/stins iar 85 n binar 01010101). Pentru
ncrcarea n registru a valorilor se dezactiveaz semnalul de latchPin dup care se utilizeaz
funcia shiftOut pentru a transmite valoarea dorit. Activarea semnalului de latchPin
13
conduce la memorarea i transmiterea la ieiri a valorii transmise serial. n mod similar se pot
rescrie i celelalte trei funcii (joc2, joc3, joc4):
void joc2() {
int afisare = 0;
while (1) {
for (int i=0;i<9;i++) {
afisare = afisare + (1<<i);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare);
digitalWrite(latchPin, HIGH);
delay(500);
}
for (int i=8;i>-1;i--) {
afisare = afisare - (1<<i);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
}
void joc3() {
int afisare = 1;
while (1) {
for (int i=0;i<8;i++) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, afisare << i);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
}
void joc4() {
int configuratie;
while (1) {
configuratie = random(0,256);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, configuratie);
digitalWrite(latchPin, HIGH);
delay(100);
}
}
14
15
Pentru generarea unui semnal de tip PWM pe pinii plcii de dezvoltare Arduino se poate utiliza
comanda analogWrite(pin, valoare) unde pin poate lua valoarea 3, 5, 6, 9, 10 sau
11 iar valoare este un ntreg ntre 0 i 255 (0 corespunde unei tensiuni echivalente de 0V iar
255 unei tensiuni echivalente de 5V rezoluia de variaie este de aproximativ 0.0196 V).
Pentru folosirea acestei funcii pinul utilizat trebuie configurat ca pin de ieire
pinMode(pin, OUTPUT).
Generarea semnalului PWM se bazeaz pe utilizarea timer-elor interne ale plcii Arduino
(instrumente care permit msurarea intervalelor de timp), din acest motiv utilizarea simultan a
timer-elor (sau a altor instrumente care i bazeaz funcionarea pe timer-e) i a comenzii PWM
nu este ntotdeauna posibil. Legtura dintre cei ase pini generatori de semnal PWM i cele
trei timer-e interne este urmtoarea: pinii 5 i 6 genereaz semnal PWM bazndu-se pe timerul 0, pinii 9 i 10 pe timer-ul 1 i pinii 11 i 3 pe timer-ul 2. De exemplu, instruciunile delay i
milis (funcii care permit introducerea de ntrzieri n mediul IDE Arduino) utilizeaz timer-ul
intern 0 nu pot fi utilizate dac dorim s generm comand de tip PWM pe pinii 5 sau 6.
pinMode(leds[0],
pinMode(leds[1],
pinMode(leds[2],
pinMode(leds[3],
pinMode(leds[4],
pinMode(leds[5],
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
Funcia
delay(milisecunde)
va
fi
nlocuit
cu
funcia
_delay_ms(milisecunde) pentru a evita blocarea programului (funcia delay nu
poate fi folosit mpreun cu generarea de semnal PWM pe pinii 5 sau 6). Funcia
_delay_ms necesit includerea header-ului <util/delay.h>.
o fade out:
for (int j=240; j>-1; j-=20)
{ analogWrite(leds[i],j); _delay_ms(50); }
18
19
Referine online
[1] LED series/parallel array wizard http://led.linear1.org/led.wiz
[2] Serial to Parallel Shifting-Out with a 74HC595 http://arduino.cc/en/Tutorial/ShiftOut
[3] 74HC595 8-bit serial-in, serial or parallel-out shift register with output latches
http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf
[4] TPIC6B595 POWER LOGIC 8-BIT SHIFT REGISTER
http://www.datasheetcatalog.org/datasheet/texasinstruments/tpic6b595.pdf
[5] Secrets of Arduino PWM http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
20