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

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

Vorheriges Thema - Nächstes Thema

klausw

Zitat von: ntruchsess am 26 Januar 2016, 10:41:18
Ich denke, das man den Puffer nicht lieber ins physische Modul (also ins FRM) packen sollte. Also in dem Sinn: logisches Modul kann beliebige Zahl von Bytes schreiben bzw. das Lesen anfordern - das physische Modul abstrahiert das und puffert die Lese bzw. Schreibvorgänge selbsttätig ab.
Das wäre natürlich die Ideallösung. Ich habe das auch eher als Notlösung eingebaut.
Könntest du dich der Sache annehmen. Du hast den besseren Überblick  :)

Zum I2C write Vorgang bei FRM habe ich noch eine Frage:
Wird der Schreibbefehl vom FRM Quittiert? Egal ob positiv oder negativ
Wenn ja würde ich diese gern zum Readings Update nutzen.
Derzeit muss ich nach dem Schreiben der I2C Register diese wieder zurücklesen um deren Status zu bekommen.
Das erzeugt Traffic und Verzögert das ReadingsUpdate.
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

ntruchsess

nein, wird nicht expliziet quittiert. Liegt auch daran, dass die I2C (Wire)-library des Arduinos keine Fehlerbehandlung vorgesehen hat. Schreiben erfolgt quasi 'auf gut Glück'. Beim Lesen gibt es Fehlermeldungen, wenn über die Wire-library eine andere Anzahl von Bytes ankommt, als vorher angefordert, aber auch diese Fehlermeldung landet FRM-seitig nur im Log und wird nicht weiter ausgewertet.
while (!asleep()) {sheep++};

thymjan

#47
$Id: 52_I2C_PCA9685.pm 10638 2016-01-26 00:11:07Z klauswitt $

8)

Funktioniert mit Ethernet ConfigurableFirmata V_2_06 + ArduinoNano mit
define PWM I2C_PCA9685 0x41 31
attr PWM IODev FRM_1
attr PWM modereg2 INVRT   # fuer LEDs mit Vorwiderstand an PWM und V+ (5V)
attr PWM prescale 255


Die Readings werden nicht immer konsequent nach set aktualisiert (vor allem bei set all in den höheren Kanälen).
Bei einem Reload wird aber das letzte Setting dann richtig angezeigt.

Ab 32 Byte gibt's dann mit dieser Konfiguration Schluckauf im Log mit "set PWM all XX".


thymjan

#48
Jetzt hab ich doch noch was zum nörgeln:

Beim shutdown restart gibts noch den Fehler
Use of uninitialized value in concatenation (.) or string at ./FHEM/52_I2C_PCA9685.pm line 218, <$fh> line 329.

und es wird noch nicht gewartet bis die Kommunikation zwischen FRM und Firmata steht.
Daher läuft die Initialisierung nicht sauber durch. Die Readings stimmen dann nicht unbedingt mit dem aktuellen Stand der Ports überein.

Das Problem bestand beim TSL2561 auch. Jens hat da irgendwo rumgeschraubt. Beim Überfliegen des Programmtextes vom TSL konnte ich die Stelle aber noch nicht ausfindig machen.

klausw

Zitat von: thymjan am 26 Januar 2016, 21:47:22
Funktioniert mit ConfigurableFirmata V_2_06 + ArduinoNano

LAN oder USB?

Zitat von: thymjan am 26 Januar 2016, 21:47:22
define PWM I2C_PCA9685 0x41 31


kannst du ruhig weglassen
Standard ist 30 und es werden sowieso nur vielfache von 4 gesendet (1 Port hat 4 Byte und wenn die nicht am Stück beschrieben werden dann flackert/wackelt die/der LED/Servo)

Zitat von: thymjan am 26 Januar 2016, 21:47:22
Die Readings werden nicht immer konsequent nach set aktualisiert (vor allem bei set all in den höheren Kanälen).
Bei einem Reload wird aber das letzte Setting dann richtig angezeigt.

Das liegt an der Kombination von Refresh der Seite und eintrudeln der Daten.
Liegt auch daran, das alle Register über FRM nach dem schreiben nochmal zurückgelesen werden müssen.
Mache die Detailseite ein zweites mal auf. Diese wir ja beim set nicht neu geladen und dort kommen die Readings korrekt an.
Habe keine Lösungsidee dafür. Allerdings wird man den PCA sicher eher im Zusammenhang mit readingsProxy und so nutzen.

Zitat von: thymjan am 26 Januar 2016, 21:47:22
Ab 32 Byte gibt's dann mit dieser Konfiguration Schluckauf im Log mit "set PWM all XX".

kennen wir ja schon, das FRM dann anfängt zu husten ;)

Zitat von: thymjan am 26 Januar 2016, 22:17:52
Beim shutdown restart gibts noch den Fehler
Use of uninitialized value in concatenation (.) or string at ./FHEM/52_I2C_PCA9685.pm line 218, <$fh> line 329.
ah prescale habe ich nicht mehr getestet, ist eh nur in einer der nutzlosen LogZeilen ;)

In Zeile 218
$hash->{confregs}{PRESCALE}
durch
(defined($hash->{confregs}{PRESCALE}) ? $hash->{confregs}{PRESCALE} : "empty")
Dann sollte der Fehler weg sein. Wenns passt ändere ich das.

Zitat von: thymjan am 26 Januar 2016, 21:47:22
und es wird noch nicht gewartet bis die Kommunikation zwischen FRM und Firmata steht.
Daher läuft die Initialisierung nicht sauber durch. Die Readings stimmen dann nicht unbedingt mit dem aktuellen Stand der Ports überein.
Sollte aber so sein.
Bei Verbose 5 beginnt die Initialisierung im Log mit:
Init1 Konfigurationsregister auslesen
Das passt auch in deinem letzten Log.

Was vorher kommt hat nichts mit der Hardwareinitialisierung zu tun:
Die Wiederherstellungsmeldungen sind nur für die Readings da. Das ganze wird über fhem.pl aufgerufen (aus log/fhem.save werden die Readings, welche beim Shutdown gespeichert wurden, wieder geladen).
Auch die Attribute werden vor der Hardwareinitialisierung geladen. Auch über fhem.pl.
Beides ist auch ok so.

Zitat von: thymjan am 25 Januar 2016, 20:59:15
Hinterher stehen falsche Werte in den Readings. Ebenso werden Port_dXX-Readings erzeugt, obwohl an diesen Parametern gar nicht geschraubt wurde.

Naja, das sind die fehlerhaften Readings, die vom wirren FRM vor dem Reset gesendet wurden. Diese werden in der fhem.save gespeichert und, wenn nich anderes im attribut onrestart angegeben ist, beim starten wiedergergestellt.
einmal "set name all 0 0" ausführen und alles ist wieder in Ordnung.
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

thymjan

Mit der Änderung von Zeile 218 ist die Fehlermeldung dann weg.

Kleiner Nachtrag zu den Servos
Mit folgender Einstellung kann ich jetzt meine Servos im verfügbaren Winkelbereich steuern:
attr PWM prescale 121 # f = 50Hz
attr PWM modreg2 OUTDRV


Mit set PWM PortXX 130..550 beim analogen Servo und 161..528 beim digitalen kann ich jeweils den gewünschten Winkel anfahren.

klausw

hast du mit der LAN oder der USB Version getestet?
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

thymjan

Das mit der Fehlermeldung habe ich mit der Ethernet Firmata getestet.
Also Deine aktuelle Version ist jetzt Ethernet fit!


Die Servos habe ich mit der StandardFirmata über USB getestet.

klausw

Zitat von: thymjan am 27 Januar 2016, 23:23:00
Das mit der Fehlermeldung habe ich mit der Ethernet Firmata getestet.
Also Deine aktuelle Version ist jetzt Ethernet fit!

super dann kommt demnächst noch nen update wegen des Fehlers
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

projectsun

Hallo!

Habe das PCA9685 direkt am I2C des Pi hängen. Alles definiert, wird auch erkannt.


define i2c RPII2C 1
attr i2c alias Onboard I2C Controller 1
attr i2c room Aquarium

define PWM I2C_PCA9685 0x40
attr PWM IODev i2c
attr PWM room Aquarium


Ich kann Werte setzen, aber es gibt keine Veränderungen am Output. Nur wenn ich modereg2 Invrt setze, dann wird der Ausgang ausgeschalten.
Angeschlossen ist ein LED Stripe mit MOSFET.

Was kann das sein? Ist das Chinateil hin?  :)
Zentrale Ubuntu, Rpi B+ mit Busware 868 CUL ser2net, Rpi 2 an Aquarium mit DS18B20, und S0Counter, Rpi 3 mit nanoCUL 433 und 868 ser2net, 7x Revolt NC-5462, 1x miniCUL WLAN, 3x IT-1000, 6x ELRO AB440, KS300, EM1000-HSM, EM1000-WZ, FHT80B, 5x FHT8v2, 20x Nodemcu mit Sensoren, 6x Echo, Sonos

klausw

Zitat von: projectsun am 17 April 2016, 21:55:05
Ich kann Werte setzen, aber es gibt keine Veränderungen am Output. Nur wenn ich modereg2 Invrt setze, dann wird der Ausgang ausgeschalten.
Angeschlossen ist ein LED Stripe mit MOSFET.

Was kann das sein? Ist das Chinateil hin?  :)

Wenn eine Mosfet Treiberstufe angeschlossen wird sollte OUTDRV gesetzt werden.
Die Standardeinstellung der Ausgangsstufe ist Open Collector. Da ist es, je nach Schaltung schon möglich, das der FET durchgesteuert bleibt, wenn das Gate nicht entladen werden kann.
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

projectsun

#56
Hmm, OUTDRV hatte ich auch schon gesetzt. Da gab es auch keine Reaktion auf das verschieben der Regler. Der FET ist ein STP16NF06L.
Verkabelt wie hier:

https://blog.adafruit.com/2013/03/29/powering-an-analog-rgb-led-strip-with-the-pi-piday-raspberrypi-raspberry_pi

Vielleicht hilft das ja.
Zentrale Ubuntu, Rpi B+ mit Busware 868 CUL ser2net, Rpi 2 an Aquarium mit DS18B20, und S0Counter, Rpi 3 mit nanoCUL 433 und 868 ser2net, 7x Revolt NC-5462, 1x miniCUL WLAN, 3x IT-1000, 6x ELRO AB440, KS300, EM1000-HSM, EM1000-WZ, FHT80B, 5x FHT8v2, 20x Nodemcu mit Sensoren, 6x Echo, Sonos

klausw

Zitat von: projectsun am 18 April 2016, 20:21:52
Hmm, OUTDRV hatte ich auch schon gesetzt. Da gab es auch keine Reaktion auf das verschieben der Regler. Der FET ist ein STP16NF06L.
Verkabelt wie hier:

https://blog.adafruit.com/2013/03/29/powering-an-analog-rgb-led-strip-with-the-pi-piday-raspberrypi-raspberry_pi

Vielleicht hilft das ja.
Invert sollte, wie der Name schon sagt, nur die Logik invertieren.
An wird aus und die LEDs werden bei höherem Dimwert dunkler statt heller.

Ein Bug im Modul kann auch Möglich sein, halte ich aber für unwarscheinlich.

Was ist denn das genaue Fehlerbild?
Nutzt du auch den kompletten Dimbereich zum testen?
Hast du den OE Pin angeschlossen? Ohne den schaltet bei bestimmten Registerkonfigurationen nix.
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

projectsun

Ich habe den kompletten Dimmbereich versucht - nix. Kein dunkler, kein heller, kein Flackern. Den OE Pin habe ich nicht angeschlossen. Hatte keine Beispielverkabelung gesehen, wo dieser verwendet wird.
Zentrale Ubuntu, Rpi B+ mit Busware 868 CUL ser2net, Rpi 2 an Aquarium mit DS18B20, und S0Counter, Rpi 3 mit nanoCUL 433 und 868 ser2net, 7x Revolt NC-5462, 1x miniCUL WLAN, 3x IT-1000, 6x ELRO AB440, KS300, EM1000-HSM, EM1000-WZ, FHT80B, 5x FHT8v2, 20x Nodemcu mit Sensoren, 6x Echo, Sonos

thymjan

Habe das hier mal nachgestellt. Allerdings nicht direkt am Raspi, das PCA9685-Modul hängt am Standard-Firmata Nano. Und ich habe momentan kein MOSFET zur Hand sondern einen Transistor TIP120 mit 220Ohm Vorwiderstand an der Basis (https://learn.adafruit.com/rgb-led-strips/usage).

Bei modreg2 habe ich OUTDRV gesetzt.

Damit funktioniert's bei mir.

Hast Du mal statt MOSFET und Led-stripe eine LED direkt angeschlossen?

Kannst Du mal ein list PWM zeigen?