Robo Pro Coding Python

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
Jochen K.
Beiträge: 2
Registriert: 23 Nov 2023, 18:08

Robo Pro Coding Python

Beitrag von Jochen K. » 24 Nov 2023, 13:26

Hi, kann mir jemand sagen, wo ich eine Einführung in die Fischertechnik spezifischen Befehle für Robo Pro Coding mit Python finden kann?

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

Re: Robo Pro Coding Python

Beitrag von matrix » 24 Nov 2023, 13:34

Hey Jochen,

leider hat fischertechnik bisher die Dokumentation nur für die grafische Programmierung erstellt. Mich persönlich ärgert das auch etwas, da ich so nicht wirklich programmieren kann und bereits Probleme beim Finden von Funktionen habe.
Du kannst dir aber mit der grafischen Programmierung in der rechten Seitenleiste den Python-Code für die entsprechenden Blöcke anzeigen lassen. So finde ich mich mittlerweile auch etwas zurecht.

Viele Grüße,
Matrix/Felix

Bastelklausi
Beiträge: 134
Registriert: 03 Jun 2020, 19:32

Re: Robo Pro Coding Python

Beitrag von Bastelklausi » 26 Nov 2023, 18:18

Moin zusammen,

vor diesem Problem stehe ich auch. Da hat FT ein tolles Robotics Programm mit u.a. den Kästen Hightech und Education Base SET mit Addons. Alle Erklärungen/Lehrpläne etc. beziehen sich auf Blockly. Mit Blockly erziele ich schnelle Erfolge, doch mit zunehmender Komplexität der Programme geht die Übersicht verloren. Die RPC (Robo Pro Coding) Hilfe bezieht sich bislang ausschließlich auf Blockly. Bezüglich Python wird nur erwähnt, dass RPC es unterstützt.
Auch erfahrene Python Programmierer (ich zähle eher zu den Anfängern) stehen vor dem Problem, wie die API Schnittstellen aussehen, um Ein- und Ausgaben nutzen zu können. Hier gibt es bislang nichts!!!
Das ist schwach von FT und unbefriedigend!!!

Parallel zu FT Robotics beschäftige ich mich mit dem Lego Spike Prime System. Das bietet Scratch als Block orientierte Sprache und Python als Text orientierte Sprache. Bezüglich Python bietet Lego eine online Hilfe um das Lego Python kennen zu lernen (Erste Schritte) und eine mehr oder weniger ausführliche Beschreibung aller unterstützten API Funktionen. Die Beschreibung ist teils sehr ausführlich mit Programmbeispielen und teils eine einfache Auflistung.
Der Lego Python Editor ist dem von RPC überlegen, da er eine Ausfüllhilfe anbietet, die Schritt für Schritt durch alle Funktionsaufrufe und deren Parameter führt. RPC hat auch eine Ausfüllhilfe, die aber nur sehr einfach gehalten ist und sich nur an dem aktuellen Programm orientiert.

Trotz intensiver Recherche im WWW habe ich zum Thema FT Python keine Hilfe finden zu können. So bleibt mir nur der mühsame Weg über die Beispielprogramme. Der führt jedoch durchaus zum Erfolg. Ich lade also z.B. ein Beispielprogramm in Python und kann es dann modifizieren. Zusätzlich speichere ich den Python Code in einer Textdatei, die ich mit Kommentaren füttere. Hierbei unterscheide ich die Controller Konfiguration (controller.py) und die eigentliche Programmdatei. Auf diese Weise komme ich dahinter, wie Sensoren und Aktoren eingebunden und benutzt werden. Ich stehe aber noch ganz am Anfang.

Meine aktuellen Versionen: RPC 6.2.0, TXT 4.0 Firmware 3.1.5

Meine bisherige Textdatei (beinhaltet NTC, Ultraschall, LED, Display):
# ==================================================
# NTC Widerstand
# ==================================================

# ----------------------------
# Controller.py
# ----------------------------
import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I1_ntc_resistor = txt_factory.input_factory.create_ntc_resistor(TXT_M, 1)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

import math
import time
from lib.controller import *
from lib.display import *

value = None

while True:
value = round(TXT_M_I1_ntc_resistor.get_temperature(), 1)
display.set_attr("temperature.text", str(''.join([str(x) for x in ['T = ', value, ' °C']])))
display.set_attr("temp_scale.value", str(value))
time.sleep(0.5)


# ==================================================
# Ultraschallsensor
# ==================================================

# ----------------------------
# Controller.py
# ----------------------------
import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I2_ultrasonic_distance_meter = txt_factory.input_factory.create_ultrasonic_distance_meter(TXT_M, 2)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

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

while True:
display.set_attr("distance.text", str(''.join([str(x) for x in ['D = ', TXT_M_I2_ultrasonic_distance_meter.get_distance(), ' cm']])))
time.sleep(0.25)


# ==================================================
# LED und Taster
# ==================================================
# ----------------------------
# Controller.py
# ----------------------------

import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()
txt_factory.init_output_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I1_mini_switch = txt_factory.input_factory.create_mini_switch(TXT_M, 1)
TXT_M_O4_led = txt_factory.output_factory.create_led(TXT_M, 4)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

import time
from lib.controller import *

while True:
if TXT_M_I1_mini_switch.is_closed():
for count in range(5):
TXT_M_O4_led.set_brightness(512)
time.sleep(0.5)
TXT_M_O4_led.set_brightness(0)
time.sleep(0.5)


Schöne Grüße
Klaus

Bastelklausi
Beiträge: 134
Registriert: 03 Jun 2020, 19:32

Re: Robo Pro Coding Python

Beitrag von Bastelklausi » 26 Nov 2023, 18:49

Nachtrag: im Code wurden die Einrückungen nicht angezeigt. Hier die korrekte Darstellung:

Code: Alles auswählen

# ==================================================
# NTC Widerstand
# ==================================================

# ----------------------------
# Controller.py
# ----------------------------
import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I1_ntc_resistor = txt_factory.input_factory.create_ntc_resistor(TXT_M, 1)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

import math
import time
from lib.controller import *
from lib.display import *

value = None

while True:
    value = round(TXT_M_I1_ntc_resistor.get_temperature(), 1)
    display.set_attr("temperature.text", str(''.join([str(x) for x in ['T = ', value, ' °C']])))
    display.set_attr("temp_scale.value", str(value))
    time.sleep(0.5)


# ==================================================
# Ultraschallsensor
# ==================================================

# ----------------------------
# Controller.py
# ----------------------------
import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I2_ultrasonic_distance_meter = txt_factory.input_factory.create_ultrasonic_distance_meter(TXT_M, 2)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

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

while True:
    display.set_attr("distance.text", str(''.join([str(x) for x in ['D = ', TXT_M_I2_ultrasonic_distance_meter.get_distance(), ' cm']])))
    time.sleep(0.25)


# ==================================================
# LED und Taster
# ==================================================
# ----------------------------
# Controller.py
# ----------------------------

import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()
txt_factory.init_output_factory()

TXT_M = txt_factory.controller_factory.create_graphical_controller()
TXT_M_I1_mini_switch = txt_factory.input_factory.create_mini_switch(TXT_M, 1)
TXT_M_O4_led = txt_factory.output_factory.create_led(TXT_M, 4)

txt_factory.initialized()

# ----------------------------
# Program.py
# ----------------------------

import time
from lib.controller import *

while True:
    if TXT_M_I1_mini_switch.is_closed():
        for count in range(5):
            TXT_M_O4_led.set_brightness(512)
            time.sleep(0.5)
            TXT_M_O4_led.set_brightness(0)
            time.sleep(0.5)



Bastelklausi
Beiträge: 134
Registriert: 03 Jun 2020, 19:32

Re: Robo Pro Coding Python

Beitrag von Bastelklausi » 02 Dez 2023, 22:40

Moin,

ich habe mich näher mit dem Python im Robo Pro Coding (RPC) befasst. Es gibt schon Möglichkeiten, heraus zu finden, wie man die FT Sensoren und Aktoren ansprechen kann.
Eine gute Möglichkeit: im Blockly "programmieren", welche Sensoren man auslesen will und welche Aktoren man ansprechen möchte. Dann das Blockly Programm in Python umwandeln. Das macht man unter Projektkonfiguration. Der Umwandlungsvorgang geht nur vom Blockly in Python. Das ist aber auch logisch, da RPC nur ein Subset von Python verwendet. Ich habe diese Möglichkeit unter RPC 6.2.0 entdeckt. Keine Ahnung, ob das vorher schon ging. Hatte ich nicht drauf geachtet.
Eine weitere Möglichkeit: Die Beispielprogramme laden und analysieren. Mit dem FT Lernmaterial abgleichen, damit man weiß, was das Programm machen soll.

Ich hab dann mal angefangen, eine Doku zusammenzustellen. Das ist erstmal nur ein kleiner Anfang für ein paar Standard Sensoren und Aktoren. Damit kann man LEDs bedienen, Encodermotoren steuern, Mini Switches auslesen, Phototransistoren, NTC-Sensor und Distanzsensor. Und ein paar Basics für das Display des TXT4.0. Im Laufe der Zeit wird die Doku (hoffentlich) weiter wachsen.

Eigentlich wollte ich den TXT4.0 schon in die hinterste Schublade verbannen. Das Blockly mag ich nicht, und die fehlende Doku hat mich verärgert. Da ich aber nicht gerne aufgebe, habe ich mich dann doch mal an das Thema begeben und habe ein paar Fortschritte gemacht. So kann ich z.B. die Parkhausschranke aus dem Basic Set wunderbar mit Python steuern. Das ist viel übersichtlicher als mit Blockly.

Okay, nun zur Doku:

Code: Alles auswählen

# ==================================================
# Documentation TXT 4.0 Python Functions
# 2023-12-02 by Klaus Janssen
# Just a begin with some essential definitions
# and functions
# ==================================================

# ==================================================
# Controller Definitions
# ==================================================

import fischertechnik.factories as txt_factory

txt_factory.init()
txt_factory.init_input_factory()  # sensors at I1 to I8
txt_factory.init_output_factory() # outputs at O1 to O8
txt_factory.init_motor_factory()  # motor control at M1 to M4

TXT_M = txt_factory.controller_factory.create_graphical_controller()

# Inputs
#
# Mini Switch at i.e. I1
TXT_M_I1_mini_switch = txt_factory.input_factory.create_mini_switch(TXT_M, 1)
# NTC resistor at i.e. I2
TXT_M_I2_ntc_resistor = txt_factory.input_factory.create_ntc_resistor(TXT_M, 2)
# Ultra Sonic sensor at i.e. I3
TXT_M_I3_ultrasonic_distance_meter = txt_factory.input_factory.create_ultrasonic_distance_meter(TXT_M, 3)
# Photo Transistor at i.e. I4
TXT_M_I4_photo_transistor = txt_factory.input_factory.create_photo_transistor(TXT_M, 4)

# Outputs
#
# LED at i.e. O3
TXT_M_O3_led = txt_factory.output_factory.create_led(TXT_M, 3)
# Encoder Motor at i.e. M1
TXT_M_M1_encodermotor = txt_factory.motor_factory.create_encodermotor(TXT_M, 1)


txt_factory.initialized()



# ==================================================
# Basic Functions in Program
# ==================================================

# some essential imports
import math			# math functions
import time			# time functions
from lib.controller import *
from lib.display import *	# display functions
from fischertechnik.controller.Motor import Motor # motor functions

# time delay
time.sleep(5)		# sleep 5 s
time.sleep(0.05)	# sleep 50 ms

# Get Status of Mini Switch at I1
if TXT_M_I1_mini_switch.is_closed():	# Switch closed
if TXT_M_I1_mini_switch.is_open():	# Switch open

# Get Temperature of NTC at I2
value = TXT_M_I2_ntc_resistor.get_temperature()
# Get Resistor value of NTC at I2
value = TXT_M_I1_ntc_resistor.get_resistor()

# Get Ultrasonic Distance from Sensor at I3
distance = TXT_M_I3_ultrasonic_distance_meter.get_distance()

# Get Status of Photo Transistor at I4
# i.e. as part of a light barrier:
if (TXT_M_I4_photo_transistor.is_bright()):	# Barrier intact
if (TXT_M_I3_photo_transistor.is_dark()):	# Barrier interrupted


# Led Functions for LED at O3
# Values 0 .. 512
TXT_M_O3_led.set_brightness(0)		# LED OFF
TXT_M_O3_led.set_brightness(64)		# LED ON dimmed
TXT_M_O3_led.set_brightness(512)	# LED ON max bright

# Encoder Motor functions at M1
#
# Set Speed and Turn Clock Wise (CW)
# Speed in range 0 to 512
TXT_M_M1_encodermotor.set_speed(int(speed), Motor.CW)
# Set Speed and Turn Counter Clock Wise (CCW)
TXT_M_M1_encodermotor.set_speed(int(speed), Motor.CCW)
#
# Start Motor
TXT_M_M1_encodermotor.start_sync()
# Stop Motor
TXT_M_M1_encodermotor.stop_sync()
#
# Run Motor for Number of Steps
# 63.9 steps for one full resolution
TXT_M_M1_encodermotor.set_distance(int(64))

# Some Display Functions
#
# Write Text "Hello" in Field "status" (defined in display.xml)
display.set_attr("status.text", str('Hello'))
#
# Set Indicator "red" to active (defined in display.xml)
display.set_attr("rot.active", str(True).lower())
# Set Indicator "red" to not active 
display.set_attr("rot.active", str(False).lower())
#
# React on Button Click
# Toggle Variable "los" 
def on_button_clicked(event):
    global los
    if los == 0:
        los = 1
    else:
        los = 0

display.button_clicked("button", on_button_clicked)

Für die Funktionsfähigkeit kann ich nicht garantieren. Aber ich hoffe, es ist für manche von euch eine Einstiegshilfe. Solltet ihr einen Fehler feststellen, bitte Nachricht an mich. Danke, und nun viel Spaß beim Programmieren mit Python unter RPC.

Beste Grüße
Klaus

Antworten