View on GitHub

i2c

Calliope Blöcke zur Programmierung beliebiger i2c Module ohne JavaScript. Typ 'Buffer' mit Blöcken verwenden.

Diese Seite bei https://calliope-net.github.io/i2c/ öffnen.

Calliope Erweiterung mit Blöcken zur Programmierung beliebiger i2c Module ohne JavaScript.

Dieses Repository kann als Erweiterung in MakeCode hinzugefügt werden.

Beschreibung der Erweiterung ‘i2c’

I²C bedeutet Inter-Integrated CircuitWikipedia. Am Calliope mini ist der linke Steckverbinder A0 ein I²C Anschluss. An die 4 Drähte Minus (GND), Plus (3,3 Volt), SDA und SCL können mehrere I²C Module gleichzeitig angeschlossen werden. Als Verteiler gibt es I²C Hubs mit 4 oder 6 Buchsen, die ohne Elektronik einfach miteinander verbunden sind. Qwiic Module haben meistens 2 Buchsen und können hintereinander gefädelt werden → Daisy Chain. Viele Module an nur einem Anschluss nennt man → Bus hier: I²C Bus.

Zur Unterscheidung hat jedes I²C Modul am Bus eine andere I²C Adresse. Die Anzahl der I²C Adressen ist begrenzt auf 7 Bit, 00000000 bis 01111111, 0 bis 127 oder hexadezimal 0x00 bis 0x7F, wovon aber einige Adressen reserviert sind. Wenn am Modul die I²C Adresse geändert werden kann, können also mehrere gleiche Module am selben I²C Bus angeschlossen werden.

Zur Programmierung des I²C Bus gibt es nur 2 Funktionen: Senden und Empfangen.

Zum Senden werden ein oder mehrere Bytes in einen Buffer gepackt und der Buffer über den I²C Bus an eine bestimmte I²C Adresse geschickt. Das Modul mit der richtigen I²C Adresse empfängt den Buffer. Die Module mit den anderen I²C Adressen ignorieren die Datenübertragung.

Zum Empfangen wird nur die Anzahl der Bytes size an eine bestimmte I²C Adresse geschickt. Das Modul mit der richtigen I²C Adresse schickt dann einen Buffer zurück, der genau so viele Bytes lang ist. Der empfangene Buffer wird in einer Variable readBuffer gespeichert und kann ausgewertet werden.

Ein Byte besteht IMMER aus 8 Ziffern, die 0 oder 1 sein können. Eine Ziffer, die nur zwei Zustände haben kann, heißt Binary Digit abgekürzt Bit. Ein Byte hat also IMMER 8 Bit und kann 2^8 = 2*2*2*2*2*2*2*2 = 256 verschiedene Werte speichern. Größere Zahlen und andere Daten brauchen entsprechend mehrere Bytes.

Ein Buffer ist eine Sammlung von Bytes (je 8 Bit) in einer bestimmten Reihenfolge. Die Position eines Bytes im Buffer heißt offset. Das erste Byte steht am offset=0. Die Länge eines Buffers (einer Instanz) kann nachträglich nicht geändert werden. Die Anzahl Bytes, die in einen Buffer passen, wird immer bei Buffer.create festgelegt. Teile von Buffern können aber in einen neuen Buffer kopiert werden.

Ein Array unterscheidet sich vom Buffer, weil Elemente vom Typ number größere Zahlen als 8 Bit speichern können. Die Position eines Elementes im Array heißt index. Das erste Element steht am index=0. Die Länge eines Arrays kann nachträglich geändert werden, z.B. durch hinten anhängen. Die Elemente im Array können vom Typ number, string, boolean oder object sein. Es gibt auch ein Array aus Buffer-Objekten.

Der Datentyp Number ist eine Wundertüte. Number kann 8-Bit, 16-Bit, 32-Bit, 64-Bit Zahlen mit und ohne Vorzeichen und mit und ohne Komma speichern. Im Buffer kann eine Number also 1 Byte, 2 Byte, 4 Byte oder 8 Byte belegen.

Einen Datentyp Byte gibt es beim Calliope (und in JavaScript) nicht. Das Objekt Buffer wird gebraucht, weil beim Senden und Empfangen nur Bytes übertragen werden können.

Für die Verpackung anderer Daten in Buffer stellt die Erweiterung ‘i2c’ Blöcke bereit.

Blöcke

writeBuffer

Zum Senden stellt die Erweiterung ‘i2c’ den Block writeBuffer bereit. Den Block gibt es 3 Mal mit der gleichen Funktion.

  1. writeBuffer mit Array als Parameter
    • Hier können direkt Bytes eingetragen werden. Die korrekte Anzahl der Bytes muss mit - + eingestellt werden.
    • Es dürfen nur 8-Bit Zahlen (0-255) eingetragen werden.
    • Für 16-Bit und 32-Bit Zahlen, die mehrere Bytes belegen, existiert der Block .setNumber im Bereich Buffer.create.
  2. writeBuffer, dem eine Variable vom Typ Buffer übergeben werden muss
    • Im Bereich Buffer.create gibt es mehrere Möglichkeiten, einen leeren Buffer zu erzeugen und schrittweise zu füllen oder einen Buffer aus vorhandenen Daten zu erzeugen.
    • Der neue Buffer wird einer Variablen zugewiesen, die dem Block writeBuffer zu übergeben ist.
  3. writeBuffer wie 2. mit Rückgabe des Fehlercode beim Senden
    • In der Variable i2cError wird das Ergebnis vom Senden gespeichert. Der Wert 0 bedeutet kein Fehler.
    • Der Wert -1010 (dezimal) wird zurück gegeben, wenn an der I²C Adresse kein I²C Modul antwortet und den Buffer empfängt.

readBuffer

Zum Empfangen stellt die Erweiterung ‘i2c’ den Block readBuffer bereit.

  1. readBuffer
    • Bei size ist die Anzahl der vom I²C Modul als Antwort erwarteten Bytes einzutragen.
    • Der empfangene Buffer wird der Variable readBuffer zugewiesen.
    • Im Bereich Buffer.get gibt es mehrere Möglichkeiten, den Buffer auszuwerten. Dazu muss die Variable readBuffer in den Block eingefügt werden.

i2c-Scan

Die 2 Blöcke i2c-Scan haben die gleiche Funktion und unterscheiden sich nur im Rückgabe Parameter.

  1. i2c-Scan gibt ein Array mit den I²C Adressen aller am I²C Bus gefundenen Module zurück.
  2. i2c-Scan wie 1. wandelt die Bytes aus dem Array in hexadezimal Zahlen um und gibt sie als Text zurück. Der Text kann unmittelbar in der LED-Matrix angezeigt werden.

Im Bereich i2c Scan sind Blöcke, die im angegebenen Bereich von - bis alle I²C Adressen testen, ob ein I²C Modul angeschlossen ist. Die Pause zwischen zwei Tests kann angegeben werden. Im Test wird ein Byte mit dem Wert 0 an jede I²C Adresse geschickt und das Ergebnis von writeBuffer ausgewertet. Ist das Ergebnis = 0, wird angenommen, dass an der I²C Adresse ein Modul vorhanden ist und den Buffer empfangen hat. Das funktioniert allerdings nicht bei jedem Modul.

Der i2c-Scan ist geeignet, Module zu finden, deren I²C Adresse durch Software geändert und vergessen wurde.

Der Test findet ohne angeschlossene I²C Module drei I²C Adressen vom Bosch BMX055: 0x10 (magnetic device), 0x18 (accelerometer device) und 0x68 (gyro device). Diese sind beim Calliope intern belegt und können nicht von externen Modulen verwendet werden.

Calli:Bot2 belegt nach diesem Test acht I²C Adressen: 0x20 bis 0x27. Gebraucht werden höchstens drei: 0x20 bis 0x22.

Erweiterungen

Upates für Erweiterungen; Erweiterungen aus einem Projekt löschen.

Alle i2c-Erweiterungen für MakeCode von calliope-net (Software).

Calliope-Apps, .hex-Dateien, Bildschirmfotos mit Blöcken

Alle Beispiel-Projekte für MakeCode von calliope-net (Calliope-Apps).

GitHub-Profil calliope-net: https://github.com/calliope-net

Bezugsquellen

Alle i2c-Module und Bezugsquellen (Hardware).

Metadaten (verwendet für Suche, Rendering)