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

Exibições: 754

Responder esta

Respostas a este tópico

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.

https://www.arduino.cc/en/Tutorial/JoyStick

// 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);
} */

Anexos

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...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço