Modul für I2C 16Kanal 12bit PWM Controller PCA9685

Begonnen von klausw, 15 Dezember 2015, 23:48:17

Vorheriges Thema - Nächstes Thema

klausw

Hallo zusammen,

anbei die erste Version des Moduls zur Ansteuerung des PCA9685.

Wichtig: ein i2cdetect auf dem Raspberry wird 2 Adressen anzeigen. Die 0x70 ist die Allcalladdress. Diese nicht verwenden, da sie beim initialisieren deaktiviert wird.
Commandref ist am Modulende vorhanden.

EDID: Modul wird jetzt bei Update mit ausgeliefert
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

Aprikose

Das ist schonmal eine große Erleichterung
Danke dir für die Mühe , hoffe ich komme vor Weihnachten noch dazu etwas zu machen

Gruß Aprikose

Joe4630

Hallo Klaus,
ich war sehr erfreut Dein Modul für den PCA9685 hier zu finden. Ich habe diesen auch bei mir im Einsatz und mit Deinem Modul getestet. Soweit läuft alles auf Anhieb. Allerdings baue ich mir auch gerade noch etwas Perepherie für LED-Ansteuerungen dran, weswegen ich noch nicht umfangreich testen konnte.
Was mir bisher auffiel:
- In FHEM ganz oben bei dem "set > Portxx" Befehl kann ich keine Werte eingeben. Dort ist nur eine 0 im roten Rand zu sehen. Vielleicht mache ich auch etwas falsch. Im "and FHEM" funktioniert alles mit den Schiebreglern.
- Sehr wünschenswert wäre eine Skalierung über den ganzen PWM-Bereich. Alle eingegebenen Werte entsprechen ja direkt dem PWM-Verhältnis. So verändert sich die Helligkeit der LED's in meinem Fall im unteren Bereich (so 0 - ca 200) recht stark. Gerne hätte ich einen etwas feiner abstufbaren "fast ganz aus" Bereich. (Nachtlicht, haben ja 12 Bit Auflösung). Denkbar wäre vielleicht eine folgende Konfiguration mit 5 Stützstellen.

Wert an PCA9685
   Y4  |                                                         x
         |
         |                                             
  Y3   |                                                x
         |                                 
         |                                   
  Y2   |                                     x
  Y2   |                         x
  Y1   |______x_____________________________Sollwert
         0       20%      40%     60%     80%     100%   

Also Sollwertvorgaben zwischen 0-20% werden umgerechnet in Werte zum Controller 0-Y1
                                             20-40%                                                                  Y1-Y2 usw.

Ich werde die Tage noch weiter testen und Rückmeldung geben.

Aber nochmals vielen Dank für Deine gute Arbeit!

Viele Grüße
Joe


Joe4630

Jetzt habe ich auch die Funktion des Sliders entdeckt.. Hatte ich noch nie benutzt.
Also der erste Punkt mit der rot umrandeten Zahl hat sich erledigt.. ;-)

klausw

Zitat von: Joe4630 am 29 Dezember 2015, 02:05:41
Jetzt habe ich auch die Funktion des Sliders entdeckt.. Hatte ich noch nie benutzt.
Also der erste Punkt mit der rot umrandeten Zahl hat sich erledigt.. ;-)

Das war auch deine einzige Frage, oder? ;)

Allerdings verstehe ich nicht, wo der Slider bei dir war. Der wird doch bei den Ports immer angezeigt
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

Joe4630

Der Slider war ja da, die viereckig umrandede Zahl habe ich nur nicht als diesen erkannt.. :-[

Das war die einzige Frage, jedoch ergeben sich leider immer wieder welche.
Gestern habe ich versucht eine Funktion zu finden die ein langsames Dimmen ermöglicht. Also von 0 auf 100% in bsp. 2 Sekunden. In den Beiträgen konnte ich zwar einige Anregungen finden, jedoch bezogen sich diese immer auf fertige Dimmer, die dieses langsame Dimmen in Ihrer Firmware ermöglichen. Also nicht FHEM den Dimmwert selbst kontinuierlich verändert.

Gibt es in FHEM die Möglichkeit einen Wert kontinuierlich zu verändern? Oder muss ich mir da selbst was bauen? (Schleifen oder ähnliches)

Der andere Punkt war nur ein Wunsch. ;)
Vielen Dank!

klausw

Zitat von: Joe4630 am 29 Dezember 2015, 21:26:38
Gestern habe ich versucht eine Funktion zu finden die ein langsames Dimmen ermöglicht. Also von 0 auf 100% in bsp. 2 Sekunden. In den Beiträgen konnte ich zwar einige Anregungen finden, jedoch bezogen sich diese immer auf fertige Dimmer, die dieses langsame Dimmen in Ihrer Firmware ermöglichen. Also nicht FHEM den Dimmwert selbst kontinuierlich verändert.

Gibt es in FHEM die Möglichkeit einen Wert kontinuierlich zu verändern? Oder muss ich mir da selbst was bauen? (Schleifen oder ähnliches)
Da müsstest du selbst etwas bauen. Mit Timer und so...
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

Aprikose

#7
Leider habe ich den PCA9685 mit Firmata nicht zum laufen bekommen.


# Disable this to avoid looking for new USB devices on startup
define FIRMATA FRM 3030 [global]
attr FIRMATA alias Firmata-Controller
attr FIRMATA i2c-config 1
#
define relayout FRM_OUT 6
attr relayout IODev FIRMATA
attr relayout stateFormat value
#
define i2c RPII2C 1
#
#define frmi2c FRM_I2C 0x40 0 7
#attr frmi2c IODev FIRMATA
#
define dimmer I2C_PCA9685 0x40
attr dimmer IODev FIRMATA
set dimmer Port00 on


Habs auch mit FRM_i2c probiert scheint nicht zu klappen ich weiß nicht weiter, normal müsste ich doch dem RPII2C erst klar machen, dass er die I2C Adresse via FIRMATA Adresse 0x40 anspricht.

Ich musste die 1 setzen weil ich sonst ne Fehlermeldung bekam.
Hoffe mal dass hier jemand weiter weiß ....


Internals:
   DEF        0x40
   FIRMATA_SENDSTAT Ok
   I2C_Address 64
   IODev      FIRMATA
   NAME       dimmer
   NR         29
   STATE      Ok
   TYPE       I2C_PCA9685
   Readings:
     2016-01-03 17:20:27   state           Ok
   Confregs:
Attributes:
   IODev      FIRMATA




2016.01.03 17:20:27 3: received String_data: I2C: Too few bytes received
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x44, Inhalt: 227
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x43, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x42, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x41, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x40, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x3F, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x3E, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x3D, Inhalt: 0
2016.01.03 17:20:27 1: dimmer UpdReadings Start Register: 0x3C, Inhalt: 0

klausw

Zitat von: Aprikose am 03 Januar 2016, 17:19:34
Leider habe ich den PCA9685 mit Firmata nicht zum laufen bekommen.

Firmata bin ich der falsche Ansprechpartner.
Damit habe ich mich noch nicht befasst, nur ein bisschen was mitbekommen.

Zitat von: Aprikose am 03 Januar 2016, 17:19:34
Habs auch mit FRM_i2c probiert scheint nicht zu klappen ich weiß nicht weiter, normal müsste ich doch dem RPII2C erst klar machen, dass er die I2C Adresse via FIRMATA Adresse 0x40 anspricht.

FRM_i2c ist nur für das senden von I2C Rohdaten gut. Es benötigt auch ein funktionierendes FRM Modul als physikalische Schnittstelle.

Zitat von: Aprikose am 03 Januar 2016, 17:19:34

# Disable this to avoid looking for new USB devices on startup
define FIRMATA FRM 3030 [global]
attr FIRMATA alias Firmata-Controller
attr FIRMATA i2c-config 1
#
define relayout FRM_OUT 6
attr relayout IODev FIRMATA
attr relayout stateFormat value
#
define i2c RPII2C 1
#
#define frmi2c FRM_I2C 0x40 0 7
#attr frmi2c IODev FIRMATA
#
define dimmer I2C_PCA9685 0x40
attr dimmer IODev FIRMATA
set dimmer Port00 on


Wenn ich die Befehle so sehe vermute ich, das du mit FRM bisher noch nix gemacht hast ;)
RPII2C benötigst du nur, wenn du den PCA9685 direkt an den Raspberry anschließt. (ist aber nicht der Grund das es nicht läuft)

Funktioniert dein relayout?

Ist I2C in Firmata mit reincompiliert worden?
Dann müsste es auch möglich sein über frmi2c I2C Befehle zu senden.

Es kann durchaus sein, das im Modul noch ein Fehler im Zusammenhang mit FRM ist.
Aber zuerst sollten wir sicherstellen, das der I2C vom FRM fehlerfrei läuft.
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

Aprikose

Zitat von: klausw am 04 Januar 2016, 10:22:14
Funktioniert dein relayout?

Ist I2C in Firmata mit reincompiliert worden?
Dann müsste es auch möglich sein über frmi2c I2C Befehle zu senden.

Es kann durchaus sein, das im Modul noch ein Fehler im Zusammenhang mit FRM ist.
Aber zuerst sollten wir sicherstellen, das der I2C vom FRM fehlerfrei läuft.

Relayout läuft ohne Probleme.
Mit reincompiliert meinst du,  den Sketch bevor ich etwas ändern tue und hochlade, einmal compilieren oder wie soll ich das verstehen ?

Werde zusehen dass ich mal frmi2c teste und Befehle sende ......

klausw

Zitat von: Aprikose am 04 Januar 2016, 10:37:48
Relayout läuft ohne Probleme.
Mit reincompiliert meinst du,  den Sketch bevor ich etwas ändern tue und hochlade, einmal compilieren oder wie soll ich das verstehen ?
Ich wollte wissen, ob I2C auch im Sketch eingebaut ist. Was ich so mitbekommen habe, ist das nicht der Standard.

Zitat von: Aprikose am 04 Januar 2016, 10:37:48
Werde zusehen dass ich mal frmi2c teste und Befehle sende ......
define frmi2c FRM_I2C 0x40 0 7

ist gar nicht so verkehrt, damit liest du die Config Register aus (0..5)
scheinbar gibt es noch einen sampling-intervall, der gesetzt werden muss
Allerdings kannst du mit FRM_I2C nur Daten vom I2C lesen!

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

Aprikose

bekomme via frm_i2c jetzt folgendes:


Internals:
   DEF        0x40 0 7
   IODev      FIRMATA
   NAME       frmi2c
   NR         22
   STATE      active
   TYPE       FRM_I2C
   i2c-address 0x40
   i2c-bytestoread 7
   i2c-register 0
   Readings:
     2016-01-04 11:17:42   values          13 13 13 13 13 13 13 0 0 0 16 0 0 0 0 0 0 0 50 11 0 0 0
Attributes:
   IODev      FIRMATA
   event-min-interval 5



Wie du schon gesagt hast, frm_i2c liest nur.

klausw

Zitat von: Aprikose am 04 Januar 2016, 11:21:07

   Readings:
     2016-01-04 11:17:42   values          13 13 13 13 13 13 13 0 0 0 16 0 0 0 0 0 0 0 50 11 0 0 0

Also bis 7 kann ich noch zählen  8)
Wieso stehen da 22 Werte?

Power up Defaults Hexwert (Dezimalwert):
Register 0: 11 (17)
Register 1: 4 (4)
Register 2: E2 (226)
Register 3: E4 (228)
Register 4: E8 (232)
Register 5: E0 (224)
Register 6: 0
Register 7: 0
Register 8: 0
Register 9: 10 (16)
Die Werte von den Registern 6-9 wiederholen sich bei den nachfolgenden Registern (insgesamt 16x entsprechend der Ports)

Mit 0x40 0 21 müsstest du also die configregister und 4 Ports (also 4x "0 0 0 16" bzw. "0 0 0 10" bekommen)
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

hanske

Kurze Rückmeldung zum neuen Modul.

Funktioniert bei mir prima. Habe es an die FHEM PID20 Regler gehängt und wollte dann damit meine Fußbodenheizung steuern.
Bisher sind nur LEDs dran, aber die tun das was sie sollen.
Vielen Dank, kann ich gut gebrauchen

Das Einzige was nervt sind die logs.
Mein FHEM log wird nach jedem set Portxx mit den Inhalten der Register "vollgemüllt":
2016.01.08 15:11:36 1: i2c_fbh1 UpdReadings Start Register: 0x44, Inhalt: 0
2016.01.08 15:11:36 1: i2c_fbh1 UpdReadings Start Register: 0x43, Inhalt: 0
2016.01.08 15:11:36 1: i2c_fbh1 UpdReadings Start Register: 0x42, Inhalt: 0
2016.01.08 15:11:36 1: i2c_fbh1 UpdReadings Start Register: 0x41, Inhalt: 16
2016.01.08 15:11:36 1: i2c_fbh1 UpdReadings Start Register: 0x40, Inhalt: 0
.
.
.


Das habe ich jetzt mit verbose 0 abgestellt.
Geht das auch eleganter weg?
Raspberry Pi (Wheezy), Aeon Labs Z-Wave USB Stick 2, HM-USB Adapter, EBUS 2.0 mit Wemos
diverse HM und Z-Wave Geräte

thymjan

#14
Hallo Klaus,

Mache mich momentan mit dem PCA9685-Modul vertraut. Habe es direkt am I2C vom Raspi hängen. Die default-Adresse habe ich von 0x40 per Lötpunkt auf 0x41 eingestellt, der HTU21D-F hat die 0x40 für sich beansprucht.

Mit define PWM I2C_PCA9685 0x41 und Einstellen des IODev wird das Modul gefunden und die Einstellungen der 16 Kanäle angezeigt.

Muss gestehen, mir fehlen im folgenden etwas die Grundlagen. LEDs habe ich zum testen zwischen PWM und V+ angeschlossen (gibt es einen besseren Weg?).
Die kann ich jetzt je nach Einstellung dimmen bzw. ein- und ausschalten.

Wenn ich mit prescale die Frequenz verändere, zeigen die LEDs vorübergehend nicht den zuvor eingestellte Wert an. Erst wenn eine weitere Konfiguration eines Eingangs erfolgt ist die Helligkeit wieder so wie eingestellt. Ist das so gewollt?
Bei den Internals ist auch vor dem Frequenzwert noch ein 0x davor.

Mal abgesehen von der Sinnfrage - wollte ich zum Spielen noch einen Servo dranhängen. Hast Du mir da nen Tip wie ich da anfangen kann?

Aber erst mal Danke für Deine Arbeit!

Grüße,
Stefan