Arduino Control (Teil 6) - LED über LAN einschalten


Das Internet der Dinge geht die meisten Wege über eine Netzwerk Verbindung. Mit dem passenden Shield für Arduino kann die Netzwerkverbindung hergestellt werden. Mit relative wenig Programm Code kann eine simple Datenübertragen vom PC an den Arduino versendet werden.


Ethernet Shield und LED
Für das Beispiel wird das Ziel sein, die LED auf dem Arduino ein und Auszuschalten. Auf dem PC kommt wiederum eine Consolen Anwendung der die Befehle über die LAN Verbindung versenden kann. Der Arduino benötigt für den Empfang den Ethernet Shield, dass wiederum die selbe Verbindung zum Netzwerk hat wie der PC.


Grüne Low Current LED mit einem 2,2kOhm Widerstand


Consolen Anwendung
Fangen wir zunächst mit der Consolen Anwendung an und legen zunächst eine neue Klasse an mit dem Namen 'NetworkHost.cs'. Für die Verbindung wird die Socket Klasse verwendet und ermöglicht die Kommunikation über das Netzwerk. Initial wird die Klasse im Konstruktor mit den wesentlichen Einstellungen als Server festgelegt. In der Methode 'SendCommand' wird das einzelne Zeichen in das zu Übertragenden UTF8 Format gebracht und als Byte Wert versendet. Die 'Stop' Methode ist zwar für das Beispiel nicht erforderlich, jedoch sollte man auch bei kleinen Dingen aufräumen.


 public class NetworkHost  
 {  
   private Socket _connection;  
   public NetworkHost(int port)  
   {  
     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
     socket.Bind(new IPEndPoint(IPAddress.Any, port));  
     socket.Listen(1);  
     this._connection = socket.Accept();  
   }  
   public void SendCommand(char command)  
   {  
     if (!char.Equals(command, ' '))  
     {  
       this._connection.Send(Encoding.UTF8.GetBytes(new char[] { command }));  
     }  
   }  
   public void Stop()  
   {  
     if (this._connection != null)  
     {  
       this._connection.Dispose();  
       this._connection = null;  
     }  
   }  
 }  

In der Klasse 'Program.cs' wird die Klasse instanziiert. Ggf. kann hier auch eine andere Port Nummer verwendet werden. In der Schleife wird die Eingabe eines Zeichen eingelesen und versendet. Allerdings auf 'A' und 'B' beschränkt und mit 'C' lässt sich die Anwendung zusammen mit der Verbindung beenden.

 class Program  
 {  
   static void Main(string[] args)  
   {  
     NetworkHost host = new NetworkHost(1200);  
     bool run = true;  
     while (run)  
     {  
       Console.WriteLine("a = ON");  
       Console.WriteLine("b = OFF");  
       Console.WriteLine("c = Close application");  
       string enter = Console.ReadLine();  
       if(enter.Contains("a") || enter.Contains("b"))  
       {  
         host.SendCommand(enter.ToCharArray()[0]);  
       }  
       else if(enter == "c")  
       {  
         run = false;  
       }  
     }  
     host.Stop();  
   }  
 }  

Arduino Client
Der Programmcode ist kaum länger als das von der Consolen Anwendung. Allerdings habe ich die 'Serial.println' Ausführungen gelassen womit man nicht zwingend eine LED braucht und sich das Ergebnis auch im 'Arduino -> Serielle Monitor' beobachten kann.

Gegebenenfalls anpassen
In der Regel muss die MAC Adresse nicht geändert werden, es sei denn ein anderes Gerät verwendet am Netzwerk genau dieselbe wie im Beispiel.
Für die Funktionsvariable 'ip' wird die IP Adresse für den Arduino mit dem Ethernet Shield festgelegt. Ggf. muss hier die dritte Oktett geändert werden und das vierte, wenn ebenfalls ein System die Adresse verwendet.
Mit der Funktionsvariable 'serverip' wird die Adresse vom PC eingetragen, auf der die Consolen Anwendung ausgeführt wird.
HINWEIS: zu den beiden 'includes' fehlen die spitzen Klammern. Der Code Formatierer kann das nicht erkennen.

#include SPI.h  
#include Ethernet.h 

 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x91, 0x8C };  
 byte ip[] = {192,168,20,99};  
 byte serverip[] = {192,168,20,69};  
 EthernetClient client;  
 int ledPin = 2;  

 void setup() {  
  pinMode(ledPin, OUTPUT);  
  Ethernet.begin(mac, ip);  
  Serial.begin(115200);  
  tryConnectToServer();  
 }  
 void loop() {  
  if(client.available()) {  
   char c = client.read();  
   if(c == 'a') {  
    Serial.println("ON");  
    digitalWrite(ledPin, true);  
   }  
   else if(c == 'b') {  
    Serial.println("OFF");  
    digitalWrite(ledPin, false);  
   }  
   Serial.println(c);  
  }  
  checkForReconnect();  
 }   
 void checkForReconnect() {  
  if(!client.connected()) {  
   Serial.println("disconnecting");  
   client.stop();  
   delay(1000);  
   tryConnectToServer();  
  }  
 }  
 void tryConnectToServer() {  
  Serial.println("connecting...");  
  bool runTryToConnect = true;  
  while(runTryToConnect) {  
   if(client.connect(serverip, 1200)) {  
    Serial.println("Connected");
    runTryToConnect = false;  
   }  
   else {  
    Serial.println("wait...");  
    delay(1000);  
    Serial.println("try to connect again...");  
   }  
  }  
 }  

Nachdem der Arduino Sketch geschrieben wurde und das Ethernet Shield eine Verbindung zum Netzwerk hat, kann die Consolen Anwendung gestartet werden. Die Verbindung kann ein paar Sekunden andauern, bevor man ein Befehl senden kann. Anschließend kann dann mit 'a' die LED eingeschaltet und mit 'b' wiederum ausgeschaltet werden.


Hmm.. Vielleicht hätte ich doch eine hellere LED verwenden sollen :D

Kommentare

Beliebte Posts aus diesem Blog

Arduino Control (Teil 5) - PWM Signal einlesen

RC Fahrtenregler für Lego Kettenfahrzeug

Angular auf dem Raspberry Pi