Arduino Internet-of-Things (IoT)


Naja, so ganz "Internet" ist es nicht. Vielmehr geht es bei diesem Projekt darum, eine größere Anzahl Sensoren zu vernetzen, um biologische Forschung zu betreiben. Die Sensoren werden in einem Wald verteilt und müssen daher mit Batterieversorgung auskommen.
Mehr zum Forschungsprojekt hier...
Bild "ArduinoIOT_Eule-Titel.PNG"
Um mit kleiner Sendeleistung zu arbeiten, was naturgemäß die Reichweite einschränkt, bietet sich an, ein Mesh-Network zu bauen, bei dem jeder teilnehmende Knoten sowohl einen Sensor abfragen kann als auch die Funktion eines Repeaters besitzt. So können weitere Strecken überbrückt werden, als die Reichweite zweier Teilnehmer.

Bild "ArduinoIOT-Mesh.png"


Hier der prototypische Aufbau
Bild "ArduinoIOT_Haselmaus.png"

Konkret geht es bei diesem Projekt übrigens darum, Haselmäuse in ihren Nisthöhlen zu detektieren.

RF Modul

Ich habe mich für das nRF24L01 von Nordic Semiconductor entschieden, weil es ideal für Low-Power-Anwendungen ist und sehr günstig auf einem Modul erhältlich ist. Das IC selber lässt sich wegen des QFN20 4x4 Gehäuses mit Hausmitteln nicht löten.
  
Bild "ArduinoIOT_nRF24.png"

Der Transceiver arbeitet im unlizenzierten 2.4GHz Frequenzband und hat etwa 100m Reichweite in dieser Minimalversion mit Antenne auf der Platine. Eine andere Version des Moduls bietet eine Freifeldreichweite bis ca. 1000m.
Die Register zum Konfigurieren des nRF24L01 und zur Datenübertragung erreicht man über das SPI Host Interface.
Man könnte das nun manuell mittels der eingebauten SPI Bibliothek des Arduino machen. Viel einfacher wird es aber dank der nRF24-Library.

Mesh-Network

Es geht aber noch einfacher: Auf der Arduino-Playground Seite findet sich ein Link zu http://mysensors.org einer Library, die alles bietet, um sehr einfach ein Mesh-Network mit Arduinos zu bauen.
Ich habe allerdings dann doch noch etwas gekämpft, bis alles funktionierte. Auch die Beispiele, waren mir zum Teil noch etwas zu kompliziert um zu verstehen, wie alles funktioniert. Daher zeige ich hier noch einfachere Minimalbeispiele.

Die Software

  
Da alles bei mySensors unter GPL Linzenz veröffentlicht ist, kann ich meine Beispiele zusammen mit den Libraries hier direkt zum Download aufnehmen.

Verdrahten der Hardware

Wie das nRF24L01-Modul mit dem Arduino verbunden wird, ist auf http://mysensors.org sehr genau beschrieben. Allerdings hat es bei mir nicht funktioniert, weil ich Arduino-Leonardo Board verwendet habe. Dort sind nämlich die SPI Pins auf den ICSP Stecker verdrahtet.
/!\ Also beim Nachbau unbedingt zuerst prüfen, wo die SPI Pins herauskommen.

Hier die Pinbelegung des ICSP Steckers, den man für die meisten Arduino-Anwendungen nicht braucht.
Bild "ArduinoIOT_ISPHeader.jpg"

Das sind Pins des nRF24L01-Moduls
Bild "ArduinoIOT_nrfTop.png"
Zwei der Pins gehören nicht zum SPI-Interface und werden mit regulären Arduino-IO-Pins verbunden:


/!\ Wichtig: Der nRF24L01 braucht 3.3V Betriebspannung. Diese kann dem 3.3V Pin des Arduino entnommen werden. Freundlicherweise sind die Eingänge 5V tolerant. Man muss also keinerlei Pegelwandlung dazwischen schalten. Mein Dank geht nach Trondheim/Norwegen an Nordic Semiconductor  :)  

Mein Mini-Netzwerk

Bild "ArduinoIOT_MiniNet.png"

Ich habe die vier Module mit Batterien gespeist, damit ich in der Gegend herumlaufen kann um Reichweiten-Tests zu machen.
Nur der Gateway-Knoten wird vom PC versorgt, da er ja an dessen USB-Port hängt um den Netzwerkzustand anzeigen zu können.
Folgende Netwerkknoten gibt es in meinem Mini-Mesh:

Sensor-Beispiel

Der simple Taster dient dazu, ein externes Event erkennen und als Message weiterzusenden. Hier schickt er die Message an LED B, dass sie ein- oder ausschalten soll.

Bild "ArduinoIOT_Taster.png"

Bild "ArduinoIOT_Sensor_Node_Code.png"

LED-Beispiel

Die LED ist ein Beispiel für einen Aktuator. Dieser Knoten wartet auf eine Message und reagiert entsprechend (siehe oben).
Bild "ArduinoIOT_LED.png"

Bild "ArduinoIOT_LED_Node_A_Code.png"


Gateway-Beispiel

Der Gateway-Code im Originalbeispiel vom mysensor.org ist etwas kompliziert. Daher habe ich hier ein sehr einfaches Beispiel erzeugt. Abhängig vom gesendet Zeichen über die Serielle Schnittstelle des PCs sendet er eine Message an LED-A bzw. LED-B. Außerdem werden alle Aktivitäten auf dem Netzwerk angezeigt. Hierzu muss in der Datei config.h im Library-Verzeichnis der Debug.Modus eingeschaltet sein.

Bild "ArduinoIOT_Gateway.png"

Bild "ArduinoIOT_Gateway_Code.png"