Arduino und das Internet of Things

Experimini am 24.1.2017

narzisse_320

Internet of Things

Das “Internet der Dinge” (engl. “Internet of Things” oder “IoT”) beschreibt das Phänomen, dass immer mehr (Alltags-) Gegenstände mit dem Internet verbunden werden. Der “vernetzte Kühlschrank” ist ein klassisches Beispiel für ein solches Gerät. Allerdings gibt es weit mehr und oft unscheinbarere Dinge, die “smart” werden und miteinander komunizieren.

Ein wesentlicher Faktor für die rasante Entwicklung ist die Verfügbarkeit günstiger Mikrocontroller, Sensoren, Aktoren und Software. Damit kann jede/r eigene smarte Dinge entwickeln. Das sehen wir uns in diesem Experimini genauer an.


Arduino

Arduino ist eine aus Hardware und Software bestehende Microcontroller Plattform. Die Hardware ist in verschiedenen Bauformen oder Modellen erhältlich, “den Arduino” gibt es also eigentlich nicht. Alle Modelle verfügen über zahlreiche digitale und analoge Ein- und Ausgänge. Damit kann man Werte von Sensoren einlesen, auswerten und Geräte steuern. Hard- und Software sind Open Source, die Software ist kostenlos, die Hardware sehr kostengünstig. Rund um Arduino hat sich eine riesige Community entwickelt.

Eine Übersicht über die verschiedenen Arduino Modelle findet sich auf der Arduino Website.


Arduino Modelle

arduino_modelle_320

Wir verwenden in diesem Experimini den Arduino Nano.


Sensoren und Aktoren

Sensoren sind Geräte, die Umweltdaten in irgendeiner Form erfassen, z.B. Temperatur, Bewegung, Licht, Gewicht, Feuchtigkeit, pH-Wert, Geschwindigkeit, Position oder beliebige andere Werte.

Aktoren sind Geräte, mit denen sich die Umwelt beeinflussen lässt, beispielsweise Motoren, Pumpen, Lampen, LEDs, Heizungen, Kühler, Servos, Relais usw.

Es gibt eine unüberschaubare Vielzahl von Sensoren und Aktoren, die mit dem Arduino benutzt werden können.


Quellen für Material

Arduinos und Sensoren gibt es bei einer Reihe von Herstellern, bei den teureren oft mit ausführlichen Anleitungen, Datenblättern und Tutorials. Die günstigsten Preise gibt es bei den chinesischen Herstellern.


Breadboard und Kabel

Die Sensoren und Aktoren müssen mit dem Arduino verbunden werden. Oft sind auch weitere Elemente wie Widerstände, Transistoren, Kondensatoren usw. erforderlich. Zum Experimentieren sind so genannte Breadboards hilfreich, das sind Steckbretter, in die Kabel und Bauelemente gesteckt werden können. Die Löcher sind in reihenweise elektrisch miteinander verbunden.

breadboard_350

kabel_350


Quellen für Wissen

Arduino

Die offizielle Arduino Website enthält alles, was man für den Anfang braucht, alle Infos zum Arduino, Getting Started Guides, Tutorials und die Arduino Entwicklungssoftware zum Download.

  • Arduino Die offizielle Arduino Website
  • Instructables ist eine Plattform für alle möglichen Anleitungen, nicht nur technische, es finden sich aber auch viele Arduino Projekte dort.

MySensors

MySensors ist ein Konzept und eine Bibliothek für Funknetzwerke. Es wird ergänzt von MyController, mit dem man die Sensorwerte ansehen und auswerten sowie Geräte steuern kann.


Programmierung

Damit der Arduino misst und steuert, was wir wollen, müssen wir ihn programmieren.

Dafür brauchen wir eine Software, die “Entwicklungsumgebung” oder “IDE” (Integrated Development Environment” und wir müssen den Arduino mit dem Computer verbinden. Der Arduino Nano und einige weitere Modelle besitzen dafür einen USB Anschluss. Beides muss zunächst installiert werden.


Installation der Arduino IDE unter Windows

Zum Schreiben, Compilieren und Hochladen der Sketches muss die Entwicklungsumgebung (“IDE”) installiert werden. Die Software kann auf der Arduino Website heruntergeladen werden. Es gibt einen Installer (EXE) und eine ZIP Version.

Die Installation geschieht wie bei Windows üblich durch Anklicken des heruntergeladenen Installers.


Installation des USB Treibers CH340

Die Arduino Nachbauten aus China sind mit einem anderen USB Chip ausgestattet. Für diesen muss ein spezieller Treiber heruntergeladen und installiert werden.

Der Treiber wird vom Hersteller des Chips, Winchiphead / Nanjing QinHeng Electronics Co., Ltd, auf seiner Webseite angeboten. Die Seite ist auf chinesisch. Eine Erklärung des Vorgangs auf englisch und den Treiber zum Download bietet die Arduino Development Website.


Konfiguration der IDE

Die Entwicklungssoftware ist für verschiedene Microcontroller ausgelegt. Für die Programmierung muss der Controller und der USB Port eingestellt werden. Der Controller wird unter “Board” eingestellt. Den USB Port ermittelt man am einfachsten, indem man einmal vor dem Anschließen des Arduinos an den Rechner und einmal danach die Liste der Ports aufruft und feststellt, welcher Port durch das Anschließen hinzugekommen ist.

screenshot_ide_config_800x365


Aufbau eines Programms (“Sketch”)

Ein Arduino Programm heißt “Sketch”. Es ist grundsätzlich in zwei Teile aufgeteilt. Im setup() werden Einstellungen vorgenommen, die nur einmal beim Starten (oder “booten”) des Arduinos ausgeführt werden. Die Befehle im zweiten Teil, der loop(), werden immer wieder ausgeführt, solange der Arduino läuft.

Die IDE enthält unter dem Menüpunkt Datei -> Beispiele zahlreiche Beispiele für Programme.


Minimales Programm

Ein minimales Arduino Programm sieht so aus:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Die Zeilen, die mit zwei Schrägstrichen beginnen, sind Kommentare. Sie werden bei der Programmausführung ignoriert. Die Einrückungen dienen der Übersichtlichkeit und haben keinen Einfluss auf die Funktion des Programms.

Das Minimalbeispiel macht gar nichts.


Sensordaten erfassen und LED blinken

Wir können einen Sensor einlesen, indem wir einen der I/O Pins als Eingang schalten, hier A0, und dann den Wert einlesen und eine LED blinken lassen. Der Arduino hat parallel zu Pin 13 bereits eine LED an Bord.

int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
    // declare the ledPin as an OUTPUT:
    pinMode(ledPin, OUTPUT);
}

void loop() {
    sensorValue = analogRead(sensorPin); // read the value from the sensor

    digitalWrite(ledPin, HIGH); // turn the ledPin on

    delay(sensorValue); // stop the program for <sensorValue> milliseconds
    
    digitalWrite(ledPin, LOW); // turn the ledPin off
    
    delay(sensorValue); // stop the program for for <sensorValue> milliseconds
}

Compilieren des Sketches

Der Arduino versteht die Programmbefehle nicht direkt, sie müssen erst übersetzt werden. Das nennt man “Compilieren”.

Dafür klickt man auf das Symbol mit dem Häkchen in der Symbolleiste der IDE oder wählt über das Menü Sketch -> Überprüfen/Kompilieren oder drückt Strg-R.

Wenn das Programm Fehler enthält, werden sie im unteren Teil des Fensters angezeigt. Nur ein fehlerfreier Sketch kann compiliert werden.


Hochladen des Sketches

Ist der Sketch compiliert, muss er auf den Arduino hochgeladen werden. Dafür muss der Arduino am Rechner angeschlossen sein. Zum Hochladen klickt man auf das Symbol mit dem Pfeil oder wählt über das Menü Sketch -> Hochladen oder drückt Strg-U.

Nach dem Hochladen startet das Programm auf dem Arduino sofort und wird ausgeführt, solange der Arduino mit Strom versorgt wird.


Bibliotheken

Um Sensoren oder Aktoren anzusteuern, muss oft ein bestimmtes Protokoll verwendet werden oder es gibt typische Aktionen, die damit ausgeführt werden können. In vielen Fällen gibt es für den Arduino so genannte Bibliotheken, die diese Funktionen bereitstellen. Sie müssen vor ihrer Verwendung installiert werden.


Beispiele: Schaltung

Wir bauen folgende Schaltung auf und schreiben drei kleine Sketches, um die LEDs anzusteuern und Sensorwerte einzulesen.

schaltung_01_320


Beispiele: Sketches

Drei LEDs

Der Sketch lässt die drei LEDs nacheinander für je eine Sekunde aufleuchten.

exp_blink_3led.ino

Analogen Wert einlesen

Dieser Sketch liest analoge Werte vom Feuchtigkeitssensor ein und gibt sie über die serielle Schnittstelle aus.

exp_read_analog.ino

Feuchtigkeitsampel

Die Feuchtigketsampel kombiniert beide Programme und zeigt über die rote, gelbe und grüne LED die Feuchtigkeit der Erde im Blumentopf an.

exp_humidity_lights.ino


Sketch: Drei LEDs

int pinGreen  = 2;
int pinYellow = 3;
int pinRed    = 4;

void setup() {
    pinMode(pinGreen,  OUTPUT); // setze Pin als Ausgang
    pinMode(pinYellow, OUTPUT);
    pinMode(pinRed,    OUTPUT);
}

void loop() {
    digitalWrite(pinGreen, HIGH); // grüne LED einschalten
    delay(1000);                  // 1000 ms warten
    digitalWrite(pinGreen, LOW);  // grüne LED ausschalten
    delay(1000);                  // 1000 ms warten

    digitalWrite(pinYellow, HIGH);
    delay(1000);                 
    digitalWrite(pinYellow, LOW); 
    delay(1000);                 

    digitalWrite(pinRed, HIGH);
    delay(1000);                 
    digitalWrite(pinRed, LOW); 
    delay(1000);               
}

Sketch: Analogen Wert einlesen

exp_read_analog.ino

int sensorValue = 0;
int pinSensor = A0;

void setup() {
    Serial.begin(9600); // Geschwindigkeit der seriellen Verbindung
    pinMode(pinSensor, INPUT);
}

void loop() {
    sensorValue = analogRead(pinSensor); // analogen Wert vom Sensor einlesen
    Serial.println(sensorValue); // Wert über serielle Verbindung ausgeben
    delay(100);
}

Sketch: Feuchtigkeitsampel I

int sensorValue = 0;
int pinSensor = A0;

int pinGreen  = 2;
int pinYellow = 3;
int pinRed    = 4;

void setup() {
    Serial.begin(9600); // Geschwindigkeit der seriellen Verbindung
    pinMode(pinSensor, INPUT);

    pinMode(pinGreen,  OUTPUT); // setze Pin als Ausgang
    pinMode(pinYellow, OUTPUT);
    pinMode(pinRed,    OUTPUT);
}

Sketch: Feuchtigkeitsampel II

void loop() {
    sensorValue = analogRead(pinSensor); // analogen Wert vom Sensor einlesen
    Serial.println(sensorValue); // Wert über serielle Verbindung ausgeben
    delay(100);

    if ( sensorValue > 800 ) {
        digitalWrite(pinRed,   HIGH); // rote LED einschalten
        digitalWrite(pinYellow, LOW); // gelbe LED ausschalten
        digitalWrite(pinGreen,  LOW); // grüne LED ausschalten
    }
    else if ( sensorValue > 400 ) {
        digitalWrite(pinRed,     LOW); // rote LED ausschalten
        digitalWrite(pinYellow, HIGH); // gelbe LED einschalten
        digitalWrite(pinGreen,   LOW); // grüne LED ausschalten
    }
    else {
        digitalWrite(pinRed,     LOW); // rote LED ausschalten
        digitalWrite(pinYellow,  LOW); // gelbe LED ausschalten
        digitalWrite(pinGreen,  HIGH); // grüne LED einschalten     
    }
}

Have Fun!

Viel Spaß bei euren eigenen Experimenten im Internet of Things!