Nutzung einer seriellen RS485 Schnittstelle

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

Hallo zusammen.

Ich bin neu hier im Forum und möchte ein Roboter Auto bauen, das von einem Raspberry Pi gesteuert wird.
Als Motoren habe ich zwei Nanotec Schrittmotoren (ST4118D1804-A) und zwei passende Controller (SMCI33-2).

Als Erweiterungsplatine für den Pi verwende ich das Modul RB-RS485.

Mit Hilfe des Buches "Raspberry Pi - Das umfassende Handbuch" von Kofler/Kühnast/Scherbeck habe ich die Bluetooth-Schnittstelle vom Pi deaktiviert, da sich wohl UART und Bluettoth beim Pi 3 gegenseitig behindern.

pyserial habe ich installiert auf dem Pi.

Leider gibt es auf der Seite für Joy-IT Anleitungen keine Anleitung mehr für die RB-RS485 Erweiterung. Die Kurzanleitung bei Conrad hilft mir auch nicht weiter.

Ich habe auf einem Windows Rechner das Programm "Free Serial Port Manager" installiert und getestet. Damit kann ich überprüfen, ob Pakete auf dem seriellen Port ankommen oder abgehen.

Obwohl aus der Erweiterungskarte die grüne LED für TX-Traffic blinkt wenn ich mein Skript ausführe, kommen keine Daten im Serial Port Manager an.

Hier mein Python Code.

Ich habe mich an das Programmierhandbuch für den SMCI33-2 Controller gehalten was die Ansteuerung des Motors angeht. Zum Test habe ich den Motor mit Hilfe des Nanotec Programms vom Windows PC aus angesteuert und den Port mit dem Serial Port Manager überwacht - das Telegramm ist gleich. Aber bisher nur in der Theorie - Mein Pi schickt keine Daten raus.

Code: Alles auswählen

#!/usr/bin/env python

import serial, time
ser = serial.Serial(
    port='/dev/serial0',
    baudrate = 115200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout = 2)

print("Daten senden")
var = '#*$0\n'             #Jeden Befehl habe ich vor dem Senden in die Variable "var" gespeichert und diese...
ser.write('#*$0\n'.encode())
print(var)                  #...nach dem Befehl anzeigen lassen. 

print("Drehrichtung einstellen")
var = '#*d1\n'
ser.write('#*d1\n'.encode())     #dreht rechtsrum
print(var)

print("4000 Schritte")
var = '#*s4000\n'
ser.write('#*s4000\n'.encode()) #4000 Schritte
print(var)

print("Positionierart Drehzahlmodus")
var = '#*p5\n'
ser.write('#*p5\n'.encode())     #Positionierart auf 5
print(var)

print("minimale Frequenz von 1 Hz eingestellt")
var = '#*u1\n'
ser.write('#*u1\n'.encode())     #minimale Frequenz 1
print(var)

print("maximale Frequenz von 80 Hz eingestellt")
var = '#*o80\n'
ser.write('#*o80\n'.encode())   #maximale Frequenz 80
print(var)

print("Beschleunigung von 800 einstellen")
var = '#*b800\n'
ser.write('#*b800\n'.encode())   #Beschleunigung 800
print(var)

print("Motoren starten")
var = '#*A\n'
ser.write('#*A\n'.encode())     #Motoren starten
print(var)

time.sleep(2)            #Der Motor sollte eigentlich 2 Sekunden lang laufen, bevor es gestoppt wird.

print("Motoren stoppen")
var = '#*S\n'
ser.write('#*S\n'.encode())     #Motoren stoppen
print(var)

ser.close()


Ich weiss dass mein Problem sehr speziell ist, ich habe es nur so genau wie möglich versucht zu beschreiben, damit mir möglichst geholfen werden kann. Hier nochmal in Kurzform meine Fragen:

-Muss ich auf dem Pi spezielle Treiber für das RB-RS485 Board installieren oder sollte es "Plug-and-Play" funktionieren?
-Welcher port ist der Richtige? Es funktioniert weder mit "ttyS0", noch mit "serial0". Mit "ttyAMA0" hängt sich das ganze Programm auf ähnlich wie bei diesem User, allerdings kann ich das Problem bei mir nicht beheben, indem ich de Port auf "ttyS0" ändere.

Alternativ:
-Ich habe ein USB-RS485 Kabel von Nanotec. Gibt es für den Pi bestimmte Treiber, die man installieren muss, damit das USB-Kabel erkannt wird?

Ich hoffe ich konnte mein Problem einigermaßen verständlich beschreiben.

Viele Grüße,

Der Praktikant
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, du musst keine speziellen Treiber nutzen. Du hast eigentlich schon richtig angefangen mit der Deaktivierung des BT Moduls. Damit sollte eigentlich eine serielle Schnittstelle /dev/ttyAMA0 verfuegbar sein, und funktionieren. So ist es zumindest bei mir, und jedem PI den ich bisher benutzt habe. Hast du schon mal probiert mit einem Terminalprogramm wie miniterm oder zB einfach mit "screen /dev/ttyAMA0 115200" auf die Schnittstelle zuzugreifen?

Bezueglich des Kabels: darin sollte ein ueblicher USB2Serial-Converter stecken. Fuer die meisten bring Linux Unterstuetzung schon mit, dann sollte eigentlich eine Schnittstelle unter /dev auftauchen. Ist das womoeglich deine /dev/serial0? Was ist der Unterschied beim Kommando lsusb mit und ohne anstecken des USB2RS485 Kabels?

Und weil ich oft meckere, hier mal ein Lob: du hast dein Problem gut beschrieben. Bekommst ein 🐝 dafuer :)

Am Programm selbst gibt's dann einiges zu meckern, vor allem das du viel unnoetige Wiederholungen drin hast. Schreib dir eine Funktion

Code: Alles auswählen

def sende(daten, ser):
       bytes = daten.encode()
       print(bytes)
       ser.write(bytes)
und benutze die, dann schrumpft dein Progamm auf triviale Laenge zusammen.
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Nein, du musst keine speziellen Treiber nutzen. Du hast eigentlich schon richtig angefangen mit der Deaktivierung des BT Moduls.
Danke! Ich habe im Ordner /dev/ die Datei "cmdline.txt" um die Zeile "dtoverlay=pi3-miniuart-bt" erweitert.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Damit sollte eigentlich eine serielle Schnittstelle /dev/ttyAMA0 verfuegbar sein, und funktionieren. So ist es zumindest bei mir, und jedem PI den ich bisher benutzt habe.
Bei mir klappt es leider nicht :( Wenn ich den Port "ttyAMA0" verwende hängt sich mein Programm auf. Und auch über den "serial0" Port kommt nichts über das USB Kabel an.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Hast du schon mal probiert mit einem Terminalprogramm wie miniterm oder zB einfach mit "screen /dev/ttyAMA0 115200" auf die Schnittstelle zuzugreifen?
Wenn ich "screen /dev/ttyAMA0 115200" ins Terminal eingebe kommt die Meldung "bash: screen: Kommando nicht gefunden". Ebenso beim Befehl "screen /dev/ttyserial0 115200".
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Bezueglich des Kabels: darin sollte ein ueblicher USB2Serial-Converter stecken. Fuer die meisten bring Linux Unterstuetzung schon mit, dann sollte eigentlich eine Schnittstelle unter /dev auftauchen. Ist das womoeglich deine /dev/serial0? Was ist der Unterschied beim Kommando lsusb mit und ohne anstecken des USB2RS485 Kabels?
Bild
Zusätzlich taucht mit dem USB Konverter ein Ordner "USB" im Ordner /dev/, sowie eine Datei "ttyUSB0" auf. Wenn ich den port im Programm auf "ttyUSB0" ändere dreht sich der Motor leider noch immer nicht. Ob diesmal Pakete gesendet werden kann ich leider nicht testen, da ich nur ein Kabel habe :) Ich habe es mal aufgeschraubt, aber leider ist auf dem Konverter keine Typenbezeichnung zu erkennen.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Und weil ich oft meckere, hier mal ein Lob: du hast dein Problem gut beschrieben. Bekommst ein 🐝 dafuer :)
Vielen Dank.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 14:37 Am Programm selbst gibt's dann einiges zu meckern, vor allem das du viel unnoetige Wiederholungen drin hast. Schreib dir eine Funktion

Code: Alles auswählen

def sende(daten, ser):
       bytes = daten.encode()
       print(bytes)
       ser.write(bytes)
und benutze die, dann schrumpft dein Progamm auf triviale Laenge zusammen.
Ja, das stimmt. Ich habe es erstmal so einfach wie möglich geschrieben, um Fehler in Schleifen ausschließen zu können. Es ist noch nicht die endgültige Version :)
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn screen nicht da ist, musst du es halt installieren. Wenn ttyUSB0 erscheint, dann funktioniert der USB2Serial-Konverter. Aufschrauben bringt da auch nix, die Elektronik ist im vergossenen Teil des Steckers. Und wenn du 20 mal das gleiche machst, machst du im Zweifel 20 mal das gleiche falsch, und musst es 20 mal korrigieren. Statt einmal, und dann eine Schleife zu verwenden.

Hast du ein Oszilloskop? Damit kann man mal auf die Leitungen des PI und der SUB-D-Stecker schauen, ob da Signale sind.
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 15:50 Wenn screen nicht da ist, musst du es halt installieren.
Ähm ja :) Danke! Dieses Praktikum ist das erste Mal, dass ich mit Linux arbeite und ich lernen jeden Tag etwas dazu.

Ich habe es mit "sudo apt-get screen" installiert. Wenn ich dann den Befehl ausführe und anschließend meinen Code erhalte ich den Fehler, dass der Port "serial0" belegt ist. Wenn ich erst meinen Code (mit einem zusätzlichen "time.sleep(2)" am Anfang ausführe und dann den screen Befehl bleibt das Terminal Fenster leider schwarz.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 15:50 Wenn ttyUSB0 erscheint, dann funktioniert der USB2Serial-Konverter. Aufschrauben bringt da auch nix, die Elektronik ist im vergossenen Teil des Steckers.
Ich hatte gehofft eine Bezeichnung des Chips zu finden, der USB zu Serial wandelt.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 15:50 Und wenn du 20 mal das gleiche machst, machst du im Zweifel 20 mal das gleiche falsch, und musst es 20 mal korrigieren. Statt einmal, und dann eine Schleife zu verwenden.
Das stimmt natürlich.
__deets__ hat geschrieben: Mittwoch 4. Juli 2018, 15:50 Hast du ein Oszilloskop? Damit kann man mal auf die Leitungen des PI und der SUB-D-Stecker schauen, ob da Signale sind.
Leider nein. Vielleicht kann ich ein zweites USB-Serial Kabel auftreiben und dann mit dem Windows PC schauen, ob der Pi aus dem USB Ausgang Signale schickt...

Ich habe die Firma Simac, die hinter dem RB-RS485 Erweiterungsboard steht angeschrieben. Sie haben mir ein Datenblatt zugesandt, aber leider werden darin meine Fragen nach nötigen Treibern nicht beantwortet.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du brauchst für das Board keine Treiber. Die serielle Schnittstelle des PI funktioniert einfach so. Und mehr als deren Signale zu wandeln tut das Board ja nicht.

Bei dem USB2Serial Kabel auf die richtige Voltzahl achten. Der PI hat 3.3V UART.

Außerdem wäre es hilfreich mal in die Ausgabe von ‚vcdbg log msg´ zu schauen. Da zeigt, wie der device tree des PIs konfiguriert ist, und ob die Deaktivierung der BT Schnittstelle erfolgreich war.

Und es gibt viele Diskussionen dazu im offiziellen Forum. ZB hier: https://www.raspberrypi.org/forums/view ... p?t=152201
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

Vielen Dank für deinen Einsatz!

Ich habe leider auch in dem genannetn offiziellen Forum keine Lösung finden können.

Bild

So sieht die Antwort auf den Befehl bei mir aus. Ich kann daran ehrlich gesagt nicht erkennen, ob es geklappt hat.

Ich teste seit Montag alle denkbaren Varianten, aber außer eifrigem Blinken der RX und TX LEDs auf der RB-RS485 Erweiterungskarte passiert nichts...
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht Bilder posten, die dann noch nicht mal funktionieren. Sondern Text, und den in die Python Code Tags setzten, damit man ihn besser lesen kann.

Blinken die LEDs nur, wenn du auch was sendest? Dann tut's doch, Fehler im Protokoll der tatsaechlichen Ansteuerung sind ja dann immer noch moeglich.
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

__deets__ hat geschrieben: Donnerstag 5. Juli 2018, 13:35 Bitte nicht Bilder posten, die dann noch nicht mal funktionieren. Sondern Text, und den in die Python Code Tags setzten, damit man ihn besser lesen kann.

Blinken die LEDs nur, wenn du auch was sendest? Dann tut's doch, Fehler im Protokoll der tatsaechlichen Ansteuerung sind ja dann immer noch moeglich.
Ich habe die Bilder bei einem gängigen Image Hoster hochgeladen... Ich wundere mich auch warum sie nicht angezeigt werden...

Ja, die LED blinken nur wenn ich was sende. Auf einem Windows Rechner habe ich parallel das Programm Free Serial Port Manager laufen und den PC über das USB-RS485 Kabel mit dem Pi verbunden. Wenn also vom Pi was gesendet wird sollte es eigentlich auf dem PC zu sehen sein, aber da kommt nichts an.
Ich werde morgen mal einen zweiten PI als Empfänger programmieren und die RX und TX stecker der beiden Pis über Kreuz verbinden. Ich hoffe dass ich dann endlich mal sehe, was da gesendet wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pythonPraktikant: Du hast nicht den Link zum Bild angegeben sondern den Link zu einer HTML-Seite. Die korrekten Links, auch im phpBB-Code-Format, sind doch unter dem Bild zum kopieren und einfügen angegeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

Danke für den Hinweis, blackjack.

Bild

Gibt es hier eine Möglichkeit Beiträge zu editieren?!
pythonPraktikant
User
Beiträge: 8
Registriert: Mittwoch 4. Juli 2018, 13:03

Es gibt ein kleines Update.

Möglicherweise ist es interessant für alle, die ebenfalls einen Nanotec Schrittmotor steuern wollen und vor ähnliches Problemen stehen:

Ich habe inzwischen mit Hilfe eines Oszilloskops die RX und TX Ausgänge geprüft. Der Pegel liegt bei über 5 Volt. Das RB-RS485 Erweiterungsboard funktioniert also.

Das Problem liegt an den GPIO Pins des Pis und den SMCI33 Controllern, die ich verwende: Der Gesamtstrom über alle GPIO Pins darf 50 mA nicht überschreiten. Da die SMCI33-2 Controller aber für einen USB-RS485 Konverter ausgelegt sind, rechnen sie mit einem höheren Strom (bis zu 500 mA über USB 2).

Dazu kam bei mir, dass ich über die NanoPro Software von einem Windows Rechner aus die Schrittmotoren wieder in den Werkszustand zurücksetzen musste. Dann hat das Nanotec Kabel über den Port /dev/ttyUSB0 funktioniert.

Ich kann die Motoren jetzt ansteuern, aber muss noch ein Programm schreiben, um die Drehzahl laufend anzupassen.

Ich bin aber froh, dass es überhaupt klappt und wollte das mal als Feedback geben.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schön das es klappt. Hast du dir deinen PI mit den Stromanforderungen frittiert?!? Und so ganz verstehe ich auch den Zusammenhang zur rs485 nicht, das ist doch nur UART auf differentielle Pegel. Strom zieht da doch keiner.
Antworten