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.

Niciun comentariu:

Trimiteți un comentariu