Python zu Arduino Verständnisproblem (i2c, DPS-1200FB)

ts7622

Ensign
Registriert
Aug. 2012
Beiträge
237
Gute Abend zusammen,

ich habe da ein kleines Problem bei einem aktuellen Projekt an dem ich sitze. Ich habe zwei DPS-1200FB Netzteile von HP und drei Ladegeräte in einer hübschen Kiste gebastelt und möchte dem Ganzen noch ein OLED-Display verpassen um interessante Informationen und Diagramme anzuzeigen. Glücklicherweise hat sich jemand auf GitHub (https://github.com/raplin/DPS-1200FB) die Mühe gemacht Daten wie Verbrauch, Eingangsspannung, Ausgangsspannung, Temperatur usw. aus den Netzteilen mittels i2c auszulesen und sein Ergebnis als Python Code veröffentlicht. Da ich mit i2c für Arduino bislang eher wenig und mit Python gar keine Erfahrung gemacht habe benötige ich Hilfe von Profis.

Die i2c-Verbindung besteht und mit ein paar Zeilen Code habe ich zwei Geräte gefunden. Einmal der EEPROM und die CPU unter Adresse 0x5F (wie beschrieben). Hier ein paar Zeilen, die was mit der Kommunikation der Geräte zutun haben.

C:
#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println("start");
}

void loop()
{
  Wire.beginTransmission(0x5F); // 0x5F = CPU Adresse
  Wire.write(0x07); // 0x07 = Ausgangsspannung
  Wire.requestFrom(0x5F,1);

  String content;
  while(Wire.available()){
    content += String(Wire.read());
  }
  Serial.println("Antwort:" + content);

  Wire.endTransmission();
  delay(500);
}

Das Problem hier wird das Wire.write() sein, den 0x07 ist zwar die korrekte Registrierung jedoch wird im Python Code noch mehr gemacht. Der Autor schreibt bei Zeile 119 (https://github.com/raplin/DPS-1200F...3a8ef3e5eaf4ecc6ad629d7c6b/DPS-1200FB.py#L119) was von einer Checksum die zwingend benötigt wird damit das Netzteil antwortet. Und genau an dieser Stelle habe ich vergebens über drei Stunden verbraten.

Python:
cs=reg+(self.address<<1)
reg wäre 0x07 (für Ausgangsspannung) und address 0x5F (CPU). In wie fern wird hier was addiert? Ich habe hier zwei Hexadezimal die addiert werden wobei address noch um 1 geshiftet wird?

Python:
regCS=((0xff-cs)+1)&0xff
Und wie lässt sich speziell der letzte Teil der Zeile (die 'checksum') in Arduino darstellen?

Tut mir leid, ich komme von den Web- und App-Entwicklern die sich eher weniger mit solchen Rechnungen auseinandersetzen müssen. :/

Gruß,
ts7622

Update:
Hat sich erledigt. Kann also weg.
 
Zuletzt bearbeitet:
Zurück
Oben