Bom dia caros amigos, 

peço ajuda de vcs para resolver um pequeno problema.

Estou fazendo um robô, utilizando dois motores cc, arduíno, joystick e uma ponte H (L293D). 

Interliguei a ponte H no arduíno e nos dois motores. A partir disto, conectei o joystick nas entradas A0 (eixo x) e A1 (eixo y) do arduíno. Declarei todas as variáveis, o que era entrada e saída. 

O problema vem agora, como faço para o arduíno enviar a informação para a ponte H e consequentemente para os motores, de acordo com os comandos do joystick?

Ex: robô pra frente, trás, direita ou esquerda. 

OBS: É sabido que o motor irá pra esquerda ou para direita, configurando os valores de potência, entre 0 a 255, em cada motor.  

CÓDIGO QUE ESTOU FAZENDO:

const int JoyY = A1; //Joystick Y conectado ao Pino A1 do Arduino
const int JoyX = A0; //Joystick X conectado ao Pino A0 do Arduino
int leiturax = 0; // Variável que guardará o valor lido no eixo x
int leituray = 0; // Variável que guardará o valor lido no eixo y

const int Motor1Pin1 = 11; //Pino 2 do L293D conectado ao Pino D11 do Arduino
const int Motor1Pin2 = 10; //Pino 7 do L293D conectado ao Pino D10 do Arduino
const int Motor2Pin1 = 7; //Pino 15 do L293D conectado ao Pino D7 do Arduino
const int Motor2Pin2 = 8; //Pino 10 do L293D conectado ao Pino D8 do Arduino
const int PWMmotor = 9; //Enables ativado Pino 9 do L293D conectado ao Pino D9 do Arduino

void setup() {

pinMode(JoyX, INPUT);
pinMode(JoyY, INPUT);

pinMode(Motor1Pin1, OUTPUT); //Motor 1.1 configurado como saída
pinMode(Motor1Pin2, OUTPUT); //Motor 1.2 configurado como saída
pinMode(Motor2Pin1, OUTPUT); //Motor 2.1 configurado como saída
pinMode(Motor2Pin2, OUTPUT); //Motor 2.2 configurado como saída
pinMode(PWMmotor , OUTPUT); //PWM (motor) configurado como saída

analogWrite(PWMmotor, 255); //Habilita PWM em 100%
}
void loop() {

leiturax = analogRead(JoyX);

leituray = analogRead(JoyY);

//???


}

//void frente() {
//digitalWrite(Motor1Pin1, HIGH); //Habilita Motor 1.1 em nível alto
//digitalWrite(Motor1Pin2, LOW); //Habilita Motor 1.2 em nível baixo
//digitalWrite(Motor2Pin1, HIGH); //Habilita Motor 2.1 em nível alto
//digitalWrite(Motor2Pin2, LOW); //Habilita Motor 2.2 em nível baixo
//}

Exibições: 974

Anexos

Responder esta

Respostas a este tópico

Oi AVF, bom dia.

Não entendi sua dificuldade.

Você apresentou um code.

Ele não funciona?

Funciona erradamente?

Rui

Olá Rui, esse código ainda está incompleto. 

A minha dificuldade está em relacionar os comandos enviados pelo joystick para o arduíno, do arduíno para a ponte e desse para os motores.

O que não to conseguindo é justamente fazer com que os servos respondam meus comandos através do Joystick.

 

O seu código já está quase pronto.

Cada motor usa 2 portas digitais para girar:

//Girar o Motor 1 no sentido horario
 digitalWrite(Motor1Pin1, HIGH);
 digitalWrite(Motor1Pin2, LOW);

 //Parar o motor 1
 digitalWrite(Motor1Pin1, HIGH);
 digitalWrite(Motor1Pin2, HIGH);

//Girar o Motor 1 no sentido anti- horario
 digitalWrite(Motor1Pin1, LOW);
 digitalWrite(Motor1Pin2, HIGH);

Crie 5 funções, como você já começou a fazer: frente, tras, ladoX, LadoY, parar

Para virar para esquerda desligue o motor1 e ligue o 2

Para virar para direita desligue o motor2 e ligue o 1

Para frente ligue os dois no sentido horário

Para trás, ligue os dois no sentido anti-horário

Para parar, desligue os dois

Como no seu exemplo:

void frente() {
digitalWrite(Motor1Pin1, HIGH);
digitalWrite(Motor1Pin2, LOW);
digitalWrite(Motor2Pin1, HIGH);
digitalWrite(Motor2Pin2, LOW);
}

No programa principal, teste o joystick:

if (leiturax > leituray){

  LadoX();

}

E assim por diante...

Criei o código, o mesmo é copilado, não apresenta nenhum erro.

Porém quando passo pro arduino e começo a mandar informação através do joystick os motores não respondem. Fica só um ruído fino mas não se movem. 

CÓDIGO 

const int JoyY = A1; //Joystick Y conectado ao Pino A1 do Arduino
const int JoyX = A0; //Joystick X conectado ao Pino A0 do Arduino
int leiturax = 0; // Variável que guardará o valor lido no eixo x
int leituray = 0; // Variável que guardará o valor lido no eixo y

const int Motor1Pin1 = 11; //Pino 2 do L293D conectado ao Pino D11 do Arduino
const int Motor1Pin2 = 10; //Pino 7 do L293D conectado ao Pino D10 do Arduino
const int Motor2Pin1 = 5; //Pino 15 do L293D conectado ao Pino D7 do Arduino
const int Motor2Pin2 = 6; //Pino 10 do L293D conectado ao Pino D8 do Arduino
const int PWMmotor = 9; //Enables ativado Pino 9 do L293D conectado ao Pino D9 do Arduino

void setup() {

pinMode(JoyX, INPUT);
pinMode(JoyY, INPUT);

pinMode(Motor1Pin1, OUTPUT); //Motor 1.1 configurado como saída
pinMode(Motor1Pin2, OUTPUT); //Motor 1.2 configurado como saída
pinMode(Motor2Pin1, OUTPUT); //Motor 2.1 configurado como saída
pinMode(Motor2Pin2, OUTPUT); //Motor 2.2 configurado como saída
pinMode(PWMmotor , OUTPUT); //PWM (motor) configurado como saída

analogWrite(PWMmotor, 255); //Habilita PWM em 100%
}
void loop() {

leiturax = analogRead(JoyX);

leituray = analogRead(JoyY);

if (leituray>leiturax) {

frente();

}
if (leituray<leiturax){

tras();

}

if (leiturax>leituray){

direita();

}
if(leiturax<leituray){

esquerda();
}

}

void frente(){

digitalWrite(Motor1Pin1, 255); //Habilita Motor 1.1 em nível alto
digitalWrite(Motor1Pin2, 0); //Habilita Motor 1.2 em nível baixo
digitalWrite(Motor2Pin1, 255); //Habilita Motor 2.1 em nível alto
digitalWrite(Motor2Pin2, 0); //Habilita Motor 2.2 em nível baixo

}

void tras(){

digitalWrite(Motor1Pin1, 0); //Habilita Motor 1.1 em nível alto
digitalWrite(Motor1Pin2, 255); //Habilita Motor 1.2 em nível baixo
digitalWrite(Motor2Pin1, 0); //Habilita Motor 2.1 em nível alto
digitalWrite(Motor2Pin2, 255); //Habilita Motor 2.2 em nível baixo

}

void direita(){

digitalWrite(Motor1Pin1, 255); //Habilita Motor 1.1 em nível alto
digitalWrite(Motor1Pin2, 0); //Habilita Motor 1.2 em nível baixo
digitalWrite(Motor2Pin1, 80); //Habilita Motor 2.1 em nível alto
digitalWrite(Motor2Pin2, 0); //Habilita Motor 2.2 em nível baixo

}

void esquerda (){

digitalWrite(Motor1Pin1, 80); //Habilita Motor 1.1 em nível alto
digitalWrite(Motor1Pin2, 0); //Habilita Motor 1.2 em nível baixo
digitalWrite(Motor2Pin1, 255); //Habilita Motor 2.1 em nível alto
digitalWrite(Motor2Pin2, 0); //Habilita Motor 2.2 em nível baixo

}

Anderson, qual a especificação do motor que você está usando?

Você está alimentado o circuito com uma bateria? (É aconselhável nesse caso a alimentação externa)

A velocidade do motor é dada pelo pino PWMMotor, então no controle da direção use sempre HIGH e LOW.

No caso dos IFs, teste no serial monitor quais devem ser os valores do joystick para cada direção. Veja se o Joystick está correspondendo.

Veja este link para entender melhor o controle do joystick http://www.arduinoecia.com.br/2013/09/modulo-joystick-arduino.html

Estou usando servos motores, esses já foram modificados. Retirei o controle dos mesmos, e deixei so alimentação para ser saída na ponte H.

 Estou alimentando o circuito com 5 pilhas (1,5V cada).

Modifiquei o controle usando HIGH e LOW. 

Ativei o serial, realmente os valores do eixo x e y estão estranhos. Quando movimento o joystick no eixo y positivo (para cima) os valores de x e y no serial aumentam (ficam iguais.Ex: x=350 e y=350), da mesma forma se movimentar o joystick para o lado positivo de x (para direita) os valores lidos de x e y aumentam. Se alternar entre x e y positivo os valores de ambas as leituras aumentam tbm.  Agora se movimentar o joystick para o lado negativo de x(para a esquerdo) e y(para baixo), os valores lidos são zero. 

Como resolvo esse problema?

Anexos

Anderson, veja se os valores batem com a figura abaixo:

Mais informações no site:

http://www.aprendetecnologia.es/practicas-con-arduino-visualino-joy...

Os valores são bem próximos a essa figura.

Por exemplo, o joystick parado X=518 e Y=500.

Eixo Y positivo: X=518; Y=1023.

Eixo Y negativo: X=518; Y=0.

Eixo X positivo: X=1023; Y=500;

Eixo X negativo: X=0; Y=500.

Entre os eixos X e Y os valores de X e Y ficam variando. Tenho que converter os valores analógicos 0 a 1023 para os valores usados na PWM que é de 0 a 255. 

Uso a função:

leiturax = map(leiturax, 0, 1023, 0, 255); // esta função map vai converter os valores de 0 a 1023 para 0 a 255.

 leituray = map(leituray, 0, 1023, 0, 255); // esta função map vai converter os valores de 0 a 1023 para 0 a 255.
Partindo dessa lógica, no código que eu fiz, coloquei:
se leiturax>leituray, motor exerce uma função. Só que vou ter duas leituras X maior que Y. Como faço para o Arduíno entender qual comando quero usar. Por exemplo, se leiturax>leituray, motor girar no sentido horário, ou o robô gira para a direita. 
Está claro a minha dúvida?

Anderson. Tente assim:

Ao invés de comparar x com y, verifique o eixo com sua posição.

Primeiramente determine qual é seu eixo esquerda/direita e qual seu eixo cima/abaixo de acordo com sua referência. O ponto central é 512.

Por exemplo, se Y é o eixo direita/esquerda, então se y > 700 indica que a pessoa quer ir para a direita e se X > 700 indica que a pessoa quer ir para cima.

Esses valores são aproximados e podem ser modificados para dar maior sensibilidade aos movimentos. Para esquerda seria 300 ou 200.

Então seria assim:

if (leituray > 700 && leituray < 1024) {

   direita()

}

if (leituray > -1 && leituray < 300) {

   esquerda()

}

E assim por diante

Vá ajustando os valores. Se o robô virar para o lado errado, inverta as variáveis até chegar  ao resultado que você deseja.

Para parar o robô, use LOW em todas os pinos.

Cara, muito obrigado! Deu certo. Agora é só ajustar os valores para chegar no resultado que eu quero. Muito obrigado mesmo!!!! Grande abraço.

Anderson, E os motores (servos) que não estavam funcionando? Estão OK agora?

Olá Jose Augusto, desculpa te responder só agora, estou na correria do dia a dia. 

O curso de elétrica é fumo, mas, os motores estão funcionando sim, só que tive que fazer umas calibragens para chegar em um determinado resultado. A ideia é justamente a que vc me indicou, agradeço muito pela dica!

Muito obrigado!!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço