ich bin neu hier im Forum und auch neu bei Python.
Ich benutze Python 3.3 und Versuche mit Pyserial eine Joystick Coordinate an ein Arduino zu senden damit es das Arduino einen Servo Motor auf den enstprechenden Winkel fährt (0-180°).
Das auslesen des Joysticks und das Skalieren auf +90° und -90° habe ich hinbekommen.
Code: Alles auswählen
#-------------------------------------------------------------------------------
# Name: Joystick Treiber -90 bis +90 grad pro Achse + Trigger 0-180 grad (XOR)
# Purpose:
#
# Author: DasGehtSchon
#
# Created: 27.11.2012
# Copyright: (c) DasGehtSchon 2012
# Licence: <your licence>
#-------------------------------------------------------------------------------
# Pygame Module Importieren und Init
import pygame
pygame.joystick.init() # Joysticks Initialiesieren
pygame.display.init() # display Modul Initialiesieren
# Kontrolle ob ein Joystick angeschlossen ist
joyinit = pygame.joystick.get_init()
if joyinit == 1:
print("Joysticks initialisiert")
else:
print ("Keine Joysticks angeschlossen")
end
# Die Anzahl der Joysticks ermitteln
joycount = pygame.joystick.get_count()
print("Es sind", joycount, "Joysticks angeschlossen")
# ein Joystick anlegen
joy1 = pygame.joystick.Joystick(1) # Joystick adresse 1 anlegen
joy1.init() # Joystick adresse 1 Initialisieren
# Informationen ueber den Initialiesierten Joystick ausgeben
print (joy1.get_name(), "wird benutzt") # Der Name wie ihn das System nennt
print ("mit", joy1.get_numaxes(), "Achsen,", joy1.get_numhats(),
"Numhat und", joy1.get_numbuttons(), "Buttons") # Anzahl der Achsen, Numhats und Buttons
# Auf eine Bewegung der Joystick-achsen warten
def wait_input():
while 1:
event = pygame.event.wait()
if (event.type == pygame.JOYAXISMOTION): # Es wird eine Achsbewegung erkannt
if (event.dict['value'] > 0.1002 #(
or # um werte zittern zu vermeiden
event.dict['value'] < -0.1002): # )
if (event.dict['axis'] == 0): # Linker Stick l/R (Achse0)
x = event.dict['value']
#print("X:", int(round(x,4)*90)) # +90 grad bis -90 grad
x_scale = int(round(x,4)*90)
print (x_scale)
if (event.dict['axis'] == 3): # rechter Stick hoch/runter (Achse3)
y = event.dict['value']
#print("Y:", int(round(y,4)*90)) # +90 grad bis -90 grad
y_scale = int(round(y,4)*90)
print (y_scale)
if (event.dict['axis'] == 2): # LT/RT (Achse2)
z = event.dict['value']
#print("Z:", int(round(max(z, -z),4)*180)) # damit beide Trigger die selbe funktion XOR haben 0-180 grad
z_scale = int(round(max(z, -z),4)*180)
print (z_scale)
#unkomentieren zum Ausgeben
#print("Joystick Nr.:", (event.dict['joy'])) #Hier steht weclcher Joystick bewegt wird
#print("Achse Nr.:", (event.dict['axis'])) #Hier steht die nummer der Achse
#print("Wert:", (event.dict['value'])) #Hier steht meine Axen Coordinate (-1.0 bis 1.0)
wait_input() # Aufruf der Wait Funktion
print("Fertig")
gibt es einen anderen befehl von Pyserial den ich übersehen hab, wie gesagt bin sehr neu bei Python
Code: Alles auswählen
import time
import serial
ser = serial.Serial("COM3", 9600)
time.sleep(1.5)
pos1 = int(180)
pos2 = int(0)
print("TX:", ser.write(pos1))
time.sleep(2)
ser.flushOutput()
print("TX:", ser.write(pos2))
time.sleep(2)
ser.flushOutput()
ser.close
Der Arduino Sketch sieht wie Folgt aus!
Code: Alles auswählen
#include <Servo.h> //Servo Bibliothek laden
Servo servo; //Servo-Objekt erzeugen
int servoPin = 9; //Servo wird an Pin 9 angeschlossen
int pos = 0; //Variable zum Speichern der Position
void setup() { //Initialiesierung
Serial.begin(9600); //Serielle Verb. 9600 baud
servo.attach(servoPin); //Servo mit servoPin verbinden
}
void loop() {
if (Serial.available()) { //Serielle Daten vorhanden?
pos = Serial.parseInt(); //Integer lesen
//nur Winkel zwischen 0 und 180 auswerten.
if ((pos >=0) && (pos <= 180)) {
servo.write(pos); //Position an servo senden
delay(50); //Warten bis die Position erreicht wurde
Serial.println(pos, DEC); // Position bestaetigen
}
else
{
Serial.print("Ungueltiger Winkel"); //Ungueltige eingabe ausgeben
Serial.println(""); //Neue Zeile
}
}
}
PS: Die Beispiele hier sind mit Python 2.x umgesetzt und ich vermute das es an Python 3.x liegt
Mfg
DasGehtSchon