Problema proyecto multiples interruptores escape room

Buenos días!

Estoy colaborando con la creación de una sala de escapismo ("escape room") y tengo problemas en una de las pruebas que estamos creando, posteo a ver si alguien me puede ayudar a dar con una solución al error.

Estamos creando una màquina que dispone de 20 pulsadores, el modelo de pulsador que usamos es un modelo tipo arcade.
Los 10 primeros pulsadores serviràn para reproducir canciones (mientras pulsó el botón, suena la canción, al parar de pulsar, deja de sonar).
Los otros diez, sirven para "introducir" la contraseña que desbloquea el premio del juego (bàsicamente, se tienen que pulsar 4 de los 10 botones en un orden concreto, cuales se deben pulsar esta ligado con las canciones anteriores).
Para controlar todo el juego, estamos usando un arduino mega.

Justo hoy hemos creado todas las conexiones de los pulsadores, y es aquí donde estamos encontrando un error, en la lectura de los pulsadores.

La conexión que hemos realizado es la siguiente:

  • Todos los puertos COM de los 20 pulsadores están conectados a la misma línia de 5V.
  • Todos los puertos NO de los 20 pulsadores tienen dos cables, el primero es el cable de lectura que va conectado a un pin digital (1-20) para leer el estado de este pulsador. El segundo cable de cada pulsador va a una resistència de 10K (para crear la resistencia pull down) , que luego va a una línia de tierra común con todos los demás cables de los otros pulsadores que finalmente van a parar al GND del arduino mega

En el momento de hacer las pruebas, hemos usado un programa simple que nos avisara cuando se pulsaban cada botón (if(digitalRead(1)) {Serial.println("boton 1 pulsado"):wink:

El problema es que al pulsar un botón, se recibe correctamente que se pulsa ése botón, pero también nos aparece que se pulsan otros, que además siempre son los mismos en cada caso. Es decir, si presiono el boton 1, me dice que se estan presionando el 1 i el 9. Mientras que si pulso el botón 2, me dice que se presionan el botón 2, 5 i 6. Y así un poco con todos (va variando entre 1, 2 o 3 botones pulsados a la vez).

Mi primera impresión ha sido que podía ser ruido, pero me parece muy raro que siempre afecte a las mismas agrupaciones de botones, otra opción que hemos barajado es que por ejemplo, las resistencias del 2, 5 ,6 están conectadas al cable del negativo una al lado de otra, que pueda ser algún tipo de cruce en este punto, pero tampoco entiendo muy bien cómo podría afectar esto a la lectura de cada pin...

Muchas gracias por adelantado por la ayuda, cualquier duda intentaré resolverla lo mas rapido possible.

Esquema, código, lee las normas y postea correctamente.
Luego envia alguna foto de cómo estan los botones y los cables que usas, son con malla, sin ella.
Si no tienen malla te aseguro que tienes 20 antenas sumado a otros errores constructivos en los que caemos todos porque cuando estamos en nuetra casa o laboratorio/taller, todo funciona pero al llevarlo al sitio nada lo hace bien.
Quedamos a la espera de mas información.

Es un poco dificil ayudarte a dar un diagnostico si no hay un esquema ni código ni tampoco estamos seguros como funciona el componente, bajo mi perspectiva yo iria probando un pulsador a la vez y luego ir añadiendo de uno en uno hasta tener el codigo completo, como arduino trabaja en TTL verificaste mediante el analogRead, el cambio de voltaje que existe en el pulsador, utilizar 10k como resistencia en un pulsador no es algo excesivo porque he visto que algunos botones de arcade son plug and play inclusive

Y no interesa mejor un keypad que 10 botones?
buscando uno al azar:
https://es.aliexpress.com/item/1005002970995934.html?pdp_npi=2%40dis%21EUR%21%E2%82%AC%201%2C72%211%2C63%20%E2%82%AC%21%21%21%21%21%40211b442216773179714872425e365a%2112000023016362501%21btf&_t=pvid%3A8d787b91-6153-43b8-853a-43b9e87cd077&afTraceInfo=1005002970995934__pc__pcBridgePPC__xxxxxx__1677317971&spm=a2g0o.ppclist.product.mainProduct&gatewayAdapt=glo2esp
Por otro lado como te han comentado, Arduino trabaja con señales TTL que son de muy bajo voltaje (un 0 lógico es <0.8V y un 1 lógico es >2.4v si no mal recuerdo) el diferencial entre un 0 y un 1 es de solo 1.6v por lo que si son cables largos no funcionará o habrá lecturas erráticas. de ahí que los puertos serie funcionen con -12v a +12v haciendo un diferencial entre 0 y 1 muchísimo mayor`en voltaje y por ende mayor distancia por tener más tolerancia al ruido.

Buenos días,

Muchas gracias por las rápidas respuestas y disculpas por no poner esquema y código de entrada. Voy a intentar detallar màs el proyecto como me pedís.

Los pulsadores que estamos usando son estos:

image

Y también estos, que son casi iguales pero con led (son los que van a introducir la contraseña y se van a iluminar al presionarlos):

image

El esquema del circuito es el siguiente, repetido hasta los 20 pulsadores
https://drive.google.com/file/d/1Rd4DEZT5dFLynN_IAPLSZabQlLc2WOaU/view?usp=sharing

Este es el código que usamos para testear, es muy simple, solo para probar la recepción de cada pulsador.

Adjunto fotografia de como estan puestos y conectados los pulsadores, están en 4 filas de 5 pulsadores cada una, la primera fila y tercera fila sin led, para reproducir las canciones, y la segunda y cuarta fila con led para seleccionar las correctas en orden para introducir la contraseña. Para conectar el cable a las patillas de los pulsadores hemos usado fastons, y como cable la verdad hemos usado un poco lo que teníamos mas a mano, para la entrada de 5V cable eléctrico del mas habitual de pared, mientras que para la salida de cable doble al Pin y al GND (previo paso por la resistencia 10k) hemos usado los cables interiores de un cable de red (adjunto foto). En la foto también se ve la salida de los cables para encender el led, pero todavía no los hemos conectado ni testeado, solo están instalados en las patillas, pues funcionan a 12V y vamos a usar relés para encenderlos.


https://drive.google.com/file/d/10FzvKI3xuT7HtAL6t4Meo0Hx3Qv5G6RF/view?usp=sharing

Me gustaria dar mas informacion del cable usado, pero no tengo a mano las especificaciones ahora mismo, le he pedido a mi compañero que me las haga llegar, cuando las tenga las posteo

Si necesitan mas informacion, no duden en pedirla.

Muchas gracias

Muchas gracias, la verdad es que el tema del cableado no lo tuvimos nada en cuenta y usamos el que teníamos mas a mano. Es posible pues que el problema sea el cable y lo podríamos solucionar usando cable apantallado?

En las primeras pruebas, conectamos todos los 20 pulsadores al mismo pin uno por uno y la señal funcionaba, es decir recibiamos señal al presionarlo y dejábamos de recibir la señal al soltar. El problema es que una vez todos conectados, al presionar cada pulsador recibimos bien la señal, pero también recibimos que se pulsan otros pulsadores(que no estamos pulsando). Lo que me parece mas raro es que siempre son los mismos, es decir si presionemos el pulsador número 1, nos dice que estamos presionando 1 y 9, siempre estos dos. He probado de cambiarlos de número de pin, y la recepción sigue siendo que presionamos esos dos. Tambien les probe en lectura analogica, y la lectura con analogRead es de 1024 en los dos pins, asi que no creo que sea el TTL que me comentas, pues la lectura es alta y completa para los dos.

No, el keypad no nos interesa por formato y por la ambientación, pues estamos simulando una màquina antigua. Además nos gusta que el botón de selección este debajo de cada canción seleccionable.

Al código (que deberías haber adjuntado así)

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 21; i++) {
    pinMode(i, INPUT);
  }
}

void loop() {
  for (int i = 0; i < 21; i++) {
    if (digitalRead(i)) {
      Serial.print("Presionado el boton: ");
      Serial.print(i);
    }
  }
}

le veo un detalle:
Usas los pines 0 (Rx) y 1 (Tx) como entradas pero a la vez usas el puerto serie.
Ahí tienes un conflicto.

Gracias por tu respuesta, disculpas, no sabia como poner el código en este formato.

Si lo de los pines 0 y 1 lo pensé, probe a cambiar los pines del 20 al 40 y el problema seguía siendo el mismo.

Moderador:
Tema movido a Hardware, no reúne las características de un proyecto.

Como estan conectados los pulsadores?
El código que indicas requiere que hayas usasdo una resistencia a GND. Es asi?
image
De lo contrario no mostrarías Presionado el boton cuando te de un True o Verdadero.
Yo dudo que tengas resistencia porque justamente es lo que hace el sistema por no tenerla y reporta estados a cada instante porque el botón rebota y tu lees 1 pin y luego en el rebote lees los que estan en 1.
Coloca una R de 4k7 o 10k a GND si no la tienes conectada.
Considera usar Bounce2.h para evitar los rebotes, darle un tiempo a esos pulsadores que son lentos digamos 100mseg y leer mas lento en consecuencia, pero no uses delay() por favor.

Buenos días,

Si cada uno de los pulsadores tiene su propia resistencia de 10k, para generar la resistencia pull down y que en estado de reposo no de falsos positivos ni rebotes. De hecho si no presionamos ningun boton, no hay ninguna lectura. Solo llegan lecturas al presionar botones, pero son dobladas o triplicadas por distintos botones como comente.

Es imposible que eso ocurra. Jamas 1 pulsador con resistencia pull-down o pull-up me dio lecturas falsas, si rebotes.
Usa bounce.
Mira... ve a Administrador de Librerias y descarga bounce2.h

Ese es el link.
Mira un ejemplo con 8 que adapté a tu necesidad, amplíalo a tu gusto


#include <Bounce2.h>

#define NUM_BUTTONS 8
const uint8_t BUTTON_PINS[NUM_BUTTONS] = { 2, 3, 4, 5, 6, 7, 8, 9};

int ledState = LOW;

Bounce* buttons = new Bounce[NUM_BUTTONS];

void setup() {

  for (int i = 0; i < NUM_BUTTONS; i++) {
    buttons[i].attach(BUTTON_PINS[i], INPUT_PULLUP);       //setup the bounce instance for the current button
    buttons[i].interval(50);              // interval in ms
  }
}

void loop() {

  bool needToToggleLed = false;

  for (int i = 0; i < NUM_BUTTONS; i++) {
    // Update the Bounce instance :
    buttons[i].update();
    // If it fell, flag the need to toggle the LED
    if (buttons[i].fell()) {
      Serial.print("Presionado el boton: "+String(i));
    }
  }
}

Este instrucción

buttons[i].interval(50);   

controla el tiempo de rebote.. un pulsador como el tuyo estará en 50 a mas mseg.. no creo que pase de 100 o 150.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.