collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Motor Shield - Iniciação  (Lida 5435 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Motor Shield - Iniciação
« em: 17 de Dezembro de 2009, 11:04 »
Olá a todos.

Montei o Motor Shield e testei com o código do tutorial Arduino + MotorShield V3.0, funciona 5*

Acontece que queria implementar 2 botões, um para mudar de direcção e outro para Ligar/Desligar.. à semelhança deste projecto: Ponte H

O meu problema é que o Motor Shield ocupa os pinos que necessito.. pois precisava de utilizar algo como isto:Button

Posto isto..  como o pino 5v está ocupado pelo Motor shield será que tenho de utilizar uma bateria externa ligada ao Jack do Arduino (onde depois posso tirar os 5v para os botões)?   

Depois ligava os botões às entradas analógicas.. e tinha pensado num código assim:

Código: [Seleccione]
int PWMA=10; //pino pwm do motor 1
int PWMB=11; //pino pwm do motor 2
int DIRA=12; //pino de controlo do motor 1
int DIRB=13; //pino de controlo do motor 1

int PinoD = 0; //Botão ligado na entrada analógica 0
int PinoE = 1; //Botão ligado na entrada analógica 1
int botaoD = 0;
int botaoS = 0;
long time = 0;         
long debounce = 200;
int pvd = HIGH;
int pvs = HIGH;
int d = 0;
int e = 0;


void setup()
{
analogWrite(PWMA,255); //definir PWM do motor 1 para velocidade máxima (0 a 255)
analogWrite(PWMB,255); //definir PWM do motor 2 para velocidade máxima (0 a 255)
}

void loop()
{
botaoD = analogRead(PinoD);
botaoS = analogRead(PinoE);
 
if ((botaoD==0 && pvd==5 && millis() - time > debounce) ||(botaoS==0 && pvs==5 && millis() - time > debounce))
  {
    if ((botaoD==0)&&(e==1))
    {
      direcao();
    }
    if (botaoS==0)
    {
      liga();   
    }
    time = millis();
  }
  pvd = botaoD;
  pvs= botaoS; 


//-------- muda de diração --------
void direcao()
{
  if (d==0)
  {
  analogWrite(PWMA, 255);
  analogWrite(PWMB, 255);
  digitalWrite(DIRA,LOW);
  digitalWrite(DIRB,LOW);
    d=1;
  }
  else
  {
  analogWrite(PWMA, 255);
  analogWrite(PWMB, 255);
  digitalWrite(DIRA,HIGH);
  digitalWrite(DIRB,HIGH);
 d=0;
  }
}

//-------- liga ou desliga motor --------
void liga()
{
  if (e==0)
  {
  analogWrite(PWMA, 255);
  analogWrite(PWMB, 255);
    e=1;
    d=1;
  }
  else
  { 
  analogWrite(PWMA, 0);
  analogWrite(PWMB, 0);
    e=0;
  }
}

Não sei se posso associar os valores 0 e 5 ao analogRead para ver se o botão foi pressionado ou não.. mas só testando

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Motor Shield - Iniciação
« Responder #1 em: 17 de Dezembro de 2009, 12:27 »
Podes sim :D

Podes usar os Inputs analógicos, tal e qual como vês na página "Button". Em vês de ligares ao Pino digital, ligas a um analógico, mas depois tens de alterar o código, pois em vez de teres:
buttonState = digitalRead(buttonPin);
tens de ter
buttonState = analogRead(buttonPin);

Depois, também tens os valores que retorna a função, ou seja, em vez de:
buttonState == HIGH
ou
buttonState == LOW

Vais ter 0 < buttonState < 1024

Tens de considerar um valor mínimo para o qual consideras "TRUE" / 1. Abaixo disso, "FALSE" / 0.
Esse valor é ajustado, mas tipicamente os valores que irás obter são:
Quando o botão está ligado: ~1020 - 1024
Quando o botão está desligado: 0 - ~100

Terás de adaptar para algo do género:
if (buttonState > 800) {     
     // turn LED on:   
     digitalWrite(ledPin, HIGH); 
   }
   else {
     // turn LED off:
     digitalWrite(ledPin, LOW);
   }
 
Percebeste o que quis dizer?

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #2 em: 17 de Dezembro de 2009, 14:15 »
Podes sim :D

Podes usar os Inputs analógicos, tal e qual como vês na página "Button". Em vês de ligares ao Pino digital, ligas a um analógico, mas depois tens de alterar o código, pois em vez de teres:
buttonState = digitalRead(buttonPin);
tens de ter
buttonState = analogRead(buttonPin);

Depois, também tens os valores que retorna a função, ou seja, em vez de:
buttonState == HIGH
ou
buttonState == LOW

Vais ter 0 < buttonState < 1024

Tens de considerar um valor mínimo para o qual consideras "TRUE" / 1. Abaixo disso, "FALSE" / 0.
Esse valor é ajustado, mas tipicamente os valores que irás obter são:
Quando o botão está ligado: ~1020 - 1024
Quando o botão está desligado: 0 - ~100

Terás de adaptar para algo do género:
if (buttonState > 800) {     
     // turn LED on:   
     digitalWrite(ledPin, HIGH); 
   }
   else {
     // turn LED off:
     digitalWrite(ledPin, LOW);
   }
 
Percebeste o que quis dizer?

Yep! Como n podem ser LOW ou HIGHT temos que definir um valor e jogar  com os >maiores e <menores  :D  vou alterar a parte do IF então :)

Qto ao circuito tem mesmo que ser com uma bateria externa ligada ao Jack do Arduino certo?
 (Power jack input voltage: minimum 7VDC, maximum 35VDC) 

Pois n tou a ver outra maneira de "roubar" 5v para os botões  ::) e se for apenas através do "Jack" e com uma bateria de 9/12v terei de utilizar isto: http://loja.lusorobotica.com/circuitos-integrados/27-lm7805-5v-regulator.html  para enviar apenas 5v para os botões correcto? (ou posso tirar a corrente do pino de 3v do arduino?)
sorry pelas perguntas



« Última modificação: 17 de Dezembro de 2009, 23:06 por almamater »

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Motor Shield - Iniciação
« Responder #3 em: 17 de Dezembro de 2009, 19:37 »
Não sei se percebi bem a tua dúvida, pois nunca usei o Motor Shield...

Contudo, vou-te tentar explicar a conversão de analógico para digital.
De uma forma simples:
GND ---- 5v
0 -----  1023

Quando ligas o GND a um pino, obténs 0. Analogamente, quando ligas 5v directamente a um pino, obténs 1023.
Os valores entre 0 e 1023 correspondem a tensões intermédias.

Podes utilizar a saída de 3.3v, contudo o valor máximo que obténs é dado pela regra de 3 simples:
1023 ---- 5.0
x -------- 3.3

x ~ 675

Logo, defines para aí uns 400 para o ON.

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #4 em: 17 de Dezembro de 2009, 23:08 »
Não sei se percebi bem a tua dúvida, pois nunca usei o Motor Shield...

Contudo, vou-te tentar explicar a conversão de analógico para digital.
De uma forma simples:
GND ---- 5v
0 -----  1023

Quando ligas o GND a um pino, obténs 0. Analogamente, quando ligas 5v directamente a um pino, obténs 1023.
Os valores entre 0 e 1023 correspondem a tensões intermédias.

Podes utilizar a saída de 3.3v, contudo o valor máximo que obténs é dado pela regra de 3 simples:
1023 ---- 5.0
x -------- 3.3

x ~ 675

Logo, defines para aí uns 400 para o ON.


Porreiro! sendo assim utilizo a saída de 3v :) facilita

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #5 em: 19 de Dezembro de 2009, 19:42 »
Bom.. afinal não liguei aos 3v e fiz com um Transformador e adaptei as fichas para o Arduino e para um regulador 5v:

Este é o meu primeiro esquema  ;D por isso não gozem.. :

Tudo montado ficou assim:




Vídeo:

O código ficou assim:

Código: [Seleccione]
/*Codigo Desenvolvido Para Controlo de 2 Motores DC com o MotorSHieldV3.0 */

int PWMA=10; //pino pwm do motor 1
int PWMB=11; //pino pwm do motor 2
int DIRA=12; //pino de controlo do motor 1
int DIRB=13; //pino de controlo do motor 1

int PinoD = 0; //Botão ligado na entrada analógica 0
int PinoE = 1; //Botão ligado na entrada analógica 1
int botaoD = 0;
int botaoS = 0;
long time = 0;         
long debounce = 500;
int d = 0;
int e = 0;


void setup()
{
//analogWrite(PWMA,255); //definir PWM do motor 1 para velocidade máxima (0 a 255)
//analogWrite(PWMB,255); //definir PWM do motor 2 para velocidade máxima (0 a 255)
pinMode(16, OUTPUT);  // digitalWrite(16, HIGH);  -> LED DIRECÇÃO
pinMode(17, OUTPUT);  // digitalWrite(17, HIGH);  -> LED ESTADO
}

void loop()
{
botaoD = analogRead(PinoD);
botaoS = analogRead(PinoE);

if ((botaoS > 800 && botaoD < 800 && millis() - time > debounce))
{
liga();
time = millis();
}

if ((botaoD > 800 && botaoS < 800 && e==1 && millis() - time > debounce))
{
digitalWrite(16, HIGH); //ACENDE LED
direcao();
time = millis();
}
if ((botaoD > 800 && botaoS < 800 && e==0 && millis() - time > debounce))
{
if (d==0)
  {
    d=1;
  }
  else
  {
    d=0;
  }
}

}                                     
   
void direcao()
{
if (d==0)
  {
  analogWrite(PWMA, 255);
  analogWrite(PWMB, 255);
  digitalWrite(DIRA,LOW);
  digitalWrite(DIRB,LOW);
    d=1;
    digitalWrite(16, LOW); //APAGA LED
     }
  else
  {
   analogWrite(PWMA, 255);
   analogWrite(PWMB, 255);
  digitalWrite(DIRA,HIGH);
  digitalWrite(DIRB,HIGH);
 d=0;
 digitalWrite(16, LOW); //APAGA LED
  }
}

//-------- liga ou desliga motor --------
void liga()
{
  if (e==0)
  {
 digitalWrite(17, HIGH); //ACENDE LED 
 direcao();
 e=1;
  }
  else
  { 
  analogWrite(PWMA, 0);
  analogWrite(PWMB, 0);
  if (d==0)
  {
    d=1;
  }
  else
  {
    d=0;
  }
   e=0;   
   digitalWrite(17, LOW); //APAGA LED 
    }
}


Por agora estou contente.. pois faz o que queria.. o LED da diecção não faz ali muito mas depois posso alterar qdo implementar isto nalguma coisa  8)
« Última modificação: 21 de Dezembro de 2009, 10:26 por almamater »

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #6 em: 22 de Dezembro de 2009, 01:09 »
Hello!!!   Preciso de uma ajuda.. não sei se fiz algo de errado..

Adicionei um potenciómetro para controlar a velocidade e verifico que um dos motores anda mais que o outro..   testei com 2 motores da tamiya e o resutado é este:



apenas adicionei os valores analógicos recebidos ao código do programa:

Código: [Seleccione]
int pinoPot = 4;
int potv = 0;

(...) No Loop tenho:

potv=analogRead(pinoPot);
potv = map(potv, 0, 1023, 0, 255);

(...) e Para os fazer andar:

analogWrite(PWMA, potv);
analogWrite(PWMB, potv);

é mesmo assim? é feitio do Motorshield?

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #7 em: 24 de Dezembro de 2009, 16:54 »
Bom.. já vi as ligações e mudei os motores mas acaba por acontecer o mesmo, um roda mais que o outro...   ???

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Motor Shield - Iniciação
« Responder #8 em: 24 de Dezembro de 2009, 19:30 »
Muito estranho... vou tentar perceber o que se passa mas não devia de estar a ir mais corrente para um do que para o outro... Diz-me que pins são PWMA e PWMB respectivamente.
Experimenta trocar o pin de um com o do outro no código e ver se continua a diferença de velocidade no mesmo motor ou se troca, depois se mantiver experimenta trocar fisicamente os motores para ficarem ligados fisicamente ao contrário e ver o que se pode observar.
« Última modificação: 24 de Dezembro de 2009, 19:31 por TigPT »

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Motor Shield - Iniciação
« Responder #9 em: 24 de Dezembro de 2009, 19:46 »
Muito estranho... vou tentar perceber o que se passa mas não devia de estar a ir mais corrente para um do que para o outro... Diz-me que pins são PWMA e PWMB respectivamente.
Experimenta trocar o pin de um com o do outro no código e ver se continua a diferença de velocidade no mesmo motor ou se troca, depois se mantiver experimenta trocar fisicamente os motores para ficarem ligados fisicamente ao contrário e ver o que se pode observar.

Obrigado pela resposta.

Eu utilizei o código do projecto: http://lusorobotica.com/index.php/topic,1407.0.html e alterei depois alumas coisas para ter mais controlo nos motores

int PWMA=10; //pino pwm do motor 1
int PWMB=11; //pino pwm do motor 2

De qualquer forma já testei com 2 motores DC de CDRoms e depois testei com a GearBox da Tamyia e o resultado foi igual.. mas vou testar o que indicas.

Eu alterei o código para implementar um potenciometro para controlar a velocidade.. o código está num post acima, só se fiz isso mal e que possa ser erro no código não sei.. :\

obrigado
« Última modificação: 24 de Dezembro de 2009, 19:56 por almamater »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: Motor Shield - Iniciação
« Responder #10 em: 24 de Dezembro de 2009, 20:23 »
Se estas a mandar PWM igual para os dois motores, eles deviam de se estar a portar da mesma forma.

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Motor Shield - Iniciação
« Responder #11 em: 24 de Dezembro de 2009, 22:15 »
puseste condensadores nos motores? houvi dizer que os que vem com essas gearboxes fazem muito ruido, poderia ser por isso?

se não conseguires resolver mete um potenciometro por cada motor, e afina...

estranhissimo