I2C-Scanner

Versionsnummer auf dem mini: 1.0
Benutzter Editor: MakeCode

Hallo zusammen,

ich beschäftige mich gerade mal wieder mit dem Calliope und wollte endlich einmal I2C-Module von Seeed ans Laufen bekommen.

Da es als erstes immer wichtig ist, die Adressen der angeschlossenen I2C-Devices zu finden und nicht immer die Dokumentation verfügbar ist, habe ich einmal versucht, einen Scanner für diese Adressen zusammenzuschieben.

Der Code schaltet die RGB-Led auf rot und wartet auf einen Druck auf Knopf „A“, bevor er mit dem Scan beginnt. Während des Scans der Adressen von 1 bis 127 wird mit „plotBarGraph“ eine Art Fortschrittsbalken angezeigt und die LED leuchtet grün.

Liefert ein Auslesen des I2C-Buses auf einer Adresse einen anderen Wert als 0, schaltet die LED auf gelb und zeigt fortlaufend die Adresse an. Ein Druck auf „A“ sucht nach weiteren Adressen.

Sind alle Adressen durchgelaufen, fängt der Calliope wieder von vorne an.

Standardmässig - also ohne angeschlossene Module finde ich zwei genutzte Adressen: 24 (Barometer?) und 104 (Gyroskop?).

Schließe ich z.B. an A0 einen Seeed I2C Motortreiber an, wird je nach Adress-Einstellung auf dem Gerät auch diese Adresse ausgegeben.

Fragen dazu:

  • Stimmt die Zuordnung der beiden Adressen für Barometer und Gyroskop?
  • Kann man überhaupt so scannen, indem man einfach die Adressen durch versucht oder ist das Vorgehen eher blauäugig?
let result = 0
let address = 0
let _continue = false
input.onButtonPressed(Button.A, () => {
    _continue = true
})
basic.forever(() => {
    basic.setLedColor(Colors.Red)
    basic.clearScreen()
    _continue = false
    while (!(_continue)) {
        basic.pause(100)
    }
    for (let index = 0; index <= 126; index++) {
        led.plotBarGraph(
        index,
        126
        )
        basic.setLedColor(Colors.Green)
        address = index + 1
        result = pins.i2cReadNumber(address, NumberFormat.UInt8LE, false)
        if (result != 0) {
            basic.setLedColor(Colors.Yellow)
            _continue = false
            while (!(_continue)) {
                basic.clearScreen()
                basic.showNumber(address)
            }
        }
    }
})

Schau mal hier:

In den Kommentaren stehen auch die belegten I2C-Adressen!

1 „Gefällt mir“

Ah, verdammich. Ich wusste, ich hatte irgendwo schon einen Scanner gesehen, habe ihn aber trotz Google-Fu nicht wiedergefunden. Danke für den Link. :slight_smile:

Mit einem zusätzlichen pins.i2cWriteNumber(address, 0, NumberFormat.Int8LE, false) findet mein Scanner dann auch etwas auf der Adresse 16.

1 „Gefällt mir“

Und um das ganze noch etwas zu vervollständigen…

Im Datasheet vom Bosch BMX055 findet man auf Seite 145 eine Tabelle mit möglichen I2C-Adressen.

Schaut man sich den Schaltplan des Calliope 1.3 an, findet man unten links den Plan für den Part MEMS - Beschleunigung, Gyro, Kompass.

SDO1, SDO2 und CSB3 sind alle mit GND verbunden. Darum gilt die erste Zeile der Tabelle mit den Werten für Accelerometer 0x18 / 24, Gyroscope 0x68 / 104 und Magnetometer 0x10 / 16.