LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: nunosilvarocha em 17 de Outubro de 2009, 00:01

Título: [Ponte H]
Enviado por: nunosilvarocha em 17 de Outubro de 2009, 00:01
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.pdf (http://www.st.com/stonline/books/pdf/docs/1328.pdf)

Depois de analisado o resultado ate agora é este:

L293E na breadboard
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg11.imageshack.us%2Fimg11%2F1559%2Fimg4881copy.th.jpg&hash=cdf5b9cab51fd50261cf513ce093be9e) (http://img11.imageshack.us/i/img4881copy.jpg/)

Ligação dos pinos 15 e 16 ao GND
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg97.imageshack.us%2Fimg97%2F6848%2Fimg4882copy.th.jpg&hash=77ce06eec2630580a0d5a55ffd41bd76) (http://img97.imageshack.us/i/img4882copy.jpg/)

Ligação dos pinos 14 e 17 ao GND (no datasheet diz para usar resistência mas não usei)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg266.imageshack.us%2Fimg266%2F4349%2Fimg4883copy.th.jpg&hash=7b58880fedcb12e36efcba6b4a855a1e) (http://img266.imageshack.us/i/img4883copy.jpg/)

Diodos para protecção do motor
Ligados dos pinos 13 e 18 ao GND
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg203.imageshack.us%2Fimg203%2F5416%2Fimg4884copy.th.jpg&hash=7c0ac6d0af4e9472160f30af0217a82e) (http://img203.imageshack.us/i/img4884copy.jpg/)


Diodos para protecção do motor
Ligados dos pinos 13 e 18 ao pino 20
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg148.imageshack.us%2Fimg148%2F1357%2Fimg4886copy.th.jpg&hash=c9858f1071d2fc0a0cc736ba97a93177) (http://img148.imageshack.us/i/img4886copy.jpg/)

Como para já não vou regular a velocidade do motor ligamos o pino 11 aos +5V
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg18.imageshack.us%2Fimg18%2F4662%2Fimg4887copy.th.jpg&hash=a214d80b5613a2bf27056ad091966194) (http://img18.imageshack.us/i/img4887copy.jpg/)


Os pinos 12 e 19 dão-nos o sinal da direcção do motor, esta informação provem do arduino
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg203.imageshack.us%2Fimg203%2F2306%2Fimg4888copy.th.jpg&hash=87612a13435ea58b60d82f92fbfb83c5) (http://img203.imageshack.us/i/img4888copy.jpg/)

É nos pinos 13 e 18 que ligamos ao nosso motor
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg266.imageshack.us%2Fimg266%2F3636%2Fimg4889copy.th.jpg&hash=b417ba4a73f81014328b86e4af5e9188) (http://img266.imageshack.us/i/img4889copy.jpg/)

Ligamos o pino 20 ao +5V, (esta pode ser ligada a uma fonte externa se necessário)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg266.imageshack.us%2Fimg266%2F1520%2Fimg4890copy.th.jpg&hash=cdba29e6fdcf4c47ba96410931b41820) (http://img266.imageshack.us/i/img4890copy.jpg/)


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/2009

Bem 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:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg442.imageshack.us%2Fimg442%2F5246%2Fimg4912copy.th.jpg&hash=85af626a09e634da1102c4a09eb2c84b) (http://img442.imageshack.us/i/img4912copy.jpg/)


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
Código: [Seleccione]
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/2009

Hoje 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
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg8.imageshack.us%2Fimg8%2F2034%2Fimg4919800x600.th.jpg&hash=d0236663984ae4e3294a931e8ec2c1c9) (http://img8.imageshack.us/i/img4919800x600.jpg/)

E agora o material em acção:
ponte H (http://www.youtube.com/watch?v=y0A3u2_7dNE#)

O código que utilizei foi:
Código: [Seleccione]
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/2009
Bem, 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.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg132.imageshack.us%2Fimg132%2F8169%2Fimg4923800x600.th.jpg&hash=c41b7fdcb102900d917fbc75e60fa9c9) (http://img132.imageshack.us/i/img4923800x600.jpg/)

A montagem em acção:
Controlo de velocidade (http://www.youtube.com/watch?v=S8S0eNio8xE#)

A programação usada é esta:
Código: [Seleccione]
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.
Título: Re: [Ponte H]
Enviado por: jspgresende em 17 de Outubro de 2009, 16:15
Pessoalmente não sou adepto de organizar a montagem do circuito ao ponto de colocar os condutores com a perfeição que fizeste, afinal de contas é uma placa de testes, e PLACA DE TESTES indica logo que é algo apenas temporário... e faço ideia do tempo que perdeste a deixar a placa com bom aspecto... Mas dou-te deste já os parabéns pelo esforço e pelo "ar" organizado que lhe deste...

Para dares uma boa justificação a esse esforço, penso que seria uma boa ideia fazeres um tutorial, visto que tens o circuito muito bem organizado e fácil de compreender... como me alonguei demasiado no comentário não vi o PDF nem nada em concreto...

Continua com o bom trabalho...
Título: Re: [Ponte H]
Enviado por: Tayeb em 17 de Outubro de 2009, 17:35
Pessoalmente não sou adepto de organizar a montagem do circuito ao ponto de colocar os condutores com a perfeição que fizeste, afinal de contas é uma placa de testes, e PLACA DE TESTES indica logo que é algo apenas temporário... e faço ideia do tempo que perdeste a deixar a placa com bom aspecto... Mas dou-te deste já os parabéns pelo esforço e pelo "ar" organizado que lhe deste...

Para dares uma boa justificação a esse esforço, penso que seria uma boa ideia fazeres um tutorial, visto que tens o circuito muito bem organizado e fácil de compreender... como me alonguei demasiado no comentário não vi o PDF nem nada em concreto...

Continua com o bom trabalho...

Fios bem organizados significa poupança de tempo na depuração e verficação do cicuito se algo não funciona.

Pessoalmente prefiro L293D, porque é melhor do que L293E ou L293B e encorajo o uso dele a quem faz desenvolvimentos com motores. Contém díodos na saída que oferecem maior protecção ao integrado. Para mais informação vêr o folheto técnico da SGS em:

http://www.datasheetcatalog.net/pt/datasheets_pdf/L/2/9/3/L293D.shtml (http://www.datasheetcatalog.net/pt/datasheets_pdf/L/2/9/3/L293D.shtml)

Tayeb

Título: Re: [Ponte H]
Enviado por: jspgresende em 17 de Outubro de 2009, 17:49
Sim, é claro. Fios organizados é um requisito básico. Fios milimétricamente organizados é exagero ou então é para alguma apresentação importante.

Título: Re: [Ponte H]
Enviado por: Tayeb em 17 de Outubro de 2009, 18:00
Sim, é claro. Fios organizados é um requisito básico. Fios milimétricamente organizados é exagero ou então é para alguma apresentação importante.

Notei com interesse que o site arduinopt.com mostra lá um circuito com L293D.
Título: Re: [Ponte H]
Enviado por: TigPT em 17 de Outubro de 2009, 19:10
Parabéns nunosilvarocha,

Não ligues para criticas não construtivas, acho que devemos dar sempre o nosso melhor.

O teu post vai ser muito útil a muita gente. Podes acrescentar informação sobre como ligaste ao arduino e o código que utilizaste?

Mais uma vez, parabéns pelo excelente post!
Título: Re: [Ponte H]
Enviado por: nunosilvarocha em 17 de Outubro de 2009, 19:52
SamPereira os pontas de cabo estão assim organizada porque tenho uma caixa com alguns fios nesse formato, foi só pegar e coloca-los na breadboard. Por vezes facilita-nos entender o que estamos a fazer, mas eu também uso aquelas pontas grandes todas dobradas e um pouco desorganizadas do ponto de vista estético.

Tayeb não usei o L293D porque o que tinha aqui em casa era o L293E, e por isso decidi utilizar este, e para ja parece que funciona.

TigPT sim, vou acrescentar as ligações ao arduino e o código, mas ando com pouco tempo para me dedicar ao arduino. quando tiver novidades vou postando
Título: Re: [Ponte H]
Enviado por: Tayeb em 17 de Outubro de 2009, 20:50
SamPereira os pontas de cabo estão assim organizada porque tenho uma caixa com alguns fios nesse formato, foi só pegar e coloca-los na breadboard. Por vezes facilita-nos entender o que estamos a fazer, mas eu também uso aquelas pontas grandes todas dobradas e um pouco desorganizadas do ponto de vista estético.

Tayeb não usei o L293D porque o que tinha aqui em casa era o L293E, e por isso decidi utilizar este, e para ja parece que funciona.

TigPT sim, vou acrescentar as ligações ao arduino e o código, mas ando com pouco tempo para me dedicar ao arduino. quando tiver novidades vou postando

Sim L239E funciona, e é mais fácil de adquirir, e fornece feedback de corrente que pode ser útil para controlo. A vantagem no L293D é os díodos de saída para os menos incautos. A minha empresa Aliatron (http://www.aliatron.pt) mantém sempre em stock o L293D, porque vai no DEAR Robot, o robô de preferência das Escolas nos concursos Robótica e Robotop.
Título: Re: [Ponte H]
Enviado por: nunosilvarocha em 18 de Outubro de 2009, 15:56
Adicionei novidades no primeiro post!
Título: Re: [Ponte H]
Enviado por: nunosilvarocha em 21 de Outubro de 2009, 01:43
mais actualizações ao primeiro post!
Título: Re: [Ponte H]
Enviado por: Njay em 21 de Outubro de 2009, 21:39
Normalmente não precisamos de ter a loop() a correr a toda a velocidade. Podes colocar um delay de por exemplo 50ms mesmo no final da função, e assim já sabes que ela corre mais ou menos 1 vez a cada 50ms. Isto permite-te fazer várias coisas com uma cadência temporal bem conhecida, como por exemplo piscar um LED de segundo a segundo ou tocar uma música (http://lusorobotica.com/index.php/topic,1522.msg14861.html#msg14861). Basta um contador que conte "em ciclo", voltando ao a zero quando atinge determinado valor.

Por exemplo, para piscar o LED de segundo a segundo (0.5s aceso, 0.5s apagado) arranja-se um contador que conte até 1s / 0.05s = 20; quando ele for 10 já passou 0.5 desde que começou a contar, e então ligas o LED, e quando chegar a 20 já passou outro 0.2s e então desligas o LED e voltas a pôr o contador a 0.

Para fazer debouncing dos botões (aquilo a que chamaste "filtrar") basta que o estado do botão não mude durante 50ms a 200ms.
Título: Re: [Ponte H]
Enviado por: TigPT em 21 de Outubro de 2009, 22:31
Muitos parabéns Nuno, gostei bastante, principalmente e consegues dar uma excelente apresentação ao teu trabalho. Continua a melhorar que dá gosto. Aproveita as dicas k o Njay te deu. ;)
Título: Re: [Ponte H]
Enviado por: nunosilvarocha em 21 de Outubro de 2009, 23:25
obrigado pela tua resposta Njay acho que o debouncing (estamos sempre a aprender) para já serve, acho que para o problema que tive foi uma boa resolução, não querendo deixar de parte a tua!

TigPT tento fazer uma boa apresentação para ser perceptível a todos. Para já a as minhas experiências com a ponte H ficam por aqui. O próximo passo vai ser dar um uso mais serio, montar a ponte com dois motores dc e apoiar tudo num chassi e por isto a mexer no chão.
Ja tenho 4 motores dc, agora tenho de arranjar umas rodas, o que me esta a parecer uma tarefe um pouco complicada.
Mas novas noticias vão aparecendo com o tempo.

Título: Re: [Ponte H]
Enviado por: Raul em 24 de Outubro de 2009, 13:22
Boas.
Que tipo de Interruptor Pulsador Mini usaste no teu projecto e que eles não fazem o tradicional "click" XD?

Cumprimentos
Título: Re: [Ponte H]
Enviado por: nunosilvarocha em 24 de Outubro de 2009, 19:45
Boas.
Que tipo de Interruptor Pulsador Mini usaste no teu projecto e que eles não fazem o tradicional "click" XD?

Cumprimentos

deves ter o teu sistema de som avariado... eu ouço perfeitamente o click do botão...
o botão e um simples PCB Pushbutton, 12*12mm
Título: Re: [Ponte H]
Enviado por: Mikey em 19 de Janeiro de 2011, 19:19
Estou a usar o L293D

No potenciómetro estou a usar um de 100k.
Ligo o potenciómetro onde?
Qual das "pernas" liga ao pino '0' do arduino; a saída PWM 5 ao pino ?? do L293D?

o pino 20 do L293E o pino 20 é o Vss, quanl é o Vss do L293D é o que me falta.
Título: Re: [Ponte H]
Enviado por: beirao em 21 de Janeiro de 2011, 02:25

Existem mil e uma explicações sobre ponte H aqui no forum.. faz uma pesquisa e terás muitos resultados! ;)