Mostrando las entradas con la etiqueta arduino uno. Mostrar todas las entradas
Mostrando las entradas con la etiqueta arduino uno. Mostrar todas las entradas

jueves, 9 de junio de 2016

Utilizar Shield Jostick en Arduino Uno



Les comparto el siguiente código para obtener los valores correspondientes  del Shield Joystick para Arduino, en mi caso lo probé para arduino uno.

Este código funciona para el modelo específico que ven arrba en la imagen, la hoja de datos para esa placa lo pueden revisar aquí http://wiki.iteadstudio.com/ITEAD_Joystick_shield

Además, lo pueden comprar en store.robodacta.mx, o en electronicaestudio.com aquí en méxico o mercadolibre.com.mx, en fin.

Bueno, el código lo que hace es obtener los valores del eje X y Y, además el valor de los botones, y los imprime en pantalla, lo que deseen hacer con ellos ya queda a su disposición:

/*
 Sketch de ejempplo para Joystick Shield
 
 Lee los botones y la posicion del joystick. El Shield Joystick tiene 6 botones.
 La hoja de datos para el Shield Joystick utilizado para este ejemplo se puede
 encontrar en:
 
 http://wiki.iteadstudio.com/ITEAD_Joystick_shield
 
 creado 8/Junio/2016
 por Fernando Merino - LiNuXiToS
*/

//Creacion de variables por cada boton del Joystick para asignarlo al numero del pin
char botonA=7, botonB=6, botonG=9, botonF=8, botonE=3, botonD=4;

void setup(){
  pinMode(botonA, INPUT);      //Establecer el botonA como entrada
  digitalWrite(botonA, HIGH);  //Habilitar la resistencia en el boton 0

  pinMode(botonB, INPUT);
  digitalWrite(botonB, HIGH);
  
  pinMode(botonG, INPUT);
  digitalWrite(botonG, HIGH);

  pinMode(botonF, INPUT);
  digitalWrite(botonF, HIGH);
  
  pinMode(botonE, INPUT);
  digitalWrite(botonE, HIGH);
  
  pinMode(botonD, INPUT);
  digitalWrite(botonD, HIGH);
  
  Serial.begin(9600);
}

void loop()
{
  Serial.print(analogRead(0));          //Leer la posicion del joysticks en el eje X e imprimirlo por el puerto serial
  Serial.print(",");
  Serial.print(analogRead(1));          //Leer la posicion del joysticks en el eje Y e imprimirlo por el puerto serial
  Serial.print(",");
  Serial.print(digitalRead(botonA));   //Leer el valor del botn 0 y se imprime en el puero serial
  Serial.print(digitalRead(botonB));
  Serial.print(digitalRead(botonG));
  Serial.print(digitalRead(botonF));
  Serial.print(digitalRead(botonE));
  Serial.println(digitalRead(botonD));
  
  //Espera 100ms, luego vuelve a leer los pines
  delay(100);
}

Este puede ser algo sencillo para los ya expertos en el tema, pero para aquellos que se inician en electrónica con arduino, esto puede ser algo complicado, así que esto va  para ellos.

viernes, 11 de julio de 2014

Punteros en programas arduino

Recientemente realicé un proyecto con arduino. Necesitaba que al tener presionado un botón desde el protoboard conectado a un pin de arduino se encendiera un led, pero que únicamente validara el primer pulso sobre el botón.
Un programa en arduino se ejecuta en loop, es decir en un ciclo infinito, para detener un proceso se usan retardos, esto con la función delay(100), el parámetro que recibe son el total de milisengundos que se retardará le programa.
El problema que tuve en primer lugar es cómo validar únicamente el primer pulso, e ignorar los demás pulsos, lo que ocurre es que arduino sensa los pines cada 100 milisegundos, al menos ese es el tiempo que yo le dí, entonces cada 100 ms realizaba la misma acción, algo que no quería.
EL segundo problema fue usar apuntadores.
La solución quedó de la siguiente manera:
Primero vea el circuito y el material que usé para esta parte:

Ahí pueden ver los materiales usados, así como la conexión de cada componente. La idea es que cuando se presione un botón se encienda el led de salida, solo tomando en cueta el primer pulso, es decir, tanto en pantalla como en el resultado solo mostrará un uno sólo una vez.
El código es el siguiente:

const int buttonPinEntrada1 = 2;
const int buttonPinEntrada2 = 3;
const int ledPinSalida1 =  8;
const int ledPinSalida2 =  9;
int buttonState1 = 0;
int buttonState2 = 0;
int bBoton1=0;
int bBoton2=0;
int *band;

void setup(){
  Serial.begin(9600);
  pinMode(ledPinSalida1, OUTPUT);
  pinMode(ledPinSalida2, OUTPUT);
  pinMode(buttonPinEntrada1, INPUT);
  pinMode(buttonPinEntrada2, INPUT);
}

void loop(){
  /*boton 1*/
  buttonState1 = digitalRead(buttonPinEntrada1);
  band=&bBoton1;
  validarUnicoPulsoBoton(ledPinSalida1,band,buttonState1);
  /*boton 2*/
  buttonState2 = digitalRead(buttonPinEntrada2);
  band=&bBoton2;
  validarUnicoPulsoBoton(ledPinSalida2,band,buttonState2);
  delay(100);
}

/*procedimiento que se usa para validar una sola pulsacion de un boton*/
void validarUnicoPulsoBoton(int ledPinSalida,int *band,int buttonState){
  /*se verifica si el estado del buton es igual a uno, es decir, si esta presionado, de tal forma que si el boton se mantiene presionado
  por mucho tiempo, pasara la siguiente condicion, esto evita que se realize la misma accion muchas veces*/
  if(buttonState == 1){
    /*se veirifica si la bandera de ese boton esta desactivada, lo que significa que no se ha realizado ninguna accion
    tras a ver pulsado dicho boton*/
    if(*band == 0){
      /*se realiza la accion, en este caso se enciende un led*/
      digitalWrite(ledPinSalida, HIGH);
      /*se actualiza la bandera para indicar que la accion ya se ha realizado al menos una vez*/
      *band=1;
      /*se imprime en pantalla el valor de la bandera, solo para asegurar en que estado se encuentra (opcional)*/
      Serial.println(*band);
    }
  }
  /*se verifica si el estado del boton es igual a cero, esto indicara que el boton ha cambiado de valor, presionado a no presionado*/
  if(buttonState == 0){
    /*se valida que la bandera sea igual a 1, indica que la accion que se realiza cuando es presionado el boton se ha realizado al menos
    una vez*/
    if(*band == 1){
      /*sin la bandera esta activada, en este caso se encendio el led, entonces es necesario apagarlo*/
      digitalWrite(ledPinSalida, LOW);
      /*se actuliza el valor de la bandera, para indicar que el  estado del boton ha sido actualizado*/
      *band=0;
      /*opcional se imprime el nuevo valor de la bandera*/
      Serial.println(*band);
    }
  }
}

Y eso es todo, buena suerte.