Olá.
Estou desenvolvendo um projeto onde tenho que ler A(0) e A(1) que estão ligados no eixo Y e eixo X do Joystik, mesmo em repouso está havendo muita mudança do estado.
Não estou conseguindo ler e tomar a decisão correta pois está variando muito.
Estou usando um joystik R300B-M1 de 5K
Att.
Edison Pessini
Tags:
Oi EAP, boa tarde,
poste seu esquema de ligações do joystick com o arduino.
Rui
Ola Rui, enviei o desenho das ligações
Boa tarde amigo, desculpe
Rui, bom dia. Não estou conseguindo enviar desenho mas é assim..
os pinos centrais de cada potenciometro do joystik estão ligados nas portas A0 e A1 e os pinos laterais no + e -.
Se A0 for >= 4xx e A1 == 4xx (motor 1 e 2 para frente)
Se A0 for <= 4xx e A1 == 4xx (motor 1 e 2 para traz)
Se A0 for == 4xx e A1 <= 4xx (motor 1 para traz e motor 2 para frente, vira pra esquerda)
e assim por diante. Ja fiz essa lógica com if mas o dificil está na compraração dos valores de A0 e A1 pois não assumem um valor estável.
Aqui a leitura dos pinos A0 e A1
448 453
456 454
446 460
451 463
449 454
453 461
454 452
448 450
448 457
453 456
450 462
442 458
447 459
442 450
454 464
444 455
445 458
450 455
446 454
451 462
453 451
450 456
447 457
452 463
448 454
457 464
453 456
447 459
448 458
447 460
448 459
454 455
445 455
447 465
451 454
442 455
452 462
447 451
450 457
436 455
451 454
452 456
457 463
445 460
Oi EAP, bom dia.
Quais são os valores dos potenciômetros deste Joystick?
Anexe (como arquivo) o seu código, pois a leitura analógica tem umas "dificuldades".
Rui
debouncing joystick
R300B-M1 = 3D joystick - POT 5K
http://www.hzqs.com/index.php?m=Product&a=index&id=32
http://www.hzqs.com/Uploads/201305/518a2f62cb69d.pdf
O seu circuito é esse ? Teste com o Sketch desse exemplo.
// define pinos para motor 1
int Dir1 = 2;
int Vel1 = 3;
// define pinos para motor 2
int Dir2 = 4;
int Vel2 = 5;
// define pinos para motor 3
int Dir3 = 7;
int Vel3 = 6;
int joysticF = 0;
int joysticT = 0;
int joysticD = 0;
int joysticE = 0;
void setup(){
Serial.begin(9600);
// Define pinos do motor como saida
pinMode(Dir1, OUTPUT);
pinMode(Vel1, OUTPUT);
pinMode(Dir2, OUTPUT);
pinMode(Vel2, OUTPUT);
pinMode(Dir3, OUTPUT);
pinMode(Vel3, OUTPUT);
}
void loop(){
if (analogRead(A0) > 511 && analogRead(A1) == 516) { // joystic para frente
joysticF=map(analogRead(A0),511,1023,0,255);
motor1F(joysticF);
motor2F(joysticF);
}
if (analogRead(A0) < 511 && analogRead(A1) == 516) { // joystic para traz
joysticT=map(analogRead(A0),511,0,0,255);
motor1T(joysticT);
motor2T(joysticT);
}
if (analogRead(A0) == 511 && analogRead(A1) > 516) { // joystic para direita
joysticD=map(analogRead(A1),516,1023,0,255);
motor1T(joysticD);
motor2F(joysticD);
}
if (analogRead(A0) == 511 && analogRead(A1) < 516) { // joystic para Esquerda
joysticE=map(analogRead(A1),516,0,0,255);
motor1F(joysticE);
motor2T(joysticE);
}
if (analogRead(A0) > 511 && analogRead(A1) > 516) { // joystic para frente Direita
joysticF=map(analogRead(A0),511,1023,0,255);
joysticD=map(analogRead(A1),516,1023,255,0);
motor1F(joysticD);
motor2F(joysticF);
}
if ((analogRead(A0) > 511) && (analogRead(A1) < 516)) { // joystic para frente Esquerda
joysticF=map(analogRead(A0),511,1023,0,255);
joysticE=map(analogRead(A1),516,0,255,0);
motor1F(joysticF);
motor2F(joysticE);
}
if (analogRead(A0) < 511 && analogRead(A1) > 516) { // joystic para Traz Direita
joysticT=map(analogRead(A0),511,0,0,255);
joysticD=map(analogRead(A1),516,1023,255,0);
motor1T(joysticD);
motor2T(joysticT);
}
if ((analogRead(A0) < 511) && (analogRead(A1) < 516)) { // joystic para Traz Esquerda
joysticT=map(analogRead(A0),511,0,0,255);
joysticE=map(analogRead(A1),516,0,255,0);
motor1T(joysticT);
motor2T(joysticE);
}
Serial.print(analogRead(A0));
Serial.print(" ");
Serial.println(analogRead(A1));
/*Serial.print(analogRead(A2));
Serial.print(" ");
Serial.println(analogRead(A3));*/
delay(500);
}
// Cria funcão para ação do controle do motor 1 FRENTE
void motor1F(int x){
digitalWrite(Dir1 , HIGH);
analogWrite(Vel1 , x);
}
// Cria funcão para ação do controle do motor 1 TRAZ
void motor1T(int x){
digitalWrite(Dir1 , LOW);
analogWrite(Vel1 , x);
}
// Cria funcão para ação do controle do motor 2 FRENTE
void motor2F(int x){
digitalWrite(Dir2 , HIGH);
analogWrite(Vel2 , x);
}
// Cria funcão para ação do controle do motor 2 TRAZ
void motor2T(int x){
digitalWrite(Dir2 , LOW);
analogWrite(Vel2 , x);
}
/* // Cria funcão para ação do controle do motor PARAR
void m1_stop(){
digitalWrite(m1_ALI, LOW);
digitalWrite(m1_BLI, LOW);
digitalWrite(m1_AHI, HIGH); // electric brake using high-side fets
digitalWrite(m1_BHI, HIGH); // electric brake using high-side fets
}
// function to release both motors (no electric brake)
// release all motors by opening every switch. The bot will coast or roll if on a hill.
void motors_release(){
digitalWrite(m1_AHI, LOW);
digitalWrite(m1_ALI, LOW);
digitalWrite(m1_BHI, LOW);
digitalWrite(m1_BLI, LOW);
} */
Jose, bom dia. Essa e a ligacao. no datasheet do joystik sao dois potenciômetros de 5K e o R300Bm1.
a tensao na saida deles e de 1,76V a 3,22V.
As interferencias aumentam quando ligo a ponteH nos motores. ja interliguei os terras, etc.. ainda tenho muita interferencia
Oi EAP, boa tarde
você esta fazendo medidas em duas portas analógicas em um espaço de tempo muito curto.
"f (analogRead(A0) > xxx && analogRead(A1) == yyy) { " A0 e A1 são lidas quase simultaneamente.
Isto causa erro na medida, pois as entradas analógicas precisam de tempo pra recalcular os
valores lidos. " A normal conversion takes 13 ADC clock cycles "
sugestão:
crie uma variável para guardar os valores lidos:
Exemplo:
int xpto1;
int xpto2;
depois no loop
xpto1 = analogRead(A0);
delay (1) ;
xpto2 analogRead(A1);
...........................
em seguida teste as condições usando os ifs.
.......
Serial.print (xpto1);
Serial.println (xpto2);
Teste e depois conte pra gente o resultado.
Rui
Rui, deve ser isso mesmo.
No exemplo do Arduino (citado por mim) tem um delay de 100 milisegundos entre as duas medidas.
void loop() {
// reads the value of the variable resistor
value1 = analogRead(joyPin1);
// this small pause is needed between reading
// analog pins, otherwise we get the same value twice
delay(100);
// reads the value of the variable resistor
value2 = analogRead(joyPin2);
Oi JGAM,
acho que até exagerei em colocar 1ms de delay, realmente 100 us é suficiente.
xpto1 = analogRead(A0);
delayMicroseconds (100) ; ----------------------------- delayMicroseconds
xpto2 analogRead(A1);
Rui
No exemplo esta com 100 milisegundos mesmo.
Não sei se 100 microsegundos vai dar...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por