Hallo,
ich bin der Südschwede und habe leider keinerlei Programmiererfahrung was sehr schade ist sonst würde ich hier bei Euch nicht nachfragen.
Das gute ist ich bin lernbereit um mir in Zukunft selber weiterhelfen zu können.
Ich habe hier ein Heimprojekt wo eine große Satellitenantenne mit einem Eigenbau Positioner gesteuert wird um die Satellitenpositionen von 47.5°West bis 76.5°Ost anzufahren.
Der Positioner arbeitet mit einem AT89S52 Mikrocontroller wo mit passender Schnittstelle (USBASP, USB-UART) auch die Firmware aktualisiert werden kann. Ebenfalls können auch sämtliche Einstellungen ausgelesen und zurückgeschrieben werden.
Da der Positioner nicht in meiner unmittelbaren Arbeitsumgebung steht (ca.30m entfernt) habe ich mir eine Fernsteuerung mittels RaspberryPi + pi-remote (Lirc) über LAN gebastelt welche per Fernbedienungscodes das Webinterface von jedem beliebigen PC, Tablet oder Handy gesteuert werden kann, funktioniert sehr gut.
Als absolutes Gimmick möchte ich nun als Rückmeldung im Webinterface noch die Satellitenposition, den Wert vom Azimuth und der Elevation anzeigen lassen, hierfür benötige ich aber eure Hilfe.
Mit diesem Ablauf bekomme ich per serieller Schnittstelle (USB-UART) RaspberryPi + cutecom verbunden mit dem Positioner und angefragt per LAN vom HeimPC mit SSH-Console aus folgende Antwort wenn ich den HEX-Befehl "F0" sende, folgenden String zur Anzeige "U ---- Sat: 019 ---- 40.5W SES 6 D - C.Circ - Vert Az: 1276 El: 1210"
Wie kann ich den Ablauf so in Python umsetzen das mir die Werte vom Positioner per /dev/ttyUSB0 vom RaspberryPi gelesen und im Webinterface oder in einer Datei abgelegt/dargestellt werden können?
Könnte hier eventuell jemand helfen, bzw. einige Tips geben wie ich da rangehen könnte?
MfG
Südschwede
Serielle Daten in Datei oder in Webseite schreiben?
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Das pi-remote https://github.com/bweston6/pi-remote läuft auf einem RaspberryPi welcher den Positioner per IR-Lirc steuert.
Gleichzeitig ist der Positioner noch per USB-UART /dev/ttyUSB0 mit dem Raspberry verbunden um die Seriellen Daten steuern und auswerten zu können was ich aktuell mit cutecom mache.
Das müsste ja der Python Script ersetzen, er müsste ein HEX F0 senden und dann das empfangene auswerten/weiterleiten.
Zugriff ist per LAN. Pi-remote ist ein Python3 Tool welches per systemd service beim Start des Raspberry gestartet wird und im Hintergrund läuft.
Die Weboberfläche ist ein Templates index.html. Das Tool kannst Du auf der github Seite als *.zip herunterladen um genauen Einblick zu erhalten, ich kann mich da leider vermutlich nicht gut ausdrücken wenn es um das Erklären geht
Ps: den F0 Hexbefehl müsste man eventuell bei jedem Tastendruck im Webinterface senden können um einen Startbefehl zu haben damit man den Antwortstring auswerten kann.
Gleichzeitig ist der Positioner noch per USB-UART /dev/ttyUSB0 mit dem Raspberry verbunden um die Seriellen Daten steuern und auswerten zu können was ich aktuell mit cutecom mache.
Das müsste ja der Python Script ersetzen, er müsste ein HEX F0 senden und dann das empfangene auswerten/weiterleiten.
Zugriff ist per LAN. Pi-remote ist ein Python3 Tool welches per systemd service beim Start des Raspberry gestartet wird und im Hintergrund läuft.
Die Weboberfläche ist ein Templates index.html. Das Tool kannst Du auf der github Seite als *.zip herunterladen um genauen Einblick zu erhalten, ich kann mich da leider vermutlich nicht gut ausdrücken wenn es um das Erklären geht
Ps: den F0 Hexbefehl müsste man eventuell bei jedem Tastendruck im Webinterface senden können um einen Startbefehl zu haben damit man den Antwortstring auswerten kann.
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Auf dieser Seite https://www.pythonpool.com/python-serial-read/ gibt es schon mal einige Beispiele.
Könnte man da eventuell schon etwas verwenden?
Könnte man da eventuell schon etwas verwenden?
Ein weiterer Schritt: Bau eine neue Route “position” ein in Server.py , mit der du erstmal eine fest kodierte Zeile zurückgibst. Und die muss in der Webseite per jQuery und einem Intervall abgefragt & in ein HTML Element gepackt werden.
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Haben wir da mal ein Beispiel zu testen?
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Habe mal einiges abgesetzt, aber keine Ahnung ob das ok ist
Code: Alles auswählen
>>> ser = serial.Serial('/dev/ttyUSB0') # open serial port
>>> ser.write(b'F0') # write a string
2
>>> ser.write(b'F0') # write a string
2
>>> ser.write(b'0xF0') # write a string
4
>>>
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Hm
Code: Alles auswählen
>>> ser.write(b'\xF0\r\n')
3
>>> ser.write(b'\xF0\r')
2
>>> ser.write(b'\xF0\n')
2
>>> ser.write(b'\xF0')
1
>>>
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Man sollte doch nicht aufgeben
Code: Alles auswählen
>>> ser.write(b'\xF0')
1
>>> answer = ser.readall()
>>> print(str(answer))
b'U ---- Sat: 019 ---- 40.5W SES 6 D - C.Circ - Vert Az: 1276 El: 1210 '
>>>
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Und Schluss für Heute
Code: Alles auswählen
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 230400, timeout=1)
>>> print('\nStatus -> ',ser)
Status -> Serial<id=0x766b2c58, open=True>(port='/dev/ttyUSB0', baudrate=230400, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)
>>> ser.write(b'\xF0')
1
>>> answer = ser.readall()
>>> print(str(answer))
b'U ---- Sat: 019 ---- 40.5W SES 6 D - C.Circ - Vert Az: 1276 El: 1210 '
>>> ser.close()
>>>
-
- User
- Beiträge: 12
- Registriert: Samstag 22. Oktober 2022, 12:03
Hallo,
hiermit bekomme ich das was ich möchte schon mal korrekt ausgelesen,
Antwort
Das Print wirft mir nun alle Daten von meinem 20x4 Display aus was am Positioner angezeigt wird, alles in einer Zeile zu 4 Blöcken (mal mit | markiert)
Einmal mit Werten/Daten im Betrieb und einmal im Standby.
Nun hänge ich fest und weiß nicht wie man den String in die Einzelwerte zerlegt und weiterverarbeitet oder eventuell erst mal zum lernen in eine Datei schreibt, hier bräuchte ich mal Hilfe von jemanden.
hiermit bekomme ich das was ich möchte schon mal korrekt ausgelesen,
Code: Alles auswählen
import serial
ser = serial.Serial('/dev/ttyUSB0', 230400, timeout=1)
ser.write(b'\xF0')
answer = ser.readall()
print(answer)
ser.close()
Code: Alles auswählen
Positioner im Betrieb (4 Blöcke a 20 Stellen, mit | markiert)
b'U ---- Sat: 019 ---- 40.5W SES 6 D - C.Circ - Vert Az: 1276 El: 1210 '
b'U| ---- Sat: 019 ---- | 40.5W SES 6 | D - C.Circ - Vert | Az: 1276 El: 1210 |'
b'U ---- Sat: 019 ---- 40.5W SES 6 D - C.Circ - Vert Az: 1276 El: 1210 '
Positioner im Standby (4 Blöcke a 20 Stellen, mit | markiert)
b'U '
b'U| | | | |'
b'U '
Einmal mit Werten/Daten im Betrieb und einmal im Standby.
Nun hänge ich fest und weiß nicht wie man den String in die Einzelwerte zerlegt und weiterverarbeitet oder eventuell erst mal zum lernen in eine Datei schreibt, hier bräuchte ich mal Hilfe von jemanden.