步驟1:需要的事情
1.arduino(duh )結(jié)果2。計(jì)算機(jī)(如果您正在閱讀此書(shū),除非您不是 _ ,否則您將擁有一個(gè)計(jì)算機(jī))
3.usb端口(大多數(shù)計(jì)算機(jī)都具有這些端口)
4.time(花了我5個(gè)小時(shí)來(lái)計(jì)算)
5.servo
6.JOYSTIK
第2步:您需要的軟件
arduino編程器
pyserial(用于python的插件)
pygame(用于python的插件)
操縱桿驅(qū)動(dòng)程序
步驟3:程序
我已經(jīng)添加了您需要的程序
arduino:
/*
JoystickSerialServo
--------------
使用PC和操縱桿的伺服控制
*
創(chuàng)建于2007年12月19日
copyleft 2007年,Brian D. Wendt
http://principialabs.com/
*
通過(guò)Tom Igoe
http://itp.nyu.edu/physcomp/Labs/Servo
*/
/**為伺服和設(shè)置調(diào)整這些值,如果必需**/
int當(dāng)?shù)厮欧?a href="http://www.xsypw.cn/tags/pi/" target="_blank">Pin = 3;//伺服電機(jī)的控制銷
int minPulse = 600;//最小伺服位置(要使用google)
int maxPulse = 2400;//最大伺服位置(要使用google)
int refreshTime = 20;//脈沖之間的時(shí)間(ms)(50Hz)
/** Arduino將為您計(jì)算這些值**/
int pulseWidth;//伺服脈沖寬度
int舵機(jī)位置;//指令的伺服位置,0-180度
int pulseRange;//最大脈沖-最小脈沖
long lastPulse = 0;//記錄的最后一個(gè)脈沖的時(shí)間(ms)
void setup(){ pinMode(servoPin,OUTPUT);//將伺服引腳設(shè)置為輸出引腳
pulseRange = maxPulse-minPulse;
centerServo = maxPulse-((pulseRange)/2);
pulseWidth = centerServo;//給伺服器一個(gè)起點(diǎn)(或者它浮動(dòng))
Serial.begin(9600);
}
void loop(){
//等待串行輸入
if(Serial .available()》 0){
//讀取傳入的字節(jié):
servoPosition = Serial.read();
//從伺服位置計(jì)算PulseWidth
pulseWidth = minPulse +(servoPosition *(pulseRange/180));
//在min和max處停止伺服脈沖,如果(pulseWidth》 maxPulse){pulseWidth = maxPulse; }
if(pulseWidth //debug
//Serial.println(servoPosition);
}
//每20毫秒(當(dāng)前時(shí)間)使用當(dāng)前pulseWidth
//脈沖伺服,這將保持伺服的如果未更改,則將其置于位置;如果更改,則將其置于位置。
if(millis()-lastPulse》 = refreshTime){//啟動(dòng)脈沖
delayMicroseconds(pulseWidth);//脈沖寬度
digitalWrite(servoPin,LOW);//停止脈沖
lastPulse = millis();//保存最后一個(gè)脈沖的時(shí)間
}
}
python:
#!/usr/bin/env python
#
#joystick-servo.py
#
#創(chuàng)建于2007年12月19日#copyleft 2007 Brian D.Wendt
#http://principialabs.com/
#
#代碼改編自:#http://svn.lee.org/swarm/trunk/mothernode/python/multijoy.py
#
#注意:此腳本需要以下Python模塊:
#pyserial-http://pyserial.sourceforge。 net/
#pygame-http://www.pygame.org/
#Win32用戶可能還需要:
#pywin32-http://sourceforge.net/projects/pywin32/
#
導(dǎo)入序列
導(dǎo)入pygame
#允許多個(gè)操縱桿
joy = []
#Arduino USB端口地址(在Win32上嘗試“ COM5”)
usbport =“ COM8”
#定義與Arduino的USB串行連接
ser = serial.Serial(usbport,9600)
#處理操縱桿事件
def handleJoyEvent(e):
如果e.type == pygame.JOYAXISMOTION:
axis =“未知” if(e.dict [‘a(chǎn)xis’] == 1):
axis =“ X”
if(e.dict [‘a(chǎn)xis’] == 0 ):
axis =“ Y”
if(e.dict [‘a(chǎn)xis’] == 2):
軸=“油門(mén)”
if(e.dict [‘a(chǎn)xis’] == 3):
軸=“ Z”
if(軸!=“未知” ):
str =“軸:%s;值:%f“%(軸,e.dict [‘value’])
#取消注釋調(diào)試
#output(str,e.dict [‘joy’])
#Arduino游戲桿伺服hack
if(axis ==“ X”):
pos = e.dict [‘value’]
#將操縱桿位置轉(zhuǎn)換為伺服增量,0-180
move = round(pos * 90,0)
if(move 《0):
servo = int(90-abs(move))
else:
servo = int(move + 90)##轉(zhuǎn)換位置到ASCII字符
servoPosition = chr(servo)
#并通過(guò)串行連接發(fā)送到Arduino write(servoPosition)
#取消調(diào)試調(diào)試注釋
#print Servo,ServoPosition
elif e.type == pygame.JOYBUTTONDOWN:
str =“ Button:%d”%(e.dict [‘button’])
#不建議調(diào)試
#output(str,e.dict [‘joy’])
#按鈕0(觸發(fā))以退出
if(e.dict [‘button’] == 0):
打印“ Bye! n”
ser。 close()
quit()
else:
pass
#打印操縱桿位置 def輸出(線,桿):
打印“操縱桿:%d; %s“%(操縱桿,行)
#等待操縱桿輸入
def joystickControl():
而True:
e = pygame.event.wait()
if(e。類型== pygame.JOYAXISMOTION或e.type == pygame.JOYBUTTONDOWN):
handleJoyEvent(e)
#main方法
def main():
#初始化pygame
pygame.joystick .init()
pygame.display.init()
如果不是pygame.joystick.get_count():
打印“ n請(qǐng)連接操縱桿并再次運(yùn)行。 n”
quit()
打印“檢測(cè)到 n%d個(gè)操縱桿。”%pygame.joystick.get_count()
對(duì)于我在范圍內(nèi)(pygame.joystick.get_count()):
myjoy = pygame.joystick。操縱桿(i)
myjoy.init()
joy.append(myjoy)
打印“操縱桿%d:”%(i)+ joy [i] .get_name()
print“壓下觸發(fā)器(按鈕0)退出。 n“
#運(yùn)行游戲桿偵聽(tīng)器循環(huán)
joystickControl()
#如果 name =,則可以用作模塊或獨(dú)立腳本
=“ main ”:
main()
步驟4:對(duì)其進(jìn)行測(cè)試_
我沒(méi)有編寫(xiě)python腳本
我在
http://principialabs.com/jo上找到了它ystick-control-of-a-servo/
有趣的是
4伺服版本
http://principialabs.com/joystick-control-of-a-servo/
-
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
187077 -
操縱桿
+關(guān)注
關(guān)注
0文章
69瀏覽量
8537
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論