Dando continuação a minha descoberta do arduino decidi montar uma ponte H para poder controlar a velocidade e a direcção de dois motores dc.
O IC que tinha disponivel comigo era o L293E, e tive que procurar o datasheet do mesmo.
Podem visualiza-lo no link abaixo:
http://www.st.com/stonline/books/pdf/docs/1328.pdfDepois de analisado o resultado ate agora é este:
L293E na breadboard

Ligação dos pinos 15 e 16 ao GND

Ligação dos pinos 14 e 17 ao GND (no datasheet diz para usar resistência mas não usei)

Diodos para protecção do motor
Ligados dos pinos 13 e 18 ao GND

Diodos para protecção do motor
Ligados dos pinos 13 e 18 ao pino 20

Como para já não vou regular a velocidade do motor ligamos o pino 11 aos +5V

Os pinos 12 e 19 dão-nos o sinal da direcção do motor, esta informação provem do arduino

É nos pinos 13 e 18 que ligamos ao nosso motor

Ligamos o pino 20 ao +5V, (esta pode ser ligada a uma fonte externa se necessário)

O L293E pode controlar 2 motores, para tal basta repetir a montagem no lado contrario.
Já testei e o motor rodou nos dois sentidos.
De momento é o que tenho feito.
Já tenho mais algumas coisas em mente para continuar isto, agora o que e preciso e tempo.
Os entendidos que falem sobre a minha experiência!
Actualização 18/10/2009Bem hoje decidi juntar ao circuito que tinha montado na breadboard o arduino e um motor dc. E com algum codigo a mistura o resultado foi este:

O código que utilizei é um código simples, pois apenas faz o motor rodar para um lado e depois para o outro, como era apenas para testar se estava tudo bem acho que é o suficiente
int motorL = 12;
int motorR = 11;
void setup()
{
pinMode(motorL, OUTPUT);
pinMode(motorR, OUTPUT);
}
void loop()
{
digitalWrite(motorR,LOW);
digitalWrite(motorL,HIGH);
delay(5000);
digitalWrite(motorL,LOW);
digitalWrite(motorR,HIGH);
delay(5000);
}
Acho que ainda vou ter muito a batalhar para melhorar isto, pois tenho algumas ideias para os próximos passos neste projecto agora o que é preciso e tempo para desenvolve-las.
Queria pedir ajuda aos mais entendidos da electronica, pois gostava de saber o que devia melhorar na circuito da breadboard para este funcionar melhor!
Actualização 20/10/2009Hoje tive mais um tempinho para brincar com o arduino.
Na actualização anterior era o programa que sequencialmente fazia o motor rodar para um lado e depois para outro.
Hoje decidi implementar dois botões na breadboard, um liga e desliga o motor, o outro faz o motor mudar o sentido de rotação.
A montagem é bastante simples, o programa é que foi um pouco mais complicado apenas porque tive que procurar uma maneira de retirar o ruido do botão, pois quando clicava no botão o programa rodava mais rápido do que o meu click e assumia como tivesse dado vários clikes, o que com a criação deste filtro isso deixa de acontecer.
Se alguém tiver ideia de um filtro mais simples estou aqui para ouvir sugestões.
Agora vamos é a resultados concretos:
Montagem:
O arduino liga a ponte H pelos pinos 11 e 12.
Os botões enviam sinal para o arduino pelos pinos 6 e 7
E agora o material em acção:
O código que utilizei foi:
int motorL = 12;
int motorR = 11;
int botaoD = 7;
int botaoS = 6;
int valD = 0;
int valS = 0;
int d = 0;
int e = 0;
long time = 0;
long debounce = 200;
int pvd = HIGH;
int pvs = HIGH;
void setup()
{
pinMode(motorL, OUTPUT);
pinMode(motorR, OUTPUT);
pinMode(botaoD, INPUT);
pinMode(botaoS, INPUT);
Serial.begin(9600);
}
//-------- funcao principa --------
void loop()
{
valD=digitalRead(botaoD);
valS=digitalRead(botaoS);
if ((valD==LOW && pvd==HIGH && millis() - time > debounce) ||(valS==LOW && pvs==HIGH && millis() - time > debounce))
{
if ((valD==LOW)&&(e==1))
{
direcao();
}
if (valS==LOW)
{
liga();
}
time = millis();
}
pvd = valD;
pvs= valS;
}
//----------------
//-------- muda de diração --------
void direcao()
{
if (d==0)
{
digitalWrite(motorR,LOW);
digitalWrite(motorL,HIGH);
d=1;
}
else
{
digitalWrite(motorL,LOW);
digitalWrite(motorR,HIGH);
d=0;
}
}
//--------------------
//-------- liga ou desliga motor --------
void liga()
{
if (e==0)
{
digitalWrite(motorR,LOW);
digitalWrite(motorL,HIGH);
e=1;
d=1;
}
else
{
digitalWrite(motorL,LOW);
digitalWrite(motorR,LOW);
e=0;
}
}
//----------------
Para já e o que tenho desenvolvido. Mas ainda tenho mais uma ideia para desenvolver um pouco mais isto. Agora o que preciso é de um pouco de tempo e logo novas noticias aqui chegaram.
Actualização 21/10/2009Bem, hoje conclui a minha ponte H, pelo menos as ideias que tinha para aprender com ela já estão usadas.
Montei uma ponte com o IC L293E, controlei o motor desligando e ligando o mesmo por um switch, fiz o motor mudar o sentido de rotação por um switch.
Tudo isto ligado ao arduino.
A minha ultima ideia era controlar a velocidade de rotação do motor com um potenciómetro, e o resultado foi este:
O potenciómetro liga ao pino '0' analógico do arduino.
A saida PWM 5 liga ao pino 20 da ponte (srve para controlar a velocidade de rotação)
O resto das ligações mantém-se igual ao da actualização anterior.

A montagem em acção:
A programação usada é esta:
int motorL = 12;
int motorR = 11;
int botaoD = 7;
int botaoS = 6;
int valD = 0;
int valS = 0;
int d = 0;
int e = 0;
long time = 0;
long debounce = 200;
int pvd = HIGH;
int pvs = HIGH;
int pot = 0;
int potv = 0;
int reg = 5;
void setup()
{
pinMode(motorL, OUTPUT);
pinMode(motorR, OUTPUT);
pinMode(botaoD, INPUT);
pinMode(botaoS, INPUT);
analogWrite(reg,255);
}
//-------- funcao principa --------
void loop()
{
valD=digitalRead(botaoD);
valS=digitalRead(botaoS);
potv=analogRead(pot);
potv = map(potv, 0, 1023, 0, 179);
analogWrite(reg,potv);
if ((valD==LOW && pvd==HIGH && millis() - time > debounce) ||(valS==LOW && pvs==HIGH && millis() - time > debounce))
{
if ((valD==LOW)&&(e==1))
{
direcao();
}
if (valS==LOW)
{
liga();
}
time = millis();
}
pvd = valD;
pvs= valS;
}
//----------------
//-------- muda de diração --------
void direcao()
{
if (d==0)
{
digitalWrite(motorR,LOW);
digitalWrite(motorL,HIGH);
d=1;
}
else
{
digitalWrite(motorL,LOW);
digitalWrite(motorR,HIGH);
d=0;
}
}
//--------------------
//-------- liga ou desliga motor --------
void liga()
{
if (e==0)
{
digitalWrite(motorR,LOW);
digitalWrite(motorL,HIGH);
e=1;
d=1;
}
else
{
digitalWrite(motorL,LOW);
digitalWrite(motorR,LOW);
e=0;
}
}
//----------------
Para já as minhas aventuras com a ponte H estão terminadas.