Firmata over Ethernet: Einbindung in Arduino

Begonnen von CaptBlaubaer, 27 Oktober 2013, 00:44:58

Vorheriges Thema - Nächstes Thema

ntruchsess

Zitat von: Achim am 03 November 2013, 15:43:40
Gibt es eine einfache Möglichkeit, die Sketche über Ethernet zu testen, ohne FHEM? Ich habe bisher nur Perl (und andere) Scripte für USB Verbindungen gefunden.
im ethernet-branch der perl-firmata findest Du ein perl-script zum Testen. Dazu musst Du natürlich den ganzen perl-firmata ethernet-branch nehmen, die 'native' Ethernet-unterstützung habe ich noch nicht ins Release übernommen.

Gruß,

Norbert
while (!asleep()) {sheep++};

Achim

Hallo Norbert,

mit
Zitat#define UIP_CONF_UDP 0 und
#define UIP_CONF_BROADCAST 0
ist der Fehler beim compilieren ohne UDP weg.

Das Problem mit dem Fehler
ZitatIn file included from C:\Program Files\Arduino\libraries\Firmata\utility\ServoFirmata.cpp:19:
C:\Program Files\Arduino\libraries\Firmata\utility/ServoFirmata.h:36: error: ISO C++ forbids declaration of 'Servo' with no type
C:\Program Files\Arduino\libraries\Firmata\utility/ServoFirmata.h:36: error: expected ';' before '*' token
habe ich weiterhin. Ich habe zwei IDEs parrallel offen, in der ersten compiliere ich den Originalsketch (mit den Netzwerkanpassungen). Dabei kommt "nur" der Fehler
ZitatBinäre Sketchgröße: 36.232 Bytes (von einem Maximum von 30.720 Bytes)
processing.app.debug.RunnerException: Sketch zu groß
Danach gleich im zweiten Fenster den geänderten Sketch
Zitat//#include <Servo.h> //wouldn't load from ServoFirmata.h in Arduino1.0.3
//#include <utility/ServoFirmata.h>
//ServoFirmata servo;
Funktioniert diese Vorgehensweise vielleicht unter Windows nicht? Ich habe dies mit der IDE Version 1.0.5 und 1.5.4 getestet.  Ich habe auch vor einem gesamten Testdurchlauf das Temp-Verzeichnis komplett gelöscht. Immer dasselbe Resultat.

Muss ich da vielleicht in den Voreinstellungen der IDE in der preferences.txt etwas konfigurieren, das vom Installationsstandard abweicht?

MFG Achim Unger
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

Achim

Hallo Norbert,

ich habe den Fehler gefunden.
Zitat2. Öffne das ConfigurableFirmata example in einem 2. IDE-fenster und compiliere es einmal unverändert mit allen Features
Ich habe bei dem Originalsketch immer die Netzwerkanpassungen gemacht. Dadurch war der Sketch logischerweise immer zu groß und die IDE hat wohl daher die anderen Module auch als nicht korrekt compiliert gesetzt. Ohne Änderungen wird zwar kein Netzwerkadapter in den Sketch eingebunden aber wohl die anderen Module korrekt compiliert und auch im TEMP auch so gekennzeichnet. Man (ich) sollte wirklich die Anweisungen genau lesen und auch so ausführen wie es beschrieben ist :)...

Vielen Dank für deine Hilfe und vor allem für deine Module (und die damit verbundene Arbeit und Zeit ) die du allen zur Verfügung stellst.

MfG Achim
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

Achim

Hallo Norbert,

ich komme mit der Anbindung nicht weiter. Die definierten Ein/Ausgänge reagieren nicht.

Meine Umgebung:
Arduino Nano mit Ethernet Shield (ENC28J60)
mit ConfigurableFirmata Sketch -> meine Anpassungen://#include <SPI.h>
//#include <Ethernet.h>
#include <UIPEthernet.h>
#define remote_ip IPAddress(192,168,178,42)
//#define remote_host "server.local"
#define local_ip IPAddress(192,168,178,50)


RPi
fhem.cfgdefine Arduino FRM 3030 global
attrib Arduino loglevel 1
attrib Arduino model nano
# -> dieses Attribut habe ich im Sourcecode von FRM.PM gefunden.

define D8 FRM_IN 8
attrib D8 internal-pullup on

define D9 FRM_OUT 9

Im Logfile steht "nur"
Zitat2013.11.17 12:06:13 3: querying Firmata Firmware Version
2013.11.17 12:06:13 3: Firmata Firmware Version: w9+?W? V_87_08

Wenn ich FHEM herunterfahre und mit example-tcpserver.pl teste bekomme ich beim ersten Aufruf des Scriptes:
Zitatexample-tcpserver.pl
waiting for firmata-client to connect...
waiting for firmata-client to connect...
>f0,79,f7
>f0,79,f7
beim zweiten und jedem weiteren Aufruf
Zitatwaiting for firmata-client to connect...
>f0,79,f7
<f0,79,57,08,17,00,2f,00,75,01,39,01,00,00,57,00,08,00,15,01,f7
    < START_SYSEX
    < DATA_SYSEX
    < END_SYSEX
Use of uninitialized value $buf in split at ../lib/Device/Firmata/IO/NetIO.pm line 167.
>
^C

Die grundsätzliche Kommunikation funktioniert aus meiner Sicht.

In der oberen SYSEX Meldung finde ich zwar die Version 87_08 (57 08), die beiden Zahlen aber nicht in den Sourcecodes. In Firmata.h habe ich nur#define FIRMATA_MAJOR_VERSION   2 // for non-compatible changes
#define FIRMATA_MINOR_VERSION   5 // for backwards compatible changes
gefunden.

Meine C und Perl Kenntnisse sind leider nicht so gut, das ich hier jetzt ohne Hilfe weiterkomme. Ich weiss nicht mehr weiter wo ich mit der Fehlersuche ansetzen soll. Vielleicht kannst du mir einen Tipp geben.

MfG Achim

1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

ntruchsess

der vermurkste Version-string deutet darauf hin, dass der Ram-speicher des Arduinos zu klein ist und deshalb der Versionstring überschrieben wurde. Ist das ein Nano mit ATMega328 oder dem 168? Kommentiere erst mal alle Features außer DigitalInput/DigitalOutputFirmata und FirmataExt aus um den Rambedarf zu minimieren.

- Norbert
while (!asleep()) {sheep++};

mago0211

Hallo,
erstmal Danke für deine Mühen in deiner Freizeit  :D

Ich steh irgendwie aufm Schlauch. Ich bekomme einfach keine Ethernet Verbindung zusammen also das sich der Arduino im Heimnetzwerk anmeldet.

//replace with ip of server you want to connect to, comment out if using 'remote_host'
#define remote_ip IPAddress(192,168,1,123)


Bedeutet hier muss ich die IP des FHEM Server (läuft auf einem Raspi) eintragen ?

//replace with the port that your server is listening on
#define remote_port 3030

Das ist dann der Port über den der Arduino erreichbar ist?

//replace with arduinos ip-address. Comment out if Ethernet-startup should use dhcp
#define local_ip IPAddress(192,168,1,130)

Ist das dann die Adresse des Arduino im Heimnetz?

Sorry ich muss jetzt echt blöd fragen ich steh total auf dem Schlauch  :-[
muss ich die Subnetzmaske und den Standardgateway nirgens eintagen?

Weil mit den oben genannten Einstellungen meldet er sich nicht im Heimnetzwerk an.

Sonstige Einstellungen
//#include <SPI.h>
//#include <Ethernet.h>
#include <UIPEthernet.h>

//#define remote_host "server.local"


Ach ja bevor ich es vergesse ich verwende einen Nano mit Ethernet Shield

Vielen Dank fürs Lesen  :)

ntruchsess

Zitat von: mago0211 am 21 November 2013, 23:10:01
//replace with ip of server you want to connect to, comment out if using 'remote_host'
#define remote_ip IPAddress(192,168,1,123)


Bedeutet hier muss ich die IP des FHEM Server (läuft auf einem Raspi) eintragen ?
ja

Zitat von: mago0211 am 21 November 2013, 23:10:01
//replace with the port that your server is listening on
#define remote_port 3030

Das ist dann der Port über den der Arduino erreichbar ist?
nein, das ist der Port, den man per 'define xyz FRM this.is.my.ip <port> global' konfiguriert. FRM öffnet hier einen Server-listen-socket und wartet, dass sich der Arduino (als Client) verbindet

Zitat von: mago0211 am 21 November 2013, 23:10:01
//replace with arduinos ip-address. Comment out if Ethernet-startup should use dhcp
#define local_ip IPAddress(192,168,1,130)

Ist das dann die Adresse des Arduino im Heimnetz?
ja

Zitat von: mago0211 am 21 November 2013, 23:10:01
muss ich die Subnetzmaske und den Standardgateway nirgens eintagen?

Subnetzmaske und Standardgateway sind optional. Gibt man nix an, dann wird ein 8-bit Subnetz (255.255.255.0) und Gateway auf (x.y.z.1) gesetzt. Falls Du die Werte explizit setzen willst, dann kannst Du die Zeile 179 anpassen. Die Signaturen der anderen Ethernet.begin(...)-methoden findest Du in der UIPEthernet.h

Zitat von: mago0211 am 21 November 2013, 23:10:01
//#include <SPI.h>
//#include <Ethernet.h>
#include <UIPEthernet.h>

Ach ja bevor ich es vergesse ich verwende einen Nano mit Ethernet Shield
sieht eigentlch gut aus, vorrausgesetzt das Nano-ethernet-shield hat CS auf PIN 10 (so wie meines ;-) ). Falls nicht, kannst Du den Wert für CS in der Enc28J60Network.h passend setzen.

Viel Erfolg,

Norbert
while (!asleep()) {sheep++};

mago0211

Hallo ntruchsess,
erstmal Danke für die super schnelle Antwort.

leider komme ich immer noch nicht zurecht. :'(

Übrigens ist mir heute aufgefallen das ich einen Fehler im meinem vorherigen Post habe. :'(
Ich habe keinen Arduino Nano sondern einen UNO  ::)

Ich bekomme einfach keine Netzwerkverbindung zu meinem Heimnetz hin. Und ich denke so lange ich das nicht hinbekomme und der Arduino nicht anpingbar ist  brauch ich in FHEM gar nicht weiter machen. :-\

Also ich habe mal versucht den Gateway und das Subnet manuell einzustellen
dazu habe ich der ConfigurableFirmata.ino ab Zeile 175 wie folgt geändert

/*==============================================================================
* SETUP()
*============================================================================*/

byte dns[] = {192, 168, 1, 1};
byte gateway[] = {192, 168, 1, 1};
byte subnet[] = {255, 255, 255, 0};
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
void setup()
{
#ifdef NETWORK_FIRMATA
#ifdef local_ip
  Ethernet.begin(mac,local_ip,dns,gateway,subnet);  //start ethernet
#else
  Ethernet.begin((uint8_t*)mac); //start ethernet using dhcp
#endif
  delay(1000);
#endif
  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);


Die Anweisungen dazu habe ich von der Arduino HP http://arduino.cc/de/Reference/EthernetBegin

Wo liegt mein Fehler ich komme einfach nicht weiter :(

ntruchsess

die Addressen für dns, gateway und subnet entsprechen den defaults, die die Ethernet-Lib wählen würde (schaded so aber natürlich nix).

Was hast Du denn für ein Ethernet-shield? Ein originales oder eines mit ENC28J60? Laufen andere Sketches (z.B. Webserver aus den Ethernet-beispielen) damit? (Ich habe eines, bei dem hat der Stecker vom ICSP nicht richtig verbunden, weil zu kurz - das ging dann auf meinem Mega, aber nicht am Uno (bis ich den ICSP-Stecker etwas verlängert angelötet habe)).

Gruß,

Norbert
while (!asleep()) {sheep++};

CaptBlaubaer

HI,

@mago0211:
Hast Du Dein Ethernetshield mal mit den mitgelieferten Beispielen (DHCP)ChatServer aus der Ethernet  Library und einem Telnet Client getestet?
Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

Achim

Hallo Norbert,

ich habe jetzt die Verbindung mit Firmata mit dem Arduino Nano und Ethernet Shield (ENC28J60) am Laufen. In den Sketch habe ich die Digitalen In/Out und das One-Wire Modul eingebunden. OWTEMP mit DS18B20 und OWCOUNT mit dem alternativen DS2423 lassen sich auslesen und darstellen. Das Problem beim Auskommentieren von "Servo" und "I2C" war, das trotzdem die Definitionen
#include <Wire.h>
#include <Servo.h>
bleiben mussten, da sonst beim Compilieren Fehler auftraten. Langsam lerne ich dazu.

Dann habe ich das ganze mit einem UNO und einem W5100 Board versucht. Nur die Definitionen für die Ethernetkarte im Sketch und das Board in der der IDE gewechselt. Die Digitalen In/Out funktionieren, Ebenso die DS18B20 am 1-Wire Bus. Nur beim Auslesen der Counter  bekomme ich folgende Fehlermeldung
ZitatOWCOUNT: Could not get values from device OWX_Count1, reason: invalid data length, 3 instead of 45 bytes in three stepsinvalid CRC
Der Fehlercode taucht in einem anderen Thread auf, dort schreibst du allerdings, das es mit einer neuen Version von OWCOUNT behoben wäre. Ich habe die aktuellsten Module mit Update geladen, keine Module separate irgendwoher installiert. Da es mit dem Nano funktioniert, ist das ein Timingproblem beim Uno?

MfG Achim
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

mago0211

Danke ntruchsess und Blaubaer für eure Antworten.

Entschuldigung das ich nicht sofort geantwortet habe aber ich war am WE im Stress.   :(

Zitat von: ntruchsess am 22 November 2013, 22:18:43
Was hast Du denn für ein Ethernet-shield? Ein originales oder eines mit ENC28J60?

Ich habe das Original Shield http://arduino.cc/en/Main/ArduinoEthernetShield .

Zitat von: CaptBlaubaer am 22 November 2013, 23:11:38
Hast Du Dein Ethernetshield mal mit den mitgelieferten Beispielen (DHCP)ChatServer aus der Ethernet  Library und einem Telnet Client getestet?
Zitat von: ntruchsess am 22 November 2013, 22:18:43
Laufen andere Sketches (z.B. Webserver aus den Ethernet-beispielen) damit?

Ich habe das mal ausprobiert und es ging nicht. Ich hab dann Arduino IDE neu installiert, scheinbar hat sich bei der Installation oder danach irgendwas verwurschtelt. Auf jeden Fall habe ich nach der neu Installation den WebServer und den ChatServer zum laufen gebracht ohne Probleme!
Jetzt habe ich aber ein anderes Problem:
Jetzt ist der ConfigurableFirmata Sketch zu groß für den UNO. 41.032 Bytes (von einem Maximum von 32.256)
Danach hab ich wie von dir beschrieben die Servo.h und Wire.h auskommentiert.

//#include <Servo.h> //wouldn't load from ServoFirmata.h in Arduino1.0.3
#include <utility/ServoFirmata.h>
ServoFirmata servo;

//#include <Wire.h> //wouldn't load from I2CFirmata.h in Arduino1.0.3
#include <utility/I2CFirmata.h>
I2CFirmata i2c;


Leider Passt er immer noch nicht drauf!?

Grüße

Markus

ntruchsess

äh, hast Du vieleicht 'UIPEthernet.h' drin oder nur 'Ethernet.h'? Für das original-Ethernet-shield brauchst Du die Ethernet.h (die Ethernet-library ist fast 10kb kleiner als UIPEthernet, letzteres braucht man nur für die ENC28J60-shields).

Gruß,

Norbert
while (!asleep()) {sheep++};

mago0211

Ja das hatte ich tatsächlich falsch eingestellt. Ich habe mit der UIPEthernet.h rum gespielt weil es Anfangs mit der Ethernet.h nicht klappte jetzt habe ich aber festgestellt das ich beim ersten Versuch die SPI.h vergessen hatte  ::) :'( .

Ok jetzt ein anderes Problem  :-[ .

Verbindung zum Fhem Server bzw. zum Arduino steht. Nur sind die Schaltvorgänge falsch herum also wenn ich in Fhem ON drücke geht z.b. Pin 5 auf Off, und in Fhem OFF ist auf dem Arduino ON.
Woran könnte das liegen

Grüße Markus

ntruchsess

Zitat von: mago0211 am 30 November 2013, 19:48:31...wenn ich in Fhem ON drücke geht z.b. Pin 5 auf Off, und in Fhem OFF ist auf dem Arduino ON.

was hast Du denn angeschlossen? Manche Relaisboards z.B. werden 'active Low' also durch Verbinden mit Masse 'angeschaltet', da ist die Schaltlogic dann umgekehrt.

- Norbert
while (!asleep()) {sheep++};