====== Mit dem Arduino ins WLAN ====== Um mit dem Arduino ins WLAN zu kommen, brauchen wir zusätzliche Hardware. Die WLAN-Module, die wir im Kurs haben, basieren auf der [[http://www.microchip.com/pagehandler/en-us/technology/wifi/software/wifly.html|Roving Networks Wifly]]. Die Module enthalten einen eigenen Prozessor, der sich um die Netzwerkkommunikation kümmert, und kommunizieren eine Serielle Schnittstelle mit dem Arduino. ===== Hardware Anschließen und die Arduino-Library installieren: ===== [[techniken:wifly:hardwareInstallation|Beschrieben in einem eigenen Artikel: WiFly-Modul an den Arduino anschließen]] ===== Grundlagen der Kommunikation über IP-Netzwerke und WiFly===== ==== IP-Adressen ==== Grob verkürzt: Im Netzwerk werden Daten in Pakete verpackt, die eine [[http://de.wikipedia.org/wiki/IP-Adresse|Absender- und Zieladresse]] haben. Die Zieladresse muss stimmen, damit die Pakete auch ankommen. Diese IP-Adressen in einem Heimnetzwerk/WLAN werden meist automatisch vom WLAN-Router an die darin vorhandenen Geräte vergeben (DHCP) und können sich ändern, wenn sie nicht fest eingestellt wurden. Eine typische IP-Adresse in unserem Kurs-WLAN "wally" ist z.B. ''192.168.0.104''. **Damit Daten, die ihr von eurem PC aus an den Arduino (oder umgekehrt) schickt, auch ankommen, müsst ihr daher im Programm des Absenders die Adresse des Empfängers ('target', 'outgoing', oder ähnlich) eintragen.** Wie die aktuelle IP-Adresse eurer WiFly lautet, seht ihr in de Ausgabe des Konfigurationsprogramms aus dem vorherigen Abschnitt. Wie die IP eures Laptops lautet, findet ihr je nach Betriebsystem unterschiedlich heraus. Bemüht dazu eine Suchmaschine eurer Wahl... ==== Ports ==== Damit mehrere Anwendungen, die auf einem Netzwerkgerät (mit einer IP-Adresse) laufen, nur die jeweils für sie bestimmten Daten bekommen, verwendet jede Anwendung eine eigene "Untermieteradresse, die [[http://de.wikipedia.org/wiki/Port_%28Protokoll%29|Port]] genannt wird. Eine Anwendung kann ihren Port prinzipiell frei wählen, es gibt jedoch einige "standard"-Ports, die üblicherweise für bestimmt Zwecke verwendet werden. Der "incoming" Port des Empfängers muss als "outgoing" Port des Absenders eingetragen werden, damit eine Verbindung zu Stande kommt. ==== TCP vs. UDP ==== Ganz kurz: [[http://de.wikipedia.org/wiki/Transmission_Control_Protocol|TCP]] stellt zunächst Verbindung zwischen zwei Endpunkten einer Netzverbindung, über die danach Daten ausgetauscht werden können. Dabei vermeidet es im Hintergrund automatisch Datenverluste und Netzwerküberlastungen. Allerdings muss ein Programm dafür Mechanismen enthalten, mit Verbindungsabbrüchen umzugehen und diese ggf. wiederherzustellen. Im Gegensatz dazu ist [[http://de.wikipedia.org/wiki/User_Datagram_Protocol|UDP]] //verbindungslos// und ohne Fehlerkorrekturmechanismen, d.h. Daten werden an eine Adresse geschickt, ohne dass vorher eine Verbindung aufgebaut werden muss. Dafür gibt es auch keine Automatik, die sich darum kümmert, verlorengegangene Pakete neu zu versenden. Die WiFly unterstützt beide Protokolle, OSC (siehe unten) läuft üblicherweise über UDP. ===== Die WiFly im Netzwerk ===== Der Funktionsumfang der Wifly-Module ist leider recht beschränkt, aber für für viele Anwendungen ausreichend. Die WiFly lauscht auf einem vorgegebenen Port auf Pakete und gibt deren Inhalt unverzüglich über ihre serielle Schnittstelle aus. Das bedeutet: * Es ist nicht möglich, den Absender-IP des Pakets festzustellen * Wenn Daten schneller ankommen, als das Arduino-Programm sie abholt, gehen sie verloren * Welche Daten zu einem Paket gehören, ist (bestenfalls) dadurch erkennbar, dass davor oder danach keine Daten kamen - wenn zwei Pakete schnell hintereinander ankommen garnicht. ...Woraus wiederum folgt: * Wenn ihr mehrere Absender unterscheiden wollt, müsst ihr euch dazu etwas Eigenes einfallen lassen. * Ihr habt keine Garantie, dass keine Daten verloren gehen, während euer Programm "nicht hinhört". Insbesondere müsst ihr dafür sorgen, dass das sendende Programm nicht schneller sendet, als ihr abholen könnt. * Protokolle, die ein UDP-paket als eine abgeschlossene Einheit verwenden (wie das gleich beschriebene OSC) funktionieren nur dann einigermaßen zuverlässig, wenn das sendende Programm zwischen zwei gesendeten Paketen eine Pause von einigen 10 Millisekunden einlegt. Da eine einfache Serielle Verbindung im Grunde die gleichen Einschränkungen hat, ist es trotzdem sehr gut möglich (auf der Arduino Seite nach der ersten Konfiguration der Wifly sogar ohne irgendwelche Anpassungen des Programms), eine direkte Kommunikation über eine Serielle Schnittstelle durch eine WLAN-Verbindung zu ersetzen. ===== Direkte Datenverbindung zwischen Processing und Arduino ===== Java bringt schon alles mit, was nötig ist, um mit wenigen Zeilen Code eine TCP-Verbindung mit der WiFly/dem Arduino herzustellen. Beispielcode für Processing mit Kommentaren gibt es hier: [[https://github.com/Zapalot/simpleTcp/blob/master/simpleTcp.pde]] Das passende Arduino Programm (für eine fertig Konfigutierte Wifly) hier: [[https://github.com/Zapalot/SoftSerialRelay]] ===== OpenSoundControl (OSC) ===== Eine sehr bequeme Möglichkeit, Daten mit dem Arduino auszutauschen ist das OSC-Protokoll, welches ursprünglich für die Steuerung von elektronischen Musikinstrumenten entwickelt wurde. Wie ihr OSC in Processing und Arduino nutzen könnt, erfahrt ihr in einem [[techniken:osc|separaten Artikel]]...