islandrabe

Tagwerk in den Feldern der Kunst und Kulturwissenschaft

Kontakt | ImpressumEinstieg

Tutorial: Connecting a LED to an academic audience is easier than you think!


Dieses Tutorial wird Dir zeigen, wie Du mit einem Arduino in Kombination mit einem RaspberryPi eine LED (Leuchtdiode) per Website aus- und einschalten kannst. Schritt für Schritt werden die nötigen Handgriffe samt nötiger Hard- und Software präsentiert, die Dich dieses Projekt eigenhändig umsetzen lassen.


I) blink oder: Vom Auspacken der Blackbox

Als Hardware benötigst Du (Bild 1)

Als erstes installiere die Arduino IDE (das „integrated development environment“, das den Arduino einfach programmierbar macht) nach den Anweisungen unter https://www.arduino.cc/en/Main/Software Deinem Betriebssystem entsprechende.
Nun zur 'Hardware': Wir nehmen den Widerstand und verbinden ihn mit einem Bein der LED. Vorzugsweise mit dem Kürzeren, der die Anode ist und der Kontakt somit auf den Minuspol der Stromquelle geht. Praktischerweise bietet das Arduino einen Pin (Steckplatz) dafür, der mit GND bezeichnet ist. Wir verbinden also das freie Bein des Widerstands mit GND und das freie Bein der LED mit dem Pin 13. Damit ist der Hardwareaufbau abgeschlossen und wir können das Arduino Board per USB-Kabel mit dem PC verbinden.
In der Arduino IDE öffnen wir nun das Beispiel „Blink“ (Bild 2). Der Code steht somit fertig geschrieben am Bildschirm und mittels „Upload“ (dem runden Button oben links in der IDE mit dem Pfeil nach rechts) laden wir das Programm auf das Arduino. Die LED beginnt im Takt einer Sekunde zu blinken (Bild 3).
Nun kann die Zeit im Code adaptiert werden; ersetzen wir „delay(1000);“ mit „delay(500);“, uploaden das Programm erneut und die LED wird schneller blinken. So kann man selbst den Takt angeben. Wir können die LED blinken lassen.

Die benötigte Hardware für Teil I im Überblick, islandrabe 2015Bild 1

Screenshot der Arduino IDE (Programmierumgebung), islandrabe 2015Bild 2

Das Ergebnis von Teil I, islandrabe 2015Bild 3


II) Hello World! oder: Und sie kommuniziert doch!

Das Arduino samt Elektronik legen wir für diesen Abschnitt zur Seite. Für diesen Teil brauchst Du folgendes (Bild 4):

Zuerst richten wir ein Betriebssystem auf dem Einplatinenrechner ein. Dafür folge den Anweisungen unter http://archlinuxarm.org/platforms/armv6/raspberry-pi, um ArchLinux zu installieren. ArchLinux bietet das Minimum, das ein PC zum Laufen braucht. Nun verbinden wir alle Komponenten – Bildschirm, Tastatur und Netzwerk –, stecken die SD-Karte in den Schacht an der Unterseite des RaspberryPi und versorgen ihn mit Strom. Die LEDs auf der Platine beginnen zu leuchten und Textzeilen erscheinen am Bildschirm.
Um Dich anzumelden, gib für den „default user“ „alarm“ und für das „password“ ebenfalls „alarm“ ein. Damit bist Du angemeldet und befindest Dich in der Kommandozeile (Bild 5). Wir können nun die weiteren Softwarebausteine für den Webserver installieren.
Als erstes benötigen wir das Softwarepaket Node.js. Der Installationsvorgang erfolgt per Kommandozeile: Melde Dich zuerst als „root“ (Administrator) an. Dies geschieht mittels Befehl „su root“ und ENTER. Die Frage nach dem Passwort beantworte mit „root“. Nun gib in die Kommandozeile den Befehl „pacman -S base-devel“ ein und bestätigen ihn mit ENTER. Die nötigen Pakete der Software werden nun automatisch installiert. Die weißen Zeilen und Statusbalken geben Dir darüber Auskunft, was geschieht (Bild 6).
Mit einem weiteren Befehl installierst Du Node.js: „pacman -S nodejs npm“ https://nodejs.org/en/download/package-manager/#arch-linux. Auch hier werden die nötigen Pakete wieder automatisch downgeloadet und installiert. Nachdem auch dies erfolgreich abgeschlossen wurde, melde Dich mit „exit“ als „root“ wieder ab.
Als nächstes lege den Ordner und die Dateien des Webservers an und folge dafür den Schritten unter http://expressjs.com/en/starter/installing.html, die erneut einfach in die Kommandozeile eingegeben werden.
Danach erzeuge mit dem Befehl „nano index.js“ die Datei für das Node.js-Script, das den Webserver zum Laufen bringen wird. Es öffnet sich ein 'roher' Texteditor und hier gib Weiß auf Schwarz den Code des Tutorials http://expressjs.com/en/starter/hello-world.html ein und speichere das Ganze mittels „STRG-O“ (Bild 7). Mit „STRG-X“ gelangst Du zurück zur Kommandozeile und kannst nun den Webserver starten: Einfach „nodejs index.js“ ausführen.
Um den Webserver zu testen, verwende den Befehl „ifconfig“, um die IP-Adresse des RaspberryPi auszulesen. In der Ausgabe findet sich im Absatz „eth...“ die „inet addr“, eine Zahl nach dem Muster „192.0.2.42“, wobei die letzte Zahl „42“, den RaspberryPi im Netzwerk adressiert.
Gib nun diese Zahl samt Doppelpunkt und Port-Nummer des Beispiels, in die Adressleiste des Browsers ein. In unserem Fall ist dies 192.0.2.42:3000 – ENTER und es erscheint eine blanke Seite mit dem Text „Hello World!“. Dein Webserver läuft.

Die benötigte Hardware für Teil II im Überblick, islandrabe 2015Bild 4

Screenshot der Kommandozeile, islandrabe 2015Bild 5

Statusanzeige während des Ausführens des Befehls, islandrabe 2015Bild 6

Texteditor 'nano' mit dem Code-Schnipsel, islandrabe 2015Bild 7


III) Hello blink oder: Zwischen Copy Paste und Community

Das bisher Erreichte kann nun zusammengefügt werden (Bild 8) und wird zu einer per Website schaltbaren LED ausgebaut. Als erstes müssen sich Arduino Board und RaspberryPi verstehen. Dafür geht es zurück zur Kommandozeile des RaspberryPi, mit der Du nun vertraut bist. Füge den Nutzer „alarm“ den Gruppen „uucp“, „lock“ und „tty“ hinzu, damit die beiden Devices (Dinge) per USB kommunizieren können. Dies geschieht mittels der drei Befehle „gpasswd -a alarm uucp“, „gpasswd -a alarm lock“ und „gpasswd -a alarm tty“. Nun bereiten wir das Arduino Board auf seine Aufgabe vor, die vom RaspberryPi eingehenden Signale zu verarbeiten. Öffne die Arduino IDE und verbinde das Arduino Board mit dem Rechner. Es erscheint ein neues Fenster für ein neues Projekt und hier fügen wir den Code von Teil I ein, um davon auszugehen. Ändere Ihn wie folgt:

int led = 13; //Nummer des Arduino-Pins, in dem die Anode/Pluspol der LED steckt
void setup() { 
  pinMode(led, OUTPUT); //Den Arduino-Pin als Ausgang (+5V) setzen
  Serial.begin(9600); //Parameter für die PC-Arduino-Kommunikation setzen
}
void loop() {
  if (Serial.available() > 0) { //Arduino prüft, ob der RaspberryPi etwas sendet
    int inByte = Serial.read();
    //Etwas ist angekommen, aber was:
    switch (inByte) {
    case 'e': //e = ein
      digitalWrite(led, HIGH);
      break;
    case 'a': //a = aus
      digitalWrite(led, LOW);
      break;
    default:
      //Etwas kam an, aber keine Ahnung was
      break;
    }
  }
}

Um zu überprüfen, ob das Programm auf dem Arduino Board läuft, öffne den „Serial Monitor“ über den Button in der IDE rechts oben. Im erscheinenden Fenster kontrolliere zur Vorsicht, ob unten rechts „9600 Baud“ als Geschwindigkeit für die Kommunikation eingestellt ist. Passt dies, tippe ein „e“ in die Zeile oben. Die LED leuchtet nun. Tippe ein „a“, um sie wieder auszuschalten. Klappt dies, so widmen wir uns dem RaspberryPi. Um die Verbindung zwischen Website-Input und Arduino Board herzustellen, installieren wir zwei weitere Softwarepakete auf dem RaspberryPi: „socket.io“ übersetzt den Input auf einer Website in eine Funktion. Installiert wird es, analog zu „expressjs“ in Teil II, mit dem Befehl „npm install socket.io“. Auf gleiche Weise installiere das Paket „serialport“, „npm install serialport“, das die serielle Kommunikation zwischen RaspberryPi und Arduino Board übernimmt. Den Dokumentationen von https://github.com/socketio/socket.io und https://github.com/voodootikigod/node-serialport folgend, können wir den Code in index.js (mit „nano index.js“ öffnen) folgendermaßen bearbeiten:

//Setup der verwendeten Pakete; einzustellen, wie über die jeweiligen DOCs angegeben
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var arduinoPort = "/dev/ttyACM0"; //Variable, um Arduino-Port manuell einzustellen
var SerialPort = require("serialport").SerialPort;
// Webserver starten
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/schalter.html'); // neuer Befehl, um mit Datei auf Browseranfrage zu antworten
})
var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});
//Socket-Verbindung erzeugen und definieren, was bei welcher Nachricht geschehen soll
io.on('connection', function(socket){
  console.log('Eine Schalterin/Ein Schalter öffnete die Seite.'); //an die "console" werden Nachrichten ausgegeben, um die Vorgänge zu betrachten
  socket.on('disconnect', function(){
    console.log('Eine Schalterin/Ein Schalter verließ die Seite.');
  });
  socket.on('ein', function() {
    sendArduinoCommand("e");
  });
  socket.on('aus', function() {
    sendArduinoCommand("a");
  });
});
//Serielle Kommunikation zu Arduino aufbauen/erzeugen
var serialPort = new SerialPort(arduinoPort, {
  baudrate: 9600
});
serialPort.on("open", function () {
  console.log('Verbindung zum Arduino ist hergestellt');
});
//Funktion, die Befehle zum Aus/Ein Schalten an den Arduino sendet
function sendArduinoCommand(zeichen) {
  serialPort.write(zeichen + "\n", function(err, results) {
    console.log('Gedrückt wurde ' + zeichen);
    if(err) {
      console.log('ERROR ' + err); //Für den Fall eines Fehlers beim Senden ...
    }
  });
}

Nun fehlt noch die im Code erwähnte Datei „schalter.html“. Diese legen wir mit „nano schalter.html“ an und verwenden für das Websitegerüst die Vorlage von http://www.w3schools.com/html/html_basic.asp. Diese verändern wir aber so, dass die Website zwei Buttons anzeigen wird, die zum Bedienen der LED dienen:

<!DOCTYPE html>
<html>
    <head>
        <title>Lichtschalter</title>
    </head>
    <script src="/socket.io/socket.io.js"></script>
    <script>1
        var socket = io();
        function ein() {
            socket.emit('ein');
        }
        function aus() {
            socket.emit('aus');
        }
    </script>
    <body style="width: 100%;">
        <h1 style="text-align: center;">
            <button style="font-size:300%;" onclick='ein()'>EIN</button>
             // 
            <button style="font-size:300%;" onclick='aus()'>AUS</button>
        </h1> 
    </body>
</html>

Damit hast Du alle nötigen Bestandteile angelegt und kannst Deinen Online-Lichtschalter mittels des bekannten „nodejs index.js“ starten, über einen anderen Rechner im Netzwerk zugreifen, wie am Ende von Teil II gezeigt, und die LED aus und ein schalten (Bild 9; inklusive Hintergrundgrafik, die im oben angeführten html-Code nicht enthalten ist).

Die benötigte Hardware für Teil III im Überblick, islandrabe 2015Bild 8

Mit dem Button der Website die LED ausschalten, islandrabe 2015Bild 9


Anmerkung

Dieses Tutorial war Grundlage für den Beitrag "Vorgelagerte Selbstermächtigung" von Benjamin Eugster und Richard Schwarz zur Tagung "Do it! Yourself? Fragen zu (Forschungs-)Praktiken des Selbermachens", die von 5. bis 7. März 2015 am Institut für Europäische Ethnologie in Wien stattfand.