Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

10 boutons utilisant 1 interruption

Composants et fournitures

Arduino UNO
Ou tout autre microcontrôleur
× 1
Planche à pain (générique)
× 1
Câbles de raccordement (générique)
× 21
Commutateur tactile, actionné par le haut
N'importe quel bouton fera l'affaire, grand ou petit
× 10

Applications et services en ligne

Arduino IDE

À propos de ce projet

Présentation

Les interruptions sont pratiques. Ils, en plus de simplifier parfois le code, peuvent être utilisés pour une synchronisation précise ou pour sortir l'Arduino du mode veille.

Disons que vous avez une interface utilisateur, une télécommande, par exemple, qui fonctionne sur piles. Vous voudrez peut-être mettre l'Arduino (ou l'ATmega autonome) en mode hors tension pour économiser de l'énergie. Lorsqu'un Arduino passe en mode de mise hors tension, il ne peut être réveillé que par une interruption externe. La puce ATmega328P utilisée dans un Arduino Uno n'a que deux interruptions de broche externes. (INT0 et INT1 sur les broches 2 et 3) Puisqu'une interface utilisateur est susceptible d'avoir plus de deux boutons, c'est un problème.

La manière standard de résoudre

ce serait de connecter tous les boutons normalement, mais aussi de les connecter à une broche d'interruption avec une diode. Cela complique cependant considérablement le circuit.

En plus des interruptions externes standard, l'ATmega328P dispose également d'interruptions de changement de broche. Il existe des bibliothèques pour les gérer et elles constituent une bonne solution à ce problème.

Cependant, lors d'un concours de programmation, j'ai compris comment faire cela en utilisant des interruptions externes standard sans composants électriques supplémentaires.

Le circuit

Nous avons quelques boutons. J'en ai utilisé dix, qui s'adaptent bien à ma planche à pain. (Je n'en ai pas non plus.) Vous pouvez avoir un bouton par broche, ce qui signifie jusqu'à 20 sur un Uno et jusqu'à 70 sur un Mega ! (Si vous avez réellement besoin de 70 boutons, je vous recommande d'utiliser le multiplexage, vous n'avez pas besoin d'un Mega entier pour cela.)

Chaque bouton a un côté connecté à une broche arbitraire. (4-13 dans mon cas) Les autres côtés de tous les boutons sont connectés ensemble à une seule broche capable d'interrompre. (2 dans mon cas)

Le code

Le code est joint ci-dessous. Pour que cet exemple fonctionne, téléchargez-le sur votre tableau. Ouvrez votre moniteur série. Lorsque vous appuyez sur un bouton, son numéro apparaît. Comme vous pouvez le voir, la fonction de boucle n'est pas du tout utilisée.

Comment ça marche ?

Il y a évidemment une interruption. Dans mon cas, il est attaché à la broche 2. Il est configuré en tant que FALLING .

Pour éviter d'utiliser des diodes, l'Arduino recâble le circuit à la volée. Deux configurations sont possibles :Mode commun et mode distinct .

Mode commun

La plupart du temps, le circuit sera en mode commun. La broche d'interruption sera configurée en tant que INPUT_PULLUP et le reste sera OUTPUT et FAIBLE .

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

En mode commun, appuyer sur n'importe quel bouton tirera notre broche d'interruption vers le bas et déclenchera notre interruption. Une fois que cela se produit, notre routine de service d'interruption reconfigurera les broches pour un mode distinct.

Mode distinct

Une fois notre interruption déclenchée, nous passons rapidement en mode distinct.

Le mode distinct est l'opposé du mode commun. La broche d'interruption sera OUTPUT et FAIBLE et le reste sera INPUT_PULLUP .

void configureDistinct() { pinMode(commonPin, OUTPUT); digitalWrite(commonPin, LOW); for (int i =0; i  

En mode distinct, seules les broches correspondant aux boutons réellement enfoncés seront tirées vers le bas. Nous pouvons facilement parcourir toutes les broches pour savoir laquelle a déclenché l'interruption.

Une fois cela fait, l'Arduino peut revenir en mode commun et attendre une autre interruption. Ou, selon votre application, il peut rester en mode distinct et traiter les entrées de l'utilisateur comme il le ferait normalement, en revenant en mode commun avant que l'Arduino ne se mette en veille.

Un exemple plus complexe

Essayons quelque chose d'un peu plus complexe. Nous allons attacher un servo et mapper chaque bouton à un angle différent. (1=0°, 2=20°... 10=120°) Nous allons également alimenter notre Arduino avec quelques batteries.

Dans cet exemple, nous mettons l'Arduino en mode veille après cinq secondes d'inactivité pour économiser l'énergie. Vous pouvez trouver des tutoriels sur le mode veille en ligne. En plus de cela, nous alimentons le servo via un transistor pour l'arrêter lorsqu'il n'est pas utilisé.

Le code de cet exemple est également joint ci-dessous.

Code

  • Enregistreur série
  • Servo avec mode veille
Enregistreur sérieArduino
const int commonPin =2;const int buttonPins[] ={4,5,6,7,8,9,10,11,12,13};unsigned long lastFire =0;void setup() { configureCommon( ); // Configuration des broches pour l'interruption attachInterrupt(digitalPinToInterrupt(commonPin), pressInterrupt, FALLING); Serial.begin(9600);}void loop() { // Empty!}void pressInterrupt() { // ISR if (millis() - lastFire <200) { // Debounce return; } dernierFire =millis(); configureDistinct(); // Configurer les broches pour tester les boutons individuels pour (int i =0; i  
Servo avec mode veilleArduino
#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);}void loop() { if (millis()-lastFire> 5000) { digitalWrite(servoEnablePin, LOW); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); mode veille(); } delay(10);}void pressInterrupt() { sleep_disable(); power_all_enable(); if (millis()-lastFire <200) { return; } dernierFire =millis(); configureDistinct(); for (int i=0;i 

Schémas

multiinterrupt_hoF76Oc4T5.fzz servo_with_sleep_u9ZqxF0jhY.fzz

Processus de fabrication

  1. Décodeur DTMF utilisant uniquement Arduino
  2. Créer un moniteur Ambilight à l'aide d'Arduino
  3. Machine à LÉVITATION ULTRASONIQUE utilisant ARDUINO
  4. Voltmètre DIY utilisant Arduino et Smartphone
  5. Moniteur de fréquence cardiaque utilisant l'IoT
  6. WebServerBlink avec Arduino Uno WiFi
  7. Compteur de voitures utilisant Arduino + Traitement + PHP
  8. Jeu Dino automatisé utilisant arduino
  9. Radio FM utilisant Arduino et RDA8057M