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
//}
Tags:
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?
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.
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.
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!!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por