View on GitHub

ft-Controller-I2C

ROBO Pro Coding Blöcke für fischertechnik TXT 4.0 und RX Controller zur Programmierung beliebiger I²C Devices: LCD, OLED Displays, Tastaturen, Sensoren, Motoren, Joystick, GPIO, RTC, EEPROM, Relais, ...

I²C Module | I²C Hardware, Software | I²C Quellcodedateien, Blöcke
I²C Programmierbeispiele im Überblick

ROBO Pro Coding Blöcke für fischertechnik TXT 4.0 und RX Controller zur Programmierung eigener I²C Module.

Das Beispiel Projekt mit Blöcken für TXT 4.0 Controller ist im fischertechnik GitLab veröffentlicht. Es kann für RX Controller konvertiert werden. Alle I²C-Module und Programmierbeispiele auf dieser Seite wurden mit dem TXT 4.0 Controller und auch mit dem RX Controller getestet.

Mit der App ROBO Pro Coding kann das Projekt ohne Anmeldung von fischertechnik GitLab geladen werden. Dazu bleibt das Zugriffstoken leer und auf der nächsten Seite im Suchfeld kann i2c eingegeben werden. Der Name ist i2c / ft_Controller_I2C. Das Projekt kann dann lokal als .ft-Datei gespeichert werden.

Im Projekt enthaltene Quellcodedateien (Blöcke) für I²C Module importieren.

Für eigene Projekte können aus der lokal gespeicherten .ft-Datei die Quellcodedateien importiert werden. Die Datei i2cCode muss immer zuerst importiert werden. Die Datei advanced enthält keinen I²C spezifischen Code, aber Blöcke für nützliche Python Funktionen.
Der Import muss mehrmals erfolgen, weil die Dateien voneinander abhängig sind. Reihenfolge:

  1. i2cCode und optional advanced
  2. Quellcodedateien mit I²C-Adresse
  3. Erweiterungen (für einfache Nutzung des I²C Moduls nicht erforderlich)
  4. Beispiele
Tabelle 1:
Quellcodedatei I²C-Adresse I²C Module
i2cCode   Python I²C für RX und TXT 4.0
advanced Erweiterung Blöcke für fehlende / zusätzliche Funktionen
dipswitch 0x03 6-DIP Switch, 5-Way Switch
keyboard 0x5F M5Stack Card Keyboard
lcd16x2 0x3E Grove - LCD Display 16x2 Zeichen
lcd16x2_keyboard_rtc Beispiel Grove LCD: Tastatur schreiben, Uhr, DIP Schalter
oled 0x3C 0x3D OLED Displays 128x128, Y&B 128x64, 128x64
oled_geometrie Erweiterung Blöcke für Linien und Kreise
oled_text_analoguhr Beispiel OLED Analoguhr, Text Zeichensatz aus EEPROM
qwiicbutton 0x6F 0x6E SparkFun Qwiic Button mit farbiger LED
qwiicbutton_int Beispiel 2 I²C Buttons mit LED, /INT Ereignis, Optokoppler
qwiicbutton_queue Erweiterung Blöcke für Button Queue
qwiiceeprom 0x50 SparkFun Qwiic EEPROM - 512Kbit
qwiicgpio 0x27 SparkFun Qwiic GPIO
qwiicjoystick 0x20 SparkFun Qwiic Joystick
qwiickeypad 0x4B SparkFun Qwiic Keypad 12 Tasten
qwiiclcd 0x72 Qwiic LCD Displays 20x4, 16x2, 16x2
qwiiclcd_keypad_rtc Beispiel LCD: Uhr stellen mit Keypad, GPIO→ASCII, Joystick
qwiicmotor 0x5D 0x5E SparkFun Qwiic Motor Driver
qwiicmotor_joystick Beispiel 4 Motoren (I²C Motor Driver) mit Joystick steuern
qwiicmux 0x70 SparkFun Qwiic Mux 8 Channel
qwiicmux_rx Beispiel RX Controller mit I²C Multiplexer, 10 I²C Module
qwiicopenlog 0x2A SparkFun Qwiic OpenLog (Speicherkarte)
qwiicopenlog_rtc Beispiel Dateien lesen, protokollieren auf Speicherkarte
qwiicrelay 0x18 SparkFun Qwiic Single Relay
rtc 0x51 Grove - RTC (Real Time Clock)
s_co2 0x62 Calliope CO2 Sensor - SCD40
s_qwiic_distance Beispiel 4 Abstands- und Nähesensoren, Qwiic LCD 20x4
s_qwiicinfrared 0x60 Proximity Sensor VCNL4040
s_qwiiclaser 0x29 Laser Distance Sensoren VL53L1X, VL53L4CD
s_qwiictemp 0x3C Temperature Sensor - STTS22H
s_qwiictemp_lcd Beispiel 2 Temperatursensoren, Qwiic LCD Display
s_qwiictmp102 0x48 Temperature Sensor - TMP102
s_qwiicultrasonic 0x09 Ultrasonic Distance Sensor HC-SR04
wattmeter 0x45 DFRobot Gravity Digital Wattmeter
wattmeter_co2_relay Beispiel Strom messen von CO₂ Sensor und I²C Relais

I²C

I²C: Inter-Integrated Circuit → de.wikipedia.org/wiki/I²C

I²C Hardware
6-pin Pfosten Stecker Qwiic Adapter Qwiic Cable - Grove Adapter Qwiic Cable Kit
I²C Module mit Hardware Interrupt

I²C Module, die eine Eingabe machen, müssen normalerweise in einer dauerhaft Schleife ständig über den I²C-Bus abgefragt werden, ob sich der Zustand geändert hat. Sensoren, Buttons, Keypad, GPIO und RTC haben einen zusätzlichen (Löt-) Interrupt-Pin /INT, der außerhalb vom I²C-Bus extra verdrahtet werden kann.

Die I²C Module haben 3,3V Logik, die fischertechnik Controller aber 9V Logik. Um die /INT Leitungen an einen Controller Input anzuschließen, wird ein Optokoppler empfohlen.
Der Optokoppler hat am Ausgang einen Fototransistor. Die Controller können am Input einen Fototransistor digital hell/dunkel abfragen.

Somit kann beim TXT 4.0 Controller ausgelöst werden. Im Ereignis-Code → buttons_event wird über den I²C-Bus das auslösende Modul gesucht und dessen /INT zurück gesetzt. → buttons_interrupt
Weil der RX Controller keine Ereignisse unterstützt, kann der Fototransistor hell/dunkel in einer Schleife abgefragt werden, was den I²C-Bus ebenfalls entlastet. → buttons_polling

Die /INT Pins aller I²C Module können miteinander verbunden und als Minus an die LED im Optokoppler angeschlossen werden. Der + vom Optokoppler ist über einen Widerstand 220 Ohm mit +3,3V zu verbinden. Ein 3V3 Löt-Pin ist an vielen I²C Modulen neben dem /INT vorhanden.
Die LED vom Optokoppler nicht an 9V anschließen!

I²C Software

RX Controller nutzt CircuitPython, TXT 4.0 Controller nutzt Python3. Beide unterstützen I²C, aber völlig verschieden. Die I²C Blöcke hier sind plattformunabhängig programmiert. Die Python Implementation wird erkannt und dann der entsprechende Code ausgeführt.

i2cCode.py

Block i2c_write_buffer (i2c_addr, write_buffer)

Block i2c_read_buffer (i2c_addr, length) : Liste der Bytes

Block i2c_write_read_buffer (i2c_addr, write_buffer, read_length) : Liste der Bytes

Block i2c_scan () : Liste der 7-Bit I²C-Adressen

Block is_rx () : Boolean

Beschreibung der Quellcodedateien (alphabetisch geordnet)

Inhaltsverzeichnis: Tabelle 1

advanced.py

Allgemeine Blöcke, die Python-Funktionen bereit stellen (ohne I²C Bezug).

Block comment (text) : Kommentar Block ohne Funktion.
Block Int (x) : Integer int(x)
Block Ord (char) : Integer Zeichencode ord(char)
Block Chr (asc) : String 1 Zeichen chr(asc)
Block print_bin (zahl, length) : BIN String z.B. ‘00001010’; Binärzahl mit fester Länge
Block list_string (string_data) : Liste der Zeichencodes [ord(c) for c in string_data]
Block encode_string (string_data) : Liste der Zeichencodes string_data.encode(‘utf-8’)
Block decode_string (data_bytes) : String data_bytes.decode(‘utf-8’, ‘replace’)
Block decode_latin (data_bytes) : String ’‘.join(chr(b) for b in data_bytes)
Block list_hex (data_bytes) : HEX String [hex(b) for b in data_bytes]
Block sign (i, exp) : Wandelt uint in int mit Vorzeichen um. exp: Anzahl der Bits z.B. 16.
Block system_time () : Liste mit 9 Elementen

Block voltmeter (input_pin, extended_range)

TXT 4.0 Controller kann an den Input-Pins I1 bis I8 Spannung messen.

dipswitch.py

→ DIP: dual in-line package; Switch: Schalter → en.wikipedia.org/wiki/DIP_switch

Grove - 6-Position DIP Switch | Grove - 5-Way Switch

Block switch_read () : Byte

keyboard.py

→ Keyboard: Tastatur → de.wikipedia.org/wiki/Tastatur

M5Stack Card Keyboard QWERTY 50-key

Block keyboard_read () : Byte

lcd16x2.py

→ LCD: liquid-crystal display → de.wikipedia.org/wiki/Flüssigkristallanzeige

Grove - LCD Display 16x2 Zeichen | Black on Yellow | Black on Red | White on Blue

Block lcd_init ()

Block lcd_text (row, col, end, text, right)

Block lcd_clear ()

Block lcd_cursor (row, col)

Block lcd_write (text)

Block lcd_display (display_on, cursor_on, blink_on)

oled.py

→ OLED: organic light-emitting diode → de.wikipedia.org/wiki/OLED

Grove - OLED Display 1.12 (128x128) | OLED Yellow&Blue Display 0.96 (128x64) | OLED Display 0.96

OLED Displays zeigen 128x64 oder 128x128 Pixel an. Alle Pixel werden zuerst in Variablen gespeichert. Dieser Speicher wird ‘Matrix’ genannt. Um die ‘Matrix’ auf dem OLED Display anzuzeigen, muss immer der Block oled_display_matrix aufgerufen werden.

Block oled_init (select_oled:Boolean) → Parameter optional

Wenn zwei Displays angeschlossen sind, muss der Block oled_init zweimal aufgerufen werden, mit False und True. Es gibt nur eine Matrix, die mit dem folgenden Block auf einem bestimmten Display angezeigt werden kann.

Block oled_display_matrix (from_page, to_page, select_oled) → alle Parameter optional

Die folgenden Blöcke ändern nur die Pixel in der Matrix, nicht das Display.

Block oled_clear_matrix (from_page, to_page) → alle Parameter optional

Block oled_set_pixel (x, y, pixel)

Block oled_scroll_matrix

Block oled_text (row, col, text)

erforderlich: qwiiceeprom

Um Text mit Pixeln zu zeichnen, muss der EEPROM angeschlossen und der Zeichensatz programmiert sein. Pro Zeichen werden 8 Byte vom EEPROM in die Matrix kopiert.

Block oled_paint_eeprom (eeprom_startadresse, from_page, to_page) → alle Parameter optional

oled_geometrie.py

Erweiterung zu: oled

Block oled_line (x0, y0, x1, y1, pixel)

Block oled_rectangle (x0, y0, x1, y1, pixel)

Block oled_circle (x0, y0, radius, pixel)

Block oled_minute (minute, x, y, l0, l1, pixel)

Block oled_hour (hour, x, y, l0, l1, pixel)

Block oled_clock (x, y, radius, hour, minute)

qwiicbutton.py

→ Qwiic Connect System: I²C · 3,3V Logik · ohne Löten → www.sparkfun.com/qwiic
→ Button: Taste → de.wikipedia.org/wiki/Taste

SparkFun Qwiic Button - Green LED | SparkFun Qwiic Button - Red LED | SparkFun Qwiic Button Breakout

Button mit farbiger LED, Bordcomputer, FIFO, /INT-Pin, mehrere gleichzeitig am I²C-Bus. Unterscheidet PRESSED (drücken) und CLICKED (drücken und loslassen).
LED Helligkeit und Blink-Takt. Qwiic_Button_I2C_Register_Map

Block button_set_i2c_addr (new_i2c_addr, i2c_addr)

Default i2c_addr ist 0x6F. Diese kann durch Lötbrücken von 0x60 bis 0x6E ODER mit diesem Block auf jede 7-Bit I²C-Adresse geändert werden. Wird bei den folgenden Blöcken der Parameter i2c_addr weg gelassen (None), gilt Default 0x6F.

Block button_is_pressed (i2c_addr)

Block button_has_been_clicked (clear, i2c_addr)

Block button_onoff (i2c_addr)

Block button_interrupt_config (when_clicked, when_pressed, i2c_addr)

Block button_led (brightness, i2c_addr)

Block button_led_config (brightness, cycle_time, off_time, granularity, i2c_addr)

Block button_led_read_register (i2c_addr)

qwiicbutton_queue.py

Erweiterung zu: qwiicbutton

→ Queue: Warteschlange → de.wikipedia.org/wiki/Warteschlange_(Datenstruktur)
→ FIFO: First In – First Out → de.wikipedia.org/wiki/FIFO

Diese Quellcodedatei wird nur benötigt, wenn die vergangene Zeit seit dem Drücken des Buttons ausgewertet werden soll. Button speichert bei PRESSED 8 und bei CLICKED 16 Zeitstempel (32 Bit Millisekunden) in QUEUE / FIFO.

Block button_clicked_queue_empty (i2c_addr)
Block button_clicked_queue_full (i2c_addr)
Block button_pressed_queue_empty (i2c_addr)
Block button_pressed_queue_full (i2c_addr)

Block button_print_queue (i2c_addr)

Block button_pop_clicked_queue (i2c_addr)
Block button_pop_pressed_queue (i2c_addr)

qwiiceeprom.py

→ EEPROM: electrically erasable programmable read-only memory → de.wikipedia.org/wiki/EEPROM

SparkFun Qwiic EEPROM Breakout - 512Kbit

Block eeprom_read (adr16Bit, read_length) : Liste der Bytes

Block eeprom_test ()

qwiicgpio.py

→ GPIO: General Purpose Input/Output → de.wikipedia.org/wiki/GPIO

SparkFun Qwiic GPIO

3,3 Volt Logik; 16 Klemmen: 8 GPIO-Pins, 4 GND, 3 3V3, 1 /INT
/INT Pin kann bei Zustandsänderung einen Hardware Interrupt auslösen.

Block gpio_init (io, inv)

Block gpio_read () : Byte

Block gpio_write (byte)

qwiicjoystick.py

→ Joystick: Spielhebel → de.wikipedia.org/wiki/Joystick

SparkFun Qwiic Joystick

Block joystick_read ()

Die folgenden Blöcke get lesen nur die Variable, nicht den I²C-Bus.

Block joystick_get_x () : Byte
Block joystick_get_y () : Byte

Block joystick_get_button_position () : Boolean

Block joystick_get_button_onoff () : Boolean

qwiickeypad.py

→ Numeric Keypad: Tastatur, Ziffernblock → en.wikipedia.org/wiki/Keypad

SparkFun Qwiic Keypad - 12 Tasten

Keypad speichert mehrere gedrückte Tasten, bei langsamer Abfrage geht nichts verloren.
Mit /INT kann ein Hardware Interrupt ausgelöst werden.

Block keypad_read () : Byte

Taste 0 1 2 3 4 5 6 7 8 9 * #
Code 48 49 50 51 52 53 54 55 56 57 42 35

qwiiclcd.py

→ LCD: liquid-crystal display → de.wikipedia.org/wiki/Flüssigkristallanzeige

SparkFun Qwiic 20x4 SerLCD - RGB Backlight | SparkFun Qwiic 16x2 SerLCD - RGB Backlight

Block qlcd_init ()

Block qlcd20x4_init ()

Block qlcd_text (row, col, end, text, right)

Block qlcd_clear ()

Block qlcd_cursor (row, col)

Block qlcd_write (text)

Block qlcd_display (display_on, cursor_on, blink_on)

qwiicmotor.py

→ Gleichstrommotor → de.wikipedia.org/wiki/Gleichstrommotor

SparkFun Qwiic Motor Driver

Block motor_init (i2c_addr)

Block motor_power (on, i2c_addr)

Block motor_drive_a (speed, i2c_addr)
Block motor_drive_b (speed, i2c_addr)

qwiicmux.py

→ MUX: Multiplexer → de.wikipedia.org/wiki/Multiplexer

SparkFun Qwiic Mux Breakout - 8 Channel (TCA9548A)

I²C Multiplexer: 8 I²C-Busse einzeln oder gemeinsam schaltbar.

Block mux (channel)

Block mux_write (byte)

Block mux_read

qwiicopenlog.py

→ Logdatei → de.wikipedia.org/wiki/Logdatei
→ SD-Karte: Speicherkarte → de.wikipedia.org/wiki/SD-Karte

SparkFun Qwiic OpenLog

Lesen und Schreiben von Dateien auf microSD card 64MB .. 32GB, FAT16 oder FAT32. Dateinamen sollen im Format 8.3, nur ASCII Zeichen und Großbuchstaben enthalten.

Block log_init

Block log_status

Block log_dir (filename, count)

Block log_size (filename)

Block log_read (filename, size)

Block log_write (filename, bu)

Block log_test

Block log_remove (filename)

Block log_sync

qwiicrelay.py

→ Relais: (englisch Relay) → de.wikipedia.org/wiki/Relais

SparkFun Qwiic Single Relay

Strom für Relais kommt aus dem 3,3 Volt I²C-Bus!

Block relay (on:Boolean)

rtc.py

→ RTC: real-time clock → de.wikipedia.org/wiki/Echtzeituhr

Grove - High Precision RTC (Real Time Clock)
Uhr stellen

Block rtc_write (index, int8)

Block rtc_set (key_code) : keyString

Uhr lesen

Block rtc_read ()

Die folgenden Blöcke lesen nur die Variable, nicht den I²C-Bus.

Block rtc_get (index) : Byte

Block rtc_time_string () : String 8 Zeichen

Block rtc_date_string () : String 10 Zeichen

Block rtc_weekday () : String 2 Zeichen

Block rtc_iso_string () : String 12 Zeichen

RTC Control Register

Block rtc_read_control

Block rtc_read_offset

Block rtc_write_offset (offset, mode)

s_co2.py

→ CO₂: Kohlenstoffdioxid → de.wikipedia.org/wiki/CO2
→ Relative Luftfeuchtigkeit → de.wikipedia.org/wiki/Luftfeuchtigkeit

Calliope mini CO2 Sensor - SCD40

Sensor hat keine Pull Up Widerstände, deshalb immer mit anderen Modulen anschließen, die welche haben. Blockiert oft den I²C-Bus, dann Strom aus und einschalten. Data Sheet

Block co2_init (factory_reset)

Block co2_start_continuous_measurement

Block co2_stop_continuous_measurement

Block co2_read_data_ready_status

Block co2_read_measurement

Die folgenden Blöcke get lesen nur die Variable, nicht den I²C-Bus.

Block co2_get_co2
Block co2_get_temperature
Block co2_get_relative_hunidity

s_qwiicinfrared.py

→ Infrarotstrahlung → de.wikipedia.org/wiki/Infrarot

SparkFun Qwiic Proximity Sensor - 20cm, VCNL4040

Nähe Sensor misst keinen genauen Abstand, nur ob ein Objekt näher als 20cm kommt (Seifenspender). Kann Interrupt auslösen. VCNL4040_Datasheet

Block qinfrared_init

Block qinfrared_power_on (on)

Block qinfrared_proximity

s_qwiiclaser.py

→ Laser → de.wikipedia.org/wiki/Laser

SparkFun Qwiic Distance Sensor - 4 Meter, VL53L1X | SparkFun Qwiic Distance Sensor - 1.3 Meter, VL53L4CD

Block qlaser_init

Block qlaser_distance_cm

Block qlaser_start_ranging

Block qlaser_stop_ranging

Block qlaser_get_distance

s_qwiictemp.py

→ Temperatur → de.wikipedia.org/wiki/Temperatur
→ Grad Celsius → de.wikipedia.org/wiki/Grad_Celsius

SparkFun Micro Temperature Sensor - STTS22H (Qwiic) | SparkFun Temperature Sensor - STTS22H (Qwiic)

Block temp_one_shot

Block temp_odr_1hz (on)

Block temp_read_data

Block temp_write_limit (limit, register_h_l)

Block temp_read_status

s_qwiictmp102.py

SparkFun Digital Temperature Sensor Breakout - TMP102 (Qwiic)

Block tmp102_read

Weitere Funktionen können noch programmiert werden z.B. Interrupt.

s_qwiicultrasonic.py

→ Ultraschall → de.wikipedia.org/wiki/Ultraschall

SparkFun Qwiic Ultrasonic Distance Sensor - HC-SR04

Der I²C Sensor hat einen eigenen Prozessor für die Ultraschall Messung. Über den I²C-Bus wird nur der aktuelle Wert in mm ausgelesen. Dieses Modul erfasst außerdem einen großen Winkel. So erkennen Modelle auch Hindernisse schräg, oben und unten und fahren nicht dagegen.

Der fischertechnik Ultraschallsensor hat auch einen Prozessor. → Datenblatt

Block ultrasonic_change_i2c (old_i2c, new_i2c)

Default I²C-Adresse ist 0x00. Damit funktioniert der Sensor. 0x00 gilt aber als reserviert und sollte geändert werden.

Block ultrasonic_read_mm

wattmeter.py

→ Spannungsmesser, Voltmeter → de.wikipedia.org/wiki/Spannungsmessgerät
→ Strommesser, Amperemeter → de.wikipedia.org/wiki/Strommessgerät
→ Leistungsmesser, Wattmeter → de.wikipedia.org/wiki/Leistungsmesser

DFRobot Gravity: I2C Digital Wattmeter SKU: SEN0291

Misst max. 26V, 8A. 4 I²C-Adressen, bis 4 Wattmeter gleichzeitig auslesen.

Block wattmeter_init

Block wattmeter_volt

Block wattmeter_milliampere

Block wattmeter_milliwatt