miercuri, 23 decembrie 2009

Controlul unui LED RGB cu Arduino Duemilanove si potentiometru

Aici va voi prezenta cum puteti controla un LED RGB cu o placuta Arduino Duemilanove si cu 3 potentiometre:


COD:

const int redpin = 9;
const int greenpin = 10;
const int bluepin = 11;

const int redpotpin = 0;
const int greenpotpin = 1;
const int bluepotpin = 2;

int currentcolorvaluered;
int currentcolorvaluegreen;
int currentcolorvalueblue;

void setup()
{
pinMode(redpin, OUTPUT);
pinMode(greenpin, OUTPUT);
pinMode(bluepin, OUTPUT);
}

void loop()
{
currentcolorvaluered = (255 - (analogRead(redpotpin) / 4));
currentcolorvaluegreen = (255 - (analogRead(greenpotpin) / 4));
currentcolorvalueblue = (255 - (analogRead(bluepotpin) / 4));

analogWrite(redpin, currentcolorvaluered);
analogWrite(greenpin, currentcolorvaluegreen);
analogWrite(bluepin, currentcolorvalueblue);
}
Pinii de la LED-ul RGB trebuie sa fie conectati la pini PWM, si este bine sa puneti la fiecare pin al LED-ului(cathode) o rezistenta de 220 Ohmi.

Controlul unui LED RGB cu Arduino Duemilanove

Ce este un LED RGB? Un LED RGB este un LED care are 3 culori:
  • rosu
  • albastru
  • verde
si are 4 pini, dintre care unu mai lung(acela este pinul GND).
Bineinteles ca putem crea si noi un LED RGB cu ajutorul a 3 leduri, cu respectivele culori.
Vreti sa controlati un LED RGB cu arduino? Sunt mai multe "metode" dar cele mai importante din punctul meu de vedere sunt doar 2 "metode":
  • random
  • cu potentiometru
Am stabilit ca fiind cele mai importante aceste 2 "metode" deoarece de la ele se pot modifica si concepe alte "metode".
Aici va voi prezenta cum sa controlati un LED RGB cu ajutorul unei placute, Arduino Duemilanove, random:
COD:
int pin1 = 9;
int pin2 = 10;
int pin3 = 11;
long value3;
long value2;
long value1;
long current_value3;
long current_value2;
long current_value1;
int x;
void setup()
{
randomSeed(analogRead(0));
value1 = random(255);
current_value1 = value1;
value2 = random(255);
current_value2 = value2;
value3 = random(255);
current_value3 = value3;
analogWrite(pin1, current_value1);
analogWrite(pin2, current_value2);
analogWrite(pin3, current_value3);
value1 = random(255);
value2 = random(255);
value3 = random(255);
}
void loop()
{
x = random(3, 9);
// prima culoare
if (value1 > current_value1)
{
current_value1++;
analogWrite(pin1, current_value1);
delay(x);
}
if (value1 < current_value1)
{
current_value1--;
analogWrite(pin1, current_value1);
delay(x);
}
if (value1 == current_value1)
{
analogWrite(pin1, current_value1);
value1 = random(255);
}
// a doua culoare
if (value2 > current_value2)
{
current_value2++;
analogWrite(pin2, current_value2);
delay(x);
}
if (value2 < current_value2)
{ current_value2--;
analogWrite(pin2, current_value2);
delay(x);
}
if (value2 == current_value2)
{
analogWrite(pin2, current_value2);
value2 = random(255);
}
//a treia culoare
if (value3 > current_value3)
{
current_value3++;
analogWrite(pin3, current_value3);
delay(x);
}
if (value3 < current_value3)
{
current_value3--;
analogWrite(pin3, current_value3);
delay(x);
}
if (value3 == current_value3)
{
analogWrite(pin3, current_value3);
value3 = random(255);
}
}
Pinii care se conecteaza la LED-ul RGB trebuie sa fie PWM, si este bine sa puneti la fiecare pin al LED-ului(cathode) o rezistenta de 220 Ohmi.

luni, 21 decembrie 2009

Controlul a 2 motoare DC cu Arduino Duemilanove si L293D

Pentru a controla 2 motorase DC cu Rduino Duemilanove este
nevoie de o punte-H, cea mai usor de folosit fiind L293D.
Conectati pini de control la placuta arduino, iar pe cei de alimentare la baterie. Am sa scriu un programel in C++(softul de la arduino) cu ajutorul caruia puteti controla motorasele.

COD:


const int motor1a = 2; //H-bridge (pin2,1A), pinul digital 2 de la arduino se conecteaza cu
// pinul 2(1A) de la L293D
const int motor2a = 4; //H-bridge (pin4,2A), pinul digital 4 de la arduino se conecteaza cu
// pinul 7(2A) de la L293D
const int motor1b = 5; //H-bridge (pin5,4A), pinul digital 5 de la arduino se conecteaza cu
// pinul 15(4A) de la L293D
const int motor2b = 7; //H-bridge (pin7,3A), pinul digital 7 de la arduino se conecteaza cu
// pinul 10(3A) de la L293D
const int enable1 = 3; //H-bridge (pin3,1.2EN), pinul digital 3 de la arduino se conecteaza
// cu pinul 1(1.2EN) de la L293D
const int enable2 = 6; //H-bridge (pin6,3.4EN), pinul digital 6 de la arduino se conecteaza
// cu pinul 9(3,4EN) de la L293D
const int ledPin = 13; // LED
boolean val = HIGH; //setam val ca fiind boolean pentru a putea opera cu HIGH si LOW

void setup()
{
// setam toti pinii pe care ii folosim ca fiind OUTPUT:
pinMode(motor1a, OUTPUT);
pinMode(motor2a, OUTPUT);
pinMode(motor1b, OUTPUT);
pinMode(motor2b, OUTPUT);
pinMode(ledPin, OUTPUT);
// setam pini de enable HIGH pentru a putea porni motoarele:
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);

// clipeste ledPin de 3 ori. Asta trebuie sa se intample doar 1 data.
// daca vezi ca ledul clipeste de mai multe ori inseamna ca s-a
// resetat; probabil din cauza ca motorasele sunt arse
// sau este un scurt circuit.
blink(ledPin, 3, 100);
}

void Forward()
{
// motoarele merg inainte
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);
digitalWrite(motor1a, HIGH);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, HIGH);
digitalWrite(motor2b, LOW);
}

void Reverse()
{
// motoarele merg inapoi
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, HIGH);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, HIGH);
}

void Left()
{
// intoarce la stanga(motorul drept merge inainte, iar cel stang inapoi):
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, HIGH);
digitalWrite(motor1b, HIGH);
digitalWrite(motor2b, LOW);
}

void Right()
{
//intoarce la dreapta(motorul drept merge inapoi iar cel stang inainte):
digitalWrite(enable1, HIGH);
digitalWrite(enable2, HIGH);
digitalWrite(motor1a, HIGH);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, HIGH);
}

void Stop()
{
//motoarele sunt oprite(1,2EN si 3,4EN sunt trecuti pe LOW ; in acest caz nu se tine cont de valoarea pinilor de control, deoarece motoarele sunt oprite. vezi desenu sa intelegi mai bine)
digitalWrite(enable1, LOW);
digitalWrite(enable2, LOW);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, LOW);
}
/*
blinks a LED
*/

void blink(int whatPin, int howManyTimes, int milliSecs)
{
int i = 0;
for(i=0; i<=3; i++)
{ digitalWrite(ledPin, HIGH);
delay(100/2);
digitalWrite(ledPin, LOW);
delay(100/2); } }
void loop()
{ //delay(x) reprezinta timpul in care se executa operatia(x se inlocuieste cu o valoare)
Forward();
delay(5000);
Stop();
delay(100);
Right();
delay(5000);
Stop();
delay(100);
Left();
delay(5000);
Stop();
delay(100);
Reverse();
delay(5000);
Stop();
delay(1000); }
Daca vreti, puteti elibera un pin, conectand pinul 3,4EN la 1,2EN, si stergeti din program tot ce contine 3,4EN (tot ce este ingrosat). daca folositi ambi pini de ENABLE puteti opri fiecare motor separat, puteti crea alt program, totul depinde de imaginatie. Pini de enable trebuie conectati la pini cu semnal PWM.

Descriere L293D pentru conectarea a 2 motorase DC



L293D este cea mai usoara calea pentru construirea unui driver pentru motoare deoarece trebuie doar sa lipiti firele de la motorase la integrat, pini de control la microcontroler, si pini de alimentare la baterie.









Pinul16(Vcc1) se alimenteaza la o tensiune de 5V.
Pinul8(Vcc2) se alimenteaza la o tensiune maxima de 24V, acesta este pinul de la care motoarele primesc curent.
Pini4,5,13,12 sunt GND, deci ii conectati pe toti 4 intre ei si apoi ii conectati la minusul sursei de alimentare pentru Vcc1 si Vcc2.
Pinul1(1,2EN) este pinul de ENABLE pentru primul motoras si se conecteaza la microcontroler sau la Vcc1, in functie de programul pe care il folositi pentru a controla primul motoras.
Pini3,6(1Y,2Y) sunt pini care se conecteaza la un motoras DC.
Pini2,7(1A,2A) sunt pini de control pentru un motoras care se conecteaza la microcontroler.
Pinul9(3,4EN) este pinul de ENABLE pentru al doilea motoras, care se conecteaza la microcontroler sau la Vcc1, in functie de programul pe care il folositi in controlarea celui de al doilea motoras.
Pini14,11(4Y,3Y) sunt pini care se conecteaza la un al doilea motoras DC.
Pini15,10(4A,3A) sunt pini de control pentru cel de al doilea motoras, care se conecteaza la microcontroler.


Pinul1 si pinul 9 (pinii de enable) sunt ca un fel de intrerupatoare; pinul1 cand este strabatut de un curent electric cu o tensiune de 5V permite curentului electric sa ajunga la primul motor, cat timp nu este strabatut de un curent electric, acesta nu permite miscarea motorului deoarece nu mai permite curentului electric sa ajunga la motor. Pinul9 face acelasi lucru numai ca pentru al doilea motor.
Pinul2 ,pinul7, pinul15 si pinul10 (1A,2A , 4A,3A) sunt pini de control a celor 2 motoare; daca vreti ca ambele motoare sa mearga intr-o directie, trebuie ca pinul2(1A) si pinul15(4A) sa aiba aceeasi valoare.

Arduino Duemilanove


Este o platforma care foloseste un Microcontroler ATMega328 32K, are 14 pini digital si 6 pini analog. Este foarte usor de programat; foloseste C++. Softul care il puteti downloada este insotit de exemple cu ajutorul carora intelegeti mai bine cum functioneaza aceasta platforma.
In romania puteti cumpara Arduino Duemilanove de aici.
Vizualizati o descriere cu privire la aceasta platforma.