Erste Schritte mit BT Control Set server mit TXT und CFW

Hallo Kids, hier ist eine Ecke extra für euch!
Ihr könnt hier Fragen aller Art stellen, die wir euch gerne so schnell wie möglich beantworten.
Ihr dürft hier aber auch gerne eure Modelle einfach mal anderen Fischertechnikern vorstellen.
Antworten
Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Mahlzeit » 09 Sep 2020, 19:11

Hallo zusammen!

Ich habe meinen TXT seit heute mit der CFW ausgerüstet. Ich habe jetzt mal den BT Control Set server gestartet und dann mit dem Iphone verbunden. Wie kann ich denn nun damit meine Motoren steuern? Mit Robo Pro wird das wohl nicht gehen oder? Bleibt dann nur ein Python Programm zu schreiben? (Noch nie gemacht)

Viele Grüße
Dennis

Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

BT Control Server + BT Remote + Python

Beitrag von Mahlzeit » 14 Sep 2020, 14:54

Da hier ja bisher keine Antwort gekommen ist, vermute ich mal, dass es nicht möglich ist, über robopro. Ich habe mir daher jetzt Python besorgt und ein Youtube Video dazu angesehen.

Zum Üben wollte ich dann erstmal die Beispielprogramme durcharbeiten, leider ist die Dokumentation auf der CFW Website nicht mehr ganz aktuell und verweist auf QT4, während die Touchstyle.py die ich mir irgendwo aus dem CFW Github gezogen haben mittlerweile scheinbar QT5 benötigt, sodass ich bei der Umsetzung der Beispielprogramme auf der Website daran eine Weile festhing (und weil pip3 unter meinem Win10 nicht laufen wollte). Egal, das läuft jetzt alles und ich komme über PyCharm auf den TXT Controller und ich kann online Programme ausführen lassen.

Der BT Control Set server auf Github enthält ja leider keine genaue Dokumentation was zu tun ist damit es z.B so läuft wie bei MOG im Youtube Video. bei ftrobopy im Github gibt es aber eine demo Datei https://github.com/ftrobopy/ftrobopy/bl ... control.py und in der manual.pdf von Robopy steht, dass es nur offline geht.

Also habe ich die o.g. Demo Datei auf meinem CFW installiert, die läuft jetzt und zeigt endlos

Code: Alles auswählen

0.0.0.0 False 
0.0.0.0 False 
0.0.0.0 False 
0.0.0.0 False 
0.0.0.0 False 
Leider weiß ich nicht genau was das bedeutet. Kann mir jemand einen Tipp geben?


Ein paar Tipps habe ich in https://github.com/ftrobopy/ftrobopy/bl ... trobopy.py ab Zeile 3xxx gefunden und damit folgendes versucht:

Code: Alles auswählen

import ftrobopy

txt = ftrobopy.ftrobopy('192.168.178.51', 65000)
# Start reading the infrared data from the controller

joy1 = txt.joystick(0, 0, 1)  # 1=BT Joystick
if joy1.isConnected():
    print('Ein Bluetooth Joystick ist verbunden.')
geschaut, da sagt er mir auf dem Display: "Connected to TXT direct firmware version not detected. Ein Bluetooth Joystick ist verbunden".

Da dachte ich dann das sieht ja gut aus. Doch mit:

Code: Alles auswählen

from __future__ import print_function
import ftrobopy

txt = ftrobopy.ftrobopy('auto')


joystick1 = txt.joystick(0, 0, 1)  # linker Joystick 
print("Links-Rechts-Stellung=", joystick1.leftright(), " Hoch-Runter-Stellung=", joystick1.updown())

joystick2 = txt.joystick(0, 0, 2)  # rechter Joystick 
print("Links-Rechts-Stellung=", joystick2.leftright(), " Hoch-Runter-Stellung=", joystick2.updown())

ergibt leider alles immer 0.0 als Stellung aller 4 Achsen. Hat jemand einen Tipp für mich was ich falsch mache?

VG, Dennis

Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Mahlzeit » 14 Sep 2020, 17:06

Das Problem war wohl, dass ich nicht verstanden habe und immer noch nicht richtig verstehe was die Nummern hinter den Joysticks bedeuten. Mit
joystick1 = txt.joystick(0,1,1)
joystick2 = txt.joystick(1,1,1)

funktioniert es.

Das Programm darf auch nicht zu schnell starten, als ich mit

N = 2
for _ in itertools.repeat(None, N)

einen zweiten Durchlauf angestoßen habe, passte es dann beim zweiten Durchlauf, während im ersten noch alles 0.0 hatte.

Jetzt muss noch rausfinden wie ich das jetzt nutze um die Motoren anzusteuern.

.. okay das war leichter als gedacht mit

Code: Alles auswählen

    Motor1 = txt.motor(1)
    Motor1.setSpeed(joystick1.leftright() * 512)
Mal gucken wie es weitergeht...
Dateianhänge
screenshot.png
screenshot.png (10.39 KiB) 1832 mal betrachtet

Benutzeravatar
PHabermehl
Beiträge: 2016
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von PHabermehl » 14 Sep 2020, 21:54

Hallo Dennis,

großen Respekt für Deinen Fortschritt. Leider habe ich keine Erfahrung mit BT. Deshalb bin ich schon recht beeindruckt, was Du so schnell auf die Beine gestellt hast.
Schön, dass Du das Wissen hier teilst, ich denke, da können Viele von lernen.

Gruß
Peter
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

Benutzeravatar
MasterOfGizmo
Beiträge: 2039
Registriert: 30 Nov 2014, 07:44

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von MasterOfGizmo » 15 Sep 2020, 15:22

Der Server für die BR-Remote, den ich damals geschrieben habe, bildet nur einen regulären Joystick unter Linux nach. Von daher gibt es da an der Stelle keine weitere Dokumentation zu.

Deine Frage ist daher eher, wie du generell unter der CFW einen Joystick ansprichst. Dazu gibt es in meinem Repository z.B. eine (alte und lange nicht mehr getestete) Joystick-Demo-App.

Du scheinst ja aber auch so recht weit gekommen zu sein. Daher die Bitte: Schreib irgendwo auf, was Du wie gemacht hast. Der nächste, der vor dem gleichen Problem steht wird's Dir danken. So funktioniert es hier generell. Die Dokumentationen schreiben wir ja auch während wir irgendetwas bauen oder testen.
Für fischertechnik: Arduino ftDuino http://ftduino.de, Raspberry-Pi ft-HAT http://tx-pi.de/hat

Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Mahlzeit » 15 Sep 2020, 16:47

Hallo! Danke für eure Rückmeldungen. Wenn ich hier echt schon etwas beitragen kann freue ich mich.

Die Fernsteuerung läuft soweit. (Kommentiertes Programm unten) Für heute war das Ziel aus dem Encodermotor die RPM zu messen. Meine kleine Schwester hat ein fahrbares Mehrgang Getriebe gebaut und ich möchte für sie damit drehzahlgesteuert eine Automatikschaltung realisieren (hoch-/runterschalten) während sie das Modell mit der Remote fahren kann.

Zuerst dachte ich, ich bräuchte scipy um die jeweils gesammelten Werte des Schrittzählers (getCurrentDistance()) zu integrieren. Das war aber quatsch und scheiterte schon daran, dass auf der CFW kein scipy importiert werden kann. Ich darf leider auch kein Linux installieren, sodass es nicht in Frage kam einen neuen build mit der Firmware zu versuchen wie im Beitrag mit der Lernfabrik4.0 beschrieben.

Die Lösung sieht jetzt so aus

Code: Alles auswählen

from __future__ import print_function
import time
import ftrobopy
import threading



txt=ftrobopy.ftrobopy('auto')

joystick1 = txt.joystick(0,1,1)
joystick2 = txt.joystick(1,1,1)
Motor1 = txt.motor(1)
Motor1.setDistance(0)
txt.updateWait()

def infiniteloop1():  # this controls Motor1 via a L-BT-Remote
    while True:
        Motor1.setSpeed(joystick1.leftright() * 512)


def infiniteloop2():  # RPM-Meter
    while True:
        Motor1 = txt.motor(1)
        curRev = Motor1.getCurrentDistance()
        t0 = time.time()
        lastRev = 0
        

        while (curRev == Motor1.getCurrentDistance()):
            txt.updateWait()
            t1 = time.time()
            try:
                getriRev = (curRev - lastRev / (t1 - t0))
                rpm = getriRev / 3.18  # 1.59 * (duration of measurement interval in s) returns sensible results for red encoder motor
                print("RPM: " + "%.1f" % rpm)

            except ZeroDivisionError:
                pass
            time.sleep(2)  # this sets length of measurement interval
            t0 = t1
            lastRev = curRev 


thread1 = threading.Thread(target=infiniteloop1)
thread1.start()

thread2 = threading.Thread(target=infiniteloop2)
thread2.start()



Wichtig ist am Anfang Motor1.setDistance(0) zu setzen, sonst resettet sich der Schrittzählerstand ständig. Warum habe ich nicht wirklich verstanden, aber es steht hier viewtopic.php?t=4834 und durch txt.updateWait() wird das Programm etwas robuster. Ich glaube mein TXT oder die Schrittausgabe hängen sonst manchmal ganz minimal.

Der erste Thread ermöglicht die Steuerung per BT und der zweite ermittelt die RPM in den letzten 2 Sekunden als gleitenden Mittelwert (denk ich).
rpm enthält jetzt Werte zwischen ca. 15 und 110 Umdrehungen, das passt zu den angegebenen Werten von ft. Der rote Motor dreht ja nicht so schnell.

Ob man das auch mit nested loops hinbekommen kann um es pythonischer zu machen weiß ich noch nicht. Als nächstes möchte ich aber versuchen das hoch und runterschalten des Getriebes damit zu automatisieren. Entweder direkt ab einer Schwellendrehzahl oder über die Ableitung als Zunahme/Abnahme der Drehzahl. Ich muss jetzt aber ein Eis essen gehen.

Benutzeravatar
EstherM
Beiträge: 979
Registriert: 11 Dez 2011, 21:24

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von EstherM » 16 Sep 2020, 17:28

Lieber Dennis,
dass Du sowenig Antworten auf Deine Fragen bekommst, liegt wohl auch daran, dass "nach oben die Luft dünner wird". Für mich liest sich das alles schon sehr fortgeschritten.

Vielleicht könntest Du Dir einen Account bei Github besorgen und Deine Programme und die Dokumentation (was soll das Programm machen? Wie arbeitet man damit? Wie hast Du es programmiert? Wie kann man es wo installieren?) dort ablegen.
Wir könnten auch gerne das fertige Programm auf der Website ablegen. Besser wäre es aber, Du würdest auch die Zwischenstände veröffentlichen. Und dafür wäre Github (oder auch Gitlab) der richtige Ort.
Weiterhin viel Spaß und viel Erfolg,
Gruß
Esther

Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Mahlzeit » 21 Sep 2020, 10:59

Hallo EstherM,

danke dir für das Lob. Hier ein neuer Zwischenstand. Meine Schwester hat am Wochenende einen Roboter mit unseren 2 Encodermotoren und ohne Lenkachse gebaut. Der sollte nun ferngesteuert werden. Das hat mich dann vor Probleme gestellt, da die Lenkung nur über die beiden Motoren erfolgen kann, genauso wie bei einem Kettenfahrzeug.

Nachdem das gelöst war und das Fahrzeug um die eigene Achse drehen, und somit lenken konnte, wollten wir einen Hütchenparcours abfahren, das hat aber nicht gut geklappt, da die Lenkung über das Drehen um die Achse sehr "radikal" ist und keine "gemäßigte Kurvenfahrt" wie bei Autos möglich ist. Gleichzeitig wollten wir aber auf die Möglichkeit auf engen Raum wenden zu können nicht verzichten.

Das wurde dann gelöst, indem wir jetzt den Linken Stick zum drehen um die eigene Achse und den rechten Stick für eine "gemütliche" Kurve nutzen. Man kann sich entscheiden.

Ich habe das ganze über sehr lange if,elif,else Schleifen gelöst, ich denke, dass das nicht sehr gut gelöst ist. Aber in der Praxis funktioniert es schon sehr gut. Die "BTR-2Mot".zip muss nur noch über die CFW Weboberfläche hochgeladen werden und erlaubt dann 'plug and play' nach dem Starten des BT Remote Servers die Lenkung des Fahrzeugs, man braucht keinen Python Code handeln.

Die Steuerung ist wie folgt:

Beschleunigung/bremsen: Linker Stick, hoch - runter
Drehen auf der Stelle: Linker Stick, seitwärts
Normale Kurve fahren wie bei Lenkachse: rechter Stick, seitwärts

Um präzise lenken zu können, haben wir noch eine Totzone um die Stickmitte eingestellt, damit der Stick immer perfekt zentriert. In der Geradeausfahrt sind die beiden Motoren über ihre Encoder synchronisiert (=perfekter Geradeauslauf).

Ich habe den Code so wie du vorgeschlagen hast auf Github hochgeladen und für die app-zip-Datei ein release erstellt.
https://github.com/Mahlzeit2000/ft

VG Dennis
Dateianhänge
fahrzeugft2.jpg
fahrzeugft2.jpg (108.93 KiB) 1185 mal betrachtet

Benutzeravatar
EstherM
Beiträge: 979
Registriert: 11 Dez 2011, 21:24

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von EstherM » 21 Sep 2020, 18:42

Lieber Dennis,
herzlichen Dank! Ich werde in den nächsten Tagen mal den TXT auspacken und mir das genauer angucken. Eine intelligente Fernsteuerung für den TX(T) ist schon von seit Jahren mein Traum. Damit habe ich hier im Forum angefangen, das Thema aber dann nicht weiterverfolgt.
Einige Fragen hätte ich noch:
- Was ist der Kasten rechts im Bild? Wo geht das Flachbandkabel rein?
- Hat das Fahrzeug Stützräder? Bitte mach doch noch mehr Fotos von dem Ding, damit man die Konstruktion erkennen kann.

Gruß
Esther

Bjoern
Beiträge: 318
Registriert: 04 Jan 2018, 12:34

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Bjoern » 21 Sep 2020, 21:53

Hi Esther,

ich tippe rechts auf den Umweltsensor aus Smart & Home.

Grüße
Björn

Kali-Mero
Beiträge: 240
Registriert: 21 Nov 2017, 12:28
Wohnort: Karlsruhe
Kontaktdaten:

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Kali-Mero » 22 Sep 2020, 08:43

Hallo zusammen,

das ist der Kombisensor (158402).

https://www.fischertechnik.de/de-de/pro ... ombisensor

Grüßle
Der Kali

Torsten
Beiträge: 199
Registriert: 29 Jun 2015, 23:08
Wohnort: Gernsheim (Rhein-Main-Region)

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Torsten » 22 Sep 2020, 15:00

Hallo Dennis,

noch eine Anmerkung: möglicherweise ist ftrobopy nicht thread-safe (ich habe das nie getestet). Innerhalb von ftrobopy werden selbst threads für die Kommunikation zwischen Linux- und Motor-Platine des TXT verwendet. Ich könnte mir vorstellen, dass es da zu Locking-Problemen in Kombination mit Deinen threads kommen kann.

Ich werde mir das bei Gelegenheit mal genauer anschauen.

Ganz davon abgesehen, bin ich aber schwer beeindruckt von Deinem Projekt !

Viele Grüße
Torsten

Mahlzeit
Beiträge: 20
Registriert: 06 Sep 2020, 10:40

Re: Erste Schritte mit BT Control Set server mit TXT und CFW

Beitrag von Mahlzeit » 02 Okt 2020, 10:33

Hallo zusammen!

Vielen Dank für die netten Antworten. Es macht mir viel Spaß, dass ich mich hier mit euch austauschen kann.

Torsten hat geschrieben:
22 Sep 2020, 15:00

noch eine Anmerkung: möglicherweise ist ftrobopy nicht thread-safe (ich habe das nie getestet). Innerhalb von ftrobopy werden selbst threads für die Kommunikation zwischen Linux- und Motor-Platine des TXT verwendet. Ich könnte mir vorstellen, dass es da zu Locking-Problemen in Kombination mit Deinen threads kommen kann.
Danke für den Hinweis! Ich habe jetzt öfters gelesen, dass threads manchmal problematisch sein können. Ich werde versuchen ab jetzt möglichst immer alles in einen loop zu packen. Ich habe bisher gedanklich immer in einzelnen Prozessen gedacht die dann strikt voneinander getrennt waren (z.B. Fernsteuerung, Kollisionsverhinderung, Gangschaltung). Das ist vermutlich ein Anfängerfehler und ich versuche ab jetzt mal umzudenken und alles als einen loop zu sehen.



EstherM hat geschrieben:
21 Sep 2020, 18:42
- Was ist der Kasten rechts im Bild? Wo geht das Flachbandkabel rein?
- Hat das Fahrzeug Stützräder? Bitte mach doch noch mehr Fotos von dem Ding, damit man die Konstruktion erkennen kann.
Wie Kali-Mero ja schon schrieb handelt es sich um den ft 3-fach Sensor (Bosch BMX055). Das Fahrzeug hat nur 2 große Räder. Für das Bild war das Fahrzeug jedoch mit 2 schwarzen Steinen abgestützt, da es zwar fährt aber bisher überhaupt nicht zuverlässig alleine stehen kann. Während die Fernsteuerung also gut funktioniert ist das Fahrzeug bisher noch kein Erfolg.

Falls jemand so wie ich Anfänger ist und das mal selbst ausprobieren will noch folgende Anmerkung:

Das Balancieren auf 2 Rädern hatte ich mir ehrlich gesagt einfacher vorgestellt als es ist! Man benötigt doch einiges an Hintergrundwissen. Entscheidend scheint mir die Erkenntnis, dass man mit einem Motor.setspeed(x) zwar die Geschwindigkeit des Motors aber eben gerade nicht die Geschwindigkeit des Fahrzeugs, sondern Beschleunigung/Bremsen beeinflusst. Mir fehlten da zunächst mathematische Grundlagen aber dank Youtube kann man schnell etwas rausfinden über Differential- und Integralrechnung und stößt dann auch auf PID controller. Durch den o.g. Zusammenhang wird dann auch klar warum das Fahrzeug mit einer einfachen Logik zw. Motor/Gyro nicht stehen bleiben kann. Ich versuche nun hinter das PID System zu steigen um es dann auf den Roboter anzuwenden.

Um die PID Regelung besser zu begreifen habe ich mal für einen virtuellen Python3 Fahrstuhl ohne Insassen (s Anhang), auf den Reibung und Schwerkraft einwirken einen PD (ohne I) Kontroller programmiert, als nächstes kommt dann PID und dann kann ich es vielleicht nochmal versuchen mit dem balancierenden Fahrzeug.

Sollte da etwas bei rumkommen, wird es hier natürlich vorgestellt.

VG, Dennis
Dateianhänge
fahrstuhlpdkl2.gif
fahrstuhlpdkl2.gif (263.19 KiB) 838 mal betrachtet

Antworten