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
Probleme Ansteurung Schrittmotor
@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.
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: 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.
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:
Ü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