Stap 3: programma's
Arduino:
/*
- JoystickSerialServo
- --------------
- Servo bediening met een PC en Joystick
*
- Gemaakt van 19 December 2007
- Copyleft 2007 Brian D. Wendt
- http://principialabs.com/
*
- Aangepast van code door Tom Igoe
- http://ITP.NYU.edu/physcomp/Labs/servo
*/
/ ** Deze waarden voor uw servo en setup, aanpassen indien nodig ** /
int servoPin = 3; controle pin voor servomotor
int minPulse = 600; minimale servo positie (te vinden gebruik google)
int maxPulse = 2400; maximale servo positie (te vinden gebruik google)
int refreshTime = 20; tijd (ms) tussen pulsen (50Hz)
/ ** De Arduino zal deze waarden berekenen voor u ** /
int centerServo; servo middenpositie
int pulseWidth; Servo pulsbreedte
int servoPosition; geboden servo positie, 0-180 graden
int pulseRange; Max pulse - min pulse
lange lastPulse = 0; geregistreerde tijd (ms) van de laatste puls
VOID Setup {}
pinMode (servoPin, OUTPUT); Set servo pin als een uitgang pins
pulseRange = maxPulse - minPulse;
centerServo = maxPulse - ((pulseRange) / 2);
pulseWidth = centerServo; Geven de servo uitgangspunt (of het drijft)
Serial.begin(9600);
}
void loop {}
seriële ingang wachten
Als (Serial.available() > 0) {}
Lees de binnenkomende byte:
servoPosition = Serial.read();
berekenen pulseWidth van servoPosition
pulseWidth = minPulse + (servoPosition * (pulseRange/180));
stoppen met servo puls op de min en max
Als (pulseWidth > maxPulse) {pulseWidth = maxPulse;}
Als (pulseWidth < minPulse) {pulseWidth = minPulse;}
debug
Serial.println(servoPosition);
}
de servo elke 20 ms (refreshTime) met de huidige pulseWidth Pulse
Dit zal houden de servo's positie als ongewijzigd of verplaatsen als gewijzigd
Als (millis() - lastPulse > = refreshTime) {}
digitalWrite (servoPin, hoge); Start van de pols
delayMicroseconds(pulseWidth); pulsbreedte
digitalWrite (servoPin, laag); stoppen van de pols
lastPulse = millis(); opslaan van het tijdstip van de laatste puls
}
}
python:
#! / usr/bin/env python
#
# joystick-servo.py
#
# gemaakt van 19 December 2007
# copyleft 2007 Brian D. Wendt
# http://principialabs.com/
#
# code aangepast van:
# http://svn.lee.org/swarm/trunk/mothernode/python/multijoy.py
#
# Opmerking: Dit script vereist de volgende Python modules:
# pyserial - http://pyserial.sourceforge.net/
# pygame - http://www.pygame.org/
# Win32 gebruikers wellicht ook nodig:
# pywin32 - http://sourceforge.net/projects/pywin32/
#
seriële importeren
pygame importeren
# toestaan meerdere joysticks
vreugde =]
# Arduino USB poortadres (probeer "COM5" op Win32)
Usbport = "COM8"
# usb seriële verbinding definieert met Arduino
ser seriële =. Serieel (usbport, 9600)
# handvat joystick gebeurtenis
def handleJoyEvent(e):
als e.type == pygame. JOYAXISMOTION:
as = "onbekend"
Als (e.dict['axis] == 1):
as = "X"
Als (e.dict['axis] == 0):
as = "Y"
Als (e.dict['axis] == 2):
as = "Throttle"
Als (e.dict['axis] == 3):
as = "Z"
Als (as! = "onbekend"):
Str = "as: %s; Waarde: %f "% (as, e.dict['value'])
# uncomment om te debuggen
#output (str, e.dict['joy'])
# Arduino joystick-servo kappen
Als (as == "X"):
POS e.dict['value =']
# joystick positie omzetten in servo increment, 0-180
bewegen = ronde (pos * 90, 0)
Als (verplaatsen < 0):
Servo = int (90 - abs(move))
anders:
Servo = int (beweging + 90)
# positie omzetten in ASCII-teken
servoPosition = chr(servo)
# en Arduino verzenden via seriële verbinding
ser.write(servoPosition)
# uncomment om te debuggen
#print servo, servoPosition
Elif e.type == pygame. JOYBUTTONDOWN:
Str = "knop: %d" % (e.dict['button'])
# uncomment om te debuggen
#output (str, e.dict['joy'])
# 0 (trigger) van de knop Afsluiten
Als (e.dict['button "] == 0):
afdrukken "Bye! \n"
ser.Close()
Quit()
anders:
Pass
# print de joystick positie
def uitgang (lijn, stok):
afdrukken "Joystick: %d; %s"% (stick, lijn)
# wachten voor joystick input
def joystickControl():
terwijl juist:
e = pygame.event.wait()
Als (e.type == pygame. JOYAXISMOTION of e.type == pygame. JOYBUTTONDOWN):
handleJoyEvent(e)
de belangrijkste methode #
def main():
# initialiseren pygame
pygame.joystick.init()
pygame.display.init()
zoniet pygame.joystick.get_count():
afdrukken "\nPlease sluit een joystick en start opnieuw. \n"
Quit()
afdrukken "\n%d joystick(s) gedetecteerd." % pygame.joystick.get_count()
voor ik in range(pygame.joystick.get_count()):
myjoy = pygame.joystick.Joystick(i)
myjoy.init()
Joy.Append(myjoy)
afdrukken "Joystick % d:" % (i) + joy[i].get_name()
afdrukken "Depress trigger (knop 0) te stoppen. \n"
# joystick luisteraar lus uitvoeren
joystickControl()
# gebruik als een module of standalone script toestaan
als naam == "belangrijkste":
Main()