DINO-Arduino auf Hutschiene

Begonnen von John, 14 Juli 2013, 20:29:36

Vorheriges Thema - Nächstes Thema

John

Ich habe folgende Arduino Implementierung entdeckt:

(siehe Anhang / see attachement)


Es verfügt über:
4x DI via Optokoppler
4x Relais 230VAC/10A
1x RS485
1x Ethernet
1x USB
Power 12VDC
ATmega328

Durch das Hutschienengehäuse und die Klemmen macht es einen sehr professionellen Eindruck.
Möglicherweise kann man über die freien an der Pfostenleiste P1 gesetzten Signale noch einen
Onewire Bus anschliessen.

(siehe Anhang / see attachement)


Hat jemand damit schon Erfahrungen gesammelt ?

Zu finden ist das Teil hier
http://sigma-shop.com/product/73/web-internet-ethernet-controlled-relay-board-arduino-compatible-rs485-usb-boxed-for-din-mount-rail.html

John




CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

ntruchsess

Erfahrung damit habe ich nicht. An sich ein echt cooles Teil zu einem sehr fairen Preis.

Was mir aber gleich dazu einfällt:

Ethernetanbindung mit ENC28J60 -> aktuell kann man darüber keine TCP-basierte (dauerhafte) Verbindung zum Arduino machen. Alle Beispiele die ich finden konnte, wickeln quasi-TCP in einem einzigen Packet, welches implizit die Verbindung wieder schließt ab. Damit kann man natürlich http1.0 ganz gut abwickeln (http ist je eh verbindungslos), Firmata geht darüber erst mal nicht. (Das kann sich aber durchaus bald ändern, ich arbeite gerade daran die enc28j60-Ethershield-library mit dem uip-Stack von Adam Dunkels Arduino-konform zu verheiraten). Grundsätzlich wird aber jede enc28j60-basierte Lösung einen signifikant höheren Speicherverbrauch im Vergleich zu einer einer auf dem WIZ5100 (wie das original Arduino Ethernet-shild) basierenden Lösung haben. D.h. man ich in der Realisierung weiterer Funktionalität auf dem ATMega368 schon deutlich eingeschränkt, dafür ist's halt billiger. (Mit WIZ5100 wäre das Gerät sicher mindestens 10EUR teurer).

1-Wire: Software-1-wire über die Digital-pins 1+2 geht natürlich. Je nachdem, was man an 1-Wire-chips dranhängen will kann das völlig ausreichend sein. Leider sind die Pins A4 und A5 nicht freigehalten, damit liegt die hardwareseitige I2C-Unterstützung brach und damit entfällt die Möglichkeit einen DS2480 als 1-Wire-Busmaster dranzuhängen, was die Leistunsfägigkeit als 1-Wire-Ethernet-relais deutlich erweitern würde. Eigentlich unverständlich, warum das überhaupt auf die Analog-pins gelegt wurde, das Manual spricht ja von '4 Opto isolated Digital Inputs', die wären auf den Digitalen I/Os sicher besser aufgehoben, wenn man wg. der Optokoppler eh nicht mehr sinnvoll analog messen kann. (Das soll das Teil jetzt nicht abwerten, es wird ja für Digital-Input angeboten, und dafür sind über Optokoppler galvanisch getrennte Eingänge echt eine prima Sache).

Gruß,

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

John

Hallo Norbert,
besten Dank für die hilfreichen Informationen.

Habe noch einen weiteren Vertreter dieser Gruppe gefunden unter
http://kmpelectronics.eu/en-us/products/dinoii.aspx


(siehe Anhang / see attachement)


Was hälts du davon ?
Der Ethernet Chip ist ein W5200.
One-Wire ist herausgeführt.

Schaltplan gibts unter
http://kmpelectronics.eu/Portals/0/Projects/DinoII/Doc/NETSTARTER.pdf

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

ntruchsess

Zitat von: John schrieb am Mo, 15 Juli 2013 11:50Was hälts du davon ?
Der Ethernet Chip ist ein W5200.
One-Wire ist herausgeführt.

Hallo John,

Das mit dem W5200 gefällt mir schon viel besser (auch wenn mein µIP-Port für den ENC29J60 gute Fortschritte macht...). 'One-Wire herausgeführt' heißt bei dem Ding aber auch nur einen digitalen Pin mit Pullup an die Anschluss-klemme gelegt. D.h. genauso gut wie die OneWire-software-implementierung eben ist (ist ja gar nicht mal so schlecht...). Die Möglichkeit einen DS2482 als leistungsfähigen Busmaster zu verwenden ist mangels nach außem geführten I2C aber genauso verbaut. D.h. jetzt nicht, dass man damit kein 1-Wire machen kann. DS18B20-Temperatursensoren und DS2443-Counter z.B. gehen über die Softwarelösung ganz prima, das muss man ausprobieren, wo bei einer konkreten 1-Wire-installation da die Grenzen liegen. Ich habe nur die Erfahrung gemacht, dass ein echter Hardware-busmaster (wie ds2482 oder ds2480) einfach mit deutlich mehr Chips gleichzeitig auf dem Bus klarkommt (liegt vieleicht auch gar nicht mal an der Software, sondern am fehlenden 'Strong-pullup' dieser simplen 1-wire Anbindung, d.h. daran, dass bei zu vielen Devices das Timing auf dem Bus über den simplen Pullup-wiederstand einfach zu langsam wird). Ich plane den DS2482-I2C-Busmaster in der ConfigurableFirmata zu supporten, damit auch größere 1-Wire-installationen mit einem Arduino+Ethernetshield als 1-Wire-IP-Gateway nutzbar werden.

Gruß,

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

John

Hallo Norbert,
besten Dank für deinen Kommentar.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

ntruchsess

Zitat von: ntruchsess am 15 Juli 2013, 11:03:21
Ethernetanbindung mit ENC28J60 -> aktuell kann man darüber keine TCP-basierte (dauerhafte) Verbindung zum Arduino machen. Alle Beispiele die ich finden konnte, wickeln quasi-TCP in einem einzigen Packet, welches implizit die Verbindung wieder schließt ab.
Nur falls jemand den Thread über die Suche rauszieht: Mittlerweile ist meine ENC28J60 library für den Arduino fertig: https://github.com/ntruchsess/arduino_uip. Abgesehen vom höheren Speicherbedarf der library (beim ENC28J60 muss der Arduino das ganze TCP selbst machen, beim WIZ5100 macht es der Chip) spricht jetzt nichts mehr gegen das Teil...

Gruß,

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

mcmuller

Hallo Norbert,

bin tatsächlich über die Suche hierher gestolpert...

Also: Ich habe das eingangs beschrieben DINo-Teil mit ENC28J60. Ich hatte vor einer Woche mal das Gefühl, das ich's am Laufen hatte - aktuell verzweifel ich aber wieder.

In Deiner ConfigurableFirmata habe ich Pin10 auf ignore, damit kommt bei FHEM auch was an, leider nur:

2013.12.04 13:19:20 3: querying Firmata Firmware Version
2013.12.04 13:19:20 3: no response from Firmata, closing DevIO
2013.12.04 13:19:20 1: 3030 disconnected, waiting to reappear
2013.12.04 13:19:28 3: querying Firmata Firmware Version
2013.12.04 13:19:29 3: querying Firmata Firmware Version
2013.12.04 13:19:30 3: querying Firmata Firmware Version
2013.12.04 13:19:30 3: no response from Firmata, closing DevIO
2013.12.04 13:19:30 1: 3030 disconnected, waiting to reappear


Liegt's am (aktuellen) FHEM-Firmata? oder doch an dem Arduino-Sketch?

...außer den Relais würde ich wohl auch gerne onewire-Temp-Sensoren daran nutzen, habe aber noch keine Idee, wie das gehen soll...

Kannst Du mir auf die Sprünge helfen?

Grüße aus Portugal,
Gregor





John

Hallo Norbert,
an Deinen Antworten zu Gregors Fragen bin ich auch sehr interessiert.

Dazu noch eine weitere Frage:

Ich möchte mit meinem Dino eine autarke Zusatz-Steuerung zu meiner Heizung aufbauen.
Es macht hier keinen Sinn, wenn Firmata direkt auf die IOs zugreift.
Wichtig wäre es vielmehr, dass man von FHEM aus Parameter setzen kann, die die Applikation auf dem DINO verarbeitet.

Ist FIRMATA in dieser Konstellation überhaupt sinnvoll ?
Kann man mit FIRMATA auch Parameter anstelle von IOs abfragen/setzen ?

@Gregor
die Beispiele der Herstellers laufen auf meinem DINO, bei Firmata stehe ich noch ganz am Anfang.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

ntruchsess

Firmata ist nicht dafür entworfen um als Basis autarker Steuerungen zu arbeiten, sondern um die IOs des Arduinos effizient remote steuern zu können.
Du könntest natürlich deine Steuerung als eigenes Firmata-feature implementieren und Firmata nur als effizientes binär-Protokoll verwenden. Hier mal ein Beispiel, wie das grundsätzlich geht. Ob da nun Sensorwerte, oder Steuerungsparameter übertragen werden ist dem Protokoll ja egal. Also es wäre sicher machar, aber eben ziemliches Neuland.

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

ntruchsess

Zitat von: mcmuller am 04 Dezember 2013, 14:25:12
2013.12.04 13:19:30 3: querying Firmata Firmware Version
2013.12.04 13:19:30 3: no response from Firmata, closing DevIO
2013.12.04 13:19:30 1: 3030 disconnected, waiting to reappear

Schaut ja imprinzip so aus, als ob eine Verbindung (also zumindestens ein SYN-packet) reinkommen würde. Weißt Du, an welchen Pins der ENC28J60 im DINO angeschlossen ist? Die müssen alle auf ignore konfiguriert werden. Falls noch was anderes am SPI-hängt, müssen die CS-Pins dieser Hardware auch auf ignore und zusätzlich als Output/High (Analog dem CS des SD-kard-readers auf dem original Ethernet-shield, wie es in der ConfigurableFirmata Zeile 242 gemacht wird) konfiguriert sein. Natürlich müssen die SPI-pins alle korrekt in der Enc28J60Ethernet.h angegeben sein, da ist erst Uno und Mega2560 berücksichtigt, falls die Defines für SS,MISO,MOSI und SCKL für deinen DINO existieren, dann kannst Du die da natürlich verwenden. Dann kannst du in der UIPEthernet.h verschiedene Arten von Debug-logging anstellen (dann muss das Teil an der seriellen Konsole angeschlossen sein und die Ausgaben zu sehen). Zusätzlich hilft es mit Wireshark auf der Leitung zu gucken, ob das, was dann im Debug-log auftaucht sich auch auf dem Netzwerk wiederfindet.

Zitat von: mcmuller am 04 Dezember 2013, 14:25:12
...außer den Relais würde ich wohl auch gerne onewire-Temp-Sensoren daran nutzen, habe aber noch keine Idee, wie das gehen soll...
das hier im fhem-wiki schon gelesen?

Gruß,

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

mcmuller

#10
Hallo Norbert,

danke für Deine ausführliche Antwort! Ich bin jetzt ein Stück weiter. ConfigurableFirmata.ino wie folgt angepasst:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i=0; i < TOTAL_PINS; i++) {
    if (IS_PIN_SPI(i)
        || 4==i
        || 10==i // is SPI CS on DINo ;explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
        || 11==i // is SPI_MOSI on DINo
        || 12==i // is SPI_MISO on DINo
        || 13==i // is SPI_SCK on DINo
        || 3==i  //is RS485 TX/RX control on DINo
        || 0==i  //is RS485 RX on DINo
        || 1==i  //is RS485 TX on DINo
       ) {
      Firmata.setPinMode(i, IGNORE);
    }
  }
  //pinMode(PIN_TO_DIGITAL(53), OUTPUT); //configure hardware-SS as output on MEGA
  pinMode(PIN_TO_DIGITAL(4), OUTPUT); // switch off SD-card bypassing Firmata
    digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;
  pinMode(PIN_TO_DIGITAL(10), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(10), HIGH);
  pinMode(PIN_TO_DIGITAL(3), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(3), HIGH);
  pinMode(PIN_TO_DIGITAL(0), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(0), HIGH);
  pinMode(PIN_TO_DIGITAL(1), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(1), HIGH);


ebenfalls habe ich die Enc28J60Network.h angepasst, äh, "provisorisch auskommentiert..", um sicher zu sein, daß SPI 10-13 gesetzt ist. :

//#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__)
//#define ENC28J60_CONTROL_CS     53
//#define SPI_MOSI        51
//#define SPI_MISO        50
//#define SPI_SCK         52
//#else;
#define ENC28J60_CONTROL_CS     10
#define SPI_MOSI        11
#define SPI_MISO        12
#define SPI_SCK         13
//#endif;


Hier ist die Dokumentation der Pins: http://www.kmtronic.com/manuals/kmtronic_DINo_Netboard_manual.pdf

So, damit komme ich in der FHEM schonmal weiter:
2013.12.05 11:10:12 1: 3030 disconnected, waiting to reappear
2013.12.05 11:10:20 3: querying Firmata Firmware Version
2013.12.05 11:10:20 3: Firmata Firmware Version: Configurable.ino V_2_05

Ich sehe das FRM-Device, kann aber die Relais (Pin 8,7,6,5) mit "define Relais1 FRM_OUT 8" zwar anlegen, aber ein "set Relais1 on" löst  zwar ein IP-Paket aus, bewirkt im DINo aber nix...

Thema Debug: ich habe in der UIPEthernet.h die #define UIPETHERNET_DEBUG aktiviert, kann aber im Serial Monitor der Arduino-IDE nix sehen. Denkfehler? Arduino ist noch "Neuland" für mich...

Thema onewire stelle ich mal zurück - das Wiki habe ich gelesen und mit einem Arduino Duo auch schon erfolgreich getestet.

Gruß,
Gregor



ntruchsess

hallo Gregor,

hab Deinen Post leider grade erst gesehen.
Wenn Du noch nicht weitergekommen bist, dann schau doch erst mal, ob UIPEthernet auf dem Dino prinzipiell läuft. Nimm dazu z.B. die Beispielssketche der UIPEthernet-lib aus. Die Counterparts zu den Sketches habe ich als perl-tests im Verzeichnis tests/perl als perl-scripte implementiert. Alternativ geht auch der Webserver.ino-sketch von der Ethernet-library, wenn Du da den Include von SPI.h entfernst und aus Ethernet.h 'UIPEthernet.h' machst. Den kann man dann mit dem Browser aufrufen.
In der UIPEthernet.h kann man mit den dort vorhandenen Defines verschiedene Debug-varianten aktivieren (loggt dann auf das Serial-device, verbinde dazu die Serielle Konsole der Arduino-ide). Da kann man dann sehen, ob denn überhaupt was ankommt.

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

John

#12
Hallo Norbert und Gregor,

folgende Libraries von Norbert laufen auf meinem Dino.

UDPServer

Ping Test:OK

Paket-Test
# command in der linux shell ausführen
echo -n "hello from john" | nc -4u -q1 192.168.0.6 5000    
liefert
Zitathello world from arduino

Im Monitor der Ardino IDE:
   
Zitatreceived: 'hello from john'
      remote ip: 192.168.0.1
      remote port: 38622
      beginPacket: success
      bytes written: 26
      endPacket: success
      restart connection: success

-------------------------------------------------------------
TCPServer
Auch der funktioniert.

Kommand in Shell
echo -n "hello from john" | nc -q1 192.168.0.6 1000

Ausgabe in Shell
ZitatDATA from Server!

Ausgabe im Arduino-Monitor

Zitathello from john

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

mcmuller

Hallo Norbert und John,

Die Tests mit den Beispiel-Sketches sind auch bei mir positiv. Ich vermute, es liegt an der Pin-Konfiguration. Die Debug-defines in der UIPEthernet.h führen bei mir dazu, das gar nix mehr ankommt - nicht am Netzwerk und auch nicht auf der seriellen Konsole.
Der DINo wird kurz nach dem sketch-upload von der FHEM-Firmata erkannt, dann fangen die Ausgänge/Relais auf dem DINo ungefragt an zu schalten, dann ist die Kommunikation tot. Kannst Du einen Blick auf meine ConfigurableFirmata.ino-Anpassungen werfen, und checken, ob ich da auf dem Weg bin? Kann ich die DINo-PINs manuell konfigurieren, zB:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i=0; i < TOTAL_PINS; i++) {
    if (IS_PIN_SPI(i)
        || 4==i
        || 10==i // muss sein!!explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
        || 11==i
        || 12==i
        || 13==i
        || 3==i
        || 0==i
        || 1==i
        ) {
      Firmata.setPinMode(i, IGNORE);
    }
  }
  //pinMode(PIN_TO_DIGITAL(53), OUTPUT); // configure hardware-SS as output on MEGA
  pinMode(PIN_TO_DIGITAL(4), OUTPUT);// switch off SD-card bypassing Firmata
    digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;
  pinMode(PIN_TO_DIGITAL(3), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(3), HIGH);
  pinMode(PIN_TO_DIGITAL(0), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(0), HIGH);
  pinMode(PIN_TO_DIGITAL(1), OUTPUT);
    digitalWrite(PIN_TO_DIGITAL(0), HIGH);
  pinMode(A5, INPUT);
  pinMode(A4, INPUT);
  pinMode(A3, INPUT);
  pinMode(A2, INPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);

  // start up Network Firmata:
  Firmata.begin(stream);
#else


Diese Konfiguration führt bei mir in FHEM aber zu:
2013.12.13 10:33:54 3: querying Firmata Firmware Version
2013.12.13 10:33:55 3: querying Firmata Firmware Version
2013.12.13 10:33:56 3: querying Firmata Firmware Version
2013.12.13 10:33:56 3: no response from Firmata, closing DevIO
2013.12.13 10:33:56 1: 3030 disconnected, waiting to reappear
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
2013.12.13 10:34:48 3: querying Firmata Firmware Version
2013.12.13 10:34:49 3: querying Firmata Firmware Version
2013.12.13 10:34:50 3: querying Firmata Firmware Version
2013.12.13 10:34:50 3: no response from Firmata, closing DevIO
2013.12.13 10:34:50 1: 3030 disconnected, waiting to reappear


Confused...

Grüße,
Gregor

mcmuller

OK, ich probiere weiter - und bin nun wieder zu folgender Minimal-Konfiguration zurück:
#ifdef NETWORK_FIRMATA
  // ignore SPI and pin 4 that is SS for SD-Card on Ethernet-shield
  for (byte i=0; i < TOTAL_PINS; i++) {
    if (IS_PIN_SPI(i)
        //|| 4==i
        || 10==i // muss sein!!explicitly ignore pin 10 on MEGA as 53 is hardware-SS but Ethernet-shield uses pin 10 for SS
        ) {
      Firmata.setPinMode(i, IGNORE);
    }
  }
  //pinMode(PIN_TO_DIGITAL(53), OUTPUT); // configure hardware-SS as output on MEGA
  pinMode(PIN_TO_DIGITAL(4), OUTPUT);// switch off SD-card bypassing Firmata
    digitalWrite(PIN_TO_DIGITAL(4), HIGH); // SS is active low;

  // start up Network Firmata:
  Firmata.begin(stream);
#else

Die liefert im FHEM-LOG zumindest schon mal einen erfolgreichen Firmware-Query, um dann kurze Zeit später FHEM abzuschiessen:

Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
2013.12.13 11:00:35 3: querying Firmata Firmware Version
2013.12.13 11:00:35 3: Firmata Firmware Version: ConfFirm251.ino V_2_05
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
Wide character in print at /opt/bin/fhem.pl line 650.
Use of uninitialized value in addition (+) at FHEM/lib/Device/Firmata/Protocol.pm line 184.
2013.12.13 11:00:35 3: received String_data: Unha㙮㊀㈀s㋹㰀c㛯む
2013.12.13 11:00:39 1: 3030 disconnected, waiting to reappear
Wide character in print at /opt/bin/fhem.pl line 650.
2013.12.13 11:00:46 3: querying Firmata Firmware Version
2013.12.13 11:00:46 3: Firmata Firmware Version: C㳯ʂConfFirm251.ino V_2_05
2013.12.13 11:01:45 2: CUL_HM set buero.control statusRequest
Wide character in memGzip at ./FHEM/01_FHEMWEB.pm line 366


Still confused...

Grüße,
Gregor