Étape 3: programmes
Arduino :
/*
- JoystickSerialServo
- --------------
- Commande de servo avec un PC et un Joystick
*
- Créé le 19 décembre 2007
- copyleft 2007 Brian D. Wendt
- http://principialabs.com/
*
- Adapté du code créé par Tom Igoe
- http://ITP.nyu.edu/physcomp/Labs/servo
*/
/ ** Ajuster ces valeurs pour votre servo et le programme d’installation, si nécessaire ** /
int servoPin = 3 ; broche de commande de moteur servo
int minPulse = 600 ; position du servo minimale (pour trouver l’utilisation google)
int maxPulse = 2400 ; position du servo maximale (pour trouver l’utilisation google)
int refreshTime = 20 ; temps (en ms) entre deux impulsions (50Hz)
/ ** L’Arduino calcule ces valeurs pour vous ** /
int centerServo ; position du servo Centre
int pulseWidth ; largeur d’impulsion servo
int servoPosition ; commanda la position du servo, 0-180 degrés
int pulseRange ; pulse max - min impulsion
long lastPulse = 0 ; consignateur (ms) de la dernière impulsion
void setup() {}
pinMode (servoPin, sortie) ; Axe servo ensemble comme une broche de sortie
pulseRange = maxPulse - minPulse ;
centerServo = maxPulse - ((pulseRange) / 2) ;
pulseWidth = centerServo ; Le servo du donner un point de départ (ou il flotte)
Serial.Begin(9600) ;
}
void loop() {}
attendre pour l’entrée périodique
Si (Serial.available() > 0) {}
lire les octets entrants :
servoPosition = Serial.read() ;
calculer pulseWidth de servoPosition
pulseWidth = minPulse + (servoPosition * (pulseRange/180)) ;
arrêter l’impulsion servo à min et max
Si (pulseWidth > maxPulse) {pulseWidth = maxPulse;}
Si (pulseWidth < minPulse) {pulseWidth = minPulse;}
débogage
Serial.println(servoPosition) ;
}
le servo chaque 20 ms (refreshTime) avec pulseWidth actuel des impulsions
Cela va tenir la position du servo si inchangé, ou le déplacer si changé
Si (millis() - lastPulse > = refreshTime) {}
digitalWrite (servoPin, HIGH) ; démarrer le pouls
delayMicroseconds(pulseWidth) ; largeur d’impulsion
digitalWrite (servoPin, basse) ; arrêter le pouls
lastPulse = millis() ; économiser le temps de la dernière impulsion
}
}
Python :
#! / usr/bin/env python
#
# joystick-servo.py
#
# créé le 19 décembre 2007
# copyleft 2007 Brian D. Wendt
# http://principialabs.com/
#
code # adapté de :
# http://svn.lee.org/swarm/trunk/mothernode/python/multijoy.py
#
# NOTE : Ce script nécessite les modules Python suivants :
# pyserial - http://pyserial.sourceforge.net/
# pygame - http://www.pygame.org/
# Win32 utilisateurs devez également :
# pywin32 - http://sourceforge.net/projects/pywin32/
#
importation de série
Import pygame
# autoriser plusieurs manettes de jeu
joie =]
# Adresse du port USB Arduino (essayez « COM5 » sur Win32)
usbport = « COM8 »
# define usb connexion série pour Arduino
SER = serial. Série (usbport, 9600)
événement de # poignée joystick
def handleJoyEvent(e) :
Si e.type == pygame. JOYAXISMOTION :
AXIS = « inconnu »
Si (e.dict['axis'] == 1) :
AXIS = « X »
Si (e.dict['axis'] == 0) :
AXIS = « Y »
Si (e.dict['axis'] == 2) :
AXIS = « Throttle »
Si (e.dict['axis'] == 3) :
AXIS = « Z »
Si (axe! = « inconnu ») :
Str = "axe: %s ; Valeur: %f "% (axe, e.dict['value'])
# Décommenter pour déboguer
#output (str, e.dict['joy'])
# Hack de manette de jeu-servo Arduino
Si (axe == « X ») :
POS = e.dict['value "]
# convertir joystick poste à incrément de servo, 0-180
déplacer = round (pos * 90, 0)
Si (déplacer < 0) :
servo = int (90 - abs(move))
autre chose :
servo = int (move + 90)
# convertir poste en caractère ASCII
servoPosition = chr(servo)
# et envoyez à l’Arduino par connexion série
SER.Write(servoPosition)
# Décommenter pour déboguer
#print servo, servoPosition
Elif e.type == pygame. JOYBUTTONDOWN :
Str = "bouton: %d" % (e.dict['button'])
# Décommenter pour déboguer
#output (str, e.dict['joy'])
# La touche 0 (déclencheur) pour quitter
Si (e.dict['button'] == 0) :
imprimer "Bye! \n"
SER.Close()
Quit()
autre chose :
Pass
# imprimer la position de la manette de jeu
sortie de DEF (ligne, bâton) :
imprimer "Joystick: %d ; %s"% (manche, ligne)
# attendre pour l’entrée de la manche
def joystickControl() :
While True :
e = pygame.event.wait()
Si (e.type == pygame. JOYAXISMOTION ou e.type == pygame. JOYBUTTONDOWN) :
handleJoyEvent(e)
méthode principale #
def main() :
# initialisation pygame
pygame.joystick.init()
pygame.Display.init()
Si ce n’est pas pygame.joystick.get_count() :
imprimer "\nPlease connecter une manette et réexécutez. \n"
Quit()
imprimer pygame.joystick.get_count() % « \n%d joystick(s) détecté. »
car moi dans range(pygame.joystick.get_count()) :
myjoy = pygame.joystick.Joystick(i)
myjoy.init()
Joy.Append(myjoy)
imprimer « Joystick % d: » % (i) + joy[i].get_name()
imprimer "Depress déclencheur (touche 0) d’arrêter de fumer. \n"
# courir joystick auditeur boucle
joystickControl()
# autoriser l’utilisation comme script de module ou autonome
Si name == « principale » :
main()