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.