Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

10 botones con 1 interrupción

Componentes y suministros

Arduino UNO
O cualquier otro microcontrolador
× 1
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 21
Interruptor táctil, accionado por la parte superior
Cualquier botón servirá, grande o pequeño
× 10

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Introducción

Las interrupciones son útiles. Ellos, además de simplificar en ocasiones el código, se pueden usar para una sincronización precisa o para activar el Arduino desde el modo de suspensión.

Digamos que tiene una interfaz de usuario, un control remoto, por ejemplo, que funciona con baterías. Es posible que desee poner el Arduino (o ATmega independiente) en modo de apagado para ahorrar energía. Cuando un Arduino entra en modo de apagado, solo puede ser despertado por una interrupción externa. El chip ATmega328P utilizado en un Arduino Uno tiene solo dos interrupciones de pines externos. ( INT0 y INT1 en los pines 2 y 3) Dado que es probable que una interfaz de usuario tenga más de dos botones, eso es un problema.

La forma estándar de resolver

esto sería conectar todos los botones normalmente, pero también conectarlos a un pin de interrupción con un diodo. Sin embargo, esto complica significativamente el circuito.

Además de las interrupciones externas estándar, el ATmega328P también tiene interrupciones de cambio de pines. Hay bibliotecas para lidiar con ellos y son una buena solución a este problema.

Sin embargo, durante una competencia de programación, descubrí cómo hacer esto usando interrupciones externas estándar sin componentes eléctricos adicionales.

El circuito

Tenemos algunos botones. Usé diez, que encajaban muy bien en mi tablero. (Tampoco tengo más). ¡Puedes tener un botón por pin, lo que significa hasta 20 en un Uno y hasta 70 en un Mega! (Si realmente necesita 70 botones, le recomiendo usar multiplexación, no necesita un Mega completo para eso).

Cada botón tiene un lado conectado a un pin arbitrario. (4-13 en mi caso) Los otros lados de todos los botones están conectados juntos a un solo pin con capacidad de interrupción. (2 en mi caso)

El código

El código se adjunta a continuación. Para que este ejemplo funcione, cárguelo en su tablero. Abra su monitor de serie. Cuando presione un botón, aparecerá su número. Como puede ver, la función de bucle no se usa en absoluto.

¿Cómo funciona?

Obviamente, hay una interrupción. En mi caso, está adjunto al pin 2. Está configurado como FALLING .

Para evitar el uso de diodos, Arduino vuelve a cablear el circuito sobre la marcha. Hay dos configuraciones posibles: Modo común y Modo distinto .

Modo común

La mayor parte del tiempo, el circuito estará en modo común. El pin de interrupción se configurará como INPUT_PULLUP y el resto será OUTPUT y LOW .

  void configureCommon () {pinMode (commonPin, INPUT_PULLUP); for (int i =0; i  

En el modo común, presionar cualquier botón bajará nuestro pin de interrupción y disparará nuestra interrupción. Una vez que eso suceda, nuestra rutina de servicio de interrupción reconfigurará los pines para un modo distinto.

Modo distinto

Una vez que se activa nuestra interrupción, cambiamos rápidamente al modo distinto.

El modo distinto es lo opuesto al modo común. El pin de interrupción será OUTPUT y LOW y el resto será INPUT_PULLUP .

  void configureDistinct () {pinMode (commonPin, OUTPUT); digitalWrite (pin común, BAJO); for (int i =0; i  

En modo distinto, solo se bajarán los pines correspondientes a los botones realmente presionados. Podemos revisar fácilmente todos los pines para averiguar cuál activó la interrupción.

Una vez hecho esto, el Arduino puede volver al modo común y esperar otra interrupción. O, dependiendo de su aplicación, puede permanecer en modo distinto y procesar la entrada del usuario como lo haría normalmente, volviendo al modo común antes de que Arduino entre en suspensión.

Un ejemplo más complejo

Intentemos algo un poco más complejo. Adjuntaremos un servo y asignaremos cada botón a un ángulo diferente. (1 =0 °, 2 =20 ° ... 10 =120 °) También alimentaremos nuestro Arduino con algunas baterías.

En este ejemplo, ponemos el Arduino en modo de apagado después de cinco segundos de inactividad para ahorrar energía. Puede encontrar algunos tutoriales sobre el modo de suspensión en línea. Además de eso, alimentamos el servo a través de un transistor para apagarlo cuando no está en uso.

El código de este ejemplo también se adjunta a continuación.

Código

  • Registrador en serie
  • Servo con modo de suspensión
Registrador en serie Arduino
 const int commonPin =2; const int buttonPins [] ={4,5,6,7,8,9,10,11,12,13}; unsigned long lastFire =0; void setup () {configureCommon ( ); // Configurar pines para interrupción attachInterrupt (digitalPinToInterrupt (commonPin), pressInterrupt, FALLING); Serial.begin (9600);} void loop () {// ¡Vacío!} Void pressInterrupt () {// ISR if (millis () - lastFire <200) {// Devolución de rebote; } lastFire =millis (); configureDistinct (); // Configurar pines para probar botones individuales para (int i =0; i  
Servo con modo de suspensión Arduino
 #include  #include  #include  const int commonPin =2; const int buttonPins [] ={4,5,6,7,8 , 9,10,11,12,13}; const int servoEnablePin =A1; const int servoPin =A0; Servo servo; unsigned long lastFire =0; int status =0; void setup () {pinMode (commonPin, INPUT_PULLUP); configureCommon (); attachInterrupt (digitalPinToInterrupt (commonPin), pressInterrupt, FALLING); servo.attach (servoPin); pinMode (servoEnablePin, OUTPUT);} bucle vacío () {if (millis () - lastFire> 5000) {digitalWrite (servoEnablePin, LOW); set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable (); modo de sueño(); } delay (10);} void pressInterrupt () {sleep_disable (); power_all_enable (); if (millis () - lastFire <200) {return; } lastFire =millis (); configureDistinct (); for (int i =0; i   

Esquemas

multiinterrupt_hoF76Oc4T5.fzz servo_with_sleep_u9ZqxF0jhY.fzz

Proceso de manufactura

  1. Decodificador DTMF usando solo Arduino
  2. Hacer Monitor Ambilight usando Arduino
  3. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  4. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  5. Monitor de frecuencia cardíaca con IoT
  6. WebServerBlink usando Arduino Uno WiFi
  7. Contador de autos usando Arduino + Procesamiento + PHP
  8. Juego automatizado de Dino usando arduino
  9. Radio FM usando Arduino y RDA8057M
  10. BLUE_P:Escudo de programación inalámbrico Arduino
  11. Reloj digital en Arduino usando una máquina de estados finitos