Usando la menor cantidad posible de pines para varios botones

0

Estoy usando un Arduino Nano para hacer algún tipo de "consola" y actualmente estoy diseñando el controlador. Sin embargo, me gustaría al menos dos de ellos con 6 botones cada uno. He reservado 4 pines para la salida VGA, por lo que simplemente no hay suficientes pines.

El controlador solo consta de los 6 botones, con un cable que se remonta al arduino. El cable debe incluir alimentación y tierra. He considerado usar la radio, pero eso está fuera de alcance para mí en este momento.

    
pregunta James Pae

4 respuestas

6

Puede usar el bueno, antiguo, R2R DAC :

simular este circuito : esquema creado usando CircuitLab

Todos los r deben ser lo suficientemente pequeños como para que se acumulen en el botón R cuando se suelta. Algunos buenos valores con los que puedes comenzar son:

  • \ $ r = 1k \ Omega \ $
  • \ $ R = 47k \ Omega \ $
  • \ $ 2R = 100k \ Omega \ $

Mejor aún, use un \ $ 100k \ Omega \ $ resistor para R y dos de ellos en serie para el 2R resistor.

No voy a profundizar en cómo funciona este circuito, consulte wikipedia para una explicación, lo que quiere saber es que si asociamos un número digital a los estados del botón pulsador, el voltaje de salida es una representación analógica de dicho número.

Si se presiona el botón, decimos que es 1 , si no se presiona, decimos que es 0 . SW1 es el LSB, es decir, el bit más a la derecha, mientras que SW6 es el MSB, es decir, el bit más a la izquierda.

Como ejemplo, si presionas SW6, 3 y 2, el número digital es \ $ D = 100110 \ $, que en decimal es 38.

El voltaje de salida depende de \ $ V_ {dd} \ $ y es: $$ V_ {out} = V_ {dd} \ frac {D} {2 ^ N} $$ donde N es el número de interruptores, en este caso 6.

Puede muestrear el voltaje analógico con el arduino ADC y luego convertirlo de nuevo a una representación digital del estado.

Ya que tienes un convertidor de ocho bits, la rutina será bastante clara:

uint_8t sw_status;
while(1) {
  sw_status = adc_read() >> 2;
  // do something with sw_status. the lsb represents SW1, and so on, e.g.:
  if (sw_status & (1 << 3)) {
    //SW3 is pressed here!
  }
}

Hay algunos problemas con esto. En primer lugar, necesita resistencias precisas, o tendrá un comportamiento no monotónico que es muy malo. El ADC en el nano debe ser lo suficientemente preciso, pero debe verificar si acepta entradas de riel a riel. Y recibe un error porque no tiene pulsadores SPDT, y necesita usar el desplegable. Además, si tiene cables largos que van a la consola, es probable que necesite amortiguar la señal para evitar lecturas falsas.

Todo en todo esto funciona, no requiere muchos componentes, pero es por lo menos subóptimo. Definitivamente me gustaría ir para i2c expansores IO. Pero esta solución es bastante ordenada y un poco fuera de la caja, y merece un poco de evaluación.

    
respondido por el Vladimir Cravero
4

El enfoque clásico aquí es usar algún tipo de IO extensor IC. En el caso más simple, esto sería simplemente un registro de desplazamiento paralelo a serie, por ejemplo, una variante del 74xx165:

LaimagenesdelahojadedatosdeTexasInstrumentsSN74LV165A.

Laideaeslasiguiente:cuandosebajaelpinSH,losvaloresenlospinsAHsealmacenanenlosflip-flopsinternos,porloqueaquíesdondeseconectanlosinterruptores/botonesqueconectanelpindirectamentealsuministrodevoltaje(sipresionado,porejemplo),oconecteatierraelpinatravésdeunaresistencia(grande):

simular este circuito : esquema creado usando CircuitLab

De esa manera, cuando se presiona el botón, el voltaje en la entrada es "alto", de lo contrario es bajo. Por lo general, es recomendable conectar un condensador en paralelo a la resistencia, ya que contrarrestará el llamado "rebote". Los valores reales de la resistencia y el condensador no son críticos: si utiliza un valor de resistencia demasiado pequeño, consumirá mucha corriente con cada botón que presione, y si elige un valor de condensador demasiado grande, los botones aparecerán mucho tiempo hasta que sean presionados y liberados de manera efectiva, pero en general, algo como 10kOhm y 10nF - 100nF, valores abundantes en la mayoría de las cajas de partes, deberían funcionar bien para la interacción humana.

Otra sugerencia más: si necesita ir a comprar piezas, compre las llamadas redes de resistencia; por ejemplo, hay partes que contienen 8 resistencias idénticas que tienen un pin común (que se conectaría a tierra aquí, y 8 pines individuales. De esa manera, se ahorra mucho trabajo de soldadura, y su circuito puede verse muy limpio y ordenado.

Ahora, después de haber tirado SH "alto" nuevamente, los valores de entrada se almacenan en los flipflops.

Ahora su microcontrolador comenzará a enviar una señal de reloj (alta, baja, alta, baja, ...) a la entrada CLK. En cada flanco ascendente (es decir, transición de bajo a alto), aparece un valor de entrada en QH, y los estados internos se empujan un paso "hacia la derecha", lo que significa que el segundo flip-flop contiene el valor antiguo del primero, el tercer flip-flop el antiguo valor del segundo y así sucesivamente. Después de seis ciclos de reloj, todos los 8 valores de entrada se han mostrado secuencialmente en QH. Es por eso que este registro de desplazamiento también suele denominarse paralelo al registro de desplazamiento de conversión en serie.

Puede en realidad encadenarlos: si toma un segundo registro de desplazamiento y adjunta su QH a su entrada SER del registro de desplazamiento, entonces los valores de salida se "concatenarán" a los valores de los registros de su primer desplazamiento. De esa manera, con solo tres pines en su Arduino (un pin pisando SH, un pin pisando CLK y un pin leyendo la salida en serie de QH), puede tener virtualmente cantidades ilimitadas de botones, y eso a un precio unitario de menos de 20ct por 8 entradas

La única parte limitante es que regularmente tiene que bajar SH, jalar de nuevo y generar 8 * (N_shiftregisters) ciclos de reloj; esto se debe hacer con la frecuencia suficiente para no perderse una pulsación de tecla, pero generalmente, con microcontroladores ejecutándose en MHz, y con hardware SPI que en realidad no es diferente a hablar con tales registros de cambios, esto no es un problema en absoluto. no es raro ver a alguien consultar los registros de turnos un par de veces por segundo.

    
respondido por el Marcus Müller
2

Si tienes 3 pines de E / S, puedes charlieplex.

(DebeagregarunaresistenciadesplegableantesdecadapindeE/S).

Fuentedelaimagen: enlace

Ahora, como nota, debe probar todas las combinaciones posibles (6 en total) antes de determinar qué botones se presionan y cuáles no. Si activa un par de pines y encuentra que hay continuidad, hay tres posibilidades, donde la corriente podría fluir a través de dos botones presionados (un poco en serie), un botón presionado o todos 3.

Esto es lo que quiero decir:

Además, asegúrese de NO establecer ninguna SALIDA en BAJO. Si desea evitar que algo se queme, coloque una resistencia de 1 kΩ en cada terminal. Pero eso crearía involuntariamente un divisor de voltaje.

    
respondido por el Bradman175
2

Indicas parámetros de:

  • Al menos seis interruptores
  • Al menos dos controladores
  • Arduino Nano-compatible
  • Usar la menor cantidad posible de pines de E / S

El uso de una interfaz digital en lugar de una analógica le proporcionará una mejor tolerancia al ruido y eliminará los requisitos de precisión de las resistencias DAC.

Si busca "Controlador de teclado I2C", obtendrá varias posibilidades.

Las características de un controlador de teclado que es posible que desee tener en cuenta al seleccionar una parte se incluyen en el desmonte de claves (hace que su software / hardware sea un poco más sencillo), la protección contra ESD (el usuario podría ser un gato) y un usuario Dirección definible (para que pueda tener más de uno en los mismos pines de E / S).

Uno de ellos es el controlador de teclado MAX7360 ( esta no es una recomendación de producto ya que no tengo experiencia con ella, y EE.SE no es un sitio de recomendación de productos).

Si encuentra que su dispositivo seleccionado prefiere trabajar con un bus I²C de 3.3 V pero su Nano funciona con 5 V, puede usar un cambio de nivel .

Otro punto a considerar es si puede soldar físicamente el dispositivo, algunos de los que encontré usan un paquete BGA. Si tiene una estación de soldadura de aire caliente, entonces podrá utilizarla, de lo contrario, elija una con clavijas en los bordes.

    
respondido por el Andrew Morton

Lea otras preguntas en las etiquetas