Styra arduino med joystick (3 / 5 steg)
Steg 3: program
Arduino:
/*
- JoystickSerialServo
- --------------
- Servo kontroll med en PC och Joystick
*
- Skapad 19 December 2007
- Copyleft 2007 Brian D. Wendt
- http://principialabs.com/
*
- Anpassad från koden av Tom Igoe
- http://ITP.NYU.edu/physcomp/Labs/servo
*/
/ ** Justera värdena för din servo och inställningar, om så erfordras ** /
int servoPin = 3; kontroll stift för servomotor
int minPulse = 600; minsta servo position (för att hitta Använd google)
int maxPulse = 2400; maximal servo position (för att hitta Använd google)
int refreshTime = 20; tid (ms) mellan pulser (50Hz)
/ ** Arduino kommer att beräkna värdena för du ** /
int centerServo; mittläget servo
int pulseWidth; servo bredd för synkpuls
int servoPosition; befallde servo position, 0-180 grader
int pulseRange; max puls - min puls
lång lastPulse = 0; inspelad tid (ms) för den senaste pulsen
void setup() {
pinMode (servoPin, produktionen); Ställ in servo pin som en utgångsstiftet
pulseRange = maxPulse - minPulse;
centerServo = maxPulse - ((pulseRange) / 2);
pulseWidth = centerServo; Ge servon utgångspunkt (eller det flyter)
Serial.BEGIN(9600);
}
void loop() {
vänta för seriell inmatning
om (Serial.available() > 0) {
Läs den inkommande byten:
servoPosition = Serial.read();
beräkna pulseWidth från servoPosition
pulseWidth = minPulse + (servoPosition * (pulseRange/180));
stoppa servo puls på min och max
om (pulseWidth > maxPulse) {pulseWidth = maxPulse;}
om (pulseWidth < minPulse) {pulseWidth = minPulse;}
debug
Serial.println(servoPosition);
}
puls servo varje 20 ms (refreshTime) med nuvarande pulseWidth
Detta kommer att hålla servo är ståndpunkt om oförändrad, eller flytta det om ändrat
om (millis() - lastPulse > = refreshTime) {
digitalWrite (servoPin, hög); Starta pulsen
delayMicroseconds(pulseWidth); bredd för synkpuls
digitalWrite (servoPin, låg); stoppa pulsen
lastPulse = millis(); Spara tiden för den sista pulsen
}
}
python:
#! / usr/bin/env python
#
# joystick-servo.py
#
# skapad 19 December 2007
# copyleft 2007 Brian D. Wendt
# http://principialabs.com/
#
# kod anpassad från:
# http://svn.lee.org/swarm/trunk/mothernode/python/multijoy.py
#
# Observera: Detta skript kräver följande Pythonmoduler:
# pyserial - http://pyserial.sourceforge.net/
# pygame - http://www.pygame.org/
# Win32 förbrukaren Maj också behov:
# pywin32 - http://sourceforge.net/projects/pywin32/
#
importera följetong
importera pygame
# tillåta flera styrspakar
Joy =]
# Arduino USB portadress (försök "COM5" på Win32)
USBporten = "COM8"
# definiera USB-seriell anslutning till Arduino
ser = följetong. Följetong (USBporten, 9600)
# handtag joystick event
def handleJoyEvent(e):
om e.type == pygame. JOYAXISMOTION:
Axel = "okänd"
om (e.dict['axis] == 1):
Axel = "X"
om (e.dict['axis] == 0):
Axel = "Y"
om (e.dict['axis] == 2):
Axel = "Strypa"
om (e.dict['axis] == 3):
Axel = "Z"
om (axel! = "okänd"):
Str = "Axis: %s. Värde: %f "% (axel, e.dict['value'])
# avkommentera för att felsöka
#output (str, e.dict['joy'])
# Arduino joystick-servo hacka
om (axel == "X"):
POS = e.dict['value']
# konvertera joystick position till servo mellanskillnad, 0-180
flytta = round (pos * 90, 0)
om (flytta < 0):
servo = int (90 - abs(move))
annat:
servo = int (drag + 90)
# konvertera position till ASCII-tecken
servoPosition = chr(servo)
# och skicka till Arduino över seriell anslutning
ser.write(servoPosition)
# avkommentera för att felsöka
#print servo, servoPosition
Elif e.type == pygame. JOYBUTTONDOWN:
Str = "knappen: %d" % (e.dict['button'])
# avkommentera för att felsöka
#output (str, e.dict['joy'])
# 0 (trigger) knappen för att avsluta
om (e.dict['button'] == 0):
skriva ut "Bye! \n"
ser.Close()
Quit()
annat:
passera
# Skriv ut joystick position
def utgång (line, stick):
skriva ut "Joystick: %d; %s % (stick, linje)
# vänta för joystick input
def joystickControl():
samtidigt sant:
e = pygame.event.wait()
om (e.type == pygame. JOYAXISMOTION eller e.type == pygame. JOYBUTTONDOWN):
handleJoyEvent(e)
# huvudsakliga metod
def main ():
# initiera pygame
pygame.joystick.init()
pygame.display.init()
om inte pygame.joystick.get_count():
skriva ut "\nPlease ansluta en joystick och kör igen. \n"
Quit()
skriva ut "\n%d joystick(s) upptäckt." % pygame.joystick.get_count()
för i i range(pygame.joystick.get_count()):
myjoy = pygame.joystick.Joystick(i)
myjoy.init()
Joy.append(myjoy)
skriva ut "Joystick % d:" % (i) + joy[i].get_name()
skriva ut "Tryck avtryckaren (knappen 0) för att avsluta. \n"
# kör joystick lyssnaren loop
joystickControl()
# tillåter användning som en modul eller fristående skript
om namn == "main":
Main)