Pages: [1]   Go Down
Author Topic: Ayuda proyecto: Bomba para Paintball  (Read 1189 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas!!!

Estoy montándome una bomba para jugar al paintball smiley

Tengo el código de un chico que se lo curró. En el propio código está la fuente

/*
   Utility code for calibrate the button array values,
 reading the values in Arduino serial Monitor
 
 The circuit:
 * More info at : http://yinhacklab.blogspot.com/
 
 Made during my reglamentation class smiley-wink
 
 */

//analogInPin = put the pin connected to the buttons, default based in the skema A0 (analog 0)
const int analogInPin = A0;

/*
  adc_keys based on the default values for the resistors used in the DFRobot LCD Keypad.
  adc_key_val[5] ={ right, up, down, left, select };
  can´t be more easy >.<
  */

int  adc_key_val[5] ={ 30, 150, 360, 535, 720};

int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

//Buttons names for lcd shield
const int BT_RIGHT = 0;
const int BT_UP = 1;
const int BT_DOWN = 2;
const int BT_LEFT = 3;
const int BT_SEL = 4;   // enter key

int sensorValue = 0;        // value read from the pot
void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // print the results to the serial monitor:
  if(!(get_key()== -1)){
    sensorValue = analogRead(analogInPin);  

    switch(get_key()){
    case BT_RIGHT :
      Serial.println("Detected Button = RIGHT" );  
      break;
    case BT_UP:
      Serial.println("Detected Button = UP");  
      break;
    case BT_DOWN:
      Serial.println("Detected Button = DOWN");  
      break;    
    case BT_LEFT:
      Serial.println("Detected Button = LEFT ");  
      break;  
    case BT_SEL:
    
      Serial.println("Detected Button = SELECT ");  
      break;
    default:
      Serial.print("Problem! I don´t detect the button. You should put this : " );                      
      Serial.print(sensorValue);
      Serial.println(" value in the adc_key_val on the code and test it again  smiley" );  

    }
  }
  // wait 10 milliseconds before the next loop
  delay(100);                    
}

//Get Key
boolean isPressed( int button) {

  if( get_key() == button ) return true;
  return false;
}

// Convert ADC value to key number
int get_key()
{

  int input = analogRead(analogInPin);
  int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)
    k = -1;     // No valid key pressed

  return k;
}

Este es el código para comprobar los botones se pulsan correctamente.

El problema que tengo es que esta todo el rato pulsando RIGHT. Si desenchufo la masa de ese se queda pulsado el siguiente. No se donde puede estar el problema.

Este es el esquema: http://www.dfrobot.com/image/data/DFR0009/LCDKeypad%20Shield%20V1.0%20SCH.pdf

Espero vuestra ayuda a ver si puedo montar el primer prototipo para el siguiente fin de semana que tengo partida!!

Saludos!!!
« Last Edit: May 08, 2013, 04:50:13 pm by MatuScien » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Chicos!!

Me estoy volviendo loco, en cada sitio veo una forma de como conectar 5 botones a un puerto analógico,

No consigo hacer funcionar mi código. Hasta ahora he conseguido funcionar 3 de los 5 botones. El esquema que he utilizado ha sido este:



Pero para el código que tengo se me queda como pulsado, y he cambiado la polaridad y ya se corrige y puedo pulsar.

La configuración de los botones es esta:

RIGHT = Ninguna -- OK

UP = 330 -- FALLO  (Cuando pulsas te muestra "DOWN")

DOWN = 620 -- ¿FALLO? (Cuando pulsas te muestra "DOWN")

LEFT = 1.8k -- OK

SEL  = 2.2k -- OK

La resistencia que está sola: 1.8k

No se como poder regular en el código para poder poner la resistencias que quiera y me estoy volviendo loco, seguro que es muy fácil pero no veo la solución.

Espero vuestra ayuda y consejos.

Saludos!!
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con este "complicado" código, creo que puedes monitorizar los valores analógicos que devuelve cada tecla. El valor que debes asignar luego en tu programa para detectar esa tecla eficazmente deberá ser un poco mayor que el máximo de los que se te muestren cuando pulses esa tecla (sin llegar a entrometerse en el rango de la siguiente).
Code:
const int analogInPin = A0;

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(analogInPin));
  delay(100);                   
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas!!

Muchas gracias por la respuesta.

Hice lo que me dijiste para obtener los valores, pero al ponerlos me pasa lo mismo. No se donde puede estar el problema. Para algo relativamente sencillo pero no lo consigo.

¿Me puedes decir que esquema tengo que seguir para que funcione el código del primer post?

Espero ayuda.

Saludos!
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola de nuevo. Entiendo que comprobado con el monitor, los valores que obtienes con cada tecla son suficientemente distintos a los de las demás. Sería interesante que postearas en qué rango están los que obtienes con cada tecla. El primer ejemplo que pones es fácilmente entendible, aunque parece un poco "remendadillo". Hay una función isPressed que no se usa para nada de momento, y se usa reiteradamente la llamada a getkey cuando creo que sería más efectivo hacerlo una vez y almacenar el valor en una variable. Doy por sentado que sabes que los adc_key_val deben ir definidos de menor a mayor en el array.
He retocado un poco el código, aunque no lo he probado:
Code:
#define analogInPin A0
#define BT_RIGHT 0
#define BT_UP 1
#define BT_DOWN 2
#define BT_LEFT 3
#define BT_SEL 4

const int  adc_key_val[5] ={ 30, 150, 360, 535, 720};
const int NUM_KEYS = sizeof(adc_key_val);

int sensorValue;

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  int tecla=get_key();
  // print the results to the serial monitor:
  if(tecla != -1){
    switch(tecla){
      case BT_RIGHT:
        Serial.println("Detected Button = RIGHT" ); 
        break;
      case BT_UP:
        Serial.println("Detected Button = UP"); 
        break;
      case BT_DOWN:
        Serial.println("Detected Button = DOWN"); 
        break;   
      case BT_LEFT:
        Serial.println("Detected Button = LEFT "); 
        break; 
      case BT_SEL:
        Serial.println("Detected Button = SELECT "); 
        break;
      default:
        Serial.print("Tecla ");
        Serial.print(tecla);
        Serial.println(" no definida");
        break;
    }
    Serial.print("SensorValue: ");
    Serial.println(sensorValue);
  }
  // wait 10 milliseconds before the next loop
  delay(100);                   
}

int get_key()
{
  sensorValue = analogRead(analogInPin);
  int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (sensorValue < adc_key_val[k])
    {
      return k;
    }
  }
  // Si la ejecución sale del for, no se ha pulsado ninguna tecla definida
  return -1;
}

Ya me dirás qué ocurre, sobre todo con pulsación prolongada, si te devuelve el mismo valor/tecla o varía, en cuyo caso quizás sea por problema hardware.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno ya lo solucioné. Al final utilicé el mismo código y me funcionó.



Aquí os dejo unas fotos de lo que tengo hasta ahora.

























No está mal para mi primer proyecto "serio" con arduino smiley-razz (Aunque el código no es mio smiley-razz )

Como me gusta aprovechar todo lo que tengo por casa para hacer el botón iluminado, pille el botón de la recreativa que me sobraba y lo taladre por dentro para pasar los filamentos de un led de alta luminosidad blanco. Aquí podeis ver el resultado.





Todavía quedan muchas cosas que hacer y mejorar, sobre todo en el código porque no entiendo ni la mitad. El código original era con 4 botones para submenús pero no necesito mas juegos con un juego me es suficiente.

Me gustaría poner un sensor de movimiento sin mercurio que tengo. Lo he probando con un puerto digital que es el único código que he visto. El funcionamiento seria poner un "valor máximo" y cuando pase de ese valor que explote la bomba. Lo primero seria poder controlar el sensor de vibración con valores que no se si se puede.

Espero vuestra ayuda!!

Saludos!!
Logged

Pages: [1]   Go Up
Jump to: