Paso 3: programas
Arduino:
/*
- JoystickSerialServo
- --------------
- Control de servo con un PC y Joystick
*
- Creado el 19 de diciembre de 2007
- copyleft 2007 Brian D. Wendt
- http://principialabs.com/
*
- Adaptación de código por Tom Igoe
- http://ITP.nyu.edu/physcomp/Labs/servo
*/
/ ** Ajuste estos valores para su servo y configuración, si es necesario ** /
int servoPin = 3; pin de control de motor servo
int minPulse = 600; posición de servo mínimo (para encontrar uso google)
int maxPulse = 2400; posición máxima servo (para encontrar uso google)
int refreshTime = 20; tiempo (ms) entre pulsos (50Hz)
/ ** El Arduino calculará estos valores para usted ** /
int centerServo; posición de servo central
int anchura de impulso; anchura de pulso del servo
int servoPosition; al mando de posición del servo, 0-180 grados
int pulseRange; pulso máx - min pulso
lastPulse largo = 0; registro de los tiempos (ms) del último pulso
void setup() {}
pinMode (servoPin, salida); Pin Set servo como un pin de salida
pulseRange = maxPulse - minPulse;
centerServo = maxPulse - ((pulseRange) / 2);
anchura de impulso = centerServo; Dar el servo de un punto de partida (o flota)
Serial.Begin(9600);
}
void loop() {}
espera de entrada en serie
Si (Serial.available() > 0) {}
leer el byte entrante:
servoPosition = Serial.read();
calcular la anchura de impulso de servoPosition
anchura de impulso = minPulse + (servoPosition * (pulseRange/180));
detener el pulso del servo en el min y max
Si (anchura de impulso > maxPulse) {anchura de impulso = maxPulse;}
Si (anchura de impulso < minPulse) {anchura de impulso = minPulse;}
de depuración
Serial.println(servoPosition);
}
pulso del servo cada 20 ms (refreshTime) con anchura de impulso corriente
Esto mantendrá la posición del servo si no cambia, o moverlo si cambia
Si (millis() - lastPulse > = refreshTime) {}
digitalWrite (servoPin, HIGH); iniciar el pulso
delayMicroseconds(pulseWidth); ancho de pulso
digitalWrite (servoPin, bajo); Pare el pulso
lastPulse = millis(); ahorrar el tiempo de la última pulsación
}
}
Python:
#! / usr/bin/env python
#
# joystick-servo.py
#
creado el 19 de diciembre de 2007 #
# copyleft 2007 Brian D. Wendt
# http://principialabs.com/
#
código # adaptado de:
# http://svn.lee.org/swarm/trunk/mothernode/python/multijoy.py
#
# Nota: Este script requiere de los siguientes módulos de Python:
# pyserial - http://pyserial.sourceforge.net/
# pygame - http://www.pygame.org/
# También pueden necesitar los usuarios Win32:
# pywin32 - http://sourceforge.net/projects/pywin32/
#
serial de importación
Import pygame
# permitir múltiples joysticks
alegría =]
# Dirección del puerto Arduino USB (prueba "COM5" en Win32)
USBPORT = "COM8"
# definir conexión serie usb para Arduino
ser = serial. Serie (usbport, 9600)
evento de joystick de mango #
DEF handleJoyEvent(e):
Si e.type == pygame. JOYAXISMOTION:
eje = "desconocido"
Si (e.dict['axis] == 1):
eje = "X"
Si (e.dict['axis'] == 0):
eje = "Y"
Si (e.dict['axis'] == 2):
eje = "Válvula reguladora"
Si (e.dict['axis'] == 3):
eje = "Z"
Si (eje! = "desconocido"):
Str = "eje: %s; Valor: %f "% (eje, e.dict['value'])
# descomentar para depurar
#output (str, e.dict['joy'])
# Arduino hack de joystick-servo
Si (eje == "X"):
pos = e.dict['value']
# cambio de posición de la palanca de mando a incremento de servo, 0-180
mover = redondo (pos * 90, 0)
Si (movimiento < 0):
servo = int (90 - abs(move))
otra cosa:
servo = int (movimiento + 90)
# cambio de posición a caracteres ASCII
servoPosition = chr(servo)
# y enviar a Arduino sobre conexión en serie
ser.Write(servoPosition)
# descomentar para depurar
#print servo, servoPosition
Elif e.type == pygame. JOYBUTTONDOWN:
Str = "botón: %d" % (e.dict['button'])
# descomentar para depurar
#output (str, e.dict['joy'])
# Botón 0 (trigger) para dejar de fumar
Si (e.dict['button'] == 0):
Imprimir "Bye! \n"
ser.Close()
Quit()
otra cosa:
pasar
# imprimir la posición de la palanca de mando
salida de DEF (línea, stick):
Imprimir "Joystick: %d; %s"% (palillo, línea)
# esperar para la entrada de joystick
DEF joystickControl():
Aunque la verdad:
e = pygame.event.wait()
Si (e.type == pygame. JOYAXISMOTION o e.type == pygame. JOYBUTTONDOWN):
handleJoyEvent(e)
método principal #
DEF main():
# inicializar pygame
Pygame.joystick.init()
Pygame.display.init()
Si no pygame.joystick.get_count():
Imprimir "\nPlease conectar un joystick y ejecute de nuevo. \n"
Quit()
Imprimir "\n%d joystick detectado." % pygame.joystick.get_count()
para que en range(pygame.joystick.get_count()):
myjoy = pygame.joystick.Joystick(i)
myjoy.init()
Joy.Append(myjoy)
Imprimir "Joystick % d:" % (i) + joy[i].get_name()
Imprimir "gatillo Presione (botón 0) para salir. \n"
# ejecutar el bucle de oyente de joystick
joystickControl()
# permitir el uso como un módulo o independiente
Si nombre == "principal":
Main()