Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

10 Schaltflächen mit 1 Interrupt

Komponenten und Verbrauchsmaterialien

Arduino UNO
Oder jeder andere Mikrocontroller
× 1
Breadboard (generisch)
× 1
Jumper (generisch)
× 21
Tastschalter, von oben betätigt
Jede Schaltfläche reicht aus, ob groß oder klein
× 10

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung

Interrupts sind praktisch. Sie vereinfachen nicht nur manchmal den Code, sondern können auch für ein präzises Timing oder zum Aufwecken des Arduino aus dem Schlafmodus verwendet werden.

Nehmen wir an, Sie haben eine Benutzeroberfläche, zum Beispiel eine Fernbedienung, die mit Batterien betrieben wird. Vielleicht möchten Sie den Arduino (oder den eigenständigen ATmega) in den Power-Down-Modus versetzen, um Strom zu sparen. Wenn ein Arduino in den Power-Down-Modus wechselt, kann es nur durch einen externen Interrupt geweckt werden. Der in einem Arduino Uno verwendete ATmega328P-Chip hat nur zwei externe Pin-Interrupts. (INT0 und INT1 an Pins 2 und 3) Da eine Benutzeroberfläche wahrscheinlich mehr als zwei Tasten hat, ist das ein Problem.

Die Standardlösung

dies wäre, alle Tasten normal zu verbinden, sie aber auch mit einer Diode an einen Interrupt-Pin anzuschließen. Dies verkompliziert die Schaltung jedoch erheblich.

Neben standardmäßigen externen Interrupts verfügt der ATmega328P auch über Pin-Change-Interrupts. Es gibt Bibliotheken, die damit umgehen können, und sie sind eine gute Lösung für dieses Problem.

Während eines Programmierwettbewerbs habe ich jedoch herausgefunden, wie dies mit standardmäßigen externen Interrupts ohne zusätzliche elektrische Komponenten möglich ist.

Die Schaltung

Wir haben ein paar Knöpfe. Ich habe zehn verwendet, die gut auf mein Steckbrett passen. (Ich habe auch nicht mehr.) Sie können einen Button pro Pin haben, das bedeutet bis zu 20 auf einem Uno und bis zu 70 auf einem Mega! (Wenn Sie tatsächlich 70 Tasten benötigen, empfehle ich die Verwendung von Multiplexing, dafür benötigen Sie kein ganzes Mega.)

Jede Taste hat eine Seite, die mit einem beliebigen Pin verbunden ist. (4-13 in meinem Fall) Die anderen Seiten aller Tasten sind mit einem einzigen Interrupt-fähigen Pin verbunden. (2 in meinem Fall)

Der Code

Der Code ist unten angehängt. Damit dieses Beispiel funktioniert, laden Sie es in Ihr Board hoch. Öffnen Sie Ihren seriellen Monitor. Wenn Sie eine Taste drücken, wird ihre Nummer angezeigt. Wie Sie sehen, wird die Loop-Funktion überhaupt nicht verwendet.

Wie funktioniert es?

Es gibt offensichtlich eine Unterbrechung. In meinem Fall ist es an Pin 2 angeschlossen. Es ist als FALLING . konfiguriert .

Um die Verwendung von Dioden zu vermeiden, verdrahtet das Arduino die Schaltung im laufenden Betrieb. Es gibt zwei mögliche Konfigurationen:Allgemeiner Modus und Eindeutiger Modus .

Gleichtakt

Die meiste Zeit wird die Schaltung im Gleichtakt sein. Der Interrupt-Pin wird als INPUT_PULLUP . konfiguriert und der Rest ist AUSGABE und LOW .

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

Im Normalmodus wird durch Drücken einer beliebigen Taste unser Interrupt-Pin nach unten gezogen und unser Interrupt ausgelöst. Sobald dies geschieht, konfiguriert unsere Interrupt-Service-Routine die Pins für den unterschiedlichen Modus neu.

Eindeutiger Modus

Sobald unser Interrupt ausgelöst wird, wechseln wir schnell in den eindeutigen Modus.

Der Distinct Mode ist das Gegenteil des Common Mode. Der Interrupt-Pin ist OUTPUT und LOW und der Rest ist INPUT_PULLUP .

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

Im Einzelmodus werden nur Pins, die den tatsächlich gedrückten Tasten entsprechen, nach unten gezogen. Wir können einfach alle Pins durchgehen, um herauszufinden, welcher den Interrupt ausgelöst hat.

Danach kann der Arduino wieder in den Common Mode wechseln und auf einen weiteren Interrupt warten. Oder, abhängig von Ihrer Anwendung, kann es im unterschiedlichen Modus bleiben und Benutzereingaben wie gewohnt verarbeiten, indem es zurück in den Normalmodus wechselt, bevor das Arduino in den Ruhezustand wechselt.

Ein komplexeres Beispiel

Versuchen wir es etwas komplexer. Wir werden ein Servo anbringen und jede Taste einem anderen Winkel zuordnen. (1=0°, 2=20°... 10=120°) Wir werden unseren Arduino auch mit ein paar Batterien betreiben.

In diesem Beispiel versetzen wir das Arduino nach fünf Sekunden Inaktivität in den Power-Down-Modus, um Strom zu sparen. Sie können einige Tutorials zum Schlafmodus online finden. Darüber hinaus versorgen wir das Servo über einen Transistor, um es abzuschalten, wenn es nicht verwendet wird.

Der Code für dieses Beispiel ist auch unten angehängt.

Code

  • Serieller Logger
  • Servo mit Schlafmodus
Serieller LoggerArduino
const int commonPin =2;const int buttonPins[] ={4,5,6,7,8,9,10,11,12,13};unsigned long lastFire =0;void setup() { configureCommon( ); // Pins für Interrupt einrichten AttachInterrupt (digitalPinToInterrupt (commonPin), pressInterrupt, FALLING); Serial.begin (9600);}void loop () { // Leer!}void pressInterrupt () { // ISR if (millis () - lastFire <200) { // Entprellungsrückgabe; } lastFire =millis(); configureDistinct(); // Setup-Pins zum Testen einzelner Tasten für (int i =0; i  
Servo mit SchlafmodusArduino
#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;Servoservo;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(); Schlafmodus(); } delay(10);}void pressInterrupt() { sleep_disable(); power_all_enable(); if (millis()-lastFire <200) { zurück; } lastFire =millis(); configureDistinct(); for (int i=0;i 

Schaltpläne

multiinterrupt_hoF76Oc4T5.fzz servo_with_sleep_u9ZqxF0jhY.fzz

Herstellungsprozess

  1. DTMF-Decoder, der nur Arduino verwendet
  2. Erstellen von Monitor-Ambilight mit Arduino
  3. ULTRASCHALLLEVITATION-Maschine mit ARDUINO
  4. DIY-Voltmeter mit Arduino und Smartphone
  5. Herzfrequenzmesser mit IoT
  6. WebServerBlink mit Arduino Uno WiFi
  7. Autozähler mit Arduino + Processing + PHP
  8. Automatisiertes Dino-Spiel mit Arduino
  9. FM-Radio mit Arduino und RDA8057M
  10. BLUE_P:Drahtloses Arduino-Programmierschild