I2C Portextender und PWM IC und physical. Modul für I2C Zugriff mit dem RasPi

Begonnen von klausw, 18 Februar 2014, 23:46:08

Vorheriges Thema - Nächstes Thema

klausw

Ist mittlerweile im SVN und kann per update installiert werden

Hallo zusammen,

ich habe mich mal hingesetzt und einn two level approach für den I2C Zugriff geschrieben.

Das Modul RPII2C ermöglicht den Zugriff auf den I2C Bus des RaspberryPi. Es sollte aber auch mit jedem Linux System, das zugriff auf den I2C über /dev/i2c-x bietet (BeagleBone und Cubieboard, etc.) funktionieren.

Die Module I2C_PCA9532 und I2C_PCF8574 bilden die Funktionen der jeweiligen IC's nach. Sie kommunizieren über das Modul RPII2C mit dem jeweiligen IC. Vorteil dieses Aufbaus ist, das für eine andere Hardware. z.B. das BeagleBone nur eine ein Modul (eine BBB Version des RPII2C) geschrieben werden muss und sofort sämtliche verfügbare I2C Module verwendbar sind.

RPII2C
Vorbereitung:

Für I2C grundsätzlich:

Pakete installieren
sudo apt-get install libi2c-dev i2c-tools build-essential

/etc/modules öffnen
sudo nano /etc/modules
folgende Zeilen einfügen
i2c-dev
i2c-bcm2708


/etc/modprobe.d/raspi-blacklist.conf  öffnen
sudo nano /etc/modprobe.d/raspi-blacklist.conf
folgende Zeile auskommentieren oder löschen
blacklist i2c-bcm2708

RPII2C benötigt das gpio Tool von wiringpi:
für andere Systeme (BeagleBone, etc.) oder alternativ für das Raspberry kann auch auf WiringPi verzichtet werden. In diesem Fall müssen die Dateien /dev/i2c-x Schreib-/Leserechte, für den User unter dem FHEM läuft, gesetzt bekommen. z.B. in der etc/init.d/fhem

und die Device::SMBus Bibliothek:

  • sudo cpan -i  Device::SMBus (dauert recht lang)

Neustart

Nun kann mit define <name> RPII2C 0|1 das Modul initialisiert werden. 0|1 entspricht dem I2C-Bus den man nutzen möchte.

Im Modul selbst kann man auch direkt I2C IC's beschreiben und auslesen:
get <name> read <i2cadresse>  [<register> [<nreg>]]
also get name read 8A 02 4 liest die Register 02 - 05 aus

set <name> writeByte <i2cadresse> <byte>
set <name> writeByteReg <i2cadresse> <register> <byte>
set <name> writeBlock <i2cadresse> <register> <byte> [<byte>...]



  • <i2cadresse>: I2C Adresse
  • <register>: Adresse des Registers, optional (mache IC's haben keine adressierbaren Register)
  • <nreg>: Anzahl der Register, die augelesen werden sollen, beginnend bei <register>
  • <byte>: Hexwert, der geschrieben werden soll

I2C_PCA9532/PCF8574

Danach können die anderen Module initialisiert werden:

define <name> I2C_.... <i2cadresse>

beide Module werden beim aufrufen in FHEMweb automatisch aktualisiert
die sets lassen sich über dropdown menüs auswählen

Module aktualisiert 28.2. (writeBlock schreibt nun auch Blockweise)
Beschreibung vervollständigt

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

MdeJong

Hallo,

Danke... Das ist genau das Modul was ich brauche.

Ich habe das Modul runter geladen, und alles installiert (das sudo cpan -i  Device::SMBus  hat viel zeit gekostet).

Kann es sein das "set i2c_bus writeBlock 40 05 03 80 80 80" nicht geht?

Grüße Mark,

klausw

was kommt denn für eine Fehlermeldung?

vielleicht sollte ich etwas weiter ausholen:
hast du den I2C Bus schon in Betrieb genommen?
also läuft i2cget / i2cset?
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

Puschel74

Hallo,

ZitatIch habe das Modul runter geladen,
Und auch in FHEM geladen?

reload 00_RPII2C
oder fhem neu starten erledigt das.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

MdeJong

Hallo,

Zitat von: klausw am 22 Februar 2014, 17:10:40
was kommt denn für eine Fehlermeldung?
Ich bekomme keinen fehler Meldung, auch steht nicht im Log file.

Zitat von: klausw am 22 Februar 2014, 17:10:40
vielleicht sollte ich etwas weiter ausholen:
hast du den I2C Bus schon in Betrieb genommen?
also läuft i2cget / i2cset?

Der I2c bus funktioniert, auch das device.

mit "sudo i2cset 0 0x44 0x05 0x03 0x80 0x80 0x80" funktioniert es auch, wie gewollt.

Grüße Mark,

klausw

Zitat von: MdeJong am 22 Februar 2014, 16:50:38
Kann es sein das "set i2c_bus writeBlock 40 05 03 80 80 80" nicht geht?

Zitat von: MdeJong am 22 Februar 2014, 18:52:17
mit "sudo i2cset 0 0x44 0x05 0x03 0x80 0x80 0x80" funktioniert es auch, wie gewollt.

ist das nur ein Tippfehler hier oder hast Du die falsche I2C Adresse eingegeben?

was steht im STATE nachdem Du set genutzt hast?
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

MdeJong

#6
Hallo,

Das ist kein Tippfehler, ich habe 5 gleiche Module am I2C Bus hängen jedes mit eine andere I2C Slave Adresse (0x40..0x44).

Der State ist vor dem Kommando Ok und auch danach Ok.

Sollte für das schreiben von einen Array nicht die funktion writeBlockData benutzt werden?

Grüße Mark,

klausw

Schade eigentlich ;)

Hast du am Ende neu gestartet?

writeBlockData hatte bei meinen Tests max. 4 Byte geschrieben.

bei set <name> writeBlock 40 05 03 80 80 80 wird auf I2C Adresse 0x40 als aufeinanderfolgende Byteoperationen:

  • in Register 0x05 ver Wert 0x03 geschrieben
  • in Register 0x06 ver Wert 0x80 geschrieben
  • in Register 0x07 ver Wert 0x80 geschrieben
  • in Register 0x08 ver Wert 0x80 geschrieben

hast du mal das lesen probiert, geht das?

stelle attr verbose mal auf 5 und schaue, was im log kommt

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

MdeJong

Hallo,

das ist genau das Problem, die Register werden einzeln, jedes Register wird separate addressiert:

<Start> <Slave Adresse> <Register Adresse> <Data Byte1> <Stop>
<Start> <Slave Adresse> <Register Adresse+1> <Data Byte2> <Stop>
<Start> <Slave Adresse> <Register Adresse+2> <Data Byte3> <Stop>
<Start> <Slave Adresse> <Register Adresse+3> <Data Byte4> <Stop>

was ich brauche ist:

<Start> <Slave Adresse> <Register Adresse> <Data Byte1> <Data Byte2> <Data Byte3> <Data Byte4> <Stop>

Viele I2C Slave Devices inkrementierten die Register Adresse nach jedes empfangene data Byte.

Grüße Mark,

klausw


writeBlockData ließe sich sicher noch einbauen.

allerdings sollte doch eigentlich beides funktionieren
also blockweises schreiben und auch byteweise ... das byteweise dauert etwas länger, da jedesmal eine neue Adresse übertragen wird aber so groß sind die Datenraten ja nicht.
Ob das I2C Device incrementiert oder der Registerpointer immer wieder neu gesetzt wird sollte eigentlich egal sein.

Oder übersehe ich was?
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

klausw

Testversionen

writeBlock wird als writeBlockData ausgeführt (funktioniert also nur, wenn der I2C IC die Registeradresse selbstständig nach jedem geschiebenen Byte erhöht)

und noch einiges in der Modulkommunikation

edit: aktuelle module im ersten post
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

MdeJong

Hallo Klaus,

Cool, ich habe gerade 00_RPII2C.pm getestet und es funktioniert.

Ich kann jetzt mit meine MODPWM Module kommunizieren.

Grüße Mark,

klausw

habe mal Dirks Drucksensormodul auf die schnelle so umgebaut, das es mit 00_RPII2C.pm funktioniert

dieses Modul funktioniert ausschließlich mit 00_RPII2C.pm

einbinden mit define <name> I2C_BMP180

Das Modul 51_I2C_BMP180.pm muss vor Nutzung gelöscht werden.
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

Mitch

Hi Klaus,

habe es jetzt geschafft, die Bibliothek zu installieren.
Habe dann Dein Modul installiert und mal zwei Devices definiert (beide Channel).
Leider zeigen mir beide ERROR an und wenn ich mit read 0x40 den SHT21 auslesen will, kommt FFFFFFFFFFFFFFFF transmission: error

Was mach ich denn falsch?

Das kleine Programm vom Hersteller läuft, also funktioniert der SHT21
FHEM im Proxmox Container

klausw

Du musst auch die Registeradresse angeben, von der Du lesen möchtest.
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