Firmata mit MCP23017

Begonnen von beSmart, 08 April 2018, 14:16:41

Vorheriges Thema - Nächstes Thema

beSmart

Hallo.

Ich habe mir ein Testbrett mit einen Arduino Nano(Lan) mit Firmata V2.06 und einem MCP23017 aufgebaut. Anbindung von Firmata an Fhem scheint zu funktionieren.
Ich nutze das Modul "I2C_MCP23017" und als IODev "FRM". Leider werden die Eingänge(ich benötige nur Eingänge) nicht eingelesen und es kommt ich die Fehlermeldung: too few Bytes received


Über die Suchfunktion habe ich einen Beitrag mit der selben Fehlermeldung gefunden. Es ging da um einen Temperatursensor.... ich glaube SHT..irgendwas..
Eine Lösung für mein Problem habe ich da leider nicht herausgelesen.

Hier ein "list" von den Geräten Firmata und MCP

Internals:
   CONNECTS   2
   DEF        3030 global
   DRIVER_VERSION 0.64
   DeviceName 3030
   FD         4
   I2C_ERROR  Too few bytes received
   NAME       FIRMATA
   NOTIFYDEV  global
   NR         22
   NTFY_ORDER 50-FIRMATA
   PORT       3030
   STATE      Initialized
   TYPE       FRM
   firmware   ConfigurableFirmataW5100I2C.ino
   firmware_version V_2_06
   i2c_pins   18,19
   protocol_version V_2_06
   READINGS:
     2018-04-08 14:10:47   error           I2C: Too few bytes received
     2018-04-08 14:10:42   state           Initialized
   SERIAL:
   SocketDevice:
     BUF       
     DeviceName 3030
     FD         10
     NAME       FIRMATA_192.168.178.251_49153
     NR         67
     PEER       192.168.178.251
     PORT       49153
     SNAME      FIRMATA
     SSL       
     STATE      Connected
     TEMPORARY  1
     TYPE       FRM
Attributes:
   verbose    5



Internals:
   DEF        20
   I2C_Address 20
   IODev      FIRMATA
   NAME       MCP
   NR         23
   STATE      Initialized
   TYPE       I2C_MCP23017
   READINGS:
     2018-03-22 01:28:05   PortA0          off
     2018-03-22 01:28:05   PortA1          off
     2018-03-22 01:28:05   PortA2          off
     2018-03-22 01:28:05   PortA3          off
     2018-03-22 01:28:05   PortA4          off
     2018-03-22 01:28:05   PortA5          off
     2018-03-22 01:28:05   PortA6          off
     2018-03-22 01:28:05   PortA7          off
     2018-03-22 01:28:05   PortB0          off
     2018-03-22 01:28:05   PortB1          off
     2018-03-22 01:28:05   PortB2          off
     2018-03-22 01:28:05   PortB3          off
     2018-03-22 01:28:05   PortB4          off
     2018-03-22 01:28:05   PortB5          off
     2018-03-22 01:28:05   PortB6          off
     2018-03-22 01:28:05   PortB7          off
     2018-03-31 13:41:54   state           Ok
Attributes:
   IODev      FIRMATA
   poll_interval 1
   verbose    5



Hat jemand eine Idee wie ich den MCP zum laufen bekomme?


Dank und Gruß

besmart

klausw

Im FRM Device fehlt das Attribut i2c-config
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

beSmart

Hallo.

Erst mal vielen Dank für deine Antwort.
Das Attribut i2c-config hatte ich schon ausprobiert. Leider keine Veränderung.....

Es sieht so aus, als ob die Kommunikation zwischen den Modulen "FRM" und "MCP23017" nicht funktioniert. Leider habe ich keine Ahnung wie ich das Problem eingrenzen kann...


Gruß


Dirk

klausw

es ist einen Weile her, das ich FRM genutzt habe.
Das Attribut "attr <frm-device> i2c-config 1" benötigst du auf alle Fälle.
Ohne geht es nicht.

Die I2C Pins sind korrekt angeschlossen?
Hast du ein Oszi zum messen?

Was ich gerade noch sehe...
Vorausgesetzt die Pins A0-A2 liegen auf Masse ist die Adresse des MCP23017 hexadezimal 20
du müsstest also 0x20 im DEF eintragen anstelle von 20
oder halt 32 (im Internal I2C_Address steht der Dezimalwert das wäre in beiden Fällen 32)
0x20 = 32
20 = 0x14

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

R1F800

Moin,

ich stehe gerade vor dem gleichen Problem.

MCP23017 am Firmata Device (ardunino nano)

IOs am nano direkt funktionieren.
Ein LCD am I2C des nanos funktioniert auch.

NUR DER MCP23017 meckert rum. > Too few bytes received

Adresse sollte korrekt sein, Definition der Outputs sollten passen, SDA und SCL mit einem PullUp versehen ...

Hat jemand eine Idee warum hier ein TRANSMISSION ERROR kommt?
Summende Grüße
Ingo

klausw

Ich glaube mich zu erinnern das für I2C ein Attribut in Firmata gesetzt werden muss
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

R1F800

Zitat von: klausw am 05 Februar 2019, 18:40:04
Ich glaube mich zu erinnern das für I2C ein Attribut in Firmata gesetzt werden muss

Der I2C selber funktioniert ja. Das LCD hängt bereits am I2C und läuft. Somit sollte der Sketch ja i.O. sein.
Oder welches Attribut meinst Du ?

VG
Ingo
Summende Grüße
Ingo

klausw

Zitat von: R1F800 am 06 Februar 2019, 10:20:27
Der I2C selber funktioniert ja. Das LCD hängt bereits am I2C und läuft. Somit sollte der Sketch ja i.O. sein.
Oder welches Attribut meinst Du ?

Handydisplay zu klein.. habe ich überlesen.

Das LCD am Firmata läuft demnach über FHEM und das Modul I2C_LCD?
Attribut: attr <frm-device> i2c-config 1
Aber wenn das LCD geht dann sollte es schon vorhanden sein.
Der MCP ist auf 0x20 konfiguriert?

Was bringt denn das setzen eines Ports um log (bei verbose5 in frm und i2c_mcp... Modul)?

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

R1F800

#8
Schau dazu bitte mal meinen Anhang aus dem vorangegangenen Post:

... Link klappt nicht >> Antwort #4

Das EventLog kann ich nachherposten, wenn ich wieder vor dem Gerät bin :-)
Summende Grüße
Ingo

R1F800

2019.02.06 18:07:10 3: NanoExpander: failure in message from FIRMATA
2019.02.06 18:07:10 3: Direction: i2cread I2Caddress: 0x20 Register: 0x12 Data: undef received: 0x00
Summende Grüße
Ingo

klausw

Zitat von: R1F800 am 06 Februar 2019, 18:09:41
2019.02.06 18:07:10 3: NanoExpander: failure in message from FIRMATA
2019.02.06 18:07:10 3: Direction: i2cread I2Caddress: 0x20 Register: 0x12 Data: undef received: 0x00
Da war ich etwas sparsam mit den logeinträgen :/
Vom Firmata müsste aber auch was kommen.

Die Meldung "Too few bytes received" wird vom FRM Device übertragen. Genauso wie das Internal FIRMATA_SENDSTAT, welches ich bei dir vermisse.

Mit der Meldung können eher die Firmata Spezis was anfangen. Ich vermute es bedeutet, das der MCP nix zurück liefert.
Das kann zum einen an Verbindungsproblemen oder auch an der falschen Adresse (ja ich wiederhole mich  ;) ), oder einem Timing Problem liegen.
Läuft alles mit der gleichen Spannung?

Zum Timing habe ich was in der Commandref gefunden:

i2c-config <write-read-delay>, no default
Configure the Arduino for ic2 communication. Definig this attribute will enable I2C on all i2c_pins received by the capability-query issued during initialization of FRM.
As of Firmata 2.3 you can set a delay-time (in microseconds, max. 32767, default: 0) that will be inserted into I2C protocol when switching from write to read. This may be necessary because Firmata I2C write does not block on the FHEM side so consecutive I2C write/read operations get queued and will be executed on the Firmata device in a different time sequence. Use the maximum operation time required by the connected I2C devices (e.g. 30000 for the BMP180 with triple oversampling, see I2C device manufacturer documentation for details).
See: Firmata Protocol details about I2C

Scheinbar hat sich da was geändert seit ich das vor 5 Jahren mal getestet habe.


RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

R1F800

Hallo,
Nein, das Delay beim I2C config habe ich nicht verändert.
Auf dem nano ist auch nicht das firmata sondern das configurable firmata
Halt eben nur mut I2C digital IO und 1 Wire
Summende Grüße
Ingo

R1F800

Zitat von: klausw am 06 Februar 2019, 22:43:21
Da war ich etwas sparsam mit den logeinträgen :/

Läuft alles mit der gleichen Spannung? >>  JA, alles auf einem Breadboard. Alles mit +5V

Zum Timing habe ich was in der Commandref gefunden:

i2c-config <write-read-delay>, no default
Configure the Arduino for ic2 communication. Definig this attribute will enable I2C on all i2c_pins received by the capability-query issued during initialization of FRM.
As of Firmata 2.3 you can set a delay-time (in microseconds, max. 32767, default: 0) that will be inserted into I2C protocol when switching from write to read. This may be necessary because Firmata I2C write does not block on the FHEM side so consecutive I2C write/read operations get queued and will be executed on the Firmata device in a different time sequence. Use the maximum operation time required by the connected I2C devices (e.g. 30000 for the BMP180 with triple oversampling, see I2C device manufacturer documentation for details).
See: Firmata Protocol details about I2C

Scheinbar hat sich da was geändert seit ich das vor 5 Jahren mal getestet habe.

Hier mal ein kompletter LOG auch zum Firmata, das ich jetzt auch auf Verbvose 5 gestellt hab.
2019.02.08 08:00:21 3: NanoExpander: failure in message from FIRMATA
2019.02.08 08:00:21 1: PERL WARNING: Argument "0 0" isn't numeric in sprintf at ./FHEM/52_I2C_MCP23017.pm line 416.
2019.02.08 08:00:21 3: Direction: i2cread I2Caddress: 0x20 Register: 0x12 Data: undef received: 0x00
2019.02.08 10:24:43 1: RMDIR: ./restoreDir/save/2019-01-02
2019.02.08 10:25:11 5: FIRMATA FRM:>f076200812000200f7
2019.02.08 10:25:11 5: FIRMATA FRM:<f0714900320043003a00200054006f006f002000660065007700200062007900740065007300200072006500630065006900760065006400f7f07720001200000000
2019.02.08 10:25:11 3: received String_data: I2C: Too few bytes received
2019.02.08 10:25:11 5: FIRMATA FRM:<00f7
2019.02.08 10:25:11 5: onI2CMessage address: '32', register: '18' data: [0,0]
2019.02.08 10:25:11 3: NanoExpander: failure in message from FIRMATA
2019.02.08 10:25:11 3: Direction: i2cread I2Caddress: 0x20 Register: 0x12 Data: undef received: 0x00
2019.02.08 10:28:12 5: FIRMATA FRM:>f076200812000200f7
2019.02.08 10:28:12 5: FIRMATA FRM:<f0714900320043003a00200054006f006f002000660065007700200062007900740065007300200072006500630065006900760065006400f7f0772000120000000000f7
2019.02.08 10:28:12 3: received String_data: I2C: Too few bytes received
2019.02.08 10:28:12 5: onI2CMessage address: '32', register: '18' data: [0,0]
2019.02.08 10:28:12 3: NanoExpander: failure in message from FIRMATA
2019.02.08 10:28:12 3: Direction: i2cread I2Caddress: 0x20 Register: 0x12 Data: undef received: 0x00
Summende Grüße
Ingo

jensb

@R1F800

Das Log sagt meiner Ansicht nach folgendes:

Zitat2019.02.08 08:00:21 1: PERL WARNING: Argument "0 0" isn't numeric in sprintf at ./FHEM/52_I2C_MCP23017.pm line 416.
Mögliches Implementierungsproblem im Modul 52_I2C_MCP23017, könnte Folgefehler verursachen, sollte auch untersucht werden.

Zitat2019.02.08 10:25:11 5: FIRMATA FRM:>f076200812000200f7
F0=START_SYSEX, 76=I2C_REQUEST, 20=I2C-Adresse, 08=periodisches Lesen (benötigt FRM-Attribut sampling-interval), 12000200=Payload, F7=END_SYSEX

Die Antwort müsste nun mit >f077 beginnen (77=I2C_REPLY) und sich unaufgefordert periodisch wiederholen. Statt dessen kommt:
Zitat2019.02.08 10:25:11 5: FIRMATA FRM:<f0714900320043003a00200054006f006f002000660065007700200062007900740065007300200072006500630065006900760065006400f7f07720001200000000
und das ist identisch mit dem Text "I2C: Too few bytes received". Diese Meldung erzeugt das Firmata-Device, wenn es ein I2C-Read absetzt, aber keine oder nur eine unverständliche Antwort erhält.

Ich kenne mich mit dem MCP23017 nicht aus, aber es gibt ein paar I2C-Devices (z.B. MMA845X), die nur in einem besonderen I2C-Write/Read-Modus Daten ausspucken. Dieser Modus wird unter den Namen "repeated start" und "combined write/read" geführt und er müsste im Datenblatt beschrieben sein, wenn er gebraucht wird. Jedenfalls wäre dafür die Firmata Firmware zu patchen, denn es gibt dafür keine Einstellmöglichkeit über FRM. Habe das Datenblatt überflogen, konnte aber keinen Hinweis finden, es müsste also ein normales Write/Read reichen.

Das FRM-Attribut i2c-config sollte hier keinen großen Einfluss haben, da FRM ja nur einmal das Lesen startet, der Rest wird vom Firmata-Device autonom durchgeführt, es gibt also keine Mehrfachkommandos vom FHEM an Firmata.

Aber ist das FRM-Attribut "sampling-interval" gesetzt? Wenn nicht, wäre das eine mögliche Erklärung, warum keine Daten zurück kommen.

Im Datenblatt zeigt Abbildung 3.4 die I2C-Hardware-Addresskonfiguration. Die 3 Eingangspins A0-A2 sollten mit GND verbunden werden, damit man sicher 0x20 als Adresse bekommt.

Ansonsten kann ich mich nur der Vermutung von Klaus anschließen, dass der MCP23017 nichts zurück liefert.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

R1F800

Hallo,

ich habe jetzt einmal das sampling interval auf 30000 gesetzt, aber es tritt keine Besserung ein.

Wie gesagt am I2C des nano hängt ein LCD das prima funktioniert.
Normale FRM IN und OUT klappen auch super ... nur der MCP nicht.

Ich werde jetzt mal schauen, ob mein Steckbrett eine Macke hat ... ansonsten bin ich grad echt ratlos
Summende Grüße
Ingo