Physical Computing mit Arduino

Online-Kurs (im Aufbau) betreut durch Matthias Husinsky

Grundlagen Arduino und Programmierung

  • Zahlensysteme
    Dezimal, Binär, Hexadezimal: Definition und Umrechnungen

Sensoren und Aktoren

Alternative Entwicklungsboards

NodeMCU

Teensy

 

Übersicht über weitere Lernressourcen

Erste Schritte mit Teensy 3.x

Inhalt

Die Teensy 3.x Boards, entwickelt von Paul Stoffregen, sind eine leistungsfähige und kostengünstige Mikrocontrollerplattform die auf ARM-Cortex Chips basiert. Im Vergleich mit Arduinos haben sie leistungsfähigere Prozessoren, mehr und flexiblere IOs und einen kleineren Formfaktor.

Dieser Artikel beschreibt die wenigen notwendigen Schritte, um mit der Arduino IDE für Teensy Boards zu entwickeln.

Installation

Für die Verwendung der Teensy Boards ist neben der Arduino IDE (getestet wurde Version 1.6.13) noch eine Software namens Teensyduino notwendig. Der Download erfolgt von der Herstellerwebseite

https://www.pjrc.com/teensy/td_download.html

Die Installation geschieht wiefolgt

  1. Schließen der Arduino IDE
  2. Ausführen des Teensyduino Installationsprogramms
  3. Auswahl des Arduino-Ordners, für den Teensyduino installiert werden soll. Dieser wird normalerweise automatisch gewählt.
  4. Es können eine ganze Menge von (teilweise gut optimierten) Bibliotheken für Teensy und Arduino installiert werden. (empfohlen)
  5. Durchführung der Installation

Nach erfolgreicher Installation stehen in der Arduino IDE im Menü Tools-> Boards eine Reihe von Teensy-Boards zur Verfügung:

Uploading Sketches

Wenn nun ein Teensy Board am Computer angesteckt ist und das entsprechende Board und Port im Menu ausgewählt wurde, kann wie gewohnt der Upload auf das Board vorgenommen werden. Einziger Unterschied beim Upload ist, dass für den Upload zusätzliches ein kleines Hilfsprogramm geöffnet wird, mit welchem der tatsächliche Upload geschieht. Normalerweise sind hierfür keine weiteren manuellen Schritte notwendig.

Weiterführende Links

Erste Schritte mit dem NodeMCU

Inhalte

  • Der NodeMCU und seine Programmierung mit der Arduino IDE

Einführung

Der NodeMCU ist eine günstige (ca. 8 Euro) Mikrocontroller-Plattform basierend auf einem ESP8266 Mikroprozessor. Besonderheit dieser Plattform ist ein WiFi-Stack, mit dem ein Mikrocontroller einfach in ein WLan-Netzwerk integriert werden kann um dort als Datenquelle oder -Senke aufgaben zu übernehmen.

In diesem Artikel wird beschrieben, wie der NodeMCU 1.0 (auch bekannt als NodeMCU v2) in Arduino in Betrieb genommen werden kann. Weiters gibt es ein paar Hinweise, wie die Stabilität im Betrieb erhöht werden kann.

Installation

Um den NodeMCU in der Arduino-IDE in Betrieb nehmen zu können, muss die ESP8266 Toolchain (Compiler, …) nachinstalliert werden. Dies ist Dank des Arduino Board Managers relativ einfach.

  1. Öffnen der Arduino Preferences (Menü: File -> Preferences oder alternativ mit dem Tastaturbefehl STRG + Komma (,) )
  2. Beim Punkt „Additional Boards Manager URL“ folgende Zeile eintragen:
  3. Öffnen des „Board Managers“ (Menü Tools -> Board -> Boards Manager…)
  4. In der der Suchmaske „ESP8266“ eingeben. Es erscheint der Punkt „esp8266 by esp8266 Community
  5. Auf den „Install“ Button klicken. Es sollte nun Download und Installation folgen.

Eine erfolgreiche Installation sollte wiefolgt aussehen:

Nun kann der NodeMCU am Rechner angeschlossen werden.

Programmierung des ESP8266 in Arduino

In Arduino steht nun der NodeMCU als verfügbares Board im Tools-Menü zur Verfügung.

Wenn man eines der Boards (bei uns NodeMCU 1.0 (ESP-12e Module))hier auswählt, erscheinen nun unter den Examples eine Reihe von Beispielen, die vorher nicht angezeigt wurden:

Um die Funktionstüchtigkeit des Boards zu testen, kann man einmal den Blink-Sketch auswählen und wie üblich mittels Upload auf das Board spielen.

Nach dem Upload sollte eine der OnBoard-LEDs blinken.

Hinweise zur Betriebsstabilität

Die ESP8266 Plattform, auf welcher der NodeMCU basiert, ist zwar sehr günstig, aber auch manchmal eine Herausforderung um einen stabilen Betrieb zu erreichen.

Vor allem eine stabile Spannungsversorgung ist unbedingt notwendig, da der ESP-Chip sehr empfindlich auf Schwankungen reagiert. Der Chip startet sich dabie unvorhergesehen neu, was sehr lästig sein kann.

Verwendung eines guten USB-Kabels

Manche Kabel haben die Eigenschaft, dass sie aufgrund von schlechter Verarbeitung einen relevanten Spannungsabfall verursachen. Teilweise treten diese erratischen Verhaltensweisen erst in Kombination mit anderen Komponenten auf (z.B. erst, wenn das Board auf einem Steckbrett verwendet wird).

Mit der Verwendung eines qualitativ guten Kabels konnte zumindest in einem getesten Fall ein stabiler Betrieb erreicht werden.

Verwendung von Stützkondensatoren an der Spannungsversorgung

Die zusätzliche Anbring eines Kondensators kann sich positiv im Betrieb des Boards äußern, vor allem wenn Funk-Verbindungen (WiFi) eingesetzt wird. Beim senden von WiFi-Befehlen wird kurzfristig viel Energie (ca. 250mA) benötigt, die manche Spannungsversorgungen nicht ausreichend schnell zur Verfügung stellen können. Ein Stützkondensator kann hier helfen.

Weiterführende Links

ESP8266 Allgemein

Stabiler Betrieb

 

Piezo

Inhalt

  • Piezo-Buzzer als einfaches Ton-Ausgabe-Gerät
  • tone -Funktion

Einführung

Die Ausgabe von akustischen Informationen – etwa Signaltöne – ist in vielen Anwendungen selbstverständlich. Das Gehör hat nämlich die wichtige Eigenschaft, dass es ungerichtet ist. Das bedeutet, es nimmt auch Schall wahr, wenn wir nicht direkt auf das schallerzeugende Element konzentriert sind. Deshalb kann es uns leicht auf diverse Dinge, wie etwa Fehlfunktionen, aufmerksam machen, auch wenn wir nicht auf das Gerät konzentriert sind.

Eine sehr günstige (und daher oft eingesetzte Methode) um Töne zu erzeugen ist die Verwendung eines Piezo-Elemements.

Der Piezoelektrische Effekt

Der piezoelektrische Effekt besagt, dass an gewissen Materialien eine elektrische Spannung auftritt, wenn man diese mechanisch verformt. Umgekehrt  bewirkt das Anlegen einer elektrischen Spannung an diesen Elementen eine mechanische Verformung (inverser piezoelektrischer Effekt). Dieser Effekt kann sowohl als Sensor (Druck) als auch Aktor (Schallerzeugung, Vibration) eingesetzt werden.

Hier wird ein Piezo-Element als Schallerzeuger (Summer) verwendet.

Beispiel: toneMelody

Im folgenden Beispiel wird ein Piezo als Klangerzeuger für Melodien verwendet.

Der Code für dieses Beispiel ist unter File / Examples / 02.Digital / toneMelody zu finden. Eine detaillierte Beschreibung des Beispiels findet man auf der Arduino-Webseite.

Die tone -Funktion

Die tone -Funktion erzeugt ein rechteckiges Signal (HIGH-LOW-HIGH-LOW…) mit einer bestimmten Frequenz für eine bestimmte Dauer. Intern wird hierfür ein Timer verwendet. Timer sind Routinen, die der Mikrocontroller zur Verfügung stellt, um Abläufe mit zeitlicher Relevanz steuern zu können. (Intern werden diese Timer auch verwendet um die Pulsweitenmodulation zu kontrollieren). Da die Anzahl der verfügbaren Timer am Arduino begrenzt ist, kann immer nur ein Ton an einem Pin ausgegeben werden. Soll die tone-Funktion an einem anderen Pin verwendet werden, ist zunächst für den ersten Pin die Funktion noTone  aufzurufen.

Weiters ist zu beachten, dass mit der Verwendung der Funktion tone  am Arduino UNO die Pulsweitenmodulation für Pins 3 und 11 gestört wird. Ursache hierfür ist, dass tone  intern denselben Timer verwendet, der an diesen Pins das PWM-Signal erzeugt.

Weiterführende Links

Drehencoder

Inhalt

  • Dreh-Encoder als Endlos-Regler

Einführung

Dreh-Encoder sind Input-Module, die endlos in die eine oder andere Richtung gedreht werden können (im Unterschied zu Potentiometern, die in ihrer Drehung begrenzt sind). Sie werden überall dort eingesetzt, wo die absolute Dreh-Ausrichtung nicht ausschlaggebend ist, sondern nur die Anzahl der zurückgelegten Drehschritte (sie werden daher auch als Inkrementalgeber bezeichnet).

Funktionsweise von Drehncodern

Im Gegensatz zu Potentiometern geben Encoder keine analoge Spannung, sondern eine definierte Folge von binären Pulsen an zwei Anschlüssen aus. Im Wesentlichen sind die beiden Anschlüsse nichts anderes als zwei Kontakte, die sich schließen und öffnen können – ähnlich den Tastern. Die Drehposition entscheidet, welche Kontakte verbunden sind. Anhand der Wechsel zwischen den Zuständen kann man erkennen, ob der Encoder eine Vorwärts- oder Rückwärtsbewegung ausführt:

Modifiziert von: Von MatthiasDD - Eigenes Werk, CC0, https://commons.wikimedia.org/w/index.php?curid=19086154
Modifiziert von: Von MatthiasDD – Eigenes Werk, CC0, https://commons.wikimedia.org/w/index.php?curid=19086154

Beispiel Rückwärtsbewegung gegen den Uhrzeigersinn (eng. counter clockwise -CCW):
Bei der Rückwärtsbewegung werden die Zeitpunkte von links nach rechts gelesen. Bei Zeitpunkt 1 erfolgt für A ein Wechsel von LOW auf HIGH. Ausgang B liegt auf LOW, daher kann angenommen werden, dass hier eine Rückwärtsbewegung passiert ist.

Beispiel Vorwärtsbewegung im Uhrzeigersinn (engl. clockwise – CW):
Bei der Vorwärtsbewegung müssen die Zeitpunkte von rechts nach links gelesen werden. Beim Zeitpunkt 3 erfolgt von rechts kommend für A ein Wechsel von LOW auf HIGH. Ausgang B liegt an dieser Stelle aber auf HIGH. Daher kann hier auf eine Vorwärtsbewegung geschlossen werden.

Anschlüsse eines Drehencoders

Ein klassischer Drehencoder besitzt 3 Anschlüsse: A,B und Common. Die Anschlüsse A und B sind wie Taster zu benutzen und können daher mit einem (Arduino-internen) PullUp-Widerstand versehen werden. Common wird mit der Masse (GND) verbunden.

Drehencoder_Steckplatine

Beispiel 1: Drehencoder simpel

Folgendes Beispiel dient dazu, das Prinzip des Drehencoders zu illustrieren. In der Praxis ist es fast immer besser, eine Bibliothek zu verwenden (siehe Beispiel 3), da auch Encoder vom Bouncing-Problem betroffen sind.

Folgendes Beispiel nimmt darauf keine Rücksicht:

Code-Analyse

Um festzustellen, in welche Richtung der Encoder gedreht wurde genügt es, eine Flanke eines Pins zu analysieren. In diesem Beispiel wird überprüft ob an Pin A eine steigende Flanke auftritt. In diesem Fall wird der Zustand von Pin B ausgelesen um zu erkennen, in welche Richtung gedreht wurde und dann dementsprechend eine Zählvariable erhöht oder erniedrigt.

Beispiel 2 (extern): Verwendung von Interrupts

Die Drehbewegung von Encodern kann durchaus sehr schnell ausgeführt werden. Bei der Ausführung des normalen Programmcodes kann es daher passieren, dass manche Zustandswechsel nicht erkannt werden, weil sie wieder vorbei sind, wenn Pins ausgelesen werden. Oft werden daher Interrupts verwendet, um auch wirklich jeden wichtigen Zustandswechsel zu erkennen.

Auf der Arduino Playground Seite für Encoder gibt es eine Menge von Beispielen, wie ein Encoder mit Interrupts angewandt werden können.

Beispiel 3: Anwendung einer Library

Die wahrscheinlich einfachste Möglichkeit einen Drehencoder einzusetzen ist die Verwendung einer hierfür spezialisierten Bibliothek, wie die Encoder Bibliothek von Paul Stoffregen (die auch via Library Manager installierbar ist).

Sie kümmert sich um das Bouncing Problem und kann mit oder ohne Interrupts verwendet werden. Hier das Beispiel der Anwendung

 

Zusammenfassung

Drehencoder sind praktische Input-Elemente für inkrementielle Werte. Intern verwenden sie zwei Kontakte, die wechselseitig geöffnet und geschlossen werden können. Am einfachsten werden sie mit einer Bibliothek eingesetzt, da diese das Contact-Bounce Problem behandeln und auch mit Interrupts arbeiten.

Weiterführende Links

 

Arduino Bibliotheken

Inhalt

  • Installieren einer Bibliothek (engl. library)

Code-Bibliotheken in Arduino

Für eine Vielzahl von Anwendungen existieren Code-Bibliotheken, die man leicht in seinen Programmcode einbinden kann, um es unkompliziert um seine Funktionalität zu erweitern. Die Arduino-IDE hat bereits eine ganze Reihe von Bibliotheken für unterschiedliche Zwecke mit integriert.

Sehr viele Sensoren, Aktoren oder andere Bauteile werden gleich mit einer Bibliothek zur Verfügung gestellt, damit man sich bei der Implementierung seiner Anwendung auf das wesentliche konzentrieren kann.

Einbinden von Bibliotheken

Bei der Einbindung von Bibliotheken muss zwischen zwei Typen von Bibliotheken unterschieden werden: Interne Bibliotheken (die gleich von der Arduino-IDE zur Verfügung gestellt werden oder in speziellen Ordnern liegen, die Arduino kennt) und externe Bibliotheken, die irgendwo im Dateisystem liegen können. Die Arduino-IDE verfügt außerdem über einen Library-Manager, mit dem Bibliotheksinstallationen automatisiert durchgeführt werden können.

Bibliotheken werden ganz am Anfang des Programmcodes mit einem #include  Ausdruck eingebunden. Nach dem #include  folgt der Name der Header-Datei der Bibliothek. (In der Headerdatei befindet sich eine für den Compiler wichtige „Beschreibung der Funktionalität“ der Bibliothek, ohne die das Programm nachher nicht kompiliert werden kann)

Die Einbindung von internen und externen Bibliotheken unterscheidet sich dahingehend, dass die Header-Dateien von internen in <>  Klammern stehen, die von externen in ""  Anführungszeichen.

Interne Bibliotheken müssen entweder im selben Ordner wie die Arduino-Sketch-Datei abgelegt werden, oder in einem für Bibliotheken vorgesehenen Ordner am Computer (mehr Infos dazu hier).

Installation einer Arduino Library

Ausführliche Informationen zur Installation von Arduino-Libraries finden sich auf der Arduino Webseite.

Debouncing

Inhalt

  • Das Contatc-Bounce-Problem bei Buttons
  • Debouncing mittels Bibliothek

Einführung

Bauelemente, die Schaltkreise physisch schließen und öffnen (Taster, Schalter, Relais, Encoder, …) sind oft vom Problem des Bouncings betroffen. Dabei wird der elektrische Kontakt oft nicht sofort vollständig geöffnet oder geschlossen, sodass Sensoren manchmal mehrere Schaltvorgänge in einem sehr kurzem Zeitraum detektieren.

Contact Bounce (Quelle: Wikipedia)

Dieses Verhalten ist unerwünscht, weshalb hard- oder softwareseitig Maßnahmen getroffen werden um ein mehrfaches auslösen zu verhindern.

Die Bounce2-Bibliothek

Die Bounce2 Bibliothek bietet zwei Strategien um mit dem Bouncing-Phänomen umzugehen. Beide warten einen bestimmten Zeitraum um den Effekt des Bouncings zu ignorieren.

Das Wiki der Bibliothek beschreibt die Möglichkeiten:

Stable Interval

Nach der Beendigung des Bouncings muss der Zustand eine definierte Zeitdauer stabil gewesen sein, um abgeschlossen zu sein:

Bildquelle: Bounce2 Wiki
Lock-Out Interval

Durch Editieren der Header-Datei der Bibliothek kann ein weiterer Modus aktiviert werden. Durch ein Einfügen von #define BOUNCE_LOCK_OUT am Anfang der Bounce.h-Datei wird die Lock-out-Methode aktiviert. Diese reagiert sehr schnell. Nachteilig ist, dass der auftretende Noise bei zu kurzer Definition des zeitlichen Intervals nicht ausgelöscht wird.

Bildquelle: Bounce2 Wiki

Beispiel: Anwendung von Bounce2

Folgender Code basiert auf dem Beispiel Taster als Schalter, ist aber um die Bounce-Bibliothek erweitert. (Er setzt voraus, dass sie die Bibliothek auch installiert haben).

Code-Analyse

Zunächst wird mit #include <Bounce2.h>  die installierte Bounce2-Bibliothek eingebunden (stellen Sie sicher, dass sie auch installiert ist) und anschließend die Pin-Nummern in Variablen gespeichert (die Installation von Bibliotheken wird auf der Arduino Website oder auch hier behandelt).

Durch die Zeile Bounce debouncer = Bounce();wird ein Bounce-Objekt namens  debouncer  erstellt. Dieses Objekt wird wie eine Variable verwendet und bekommt später verschiedene Eigenschaften (z.B. welchem Pin es zugewiesen ist).

In setup()  wird zunächst der Input wie üblich erstellt ( pinMode(BUTTON_PIN,INPUT_PULLUP);). Im Anschluss wird dem Bounce-Objekt dieser Pin mittels debouncer.attach(BUTTON_PIN); zugewiesen. Über den Aufruf der Methode debouncer.interval(5);  wird dem Bounce-Objekt eine Wartezeit von 5 ms zugewiesen (in der weiteren Verwendung muss der Taster also 5 ms stabil sein, damit ein Zustandswechsel erkannt wird).

In loop()  wird der Taster mit dem Bounce-Objekt verwendet. Zunächst muss der Zustand des Buttons bei jeder Ausführung des loops mittels debouncer.update(); ausgelesen werden. Über debouncer.read();  wird nun der digitale Input ausgelesen und der Wert in einer Variable gespeichert (es ist keine Angabe des Pins notwendig, da debouncer bereits vorher einen Pin zugewiesen bekommen hat). Die Variable enthält nun den entsprechenden, gefilterten Wert des Tasters.

Weiterführende Links

  • https://en.wikipedia.org/wiki/Switch#Contact_bounce
  • http://playground.arduino.cc/Code/Bounce

Interrupts

Inhalte

  • Interrupts als Trigger um Funktionen sofort aufzurufen

Einführung

Viele Anwendungen sind so konzipiert, dass sie die meiste Zeit eine bestimmte Funktion erfüllen und nur beim Eintritt eines definierten Ereignisses eine bestimmte andere Funktion ausführen müssen (Ein Beispiel hierfür wäre ein Kaffeeautomat, der die meiste Zeit im Leerlauf ist, aber bei einem Münzeinwurf in einen anderen Modus wechselt).

Für manche Anwendungen ist es wichtig, dass sie – egal was sie gerade ausführen – unterbrochen werden können (etwa um einen Not-Stopp einer Anlage ausführen zu können).

Da diese Art von Unterbrechungen oder Wechsel sehr gerne zum Einsatz kommen, haben viele Mikrocontroller eine spezielle Routine hierfür vorgesehen: Interrupts.

Interrupts an Pins

Interrupts sind Funktionen, beim Eintreffen eines bestimmten Ereignisses sofort ausgeführt werden (egal, wo man sich in der Ausführung eines Programms gerade befindet). Das Arduino hat die Eigenschaft, dass die Auslösung eines Interrupts an bestimmte digitale Pins gekoppelt werden können (am Arduino UNO sind dies Pins 2 und 3). Diese Pins werden überwacht und können den Prozessor unterbrechen um eine definierte Methode, die Interrupt Service Routine (ISR), auszuführen. Diese ISRs müssen sehr kurz und schnell ausführbar gehalten werden um den Prozessor nicht zu lange zu blockieren. Dafür sind sie aber auch für Anwendungen mit sehr schnellen Zustandswechsel wie Drehencoder geeignet.

Beispiel 1: Interrupts an digitalen Pins anwenden

Folgender Code demonstriert die Einbindung einer ISR und die Verbindung der Routine mit dem digitalen Pin. Beim Anhängen an der Routine an den Pin wird außerdem definiert, welches Ereignis die ISR auslösen soll. Dieses Ereignis bezieht sich auf die Flanke des Pins. Zur Wahl stehen

  • RISING (steigende Flanke)
  • FALLIN (fallende Flanke)
  • CHANGE (also bei steigender oder fallender Flanke) und
  • LOW (ISR wird immer ausgeführt, solange der Pin LOW ist).

Das Programm an sich macht nichts anderes, als einen Pin zu überwachen und bei einem Wechsel des Zustands, die ISR aufzurufen. Diese wiederrum invertiert nur den Zustand einer Variable, die auf den ledPin 13 geschrieben wird.

Code-Analyse

Die Variable int state  wird als volatile  definiert. Dies sollte für alle Variablen gemacht werden, die in einer ISR verändert werden (sie werden hierfür in einem speziellen Speicherbereich abgelegt und können somit auf jeden Fall korrekt upgedatet werden).

Die Methode attachInterrupt(digitalPinToInterrupt(interruptPin), myISR, CHANGE) definiert den Interrupt-Pin, die ISR für diesen Pin und auf welchen Zustand geachtet werden soll:

  • Interrupt-Pin: Hierbei wird empfohlen, dass die Pin-Nummer nicht direkt angegeben wird, sondern stattdessen die Pin-ID über die Methode digitalPinToInterrupt(interruptPin)  herausgefunden wird. Grund hierfür ist, dass bei verschiedenen Arduino Plattformen (neben dem UNO existieren noch weitere) die Prozessoren möglicherweise andere  Bezeichnungen für diese Pins haben. Mit dem Aufruf dieser Methode ist garantiert, dass der Code auch auf anderen Boards wie erwartet läuft.
  • ISR: Der Name der Methode (hier myISR ) wird als Parameter angegeben.
  • Zustand: Durch die Angabe von CHANGE  wird die vorhin angegebene Methode immer dann aufgerufen, wenn der Zustand wechselt (egal ob von LOW zu HIGH oder umgekehrt).

In der loop  Methode geschieht nichts, außer dass der Zustand der Variable state  auf einen Pin geschrieben wird.

Die Methode myISR  ist eine sehr kurz gehalten und erfüllt hier nur die Funktion, dass der Zustand der Variable state  gewechselt wird. Da myISR  durch den Interrupt immer dann aufgerufen wird, wenn sich der Zustand des Interrupt-Pin ändert, ist es nicht notwendig die Funktion irgendwo anders im Code aufzurufen.

PinChangeInterrupts (PCI)

Am Arduino können für die alle Pins (nicht nur 2 und 3 wie beim UNO) mit einem PinChangeInterrupt belegt werden. Diese lösen sowohl bei RISING als auch FALLING aus, allerdings werden die ISRs immer in Gruppen von Pins definiert (d.h. mehrere Pins haben dieselbe Interrupt-Routine). Für manche Anwendungen wie z.B. Drehencoder ist dies egal, für andere muss eventuell weitere Funktionalität eingefügt werden um zwischen den Pins unterscheiden zu können.

Einen guten Überblick über PCIs gibt dieser Artikel.

Zusammenfassung

Interrupts am Arduino bieten die Möglichkeit eine ISR sofort und sehr schnell auszuführen. Mittels der Funktion attachInterrupt  wird die ISR Funktion, der Pin und der Zustandswechsel definiert. Nick Gammon empfiehlt für den Code in der ISR folgendes:

 

  • Code kurz halten
  • delay -Funktion nicht verwenden
  • Keine Serial prints
  • Variablen, die im Hauptcode und der ISR verwendet werden müssen volatile  sein
  • Interrupts sollen nicht ein- und ausgeschalten werden

 

Weiterführende Links

  • https://www.arduino.cc/en/Reference/Volatile
  • https://www.arduino.cc/en/Reference/AttachInterrupt
  • http://gammon.com.au/interrupts
  • http://playground.arduino.cc/Main/PinChangeInterrupt

 

Relais zur Schaltung großer Ströme

Inhalt

  • Relais (engl. Relay)

    Einführung

Mikrocontroller können mit ihren zahlreichen digitalen Ausgängen potentiell sehr viele Dinge steuern. Die Ströme, die über diese Ausgänge fließen können, sind aber sehr gering. Sie eignen sich daher nicht um größere Leistungen zu erbringen und Lasten wie elektrodynamische Elemente (Relais, Hubmagnete, Motoren, …) zu schalten.

Benötigt werden also Schaltungen, die mit kleiner Leistung große Lasten steuern können. In diesem Abschnitt wird das Relais vorgestellt, der ein dynamischer Schalter für getrennte Stromkreise ist. In einem weiteren Abschnitt werden Transistoren als Schalter eingeführt.

Relais als Schalter

Ein Relais ist ein elektromagnetischer Schalter, der mit dem Anlegen einer Spannung gesteuert werden kann. Es besteht üblicherweise aus einer Spule und einem beweglichen Leiter in örtlicher Nähe dieser Spule. Der Leiter agiert als Schalter und ist Teil eines separaten Stromkreises, der gesteuert werden soll. Wird die Spule mit Strom durchflossen, so erzeugt sie ein elektromagnetisches Feld. Dieses Feld zieht den Leiter des Schalters an und bewegt ihn in eine öffnende (bzw. schließende) Stellung. Der zweite Stromkreis wird also mit der Spannung aus dem ersten Stromkreis gesteuert.

Relais werden oft verwendet um mit kleinen Spannungen auch sehr große Spannungen zu schalten. Je nach Bauform sind sie unterschiedlich beschaffen. Die Ausgänge sind meistens wiefolgt benannt.

  • NO (normally open): Liegt keine Spannung an sind die Schalter offen
  • NC (normally closed): Liegt keine Spannung an sind die Schalter geschlossen
  • CO (change over): Dieser Ausgang wechselt zwischen den beiden anderen.
Das Relais dient hier als Schalter, um mit einer kleinen Spannung (Steuerstromkreis) eine größere Spannung (Laststromkreis) zu schalten.
Das Relais dient hier als Schalter, um mit einer kleinen Spannung (Steuerstromkreis) eine größere Spannung (Laststromkreis) zu schalten.

Selbstinduktion in der Spule

Kernelement des Relais ist eine Spule, die das elektromagnetische(EM) Feld zur Betätigung des Schalters erzeugt. Eine Spule hat die Eigenschaft der Selbstinduktion: Bewegte Ladungen erzeugen um den Leiter herum ein EM-Feld, das widerrum andere Ladungen in Bewegung versetzen kann. In einer Spule liegen aufgrund der Wicklung des Leiters die Windungen eng nebeneinander. Daher können bewegte Ladungen auf andere Ladungen im selben Leiter eine elektromagnetische Wirkung ausüben.

Wird also eine Spule mit Strom durchflossen, dann treibt die Selbstinduktion die Ladungen in anderen Windungen auch weiter. Wenn nun der Stromfluss unterbrochen wird (z.B. weil keine Spannung mehr anliegt), dann bleibt die Selbstinduktion zunächst noch bestehen. Sie treibt die Ladungen im Leiter weiter und erzeugt daher am Ende einen Ladungsüberschuss, während am anderen Ende ein Ladungsmangel entsteht.

Die Selbstinduktion schwächt sich mit der Zeit ab und er Stromfluss kommt schließlich zum erliegen. Bis es aber soweit ist kann der Ladungsüberschuss teilweise sehr groß werden, sodass sich am Ausgang der Spule eine hohe Spannung aufbauen kann, die sogar Bauteile beschädigen oder zerstören können.

Intuitiv kann man sich diesen Vorgang wie ein Wasserrad mit Trägheit (Spule) vorstellen. Beim Anlegen einer Wasserleitung mit Druck (Spannung) benötigt das Rad aufgrund seiner Trägheit eine Weile, bis es sich vom Wasserdruck (Ladungen) in Bewegung setzt und das Wasser weitertransportiert.  Dreht man am Eingang das Wasser ab, so dreht sich das Rad zunächst aufgrund seiner Trägheit weiter. Da es weiterhin versucht Wasser zu transportieren, entsteht am Ausgang des Wasserrads ein Überdruck, während am Eingang ein Unterdruck aufgrund von Wassermangel entsteht.

Freilaufdiode zum Schutz

Um den Aufbau einer Hochspannung zu verhindern wird parallel zur Spule eine Diode in Sperrichtung geschalten. Dioden haben als Halbleiterelemente die Eigenschaft Strom nur in eine Richtung passieren zu lassen. In Sperrichtung (antiparallel) geschalten verhindert sie den Strom über sich selbst, sodass der ganze Strom über die Spule fließen muss.

Wenn sich beim Ausschaltvorgang die Spannung am Ausgang der Spule erhöht, so herrscht dort auf einmal eine größere Spannung als am Eingang (die Spannung hat sich umgekehrt).  Für die Diode gilt dies ebenso, da sie parallel zur Spule ist. Da sich die Spannung aber nun umgekehrt hat ist sie nun für die überschüssigen Ladungen in Durchlassrichtung. Sie können zum Eingang der Spule zurückfließen, weshalb sich am Ausgang keine hohe Spannung entwickeln kann, die zerstörend wirken könnte. Die Diode wirkt also wie eine Art Rücklaufventil.

[FILM Freilaufdiode]

Nachteile von Relais

Zusammenfassung

Relais werden als Schalter für separate Stromkreise verwendet. Gerne werden sie eingesetzt um mit kleinen Spannungen größere Spannungen zu schalten. Aufgrund der Induktivität der im Relais vorhandenen Spule sollte man eine Freilaufdiode antiparallel zum Relais verwenden, da sonst schädliche Hochspannungen entstehen könnten.