I2C Verbindung von TXT 4.0 und TX

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 25 Mai 2023, 14:49

Hallo...
Es geht um Python 3.9.
Ich bekomme es nicht hin und hab schon sehr sehr viel ausprobiert.
Am TXT kann man über RoboPro, auf den I2C zugreifen. OK.
Wie macht man das beim TXT 4.0?
Es ist schon schwierig rauszubekommen, das es wohl der zweite (also 1) I2S Anschluss ist. Damit kann ich aber auch falsch liegen.
Im Grunde muss es doch relativ gleich sein, am TXT und TXT 4.0.
Mir geht es nicht um Zeitkritische Anwendungen, es sollen "einfach" nur Bytes geschrieben und gelesen werden.
Deswegen möchte ich noch mal bei 0 anfangen.
Hat jemand eine Idee, wie es gehen könnte?
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 28 Mai 2023, 09:17

Hallo...
Keiner eine Idee?
Ich hab mal den i2C Gestensensor ausgewählt. Leider ist der, in der Hilfe von Robo Pro Coding, vergessen worden.
I2C Beispiel von fischertechnik von gitlab: test_gesture_sensor.ft
Mit Komentaren, so wie ich es verstehe.

Programm Controllerkonfiuration

Code: Alles auswählen

import fischertechnik.factories as txt_factory #Hier wird die eine Lib der 9V Fabrik vom TXT geladen

txt_factory.init() # Initialisierung. U.a. setzen der Variablen.
txt_factory.init_i2c_factory() #Hier ist die Initialisierung der I2C Schnittstelle.

TXT_M = txt_factory.controller_factory.create_graphical_controller() # Erstellem des  Masters TXT der ft-factory
TXT_M_I2C_1_gesture_sensor = txt_factory.i2c_factory.create_gesture_sensor(TXT_M, 1) # I2C für den Gestensensor an die 2 I2C Schnittstelle

txt_factory.initialized() # Initialisierung der factory nochmal für was auch immer
Hauptprogramm (Vereinfacht)

Code: Alles auswählen

import math # Mathematische Funktrionen Importieren

from lib.controller import * # Zeiger auf controller.lib
from lib.display import * # Zeiger auf display.lib (Wo auch immer diese beiden Dateien stehen. Compilierte Gesammt-Lib ?)


hue_text = None #Variablenliste
list_gesture = None
hue_grad = None


def callback(event):  # Schleife
    global hue_text, list_gesture, hue_grad # Variablen
    if TXT_M_I2C_1_gesture_sensor.get_hsv_hue() >= 0: # Hat der Sensor einen Farbsättigungswert?
        hue_text = '-' # Leeren Text 
        hue_grad = round(TXT_M_I2C_1_gesture_sensor.get_hsv_hue()) # High Level I2C Befehle an den Sensor senden und empfangen 
        #color text: http://www.workwithcolor.com/yellow-color-hue-range-01.htm
        if hue_grad >= 0 and hue_grad < 9: # Jenachdem welcher Wert kommt wir die Farbe zugewiesen
            hue_text = 'red'
        elif hue_grad >= 9 and hue_grad < 20:
            hue_text = 'red-orange'

       ... usw bis

        elif hue_grad >= 357 and hue_grad < 360:
            hue_text = 'red'
        display.set_attr("txt_label_hsv.text", str(''.join([str(x) for x in [round(TXT_M_I2C_1_gesture_sensor.get_hsv_hue(), 1), ', ', round # Ausgabe Display(TXT_M_I2C_1_gesture_sensor.get_hsv_saturation(), 1), ', ', round(TXT_M_I2C_1_gesture_sensor.get_hsv_value(), 1)]])))
        display.set_attr("txt_label_rgb.text", str(''.join([str(x2) for x2 in [round(TXT_M_I2C_1_gesture_sensor.get_rgb_red(), 1), ', ', round(TXT_M_I2C_1_gesture_sensor.get_rgb_green(), 1), ', ', round(TXT_M_I2C_1_gesture_sensor.get_rgb_blue(), 1)]])))
        display.set_attr("txt_status_indicator_valid.active", str((TXT_M_I2C_1_gesture_sensor.get_hsv_saturation()) >= 0.35).lower())
        display.set_attr("txt_label_hue.text", str(str(hue_grad)))
        display.set_attr("txt_label_color_text.text", str(str(hue_text)))
        display.set_attr("txt_label_ambient.text", str(str(TXT_M_I2C_1_gesture_sensor.get_ambient())))



def callback2(event):
    global hue_text, list_gesture, hue_grad
    if TXT_M_I2C_1_gesture_sensor.get_proximity() >= 0:
        display.set_attr("txt_label_prox.text", str(str(round(TXT_M_I2C_1_gesture_sensor.get_proximity()))))



def callback3(event):
    global hue_text, list_gesture, hue_grad
    if TXT_M_I2C_1_gesture_sensor.get_gesture() >= 0:
        display.set_attr("txt_label_gesture.text", str(''.join([str(x3) for x3 in [list_gesture[int(((TXT_M_I2C_1_gesture_sensor.get_gesture()) + 1) - 1)], ' (', TXT_M_I2C_1_gesture_sensor.get_gesture(), ')']])))



def on_txt_switch_color_toggled(event):
    global hue_text, list_gesture, hue_grad
    if bool(event['checked']):
        TXT_M_I2C_1_gesture_sensor.enable_light()
    else:
        TXT_M_I2C_1_gesture_sensor.disable_light()


def on_txt_switch_prox_toggled(event):
    global hue_text, list_gesture, hue_grad
    if bool(event['checked']):
        TXT_M_I2C_1_gesture_sensor.enable_proximity()
    else:
        TXT_M_I2C_1_gesture_sensor.disable_proximity()


def on_txt_switch_gesture_toggled(event):
    global hue_text, list_gesture, hue_grad
    if bool(event['checked']):
        TXT_M_I2C_1_gesture_sensor.enable_gesture()
    else:
        TXT_M_I2C_1_gesture_sensor.disable_gesture()


TXT_M_I2C_1_gesture_sensor.add_change_listener("hsv_hue", callback) # I2C "Umschaltung" des Sensors: Farbsätigng, Entfernung, Gesten
TXT_M_I2C_1_gesture_sensor.add_change_listener("proximity", callback2)
TXT_M_I2C_1_gesture_sensor.add_change_listener("gesture", callback3)

display.switch_toggled("txt_switch_color", on_txt_switch_color_toggled) # Display
display.switch_toggled("txt_switch_prox", on_txt_switch_prox_toggled)
display.switch_toggled("txt_switch_gesture", on_txt_switch_gesture_toggled)


hue_text = '-'
list_gesture = ['none', 'left', 'right', 'up', 'down', 'near', 'far']
while True:
    pass
In dem Programm wird er Sensor mit High-Leve Befehle angesprochen. Selbst wenn man die Initialisierung übernehmen würde, muss es doch möglich sein, über Low-Level Befehle auf den I2C zuzugreifen. Nur welche?
In ftRoby sind die I2C Befehle ausgetextet, also nicht funktionstüchtig. Dennoch muss man über den Inhalt der factory.lib irgendwie Werte senden und empfangen können.
Kann man diese Befehle in eigene Py-Programme einbinden?
Mit freundlichen Grüßen
Holger

PS Wenn man die Initialisierung des I2C Bussen übernimmt, -denke ich-, hat man sofort auch den richtigen I2C Bus vom TXT 4.0. Scheinbar ist es ja die Nr2, also 1. Somit müssten ja, wenn man die Low-Level-Befehle von ftroby nutz sofort auf den richtigen Buss zugegriffen werden (die Sache mit 65000 bze Bus 0 oder Bus 1)
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 27 Aug 2023, 19:01

Hallo...
Bin schon mal etwas weiter gekommen, um den I2C vom TXT 4.0 anzusprechen .
In derfischertechnik Cloud gibt es ein RoboPro Coding Projekt, wo ein Combisensor angesteuert wird.
https://git.fischertechnik-cloud.com/br ... mbi_sensor
Wenn man in den LIB Ordner geht, findet man in der controller.py:

Code: Alles auswählen

import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_i2c_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I2C_1_combined_sensor = txt_factory.i2c_factory.create_combined_sensor(TXT_M, 1)

txt_factory.initialized()
Es ist immer noch etwas unglücklich gemacht, das die nur TXT statt TXT40 geschrieben haben. Aber zumindest ist es der TXT4.0 schon mal.
Im darüber liegenden Ordner ist die Datei test_combi_sensor.py .
Da findet man:

Code: Alles auswählen

import math
import time

from lib.controller import *
from lib.display import *


ax = None
ay = None
mx = None
az = None
my = None
rx = None
mz = None
ry = None
rz = None


TXT_M_I2C_1_combined_sensor.init_accelerometer(16, 31, False)
TXT_M_I2C_1_combined_sensor.init_magnetometer(10)
TXT_M_I2C_1_combined_sensor.init_gyrometer(2000, 32, True)
while True:
    if True:
        ax = TXT_M_I2C_1_combined_sensor.get_acceleration_x()
        ay = TXT_M_I2C_1_combined_sensor.get_acceleration_y()
        az = TXT_M_I2C_1_combined_sensor.get_acceleration_z()
        display.set_attr("txt_label_ax.text", str('ax:' + str(round(ax, 3))))
        display.set_attr("txt_label_ay.text", str('ay:' + str(round(ay, 3))))
        display.set_attr("txt_label_az.text", str('az:' + str(round(az, 3))))
    if True:
        mx = TXT_M_I2C_1_combined_sensor.get_magnetic_field_x()
        my = TXT_M_I2C_1_combined_sensor.get_magnetic_field_y()
        mz = TXT_M_I2C_1_combined_sensor.get_magnetic_field_z()
        display.set_attr("txt_label_mx.text", str(' mx:' + str(round(mx, 3))))
        display.set_attr("txt_label_my.text", str(' my:' + str(round(my, 3))))
        display.set_attr("txt_label_mz.text", str(' mz:' + str(round(mz, 3))))
    if True:
        rx = TXT_M_I2C_1_combined_sensor.get_rotation_x()
        ry = TXT_M_I2C_1_combined_sensor.get_rotation_y()
        rz = TXT_M_I2C_1_combined_sensor.get_rotation_z()
        display.set_attr("txt_label_rx.text", str(' rx:' + str(round(rx, 3))))
        display.set_attr("txt_label_ry.text", str(' ry:' + str(round(ry, 3))))
        display.set_attr("txt_label_rz.text", str(' rz:' + str(round(rz, 3))))
    if True:
        print('a:{:.3f}, {:.3f}, {:.3f} m:{:.3f}, {:.3f}, {:.3f} r:{:.3f}, {:.3f}, {:.3f}'.format(ax, ay, az, mx, my, mz, rx, ry, rz))
        time.sleep(0.2)
Jetzt stell sich mir die Frage wo die Datei fischertechnik.factories ist. Denn da müssen, ja noch mehr Infos drinnstehen. Oder reicht die Initialisierung auch für andere Sensoren? (da ja der -zweite- I2C Bus vom Controller initialisiert wird)
Ich hab leider keinen 5V-3.3V Wandler. Könnte man von Außen, einen I2C Sniffer an den TXT4.0 geben, um die Adressen und das Vorhanden sein von weiteren Komponenten zu messen?
Ideen / Lösungen?
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 27 Aug 2023, 20:16

Hallo...
Wir kommen der Sache immer näher. In der Datei test_environmental_sensor.py
steht:

Code: Alles auswählen

import time

from lib.controller import *
from lib.display import *


t = None
aq = None
h = None
iaq = None
p = None


import smbus



bus = smbus.SMBus(0)    # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)



DEVICE_ADDRESS = 0x15      #7 bit address (will be left shifted to add the read write bit)

DEVICE_REG_MODE1 = 0x00

DEVICE_REG_LEDOUT0 = 0x1d



#Write a single register

bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, 0x80)



#Write an array of registers

ledout_values = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]

bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT0, ledout_values)
if TXT_M_I2C_1_environment_sensor.needs_calibration():
    TXT_M_I2C_1_environment_sensor.calibrate()
while True:
    if TXT_M_I2C_1_environment_sensor.needs_calibration():
        display.set_attr("txt_status_indicator.active", str(False).lower())
        aq = '-'
        iaq = 0
    else:
        display.set_attr("txt_status_indicator.active", str(True).lower())
        aq = TXT_M_I2C_1_environment_sensor.get_indoor_air_quality_as_text()
        iaq = TXT_M_I2C_1_environment_sensor.get_indoor_air_quality_as_number()
    t = TXT_M_I2C_1_environment_sensor.get_temperature()
    h = TXT_M_I2C_1_environment_sensor.get_humidity()
    p = TXT_M_I2C_1_environment_sensor.get_pressure()
    display.set_attr("txt_label_t.text", str('Temperature {:.1f} °C'.format(t)))
    display.set_attr("txt_label_h.text", str('Air humidity {:.1f} %rH'.format(h)))
    display.set_attr("txt_label_p.text", str('Air pressure {:.1f} hPa'.format(p)))
    display.set_attr("txt_label_iaq.text", str('Air quality {} ({:.0f})'.format(aq, iaq)))
    print('T {:.1f} °C, H {:.1f} %rH, p {:.1f} hPa, iaq {} ({:.0f})'.format(t, h, p, aq, iaq))
    time.sleep(3)
Und siehe da :-) da ist der zweite SMBus.
Man kann scheinbar zwischen dem Speicher auf dem ersten Bus (0) und z.B. Sensoren auf dem zweiten Bus (1) auswählen.
Mal schauen ob wir damit weiterkommen...
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 29 Aug 2023, 20:22

Hallo...
OK, ich bin verwundert.
Es ist das Standartbeispiel von smbus wie vom raspberry Pi.
Siehe unten:https://raspberry-projects.com/pi/progr ... nterface-2
Und es ist smbus (eins) und nicht smbus2.
Mal schauen...
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 03 Sep 2023, 12:42

Hallo...
Es ist schon etwas seltsam. Da bekommt man übers Internet eher raus, an welchen Pin vom STM32 der I2C 2 und 4 in der (ft-) Konfiguration-Datei zum programmieren ist, als -ein- einziges Beispiel, wie man selber an den I2C kommt, wo die Sensoren sind. Also der, der rausgeführt ist.
Momentan scheint es so, dass nur die drei ft-Sensoren in den fabrik Libs genutzt werden.
Ich forste mich mal weiter durch die Firmware...
Mit freundlichen Grüßen
Holger
PS Obwohl ich Lust hätte, mal bei den Leuten aus MS vorbeizuschauen und mir die Infos direkt bei denen abzuholen. So schwer kann das doch nicht sein.
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 09 Nov 2023, 18:17

Hallo...
So nun mal zumindest einen kleinen Schritt weiter und zumindest ein ganz kleines Aha.

In Python wird der zweite I2C Bus mit 1 angesprochen. Ist ja auch klar der erste I2C (z.B. für den Speicher) hat die Nummer 0.
Die Initialisierung vom I2C erfolgt mit (Beispiel aus "IoT_CO2_Signal_Light"):

Code: Alles auswählen

import fischertechnik.factories as txt_factory
txt_factory.init()
txt_factory.init_input_factory()
txt_factory.init_output_factory()
txt_factory.init_i2c_factory()
txt_factory.init_usb_factory()
TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I3_photo_resistor = txt_factory.input_factory.create_photo_resistor(TXT_M, 3)
TXT_M_O5_led = txt_factory.output_factory.create_led(TXT_M, 5)
TXT_M_O7_led = txt_factory.output_factory.create_led(TXT_M, 7)
TXT_M_I2C_1_environment_sensor = txt_factory.i2c_factory.create_environment_sensor(TXT_M, 1)
TXT_M_USB1_1_microphone = txt_factory.usb_factory.create_microphone(TXT_M, 1)
txt_factory.initialized()
Also :
import fischertechnik.factories as txt_factory
txt_factory.init()
txt_factory.init_i2c_factory() # Tada I2c am TXT 4.0 Initialisierung
TXT_M_I2C_1_environment_sensor = txt_factory.i2c_factory.create_environment_sensor(TXT_M, 1) #Hier der CO2 Sensor am zweiten I2C

So und nun muss ich dem TXT 4.0 "nur" noch beibringen auch mal andere Sachen über I2C anzusprechen...
Muss das eigentlich so kompliziert und versteckt sein?...
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

matrix
Beiträge: 5
Registriert: 21 Nov 2023, 16:39

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von matrix » 21 Nov 2023, 22:07

Hallo Holger,

die Frage beschäftigt mich auch schon seit längerem, was nun mit I2C Implementierung für Drittanbieter ist. Auf Nachfrage hieß es bisher zu mir, I2C sei auch für andere Sensoren etc. bereits vorhanden, ich konnte allerdings auch noch nichts entdecken.
Im Rahmen meiner "Aufbohr-Aktionen" der Firmware des TXT 4.0 habe ich mir nun auch etwas die installierten Python-Packages angeguckt, so auch die Bibliothek aus dem Hause fischer.

Die schlechte Nachricht: I2C für Drittanbieter wurde hier komplett weggelassen. Scheinbar hat man sich auf "das Nötigste" beschränkt.
Die gute Nachricht: Mit Python kannst du eine I2C Implementierung selbst vornehmen.

Ich weiß nicht, wie fit du in Python bist, je nach dem kann das schon relativ kompliziert werden. Ich kann dir schonmal etwas Start-Code geben, damit du nicht ganz von Null starten musst. Fischertechnik benutzt selbst das PIP "smbus", über das mit I2C beliebig kommuniziert werden kann. Eine einfacher Code, um 1 Byte zu empfangen würde wie folgt aussehen:

Code: Alles auswählen

import smbus

bus = smbus.SMBus(3)

adresse = 0x60
register = 0x1

antwort = bus.read_byte_data(adresse, register)
Falls ich mal die Zeit dafür finde, schreibe ich selbst mal ein Python Package, welches man dann über den PC und die Kommandozeile über SSH installieren kann. Ganz so schwer ist das jetzt nicht für jemanden Erfahrenen, frage mich immernoch warum man das nicht direkt bei fischer gemacht hat.

Ich denke das ist jetzt nicht unbedingt die Antwort, die du hören wolltest, aber immerhin schonmal ein Anfang. Wenn du weiter Hilfe mit Python brauchst, wird sich bestimmt jemand melden. Im Notfall kannst du mir auch gerne eine DM schreiben.

Viele Grüße,
Matrix/Felix

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 22 Nov 2023, 21:36

Hallo...
Ok, danke, es geht schon mal weiter.
Ich fange auch bei Python nicht bei 0 an. Ich hab schon mal was damit gemacht.

Wie kommst du auf die -3- beim SMBus?
Ich hatte am Wochenende vor, über deinen SSH Zugang mir die Libs etwas näher anzusehen. Vom meinem Verständniss her sollten die auch als "Lesbar" vorliegen. Vor allem die Industrie-Lib. Ich denke das dort die Teile sind um die Sensoren anzusteuern und halt das Initialisieren.
Das "Ansteuern" ist ja auch "nur" eine Liste von Adressen und Bytes die gesendet und emfangen werden und eine Pausenzeit, mit Fail Überwachung/Timeout usw.

Ich denke, ob ich nun die Initialsirung vom I2C der Lib nehme oder selber in meinem Programm mache - sollte Egal sein. Außer, ich als User, hab nicht die Berechtigung auf dem Bus zuzugreifen. Mal schauen...
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

matrix
Beiträge: 5
Registriert: 21 Nov 2023, 16:39

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von matrix » 24 Nov 2023, 13:05

Hallo Holger,

die 3 beim smbus kommt vom I2C Port 3, den, soweit ich das jetzt durchschaut habe, fischertechnik standardmäßig verwendet. Zumindest habe ich das so aus dem Python Package von fischertechnik übernommen. Habe das auch schon getestet und sollte soweit funktionieren. Ich kann dir jedoch nicht sagen, wie sich die Verbindung verhält, wenn du zusätzlich die Bibliothek von fischertechnik mit dem selben I2C Port verwendest. Eventuell lässt sich über einen anderen Port auch der Anschluss an EXT 1 ansprechen. Das habe ich bisher noch nicht ausprobiert.

Was die SSH Verbindung angeht, hast du unter ft:fischertechnik die Berechtigung, die Dateien zu lesen. Solltest du weitere Berechtigungen benötigen, kannst du dir gerne meine Anleitung für den Root-Zugang auf dem TXT 4.0 anschauen.

Viele Grüße,
Matrix/Felix

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 03 Dez 2023, 18:23

Hallo...
Ist echt interessant.
Ich hab nun ein Beispiel in Python für den TXT 4.0 vorliegen, wo die Wegezelle NAU7802 über I2C angesprochen wird.
Da wird -soweit ich das sehe- SMBus 1 angesprochen, wobei auch eine Lib "lib_nau7802" eingebunden wird.
Ich hab darauf allerdings noch keinen Zugriff. Es kannauch sein, das der Anschluss über eine SPS geht und dann per MQTT die Daten rüber kommen.
Ich muss mir das noch mal genauer anschauen. Ich bin mir da noch nicht sicher.

Ich hab das mit dem I2C mal an dem ft-Sonderverkauf angesprochen, ob es von ft dazu noch weitere Hilfe gibt.
Es ist schon mal aufgenommen worden und ich freue mich auf eine Reaktion von ft.
Mal schauen...

Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
fishfriend
Beiträge: 1791
Registriert: 26 Nov 2010, 11:45

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von fishfriend » 09 Dez 2023, 11:45

Hallo...
Yippie juhu, es läuft...

Bitte beachtet den Hinweis unten!

Ich habe dankenswerterweise von ft ein Beispiel bekommen.
Problem 1, es war in einer neueren Version von RoboPro Coding. Die von MS Store ist u.a. mit Blocky 14, die Onlineversion von RoboPro https://dev.fischertechnik-cloud.com/de ... de/desktop hat Bolcky 15.
Die Unterschiede sind nicht so groß, aber ich habe es nicht 100% hinbekommen es umzuschreiben. Somit lief es nicht.
Problem 2, mein Gestensensor hat natürlich 10 Pins, der TXT 4.0 6 Pins. Man muss erst die jeweilige Belegung haben oder einen Adapter (den ich natürlich nicht hatte).

Das Beispiel bezieht sich auf den 20.Teil vom I2C Workshop, der Zeitschrift Raspberry Pi Geek:
https://www.raspberry-pi-geek.de/ausgab ... apds-9960/
Hier wird das APDS-9960 Sensor-Modul über I2C angesprochen. Das ist in dem ft-Gestensensor drinn.

Im RoboPro Coding - Programm ist ein Hauptprogramm, wo der Sensor Initialisiert wird und dann in einer Dauerschleife die Übertragenen Werte jede Sekunde auf dem Bildschirm ausgegeben werden. Es werden die Werte der Entfernung (Proximity) und der Farbe (Color) übertragen. Als Bus wird der I2C Bus "Nr.3" benutzt der an der Seite vom TXT 4.0 zugänglich ist.

Code: Alles auswählen

import time

def initAPDS9960():
    global bus, DEVICE_ADDRESS
    #https://www.raspberry-pi-geek.de/ausgaben/rpg/2018/08/i2c-workshop-teil-20-apds-9960/

    import smbus

    bus = smbus.SMBus(3)
    DEVICE_ADDRESS = 0x39

    #0x80 Aktivierungsregister, Sensor einschalten, Funktionen aktivieren
    bus.write_byte_data(DEVICE_ADDRESS, 0x80, 0x07)

    #0x8F Steuerregister 1 Funktionsparameter des ICs einstellen.
    #0/1 Verstärkung Farb- und Lichtsensor (00=1x, 01=4x, 10=16x, 11=64x)
    #2/3 Verstärkung Annäherungssensor (00=1x, 01=2x, 10=4x, 11=8x)
    #4/5 reserviert
    #6/7 Stromstärke LED (00=100mA, 01=50mA, 10=25mA, 11=12,5mA)

    bus.write_byte_data(DEVICE_ADDRESS, 0x8f, 0x0f)


def readProximity():
    global bus, DEVICE_ADDRESS, p
    #proximity
    p = bus.read_byte_data(DEVICE_ADDRESS, 0x9c)


def readColor():
    global bus, DEVICE_ADDRESS, cf, rf, gf, bf, hf, sf, vf
    import colorsys #hsv
    #color
    cl = bus.read_byte_data(DEVICE_ADDRESS, 0x94)
    ch = bus.read_byte_data(DEVICE_ADDRESS, 0x95)
    rl = bus.read_byte_data(DEVICE_ADDRESS, 0x96)
    rh = bus.read_byte_data(DEVICE_ADDRESS, 0x97)
    gl = bus.read_byte_data(DEVICE_ADDRESS, 0x98)
    gh = bus.read_byte_data(DEVICE_ADDRESS, 0x99)
    bl = bus.read_byte_data(DEVICE_ADDRESS, 0x9a)
    bh = bus.read_byte_data(DEVICE_ADDRESS, 0x9b)
    c = cl + (ch << 8)
    r = rl + (rh << 8)
    g = gl + (gh << 8)
    b = bl + (bh<<8)
    m = 65535/63
    cf = c/m
    rf = r/m
    gf = g/m
    bf = b/m
    hf,sf,vf = colorsys.rgb_to_hsv(rf, gf, bf)


initAPDS9960()
while True:
    readProximity()
    readColor()
    print("proximity:",p," crgb:", format(cf, '.2f'),format(rf, '.2f'),format(gf, '.2f'), format(bf, '.2f')," hsv:",format(hf, '.2f'),format(sf, '.2f'),format(vf, '.2f'))
    time.sleep(1)
Das Programm ist ein Bolcky RoboPro Programm. Oben ist nur das Python Programm abgebildet. Nun das Blocky Programm (*)
Man muss es in APDS9960_smbus.ft umbenennen.

Code: Alles auswählen

PK
     j{…WÅ%àÅ  Å     /APDS9960_smbus.blockly<xml xmlns="https://developers.google.com/blockly/xml" version="15">
  <block type="start_block" id="C,[Z#!8M:O]SV%@n@}Tj" deletable="false" x="0" y="0">
    <statement name="statement">
      <block type="procedures_callnoreturn" id="~M-#Qmq7kM[|xL9aS;G:">
        <mutation name="initAPDS9960"/>
        <next>
          <block type="loop_endless" id="[v.mwpHbcQKSI:?%u5*=">
            <statement name="DO">
              <block type="procedures_callnoreturn" id="OUL%CN}5d|u^PNH_nU[)">
                <mutation name="readProximity"/>
                <next>
                  <block type="procedures_callnoreturn" id="h[z(f3`lSom1{9?M`Aet">
                    <mutation name="readColor"/>
                    <next>
                      <block type="util_python" id="nR{)ZS*a`z_8Ek0Gsq/K">
                        <field name="value">print("proximity:",p," crgb:", format(cf, '.2f'),format(rf, '.2f'),format(gf, '.2f'), format(bf, '.2f')," hsv:",format(hf, '.2f'),format(sf, '.2f'),format(vf, '.2f'))</field>
                        <next>
                          <block type="util_wait_for" id="dytNq]a++sLK`yUOgWub">
                            <field name="format">s</field>
                            <value name="value">
                              <shadow type="math_number" id="tiqT;`F@DO|ZeD9QOSe1">
                                <field name="NUM">1</field>
                              </shadow>
                            </value>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </statement>
  </block>
  <block type="procedures_defnoreturn" id=".h}tCd|b`}9t8uw`hv]Y" x="0" y="297">
    <field name="NAME">initAPDS9960</field>
    <statement name="STACK">
      <block type="util_python" id="!U;VVyW|iCw8P.2{5a/E">
        <field name="value">global bus, DEVICE_ADDRESS&amp;#10;#https://www.raspberry-pi-geek.de/ausgaben/rpg/2018/08/i2c-workshop-teil-20-apds-9960/&amp;#10;&amp;#10;import smbus&amp;#10;&amp;#10;bus = smbus.SMBus(3)&amp;#10;DEVICE_ADDRESS = 0x39&amp;#10;&amp;#10;#0x80 Aktivierungsregister, Sensor einschalten, Funktionen aktivieren&amp;#10;bus.write_byte_data(DEVICE_ADDRESS, 0x80, 0x07)&amp;#10;&amp;#10;#0x8F Steuerregister 1 Funktionsparameter des ICs einstellen.&amp;#10;#0/1 Verstärkung Farb- und Lichtsensor (00=1x, 01=4x, 10=16x, 11=64x)&amp;#10;#2/3 Verstärkung Annäherungssensor (00=1x, 01=2x, 10=4x, 11=8x)&amp;#10;#4/5 reserviert&amp;#10;#6/7 Stromstärke LED (00=100mA, 01=50mA, 10=25mA, 11=12,5mA)&amp;#10;&amp;#10;bus.write_byte_data(DEVICE_ADDRESS, 0x8f, 0x0f)</field>
      </block>
    </statement>
  </block>
  <block type="procedures_defnoreturn" id="{aEMkm!Wq{j/H3td@J-9" x="0" y="797">
    <field name="NAME">readProximity</field>
    <statement name="STACK">
      <block type="util_python" id="a9$IASd~iSfz`riK?Ofx">
        <field name="value">global bus, DEVICE_ADDRESS, p&amp;#10;#proximity&amp;#10;p = bus.read_byte_data(DEVICE_ADDRESS, 0x9c)</field>
      </block>
    </statement>
  </block>
  <block type="procedures_defnoreturn" id="QdxeW$X@QoLcrnl7GHO." x="0" y="982">
    <field name="NAME">readColor</field>
    <statement name="STACK">
      <block type="util_python" id=",/Dzo)/){=+)`=(;;Qk:">
        <field name="value">global bus, DEVICE_ADDRESS, cf, rf, gf, bf, hf, sf, vf&amp;#10;import colorsys #hsv&amp;#10;#color&amp;#10;cl = bus.read_byte_data(DEVICE_ADDRESS, 0x94)&amp;#10;ch = bus.read_byte_data(DEVICE_ADDRESS, 0x95)&amp;#10;rl = bus.read_byte_data(DEVICE_ADDRESS, 0x96)&amp;#10;rh = bus.read_byte_data(DEVICE_ADDRESS, 0x97)&amp;#10;gl = bus.read_byte_data(DEVICE_ADDRESS, 0x98)&amp;#10;gh = bus.read_byte_data(DEVICE_ADDRESS, 0x99)&amp;#10;bl = bus.read_byte_data(DEVICE_ADDRESS, 0x9a)&amp;#10;bh = bus.read_byte_data(DEVICE_ADDRESS, 0x9b)&amp;#10;c = cl + (ch &lt;&lt; 8)&amp;#10;r = rl + (rh &lt;&lt; 8)&amp;#10;g = gl + (gh &lt;&lt; 8)&amp;#10;b = bl + (bh&lt;&lt;8)&amp;#10;m = 65535/63&amp;#10;cf = c/m&amp;#10;rf = r/m&amp;#10;gf = g/m&amp;#10;bf = b/m&amp;#10;hf,sf,vf = colorsys.rgb_to_hsv(rf, gf, bf)</field>
      </block>
    </statement>
  </block>
</xml>PK
     j{…WV‘[       /APDS9960_smbus.py

import time

def initAPDS9960():
    global bus, DEVICE_ADDRESS
    #https://www.raspberry-pi-geek.de/ausgaben/rpg/2018/08/i2c-workshop-teil-20-apds-9960/

    import smbus

    bus = smbus.SMBus(3)
    DEVICE_ADDRESS = 0x39

    #0x80 Aktivierungsregister, Sensor einschalten, Funktionen aktivieren
    bus.write_byte_data(DEVICE_ADDRESS, 0x80, 0x07)

    #0x8F Steuerregister 1 Funktionsparameter des ICs einstellen.
    #0/1 Verstärkung Farb- und Lichtsensor (00=1x, 01=4x, 10=16x, 11=64x)
    #2/3 Verstärkung Annäherungssensor (00=1x, 01=2x, 10=4x, 11=8x)
    #4/5 reserviert
    #6/7 Stromstärke LED (00=100mA, 01=50mA, 10=25mA, 11=12,5mA)

    bus.write_byte_data(DEVICE_ADDRESS, 0x8f, 0x0f)


def readProximity():
    global bus, DEVICE_ADDRESS, p
    #proximity
    p = bus.read_byte_data(DEVICE_ADDRESS, 0x9c)


def readColor():
    global bus, DEVICE_ADDRESS, cf, rf, gf, bf, hf, sf, vf
    import colorsys #hsv
    #color
    cl = bus.read_byte_data(DEVICE_ADDRESS, 0x94)
    ch = bus.read_byte_data(DEVICE_ADDRESS, 0x95)
    rl = bus.read_byte_data(DEVICE_ADDRESS, 0x96)
    rh = bus.read_byte_data(DEVICE_ADDRESS, 0x97)
    gl = bus.read_byte_data(DEVICE_ADDRESS, 0x98)
    gh = bus.read_byte_data(DEVICE_ADDRESS, 0x99)
    bl = bus.read_byte_data(DEVICE_ADDRESS, 0x9a)
    bh = bus.read_byte_data(DEVICE_ADDRESS, 0x9b)
    c = cl + (ch << 8)
    r = rl + (rh << 8)
    g = gl + (gh << 8)
    b = bl + (bh<<8)
    m = 65535/63
    cf = c/m
    rf = r/m
    gf = g/m
    bf = b/m
    hf,sf,vf = colorsys.rgb_to_hsv(rf, gf, bf)


initAPDS9960()
while True:
    readProximity()
    readColor()
    print("proximity:",p," crgb:", format(cf, '.2f'),format(rf, '.2f'),format(gf, '.2f'), format(bf, '.2f')," hsv:",format(hf, '.2f'),format(sf, '.2f'),format(vf, '.2f'))
    time.sleep(1)
PK
     j{…W               lib/PK
     j{…W£‚!4E   E      lib/controller.blockly<xml xmlns="https://developers.google.com/blockly/xml" version="15"/>PK
     j{…W“×2         lib/controller.py
PK
     j{…W÷ôÙ	}   }   
   .project.json{"uuid":"3c35bc4f-7b7c-5ba2-6ac4-5bb5376fe1a8","name":"APDS9960_smbus","mode":"ADVANCED","version":"1.0","controller":"TXT4"}PK 
     j{…WÅ%àÅ  Å                   /APDS9960_smbus.blocklyPK 
     j{…WV‘[                 ú  /APDS9960_smbus.pyPK 
     j{…W                        0  lib/PK 
     j{…W£‚!4E   E                R  lib/controller.blocklyPK 
     j{…W“×2                   Ë  lib/controller.pyPK 
     j{…W÷ôÙ	}   }   
             û  .project.jsonPK      u  £    
Jetzt können wir die I2C Schnittstelle benutzen und Sensoren oder Erweiterungen anschließen. Es ist auch möglich einen TXT mit einem TXT 4.0 zu verbinden. Man kann auf dem TXT auch ein RoboPro Programm laufen lassen und damit die I2C Schnittstelle ansprechen.
Ich denke, dass es eine große Vielfalt und nun viele neue Einsatzmöglichkeiten und Modell geben wird.

Mit freundlichen Grüßen
Holger
(*)
Es ist die Frage wie man hier im Forum ft-Programme darstellt. Man kann den RoboPro Coding (Blocky) Text in den Editor kopieren speichern und dann in xxxxx.ft umbenennen.

Wichtiger Hinweis:
Man sollte schon wissen was man da macht. Man darf nicht Sachen einfach mischen. Z.B. ist die Spannung die man verwendet sehr wichtig. Man kann nicht einfach 3,3V mit 5V mischen. Das führt zur unwiederruflichen Zerstörung der Ein- und Ausgänge am TXT 4.0. Das betrift z.B. die Kopplung vom TX/TXT zum TXT 4.0 oder vom Arduino UNO und dem TXT 4.0. Es gibt "auch" 3,3V Versionen vom UNO aber viele der I2C-Sensoren laufen mit 5V und damit auch die I2C Schnittstelle auf 5V. Ansonsten Levelshifter 3,3V <-> 5V benutzen.
Als Bus wird der I2C Bus Nr.3 benutzt der an der Seite vom TXT 4.0 zugänglich ist. Niemals einen anderen Bus benutzen! Man könnte Werte z.B. vom Speicher überschreiben und den TXT 4.0 dauerhaft blockieren. Man darf auch keinen Kurzschluss auf dem Bus erzeugen. Immer erst prüfen, dann einschalten. Auch sollte man die Sensoren nicht im laufenden Betrieb anschließen.
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

hypnotoad
Beiträge: 119
Registriert: 16 Feb 2019, 12:43
Wohnort: 30559 Hannover
Kontaktdaten:

Re: I2C Verbindung von TXT 4.0 und TX

Beitrag von hypnotoad » 27 Dez 2023, 22:17

Vielen Dank für das perfekte Beispiel im letzten Posting ! Ich musste auf dem TXT lediglich die 3 oben durch eine 1 ersetzen. Ich hatte ansonsten mit der Community-Firmware und ftrobopy bislang keinen Erfolg.

Antworten