Probleme Ansteurung Schrittmotor

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
jkoetter
User
Beiträge: 5
Registriert: Donnerstag 27. November 2014, 09:08

Hallo liebe Python Gemeinde,

ich habe ein Problem mit der Ansteueung eines Schrittmotors. Der Schrittmotor wird mit einem Arduino Uno Board angesteuert, auf dem ein funktionierendes Arduino Programm aufgespielt ist, in dem sich der Motor mit dem Befehl 'steps 500' um 500 Mikroschritte drehen lässt.
Jetzt soll aber das ganze mit Python gesteuert werden.
Das Arduino Board ist über USB mit dem Rechner verbunden. Ich nutzt PYthon xy in der Version 2.7.6.1. Das Programm wurde in Spyder verfasst.
normalerweise sollte das ganze mit dem Befehl ser.write('steps 500') möglich sein sobald man die Schnittstelle über pyserial initialisiert hat.
Das Programm sieht wie folgt aus:
import serial

ser=serial.Serial(4)
print ser.name
ser.write('steps 500 XX')
ser.close()


An der Stelle XX habe ich schon veschieden Abschlusskommentare eingefügt:
\n
\t
\r\n
0A
10

bis jetzt hat nichts funktioniert. Wenn man das Arduino Board mit Realterm ansteuert funktioniert das ganze einwandfrei. Es wird dabei der Abschlusskommentar +lf (line feed) verwendet.

Vielleicht mache ich ja einen offentsichtilichen Fehler, aber ich komme einfach nicht auf die Lösung des Problems.
Möglicherweise hat hier jemand eine Lösung oder eine Hilfestellung für mich.

Danke
BlackJack

@jkoetter: Stimmen denn die Verbindungsparameter, also Baud und so weiter?

Edit: Und muss man beim Uno eventuell direkt nach dem Verbindungsaufbau eine Weile warten bevor man die ersten Daten sendet? Einige Arduino-Modelle erwarten in den ersten x Sekunden nämlich erst einmal ob ein neues Programm über die serielle Schnittstelle geflasht werden soll.
jkoetter
User
Beiträge: 5
Registriert: Donnerstag 27. November 2014, 09:08

Die Verbindungsparameter stimmen, ich hab das Steuerungsprogramm erst auf das Board geladen und dann versucht es mit Python zu bedienen.
Wie lange sollte man denn warten bevor man Befehle herübersendet?
BlackJack

@jkoetter: Das sollte irgendwo in der Dokumentation stehen. Zitat von der Arduino-Webseite:
http://arduino.cc/en/Main/ArduinoBoardUno hat geschrieben:When the Uno is connected to either a computer running Mac OS X or Linux, it resets each time a connection is made to it from software (via USB). For the following half-second or so, the bootloader is running on the Uno. While it is programmed to ignore malformed data (i.e. anything besides an upload of new code), it will intercept the first few bytes of data sent to the board after a connection is opened. If a sketch running on the board receives one-time configuration or other data when it first starts, make sure that the software with which it communicates waits a second after opening the connection and before sending this data.
jkoetter
User
Beiträge: 5
Registriert: Donnerstag 27. November 2014, 09:08

Ok, ich werde das ausprobieren gucken ob es dran liegt.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Wie schaut es aus, bist du weiter gekommen?

Bin neugierig, weil ich selbst eine Kombination aus Arduino als Steuerung und zur Parametrierung / Visualisierung Python(PyQt+matplotlib) verwende.
jkoetter
User
Beiträge: 5
Registriert: Donnerstag 27. November 2014, 09:08

Nein, leider keine Fortschritte. Es funktioniert einfach nicht so wie ich das gerne hätte.
jkoetter
User
Beiträge: 5
Registriert: Donnerstag 27. November 2014, 09:08

So, das Problem ist gelöst.
Über Realterm habe ich herausgefunden, dass das Arduino Board als erstes ein "lf" sendet, dann ein "Controller started crlf". Das wiederum blockiert den Buffer, da zum Ein- und Ausgben wohl der gleiche Buffer genutzt wird.
Ich habe dann das Programm um Ausleseschritte erweitert und Zeitspannen mit eingefügt in denen sich der Motor drehen kann bevor neue Befehle gesendet werden.
Das gesamte Programm sieht dann wie folgt aus:

Code: Alles auswählen

Programm zur Ansteuerung eines Schrittmotors über ein Arduino Uno
Board. 

In Zeile 23 wird eine delayzeit eingegeben, die die Zeitspanne
zwischen zwei steps in Mikrosekunden angibt. 

In Zeile 21 wird eine Stepweite zur rechtsfahrt und in Zeile 25 zur 
linksfahrt eingegeben. 
 
"""

import serial               #Bibliotheken importieren
import time

ser=serial.Serial(4,9600)   #Port konfigurieren


t= ser.readline()           #auslesen des Buffers (read /lf) 
t=t + ser.readline()        #read Controller started 

ser.write('delay 3\n')      #Schrittgeschwindigkeit einstellen

t=t + ser.readline()        #Buffer auslesen

ser.write('steps 64\n')   #Schrittbefehl senden

t=t + ser.readline()        #Buffer auslesen

time.sleep(3)             #Zeitspanne zur Datenverarbeitung/Motordrehung

ser.write('steps -64\n')    #Schrittbefehl senden

time.sleep(3)             #Zeitspanne zur Datenverarbeitung/Motordrehung

#t=t + ser.readline()        #Auslesen des Buffers

ser.close()                 #Port schließen
Antworten