Input Shield

Adquiri o Input Shield para o Arduino da DFRobot.

Aqui está tudo montado no meu Arduino juntamente com o "Screw Shield", também da DFRobot, apenas para estender e simplificar as ligações com o Arduino:

  

Podemos começar por testar este Shield usando código de exemplo disponibilizado pela DFRobot aqui: http://www.robotshop.com/content/PDF/dfrobot-arduino-shields-manual.pdf

//This input shield use Digital Pin 3,4,5 (3 buttons) and Analog Pin 0,1 (JS) 

// 

// Upload the code to Arduino // www.dfrobot.com 

// Last modified on 24/12/2009 

int x=1; 

int y=0; 

int button_A= 5; 

int button_B= 3; 

int button_C= 4; 

int LED=13;

void setup() { 

int i; 

for(i=3;i<=5;i++) 

pinMode(i, INPUT); 

pinMode(LED,OUTPUT); } 

void loop() { 

int val; 

while(1) { 

  val=analogRead(x); 

  //Read Analog input 

  if(val>1000||val<20) digitalWrite(LED, HIGH); 

  else digitalWrite(LED,LOW);

  

val=analogRead(y); 

if(val>1000||val<20) digitalWrite(LED, HIGH); 

else digitalWrite(LED,LOW); 

if(digitalRead(button_A)==0) 

//Check Button A 

{ digitalWrite(LED, HIGH); 

// Set LED on 

} else digitalWrite(LED,LOW); 

if(digitalRead(button_B)==0) 

//Check Button B 

{ digitalWrite(LED, HIGH); 

// Set LED Off 

} else digitalWrite(LED,LOW); 

if(digitalRead(button_C)==0) 

//Check Button C 

{ digitalWrite(LED, HIGH); 

// Set LED off 

} else digitalWrite(LED,LOW); } 

}

Como pretendo associar este Input Shield a um projecto de controlo remoto para um carro-robot, usando o Joystick para o fazer andar para a Frente, Trás, Esquerda e Direita, fiz a seguinte alteração ao código exemplo para obter a posição exacta e respectivo valor:

int x=1; 

int y=0; 

int LED=13; 

int button_A= 5;

int button_B= 3; 

int button_C= 4; 

int valy; 

int valx; 

int xOut;

int yOut;

int totalOut;

int controloParado=0;

int controloinicialX;

int controloinicialY;

  

void setup() { 

Serial.begin(9600);

controloinicialX = analogRead(x);       

controloinicialY = analogRead(y);      

Serial.print("X Inicial:");

Serial.println(controloinicialX);

Serial.print("Y Inicial:");

Serial.println(controloinicialY);

Serial.println("---------------");

int i; 

for(i=3;i<=5;i++) 

pinMode(i, INPUT); 

pinMode(LED,OUTPUT);

}

void loop() 

   // Ler valor Horizontal (X)

    valx = analogRead(x);         

if (valx>(controloinicialX+5) && valy > (controloinicialY-5) && valy < (controloinicialY+5)) {    //ESQUERDA 

xOut = map(valx, controloinicialX, 1023, 0, 255 );     // Associar os valores lidos ao valor PWM a enviar para o LED

analogWrite(LED, xOut); 

Serial.print("X: ");

Serial.println(xOut);

controloParado=0; }

    

if (valx<(controloinicialX-5) && valy > (controloinicialY-5) && valy < (controloinicialY+5)) {   //DIREITA

xOut = map(valx,  controloinicialX, 0, 0, 255);     // Associar os valores lidos ao valor PWM a enviar para o LED

analogWrite(LED, xOut); 

Serial.print("X: ");

Serial.println(xOut);

controloParado=0; }

    

//PARADO EM AMBOS OS EIXOS (POSIÇÃO NEUTRA)    

//---------------------------------------------------------------------------------------------------------       

if (valx > (controloinicialX -5) && valx < (controloinicialX +5) && valy > (controloinicialY-5) && valy < (controloinicialY+5) && controloParado==0) {    

controloParado=1;

Serial.println("PARADO");

analogWrite(LED, 0); }    

//---------------------------------------------------------------------------------------------------------    

valy = analogRead(y);  

    

if (valy>(controloinicialY+5) && valx > (controloinicialX -5) && valx < (controloinicialX +5)) {    //BAIXO

yOut = map(valy, controloinicialY, 1023, 0, 255 );     // Associar os valores lidos ao valor PWM a enviar para o LED

analogWrite(LED, yOut);  

Serial.print("Y: ");

Serial.println(yOut);

controloParado=0;  }

if (valy<(controloinicialY-5)&& valx > (controloinicialX -5) && valx < (controloinicialX +5)) {  //CIMA

yOut = map(valy, controloinicialY, 0, 0, 255 );     // Associar os valores lidos ao valor PWM a enviar para o LED 

analogWrite(LED, yOut); 

Serial.print("Y: ");

Serial.println(yOut);

controloParado=0; }

//BOTÕES DO SHIELD:    

if(digitalRead(button_A)==0) //Check Button A 

{ digitalWrite(LED, HIGH); // Set LED on

} else digitalWrite(LED,LOW); if(digitalRead(button_B)==0) //Check Button B

{ digitalWrite(LED, HIGH); // Set LED Off 

} else digitalWrite(LED,LOW); if(digitalRead(button_C)==0) //Check Button C 

{digitalWrite(LED, HIGH); // Set LED off 

} else digitalWrite(LED,LOW); 

// JOYSTICK COM X e Y EM SIMULTÂNEO:

//---------------------------------------------------------------------------------------------------------    

if (valx<(controloinicialX-5) && valy<(controloinicialY-5)) { //DIREITA e CIMA

yOut = map(valy, controloinicialY, 0, 0, 255 );

xOut = map(valx,  controloinicialX, 0, 0, 255);   

totalOut= ((yOut+xOut)/2);

analogWrite(LED, totalOut); 

Serial.print("DIREITA E CIMA: ");

Serial.println(totalOut);   

controloParado=0; }

    

if (valx<(controloinicialX-5) && valy>(controloinicialY+5)) {    //DIREITA e BAIXO  

yOut = map(valy, controloinicialY, 1023, 0, 255 );   

xOut = map(valx,  controloinicialX, 0, 0, 255);        

totalOut= ((yOut+xOut)/2);     

analogWrite(LED, totalOut);  

Serial.print("DIREITA E BAIXO: ");

Serial.println(totalOut);  

controloParado=0; }

if (valx>(controloinicialX+5) && valy<(controloinicialY-5)) {    //ESQUERDA e CIMA

yOut = map(valy, controloinicialY, 0, 0, 255 );

xOut = map(valx, controloinicialX, 1023, 0, 255 );

totalOut= ((yOut+xOut)/2);     

analogWrite(LED, totalOut); 

Serial.print("ESQUERDA E CIMA: ");

Serial.println(totalOut);  

controloParado=0; }

if (valx>(controloinicialX+5) && valy>(controloinicialY+5)) {    //ESQUERDA e BAIXO

yOut = map(valy, controloinicialY, 1023, 0, 255 ); 

xOut = map(valx, controloinicialX, 1023, 0, 255 );

totalOut= ((yOut+xOut)/2);     

analogWrite(LED, totalOut); 

Serial.print("ESQUERDA E BAIXO: ");

Serial.println(totalOut);

controloParado=0; }

//--------------------------------------------------------------------------------------------------------- 

}

Vídeo de exemplo:

 

Desta forma conseguimos identificar a posição do Joystick mesmo se este estiver nas diagonais.