Arduino 自走車& 機械手臂

文章推薦指數: 80 %
投票人數:10人

微算機實驗課程期末專題有些人接線做8051 喇叭,但因為器材不太夠,就有幾個人可以玩Arduino 自走車,剛好MOLi 實驗室有舉辦機械手臂相關活動也是使用Arduino 去弄,就 ... JackKuo'sBlogHomeawstech研究文章列表關於我🔍全文搜尋使用器材組裝教學自走車搖桿遇到的坑馬達PS2搖桿IDE問題DEMO影片程式碼Monday,June4,2018微算機實驗課程期末專題有些人接線做8051喇叭,但因為器材不太夠,就有幾個人可以玩Arduino自走車,剛好MOLi實驗室有舉辦機械手臂相關活動也是使用Arduino去弄,就順便將這兩樣東西兜起來當作期末報告。

使用器材ArduinoUNOArduinoSensorShieldV5.0感測器擴展板自走車相關零組件PS2副廠搖桿組裝教學自走車基本上可以參考這篇,其中我拿到的零件比較不同的是馬達驅動模組,但一樣接上IN1~IN4當作訊號即可,因為另一邊有通電了。

聽同學說有個跳線的地方,蓋子拔掉就不會通電了,這樣就得自己接電接地。

對於擴充版不熟悉的話可以參考這篇。

搖桿網路上很多接線圖,大部分都一樣,這邊就貼個我看的順眼的。

遇到的坑馬達一開始測試馬達,code寫進去要他怎麼轉就怎麼轉,可是之後重接重寫就發現不會動了。

先檢查程式,發現是忘了在最前面寫上pinMode指定OUTPUT。

後來還是不會動,從馬達開始接電測試,不管正轉逆轉都沒問題,再來是馬達驅動模組,螺絲重新鎖、接電測試也都沒問題,那該不會是我的腦袋有問題吧!?最後終於發現是杜邦線太鬆、或是模組的針腳太細,總之就是接觸不良,因為這批線是當天助教拿新的給我,沒想到就有這個問題。

後來詢問老師,說可能是針腳太短,且杜邦線價格差異很大,品質可能也有差。

PS2搖桿沒想到這搖桿也能拿來接Arduino,上網找來找去好像就PS2X這個Library最好用,基本上就是範例code貼上去就要會動,可是我怎麼測試就是不會動,弄了約3.4小時聽到同學早就成功了,跟他借線測試後才知道可能有些訊號線斷掉了,之前還有請老師幫忙找問題,可惜沒找到,老師表示原來杜邦線品質這麼差。

之後弄弄手臂再回來弄搖桿發現又不會動了。





換線過後又正常,Arduino這東西怎麼那麼難搞阿,光是接線測試就花了8小時,雖然很倒楣線材總是出包,但也只能怪自己沒玩過多少硬體,對於debug不熟悉。

IDE問題在Mac上如果輸入法是在內建的注音模式,複製貼上或是快捷鍵註解等操錯可能會有問題,建議切換到英文模式操作。

如果Arduino同時接電又接USB,傳輸時可能會出現stk500_recv():programmerisnotresponding錯誤,只要將電源拔掉即可DEMO影片因為是一手操控搖桿一手攝影,稍微晃動/img/20180626_102720.mp4程式碼#include//forv1.6 #include #defineLEFT_FORWARD6 #defineLEFT_BACKWARD7 #defineRIGHT_FORWARD9 #defineRIGHT_BACKWARD8 #defineMIDDLE_VALUE127 #defineCLAW5 #defineBASE2 #defineLEFT_ARM3 #defineRIGHT_ARM4 PS2Xps2x; interror=0; bytetype=0; //手把是否要震動 bytevibrate=0; //總共有幾顆伺服馬達 constintSERVOS=4; //類比搖桿至少扳動多少才開始動作 constintsensityOffset=50; Servomyservo[SERVOS]; intservoConfig[SERVOS][5]={ //Order,servoPin,minAngle,maxAngle,initialAngle {0,CLAW,0,50,50},//夾子 {1,BASE,60,140,90},//基座 {2,LEFT_ARM,0,70,0},//左臂 {3,RIGHT_ARM,40,110,80}//右臂 }; voidsetup(){ Serial.begin(57600); pinMode(LEFT_FORWARD,OUTPUT); pinMode(LEFT_BACKWARD,OUTPUT); pinMode(RIGHT_FORWARD,OUTPUT); pinMode(RIGHT_BACKWARD,OUTPUT); error=ps2x.config_gamepad(13,11,10,12,true,true);//setuppinsandsettings:GamePad(clock,command,attention,data,Pressures?,Rumble?)checkforerror if(error==0){ Serial.println("FoundController,configuredsuccessful"); Serial.println("Tryoutallthebuttons,Xwillvibratethecontroller,fasterasyoupressharder;"); Serial.println("holdingL1orR1willprintouttheanalogstickvalues."); Serial.println("Goto[url]www.billporter.info[/url]forupdatesandtoreportbugs."); }elseif(error==1) Serial.println("Nocontrollerfound,checkwiring,seereadme.txttoenabledebug.visit[url]www.billporter.info[/url]fortroubleshootingtips"); elseif(error==2) Serial.println("Controllerfoundbutnotacceptingcommands.seereadme.txttoenabledebug.Visit[url]www.billporter.info[/url]fortroubleshootingtips"); elseif(error==3) Serial.println("ControllerrefusingtoenterPressuresmode,maynotsupportit."); type=ps2x.readType(); switch(type){ case0: Serial.println("UnknownControllertype"); break; case1: Serial.println("DualShockControllerFound"); break; case2: Serial.println("GuitarHeroControllerFound"); break; } //馬達初始化 for(inti=0;i(MIDDLE_VALUE+sensityOffset)){ if(currentAngle[1]>servoConfig[1][2]){ currentAngle[1]-=2; shouldMove=true; //Serial.println(currentAngle[1]); } } //左臂計算 if(ps2x.Analog(PSS_LY)(MIDDLE_VALUE+sensityOffset)){ if(currentAngle[2]>servoConfig[2][2]){ currentAngle[2]-=2; shouldMove=true; //Serial.println(currentAngle[2]); } } //右臂計算 if(ps2x.Analog(PSS_RY)(MIDDLE_VALUE+sensityOffset)){ if(currentAngle[3]>servoConfig[3][2]){ currentAngle[3]-=2; shouldMove=true; //Serial.println(currentAngle[3]); } } //夾子 if(ps2x.ButtonPressed(PSB_BLUE)){//willbeTRUEifbuttonwasJUSTpressedORreleased Serial.println("Xjustchanged"); //Serial.println(currentAngle[0]); if(currentAngle[0]==servoConfig[0][2]){ currentAngle[0]=servoConfig[0][3]; shouldMove=true; //Serial.println(currentAngle[0]); } else{ currentAngle[0]=servoConfig[0][2]; shouldMove=true; //Serial.println(currentAngle[0]); } } //開始移動 if(shouldMove){ myservo[0].write(currentAngle[0]); myservo[1].write(currentAngle[1]); myservo[2].write(currentAngle[2]); myservo[3].write(currentAngle[3]); } } delay(50); //強制歸零,不然會一直跑 digitalWrite(LEFT_FORWARD,HIGH); digitalWrite(LEFT_BACKWARD,HIGH); digitalWrite(RIGHT_FORWARD,HIGH); digitalWrite(RIGHT_BACKWARD,HIGH); } ← PreviousPostNext Post→commentspoweredbyDisqusFEATUREDTAGSemail env nfv review sigcomm skill tool whyFRIENDSYIYU0X'SBLOG飛飛KevinHuang'sBlogFuYuan'sSpace節省工具箱JasonTools阿力獅的教室



請為這篇文章評分?