Arduino ans Netz (Überlegungen)

Hallo,

ich habe hier schon länger 2 Arduinos die per USB mit IPS verbunden sind. An sich keine schlechte Sache, doch leider schiesst sich die USB (V-Com auf FTDI Basis) Verbindung des öfteren ab. Nun hab ich hier mal ein Netzwerkshield liegen und das ist auch recht vielversprechend. Ich könnte jetzt eine Sockets Verbindung machen und mein vorhandenes Zeugs im Prinzip 1:1 weiter nutzen. Was auch nicht schlecht ist. Dennoch in anbetracht der Möglichkeiten derzeit stellt sich die Frage ob es nicht machbar und cool (naja nützlich :slight_smile: ) wäre:

  1. Die Soap Schnittstelle anzusprechen
  2. Die JSON-RPC Schnittstelle anzusprechen
  3. Ne eigene Web-Schnittstelle
    (eine davon reicht)

Probelm ist beim Arduino haben wir nicht so die Libs in dem Bereich. Ist auch aufgrund des Memories etc. wohl ehr müssig. Dennoch wäre so eine Schnittstelle mehr oder weniger hard gecodet ansprechbar. Mir fehlt jedoch ein wenig der Background wie Header und Nachricht dann aussehen müssen, das es klappt. Hatt schon mal ein gültiges (naja funktionierendes) Raw Soap mitgeschnitten und konnt das auch per Telnet senden, habs aber mit dem Arduino nicht hinbekommen.

Naja vielleicht habt Ihr ja noch ein paar Ideen zu dem Thema.

Gruß,
Jan

P.s.: Wenn jmd was von dem gebrauchen kann was ich bisher hab: (von IPS) Schnittstellen (in/out) ansprechen, TLC 5940 (16x LED Dimmer) ansprechen, IR Codes an Geräte senden. Einfach melden, ist aber mühnsam zusammengestöpselt und nicht gerade veröffentlichungsfähig :rolleyes:

Hallo,
klingt alles irgendwie interessant. Ich bastele gerade an einer Variante für die Deckenbeleuchtung mit Arduino und TLC5947 (24x LED Dimmer), aber von den TLC 5940 liegen auch schon einige für ein Treppenlicht bereit. Anstoßen wollte ich das alles von einer Wago, aber eine direkte IPS-Variante über’s Netz klingt auch gut.
Somit interessiert mich alles zu dem Thema, auch wenn’s vielleicht (noch) nicht veröffentlichungsfähig ist :slight_smile:
Gruß Jens

Hallo,

ich habe mein Arduino-Projekt mit dem Server-Socket umgesetzt und bin sehr zufrieden.

Ursprünglich wollte ich einen Client- und einen Server-Socket betreiben, hier hatte ich aber immer „mal“ nicht reproduzierbare Ausfälle in der Kommunikation.

Jetzt überwache ich die Verbindung (auf IPS-Seite) mittels zyklischen Lebenszeichen, allerdings habe ich praktisch keine Unterbrechungen, wenn ja starte ich den Server-Socket per Script neu.
Auf Arduino-Seite überwache ich ebenfalls die Bestätigung des Lebenszeichens. Einen Watch-Dog setze ich nicht ein.

Für mich bieten die Teile (auch von den Chinesen (SAINSMART)) eine TOP-Preis-Variante vielen Meldungen/Befehle/Messwerte… u. a. 1-Wire an IPS anzubinden.

Da aber die individuellen Konfigurationen extrem unterschiedlich sein werden, wüsste ich jetzt nicht wie man dies automatisiert in IPS zur Verfügung stellt. Eien Grundvariante mit Kommunikation (IPS-Arduino) und Grundstruktur auf dem ARDUINO (Netzwerk, DHCP, NTP-Anbindung…) wäre schon schön, ich kann dies aber nicht leisten …

Hallo,
ich habe mir einen Arduino Ethernet gebaut um meinen IPS-Server zu Monitoren und ggf. per FS20 Funksteckdose zu schalten.
Im Nachhinein würde ich das Unterfangen NICHT mehr mit Arduiono machen, da Du für dasselbe Geld oder fast noch günstiger einen Raspberry bekommst, der fast gleichviel Strom zieht, Du aber viel mehr Möglichkeiten hast.
Die GPIOs kann man ja auch beliebig ansprechen - (1Wire, LED, andere Dinge)

Die serielle Variante könnte ich noch bieten
Naja und wie schon berichtet: Pokeys56E hat 6 PWM-Kanäle übers Netzwerk (Modbus TCP).

Gruß Helmut

Tja also erstmal für Jens im Anhang mein Arduino Script. Grund Idee ist ein Befehl endet immer mit **
In IPS gibts einen Cutter der bei ** (2A 2A Hex) trennt und an ne Regvar übergibt.

Regvarscript sieht etwa so aus:

$find = array("\r","
");
$replace = array("","");
$data=str_replace($find,$replace,$IPS_VALUE);
if (substr($data,0,8) =="Buttons:") {
	$NutzData=substr($data,8);
	$Tabelle="42713865";
	$x = 0;
	$Taste = substr($Tabelle,$x,1);
	while (substr($NutzData,$x,1)<>"0" && $x < 10) {
		$x = $x +1;
		$Taste = substr($Tabelle,$x,1);
	}
	SetValueString (35335 /*[Lights\Hidden\Register Variable\Result]*/,"Taste -".$Taste);
	if ($x < 9) {
		switch ($Taste) {
	   	case 1: // Taster 1 ...

Der Teil mit der Tabelle dient der Tasterzuordnung, da ich diese einfach angeschlossen hatte und nacher geschaut habe welche wo dran sind.

Lampenhelligkeit sende ich wie folgt:


$arduino = 45140 /*[FTDI-Ardu2]*/;

function sendValue ($chan, $val) {
	$valArray[0] = $val;
	sendValues ($chan, $valArray);
}

function sendValues ($chanStart, $valArray) {
	global $arduino;
	$send = "";
	foreach ($valArray as $val) {
		if ($val > 100) $val = 100;
		if ($val < 0) $val = 0;

		$val = round ($val * 40.95);
		$high = floor ($val / 128);
		$low = $val -$high*128  ;

		// Low Byte 7 Bit (die 7 Höherwertigen) - High Byte 5 Bit (Bit 1-6)
		$high = $high *2 +1;
		$low = ($low *2) +1;

		// Byte codieren
		$send .=  sprintf ("%c%c", $high, $low);
	}
	
	$num = sprintf ("%02d", $chanStart);
	// und ab damit
	//echo "1".$num.$send."**";
	FTDI_SendText($arduino, "1".$num.$send."**");
}

Ich sende das letzte Bit immer = 1 weil es sonst zu irgendwelchen Übertragsproblemen kam. Ich glaub wenn man 0 0 sendete oder so. Egal so geht’s eigentlich gut.

Problem was ich habe: Offensichtlich erzeugen die LEDS mächtige Störspitzen (vielleicht auch weil sie teilweise nicht Dimmgeeignet sind?!), naja äußert sich darin, das gerde bei hoher Dimmung (kleine Helligkeit), gerne irgendwelche Lampen anfangen zu flackern. Je stärker das flackern, desto höher die Chance, dass die Verbindung zum Arduino flitzengeht. (Vielleicht noch mal als Hintergurnd ich steuere die Raumbeleuchtungs LED damit. Ist natürlich am TLC5940 noch ein Verstärker (MosFet) an den Ausgängen. Daher muss ich auch Invertiert ansprechen).

Zum ursprünglichen Post zurück, ich denke ich versuchs mal über Sockets. IPS Server, Arduino Client. Da muss ich an den Scripten ja nicht viel ändern. Mal sehen wie sich das so verhält.

@Herbert machst Du Arduino Seitig etwas wenn die Komm abbricht?

Gruß,
Jan

P.s.: Ich hatte auch erst mit einem anderen LED Treiber überlegt (war betsimmt der TLC5947). Aber aus verschiedenen Gründen dann doch den oben genannten genommen (Ich meine vorhandensein einer Lib, sowie kein SMD waren die Hauptgründe)

steuerung_lampen.rar (1.63 KB)

Bei meinen Arduinos nutze ich bislang folgende Kommunikation (über Serial/USB und Ethernet):

Vom Server zum Modul Ein-Byte-Befehle (ist bei mir aber auch nichts groß mit Stellgrößen) also z.B. „k“ schaltet die Klingel aus, „K“ schaltet sie ein etc. Vorteil: Man kann das von jeder Telnet/Seriellen Konsole aus eben schnell testen.

Umgekehrt puzzle ich mir einen simplen JSON-String zusammen, den ich in IPS komfortabel auslesen kann.

Hi,

seitdem ich ausschließlich auf den IPS-Server-Socket gewechselt bin, habe ich partout keine Ausfälle.
Wenn ich das Kabel ziehe oder den IPS-Server down fahre, erkennt der ARDUINO dies und würde (falls es lang genug ist neu starten):

Mein Arduino-Sende-Script:

// this method makes a TELNET connection to the ips_server:
void telnetRequest(char *outputString) {
  // if there's a successful connection:
  strncpy(sendeString, "<STX>",6);             //fügt Startzeichen <STX> und Stoppzeichen <ETX> hinzu
  strcat(sendeString, outputString);       // Zeichen unter: http://www.robelle.com/smugbook/ascii.txt
  strcat(sendeString, "<ETX>
");
  Serial.print("Sendestring: ");  
  Serial.println(sendeString);
  if (ips_client.connected()) {
    ips_client.print(sendeString);          //sendet String zum Server  
    errorConnect+=1;                        //Zählt jedes Senden als Fehler - wird durch Life-Check oder Life-Bit auf NULL gesetzt (wird "zwischendurch auch bis 30 groß(ist i.O.)
  }                                         //errorConnect soll nur im WorstCase (Ausfälle >90) Aktion (Restart Arduino) auslösen 
  delay(5);                                //Netzwerkchip ein kleines wenig Zeit gegeben
}

Ähnlich Deinem Script nutze ich auch zusätzliche Zeichen ( bzw. ) welche ich per IPS-Cutter abschneide.
In meinem obigen „ersten“ ANsatz zähle ich praktisch jedes Senden als Fehler und setze dieses Fehlerzähler über eingehende Lebenszeichen zurück. Die Anzahl zum Reset auslösen ist derzeit 90, da ich halbminütlich 10 Temperaturen und auch die UTP-Zeit als String übertrage (Zusätzlich zu eventuell spontan auftretenden Meldungen und Befehlsquittierungen versteht sich).

Wenn der IPS fehlende Lebenszeichen erkennt setze ich den Server-Scoket zurück. Als ich noch parallel den Client-Socket hatte benötigte ich dies mehrfach am Tag bis mehrfach einzelne Stunden. Jetzt praktisch nicht mehr - läuft aber weiter mit:

    Case "Variable": {
         //IPS Apply changes
		   If (IPS_SetProperty ($Par_Par_ID , 'Open' , true )==True)  {
		      IPS_ApplyChanges($Par_Par_ID);
		      IPS_LogMessage($SocketName,"ServerSocket IPS neu gestartet (Variablen-Event)");
   		   IPS_SetScriptTimer($IPS_SELF, 210);
		      IPS_Sleep(2000);
   		   $sendestring="Generalabfrage";
   		  }
		   else IPS_SetScriptTimer($IPS_SELF, 0);
    break;

Zum Schluß noch was zum Preis. Wenn man - wie ich - SAIN SMART Produkte kauft ist man bei rund 30Euro (MEGA 2560 inkl Ethernet Shield) für 54 I/O Ports (davon 15PWM), 16 Analog Input und inkl. Netzwerkcontroller. Man benötigt eigentlich nur noch ein Netzteil, für Tempmessung die 1-WIRE-Sensoren (1€/Stück) udn ggf. Relaiskarten für die Ausgabe (falls TTL nicht ausreicht).

Wüsste nicht mit welcher anderen Lösung man in diese Bereiche kommt.

Moin,

ich wollte meine Lösung auch noch eben reinschmeißen :slight_smile:

Mein Arduino hängt per Modbus am IPS. Also man kann ganz normal die Modbus Read/Write aus IPS benutzen.

Man muss leider immer das Original Ethernet Shield nutzen…mit dem sehr sehr günstigen Ethernet Shield läuft es nicht.

Ist vielleicht etwas veraltet der Thread aber als Hinweis:

Ich habe mein problem herausgefunden. Das aufdrösen der Ankommenden Befehle etc. habe ich unter anderem über Strings gemacht. Das wiederum hat wohl mehr oder weniger zufällig zu Memory Overflow und somit zum Absturz des Arduinos geführt. Fazit: Nehmt keine Strings bei der Arduino Programmierung. Immer Char Arrays und immer drauf achten das es keinen Overflow gibt.

Gruß,
Jan

Schänder :wink:

Ich kann nur diesen Weg empfehlen:
Lightweight Arduino Datenübertragung

…schlank und zuverlässig. Ich mache das so ähnlich wie im verlinkten Thread beschrieben, nur 2-Wege Kommunikation. Werde da demnächst noch was veröffentlichen.

Grüße,
Chris

Hallo Zusammen,

ich nutze auch einige Arduinos über Ethernet, bin da kürzlich auf den ESP8266 gestoßen. Kostet nur ein paar Euro und ist WLAN Fähig. Man kann ihn entweder am Arduino über die Serielle Schnittstelle anbinden und mittels AT Kommandos steuern oder was das eigentlich interessante ist den Chip auch Standalone betreiben um Sensoren und Aktuatoren anzubinden. Der Chip lässt sich auch über die Arduino IDE Programmieren.

Hab mir gleich mal ein Paar zum spielen bestellt und einen Temperatur Sensor, Bewegungssensor und ein Relay dran geklemmt. Ich denke ich werde meine Arduinos mit ESP Boards ablösen.

Es gibt eine große Community und es wurden schon viele Projekte auf Basis des Chip’s entwickelt, einfach mal danach googeln.

Vielleicht findet es ja der ein oder andere Interessant, ich bin jedenfalls gerade von dem Teil total begeistert.

Willkommen im Club, Du hast scheinbar Bernds Eintrag nicht gesehen… hier noch zwei schöne Sketche von noch 'nem Michael.

Gruß Helmut

Hi,

entgegen meinem ersten Beitrag in diesem Thread, bin ich von der ARDUINO-Schiene nach ersten Versuchen komplett auf Raspberry (mittlerweile Raspberry PI2) gewechselt - und würde dies auch unbedingt empfehlen! Eventuell fehlende Schnittstellen habe ich per I2C-Modulen von Horter&Kalb angekoppelt (direkt ohne irgendwelche Zwischenschaltungen) und habe damit seit weit über einem Jahr keinerlei Probleme. Nicht nur das Handling der Datenanbindung (über Netzwerk) auch das Aufspielen neuer Software war für mich bei den Arduinos nicht akzeptabel - von der WatchDog-Fummelei ganz zu schweigen.
Das mittlerweile auch IPS für RASPi gibt, macht die Sache vollkommen rund.

herbertf

Hmm, ich will jetzt keine Grundsatzdiskussion anstoßen, es kommt aber wie so oft auf den Einsatzzweck an.

Wenn es - wie oft - nur darum geht irgendwelche einfache I/O bereitzustellen so ist das am Arduino mit ganz wenigen Code Zeilen erledigt.
Mitm Raspi hingegen schleppst du Megabyteweise sehr komplexen Code mit. Manchem mag das egal sein, ich mag das nicht.
Ich sag immer: Was nicht da ist, das macht auch keinen Ärger.

Sobald man allerdings komplexe Sachen erledigen will kommt ein Arduino bald mal ins hintertreffen.

Es gilt soüberall: Man muß das richtige Werkzeug für die jeweilige Aufgabe auswählen. One-fits-all ist IMMER mit
Unzulänglichkeiten verbunden.

gruß
bb

Da kann ich mich bb nur zu 100% anschließen :slight_smile:

Ich habe z.B. für meine Display-Geschichte einen Raspberry, der passt da wunderbar. Für mein Terrarium reicht ein Arduino aber vollkommen aus. Und in Sachen Stabilität ist der Arduino mit seinen paar Zeilen Code nicht zu übertreffen. Da gibt es einfach nichts, was sich aufhängen kann. Da gibt es, grob gesagt, ja nur 0 oder 1 :wink:

Ich muss bei meinem Arduino noch 2 Taster ordentlich einprogrammieren und dann veröffentliche ich das mal. Dann werdet ihr sehen, wie man trotz unperfektem C-Code, recht einfach alles realisieren kann über LAN mit IPS :smiley:

Grüße,
Chris