[gelöst] Hardware-Problem: I2C-Emulation an Robbe Ladegerät

Moin zusammen,
ich muss etwas ausholen, um das Problem zu erläutern - bitte entschuldigt!
Neben der Elektronik-Bastelei lasse ich noch mehr oder weniger kunstvoll zusammengeleimtes Balsaholz elektrisch angetrieben durch die Lüfte schweben. Zum Laden der Akkus verwende ich bisher Robbe Ladegeräte mit BID-Chips (Power Peak B7 und C8). BID anstecken = Der Lader kennt die Parameter, mit denen der Akku geladen werden muss.
Diese BID-Chips sind eigentlich nur ein 256 Byte EEPROMs und ich möchte die nun durch NFC-Tags ersetzen. So was in der Art ist hier bei rc-network beschrieben. Der Kollege verwendet allerdings einen Arduino ProMini 3,3 V, der ist ja schon ausgelaufen. Weil ich neben dem Leser auch noch ein (P)paar Taster und ein Display anschließen will, soll es bei mir ein 5V-Standard-Arduino (UNO oder vielleicht Leonardo) werden.
Das Problem:
Der Arduino soll als I2C-Slave das EEPROM für das Ladegerät simulieren - das funktioniert auch mit zwei Arduinos, aber nicht mit dem Robbe. Um das Ladegerät nicht zu schlachten, habe ich vorsichtshalber ein Optokoppler-IC (Analog Devices ADuM1250 [PDF]) dazwischen gebaut.
Bin bisher soweit vorgedrungen, dass ich feststellen konnte, dass Robbe die Pegel von CLK und DATA bei 3.3V hat, das EEPROM aber mit 5V versorgt. Damit will auch der Optokoppler nicht wirklich klarkommen.

Der Aufbau hängt als PNG an.

Ich habe auch schon versucht, die "Ladegeräte-Seite" des ADuM mit 3.3V vom Arduino zu versorgen; das hat aber nix gebracht.

Jemand eine Idee?

Gruß Walter

Wieso ausgelaufen ?
Als Clone bekommst du den noch hier !
Da hast du dann sicher keine Probleme.

Bin bisher soweit vorgedrungen, dass ich feststellen konnte, dass Robbe die Pegel von CLK und DATA bei 3.3V hat, das EEPROM aber mit 5V versorgt. Damit will auch der Optokoppler nicht wirklich klarkommen.

Nur mal so ins Blaue... versuchs mit einem Pegelwandler. zb.: 4-channel I2C-safe Bi-directional Logic Level Converter
lg dony

Danke Euch soweit!

Ich würde es vorziehen, nicht unbedingt einen Clone beim Chinesen kaufen zu müssen, aber natürlich ist das eine Option (und "gebookmarked").
Edit: Sehe gerade, dass es sowas ähnliches auch bei Watterott gibt.

Was den Level Shifter angeht: Meinen (fehlgeschlagenen) Versuch mit einem ebenfalls auf BSS138 FETs basierenden Modul von Watterott (Pegelwandler 4-Kanal) habe ich Euch unterschlagen. Der hat aber dasselbe Problem wie der optische: Er braucht von beiden Seiten die Versorgungsspannung als Referenz.

Ich habe auch schon versucht, die "Ladegeräte-Seite" des ADuM mit 3.3V vom Arduino zu versorgen; das hat aber nix gebracht.

In diesem Fall mußt Du auch die Massen zusammenschalten.

Ohne Sketch wie sollen wir Dir was sagen können???

Grüße Uwe

Wieso gibst Du 5V vom Ladegerät auf die BID Seite des Isolators wenn Du schreibst daß dieser 3,3V braucht??

Du hast ja recht - ich würde gerne weniger dranhängen.

Die BID-Stecker am Ladegerät haben 4 Pins: Vcc, SDA, SCL und GND - was das EEPROM auf den BID-Platinchen halt so braucht. Perverserweise ist Vcc bei beiden Ladegeräten nahe an 5V und die (mit Oszi nachgemessenen) Pegel auf SDA und SL haben nur 3.3V.

Masse zu verbinden habe ich bei dem Versuch mit dem LevelShifter gemacht - ohne Erfolg. Ergibt das bei der optischen Trennung wirklich Sinn?

Und hier ist der Sketch (der aber mit einem Arduino als Master und einem als Slave das tut was ich erwarte).

#include <Wire.h>
#include <EEPROM.h>
#include <string.h>


const uint8_t BID_CHIP_ADDRESS = 0x50;
int requestCount = 0;
int receiveCount = 0;
int oldRequestCount = 0;
int oldReceiveCount = 0;

byte muell;
byte bidAddress = 0;
byte bidData[256] = 
{
    0x01, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x64, 0x00,
    0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    
    0x01, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01, 0x01, 0x02, 0x01, 0x00, 0x64, 0x00,
    0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


void setup() 
{
    Serial.begin(9600); // begin serial communication
    while(!Serial)
    {
        ;
    }
    Serial.println(F("EEPROM CLIENT"));

    Wire.onReceive(receiveEvent);
    Wire.onRequest(requestEvent);
    Wire.begin(BID_CHIP_ADDRESS);
}

void loop() 
{
    if (Serial.available())
    {
        byte cmd = Serial.read();
        while(Serial.available())
        {
            muell = Serial.read();
        }
        switch (cmd)
        {
            case 'w':
                Serial.println("put data");
                EEPROM.put(0, bidData);
                break;
            case 'r':
                Serial.println("get data");
                EEPROM.get(0, bidData);
                break;
            case 'i':
                Serial.print("RQ ");
                Serial.print(requestCount);
                Serial.print("  -  RV ");
                Serial.println(receiveCount);
                break;
            default:
                break;
        }
    }
}

void receiveEvent(int numberOfBytes) 
{
    byte address;
    byte value;
    bool writeAccess = false;
    
    while (1 < Wire.available())
    {
        address = Wire.read();
        writeAccess = true;
        receiveCount++;
    }
    value = Wire.read();
    receiveCount++;
    if (writeAccess)
    {
        bidData[address] = value;
        bidAddress = address;
    }
    else
    {
        bidAddress = value;
    }
}

void requestEvent()
{
    Wire.write(bidData[bidAddress]);
    bidAddress++;
    requestCount++;
}

wno158:
Du hast ja recht - ich würde gerne weniger dranhängen.

Die BID-Stecker am Ladegerät haben 4 Pins: Vcc, SDA, SCL und GND - was das EEPROM auf den BID-Platinchen halt so braucht. Perverserweise ist Vcc bei beiden Ladegeräten nahe an 5V und die (mit Oszi nachgemessenen) Pegel auf SDA und SL haben nur 3.3V.

Also laß die Pullupwiderstände an der BID - Seite des Isolators weg.

Grüße Uwe

Hab hier nur kurz mitgelesen, aber nur mal zur Sicherheit: wenn Du nen Optokoppler dazwischen hast, dann wird der das Signal ja vermutlich invertieren (Open Collector und so). Haste das berücksichtigt?

Die Pullups auf der BID- (Lader-) Seite habe ich weggenommen, damit sehen die Signale trotz ziemlich fliegenden Aufbaus einigermaßen aus; Polarität stimmt auch. Anbei: Fotos der Clock-Leitung (habe leider nur noch einen Tastkopf gefunden) von BID- und Arduino-Seite.

Der Lader erkennt zwar die Emulation noch nicht als BID-Chip; das Ding feuert mit 333kHz Clockfrequenz. Mal schauen... (und einen 3.3V-Wattuino bestellen, kann ja immer mal nützlich sein).

Danke für Eure Hinweise!
Gruß Walter

Arduino-SCL.png

BIDLader-SCL.png