Serielle Daten in Datei oder in Webseite schreiben?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

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?

Bild

Bild

Könnte hier eventuell jemand helfen, bzw. einige Tips geben wie ich da rangehen könnte?

MfG
Südschwede
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Bilder hochladen per [img]http://bild_url[/img] funktioniert hier leider nicht :wink:
Hier noch mal per URL da oben die Zeit zum bearbeiten abgelaufen ist :roll:

Bild

Bild
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie ist denn diese Kontrolloberflaeche entstanden? Denn da soll doch das Resultat der Abfrage via UART rein, oder?
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

__deets__ hat geschrieben: Samstag 22. Oktober 2022, 15:28 Wie ist denn diese Kontrolloberflaeche entstanden? Denn da soll doch das Resultat der Abfrage via UART rein, oder?
Die Abstände kann ich noch verkleinern so dass noch eine Zeile für die anzuzeigenden Parameter habe.
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Darum ging es mir nicht. Sondern um die verwandte Technik, damit da einschaetzen kann, wie die Abfrage eingebaut werden kann, und die Daten fliessen muessen.
Südschwede
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 :wink:

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.
Südschwede
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?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, das ist der erste Schritt: per pyserial versuchen, die gewünschten Information abzufragen.
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Habe mir erst mal pyserial installiert.
Kann ich hier schon mal ein paar Testbefehle absetzen um die Kommunikation zu testen?
Bild
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, kannst Du.
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Haben wir da mal ein Beispiel zu testen?
Südschwede
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
>>> 
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da fehlt das new line oder sogar carriage return new line.
Südschwede
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
>>> 
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du solltest irgendwann auch mal etwas von der Schnittstelle lesen.
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Man sollte doch nicht aufgeben :D

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 '
>>> 
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Und Schluss für Heute :D

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()
>>> 
Südschwede
User
Beiträge: 12
Registriert: Samstag 22. Oktober 2022, 12:03

Hallo,

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()
Antwort

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                                                                                '
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.
Antworten