Arduino unterbricht
Unterbricht
Dies ist eine Anleitung zum Implementieren von Interrupts für Ihren Arduino-Code. Es gibt viele gute Informationen zu Interrupts, aber diese Anleitung ist Teil einer Reihe zum Ausführen Ihres Arduino mit geringem Stromverbrauch. Und wir meinen winzig. Wir sprechen von jahrelanger Betriebsdauer je nach Anwendung…. Auf einer Knopfzellenbatterie. Dies ist das Zeug, das Sie wissen müssen, um Ihre zukünftigen Embedded- oder Internet of Things-Projekte zu erstellen. Ehrlich gesagt ist es lächerlich, wie viel Energie ein Aktien-Arduino verschwendet. Mit den verschiedenen Tricks in dieser Leitfadenserie können Sie den Stromverbrauch um mehr als den Faktor 1000 senken! Hört sich interessant an? Dann ist dies der Leitfaden für Sie! Wenn Ihnen dieser Leitfaden gefällt oder Sie sehen möchten, wie wir Interrupts in unserem eigenen Projekt implementiert haben, besuchen Sie unsere Website unter:
//doteverything.co/
Warum brauche ich Interrupts?
Die Antwort ist wirklich einfach. Sie benötigen Interrupts, da Sie Ihr Arduino ohne Interrupts nicht in den Ruhezustand versetzen können und erwarten, dass es wieder aufwacht (im Allgemeinen. Es gibt Möglichkeiten, in begrenzten Situationen ohne Interrupts aus dem Schlaf aufzuwachen). Und wenn Sie es nicht einschläfern können, fressen Sie Kraft wie ein Marathonläufer, der mitten im Sommer durch das Death Valley rennt und Wasser frisst. Der Schlafmodus verbraucht sehr, sehr wenig Strom… aber die Einrichtung erfordert besondere Anstrengungen. Das erste, was Sie wissen müssen, ist, wie Sie Ihren Code schreiben, um Interrupts zu nutzen. Dann können Sie die leistungsfähigeren Techniken verwenden.
WAS ist ein Interrupt?
Eine Unterbrechung ist ein paar Dinge. Im Kern handelt es sich jedoch um einen Code, der aufgerufen wird, wenn eine spezielle Aktion ausgeführt wird. Welche besondere Aktion? Grundsätzlich, wenn sich die Spannung eines bestimmten Pins ändert. Auf der Duemilanove / UNO gibt es nur 2 solcher Pins, die sich qualifizieren können. Aber wie Sie sehen, ist dies eine sehr breite Anforderung. Sie können die Spannung an diesen Pins beliebig ändern. Es kann eine Benutzereingabe über eine Taste sein, es kann ein Peripheriegerät wie ein Sensor sein, es kann ein weiterer Mikrochip sein, es kann sogar ein interner Timer sein. Das erste, was Sie tun müssen, um Interrupts zu verwenden, ist herauszufinden, wie Ihre Anwendung in einen externen elektrischen Trigger konvertiert werden kann. Oft verwenden andere Geräte, die Sie mit Ihrem Arduino verbinden möchten, Interrupts, um Ihre Aufmerksamkeit zu erregen. Unsere vorherige Anleitung zum Hinzufügen von Bluetooth zu Ihrem Arduino-Projekt ist ein perfektes Beispiel für die Anbindung eines externen Geräts auf diese Weise.
In diesem Handbuch wird gezeigt, wie eine Beispielschaltung zum Auslösen von Interrupts verdrahtet wird. Dann werden wir einen Beispielcode bereitstellen. Nachdem Sie gesehen haben, wie es gemacht wird, werden Sie hoffentlich in die richtige Stimmung geraten, um herauszufinden, wie Sie einen Interrupt auf Ihr Projekt anwenden können.
Angenommen, der Stromverbrauch ist mir egal. Benötige ich noch Interrupts?
Ja! Auch wenn Sie nicht vorhaben, den Prozessor in den Ruhezustand zu versetzen, benötigen Sie möglicherweise Interrupts! Interrupts sind wichtig, wenn Sie eine zeitabhängige Anwendung haben. Dies kann bedeuten, dass alle x Millisekunden eine Aktion ausgeführt werden muss oder dass unmittelbar nach dem Eintreten eines externen Ereignisses eine Aktion ausgeführt werden muss. Wenn Sie mit den Grundlagen der Arduino-Programmierung vertraut sind, fragen Sie sich möglicherweise, warum Sie nicht einfach eine while-Schleife verwenden können, um zu überprüfen, wann es Zeit ist, Ihre Aktion auszuführen. Die typische Lösung besteht darin, dass Ihre while-Schleife den Status des Pins so schnell wie möglich „abfragt“. Diese Methode funktioniert oft, ist aber unzuverlässig. Was passiert, wenn Sie nach einem Tastendruck abfragen, der Knopf jedoch gedrückt und losgelassen wird, bevor Ihre while-Schleife den Knopfstatus erneut überprüft? Sie werden den Knopfdruck verpassen. Was passiert, wenn Sie nach einem sehr schnellen Ereignis suchen, z. B. einem Signal von einem Sensor? Sie müssen ziemlich ständig abfragen und Ihr Programm kann nichts anderes tun, aus Angst, das kritische Ereignis zu verpassen. Bei Interrupts ist jedoch zu 100% garantiert, dass Sie das Ereignis abfangen. Durch die Verwendung eines Interrupts müssen Sie den Status nicht ständig überprüfen, wodurch Rechenleistung gespart wird und Ihre while-Schleife schneller zu den anderen Aufgaben gelangt.
Schritt 1: Schaltkreisübersicht

Hier ist die Schaltung, die Sie erstellen sollten, um Ihren ersten Interrupt zu erstellen:
... oder zumindest ist es die Schaltung, die Sie bauen sollten. Glücklicherweise haben die meisten Arduino-Boards bereits LED und Widerstand eingebaut, genau in dieser Konfiguration. Sie können in der Software aktiviert werden. Leider zeigt Ihnen die Verwendung der integrierten Funktionalität nicht alles, was gerade passiert! Es lohnt sich also, diesen Schaltplan zu studieren und zu verstehen, was er tut. Die Tatsache, dass diese genaue Schaltung bereits in Arduino eingebaut ist, sollte Ihnen einen wichtigen Hinweis geben, wie wichtig sie ist.
Der wichtigste Teil dieser Schaltung ist der 20k-Widerstand, der an + 5V angeschlossen ist. Dies wird als Pull-up-Widerstand bezeichnet. Wenn der Widerstand anstelle von +5 V an GND angeschlossen wäre, würde er als Pulldown-Widerstand bezeichnet (in Arduino sind keine Pulldown-Widerstände eingebaut, Sie müssen diese extern hinzufügen). Der Pull-up-Widerstand hält den Pin, dem er zugeordnet ist, normalerweise bei + 5V. Wenn Sie den Stift alleine lassen, wird immer HIGH angezeigt. Wenn Sie den Pin direkt mit GND verbinden (z. B. durch Schließen der Taste), wird der Pin auf 0 V gesenkt und zeigt LOW an. Wenn wir das Pull-up nicht hätten, könnten wir den Knopf nicht dazu bringen, etwas Sinnvolles zu tun. Jeder Arduino-Pin kann intern mit + 5V verbunden werden, indem PinMode (Pin #, INPUT_PULLUP) angegeben wird. Beachten Sie, dass das Pullup nur dann sinnvoll ist, wenn der Pin als Eingang konfiguriert ist. Weitere Informationen zu Klimmzügen finden Sie auf der DigitalPins-Seite.
Die INTERRUPT_PIN sollte an Pin 2 oder 3 Ihres Arduino UNO (oder eines anderen 328p-basierten Arduino) gehen. Überprüfen Sie für andere Arduinos diese Seite, um einen Interrupt-fähigen Pin zu finden. In unserem Codebeispiel werden wir es mit Pin 2 verbinden. Die an ANY_PIN angeschlossene LED ist eine einfache Schaltung. Arduino hat bereits eine LED an Pin 13 angeschlossen, daher werden wir diese verwenden, aber Sie können die Schaltung jederzeit mit Ihrer eigenen LED an einem anderen Pin ändern. Neben der Arduino-LED befindet sich ein „L“.
Tasten haben oft 4 Stifte - normalerweise sind zwei der Stifte nur intern mit dem anderen Stift auf derselben Seite der Taste verbunden. Wenn Sie die Taste drücken und nichts passiert, überprüfen Sie, ob Sie Ihren Stromkreis tatsächlich über die Stifte verdrahtet haben, die beim Drücken der Taste verbunden sind, und nicht über die Stifte, die immer verbunden sind.
Schritt 2: Tatsächliche Verkabelung

Vor diesem Hintergrund ist hier die supereinfache Schaltung, die Sie tatsächlich verkabeln müssen, wenn Sie die internen Arduino-Pullups und die integrierte LED verwenden möchten.
Schritt 3: Der Code

Hier sind einige Dinge hervorzuheben. Am interessantesten ist Zeile 10, in der wir den Interrupt konfigurieren. attachInterrupt () akzeptiert 3 Argumente. Die erste ist die Interrupt-Nummer, nicht die Pin-Nummer. Sie müssen sich darüber keine Sorgen machen, stellen Sie einfach sicher, dass Sie immer digitalPinToInterrupt (Pin #) verwenden, und es wird automatisch übersetzt. Denken Sie daran, dass nur bestimmte Pins in Interrupt-Pins umgewandelt werden können. Das zweite Argument ist der Name der Funktion, zu der Ihr Code springen soll, wenn der Interrupt ausgelöst wird. Wie diese Funktion definiert ist, sehen Sie in Zeile 21.
Das dritte Argument für attachInterrupt () ist in diesem Fall das Schlüsselwort FALLING. Dies bedeutet, dass der Interrupt ausgelöst wird, wenn die Spannung an Pin 2 von HIGH nach LOW geht. Sie können auch RISING angeben, das ausgelöst wird, wenn die Spannung von LOW auf HIGH geht. oder Sie können CHANGE verwenden, das ausgelöst wird, wenn sich die Spannung in beide Richtungen ändert. Wenn in unserer Schaltung die Taste gedrückt wird, geht die Spannung von hoch nach niedrig, und wenn die Taste losgelassen wird, geht sie von hoch nach niedrig. Wir möchten den Code nicht jedes Mal zweimal auslösen, wenn die Taste umgeschaltet wird. Daher wählen wir entweder RISING oder FALLING. Ihre Anwendung erfordert möglicherweise etwas anderes.
Probieren Sie es aus
Wenn Sie den Code laden, den seriellen Monitor starten und auf die Schaltfläche klicken, werden Sie feststellen, dass sich die LED nicht genau so verhält, wie wir es beabsichtigt haben. Wir möchten, dass die LED bei jedem Drücken der Taste zwischen Ein und Aus wechselt. Aber für Sie wird es wahrscheinlich jedes Mal ein paar Mal blinken, wenn Sie den Knopf drücken. Dies geschieht, weil Tasten nicht perfekt sind. Ihr Finger drückt möglicherweise die Taste, aber wenn Sie auf die mikroskopische Ebene schauen, prallt die Taste tatsächlich mehrmals von den Kontakten ab, bevor sie vollständig geschlossen wird. Jeder Sprung löst einen Interrupt aus. Unser System ist so präzise und empfindlich, dass wir tatsächlich ein neues Problem eingeführt haben! Um dies zu beheben, verwenden wir eine Routine, die als Entprellen bekannt ist, um die Interrupt-Erkennung weniger empfindlich zu machen.
Schritt 4: Beispiel

Hier ist eine, die ich ausgepeitscht habe. Es ist nicht perfekt, es gibt sicherlich bessere Möglichkeiten, aber es sollte ausreichen, um Ihnen den Einstieg in die Verwendung von Schaltflächen zu erleichtern.
Die Grundidee besteht darin, das letzte Drücken der Taste mit der Funktion millis () zu protokollieren. (Die Funktion millis () gibt an, wie viele Millisekunden seit dem Start der Skizze vergangen sind.) Wenn der vorherige Interrupt-Trigger weniger als 200 Millisekunden vor dem aktuellen ausgelöst wurde, springt die Taste wahrscheinlich, sodass keine Aktion ausgeführt wird. Ansonsten passiert alles normal. Alle Variablen, die Sie innerhalb einer Interrupt-Funktion ändern möchten, sollten als flüchtig deklariert werden, damit Interrupt und Hauptschleife in Bezug auf den Wert niemals nicht übereinstimmen.
Schritt 5: Wie geht es weiter?
Das ist es! Jedes Mal, wenn Sie auf die Schaltfläche klicken, sollte sich der Status der LED ändern. Sie haben jetzt eine Arbeitsunterbrechung. Es liegt an Ihnen, sich Möglichkeiten vorzustellen, wie Sie Interrupts in Ihr Projekt integrieren können. Wie Sie sehen können, sind Interrupts wichtig, wenn Timing und Rechenleistung wichtig sind. In der nächsten Anleitung werden wir beschreiben, wie Sie den ATMega328p in den Energiesparmodus mit extrem geringem Stromverbrauch versetzen und dabei auf Interrupts angewiesen sind, um uns wieder aufzuwecken. Bis dahin abonnieren Sie uns bei Instructables und besuchen Sie unsere Produktseite unter www.doteverything.co. Wir bauen Dot, ein Gerät für das Internet der Dinge, das Sie hoffentlich cool und nützlich finden, und anhand dieser Reihe von Anleitungen zeigen wir Ihnen genau, wie Sie Ihre eigene Version der Hardware erstellen können!