[3/29_C-Day有什麼?]系列之四:台北市校際盃機器人選拔賽(三)- 使用Arduino uno與NXShield

本篇內容是由  CAVEDU 的實習生-袁佑緣提供的使用心得

這次採用Arduino UNO搭配mindsensors公司所生產的NXShied來控制我們的機器人(本次使用的是NXShield-D),Arduino相比Raspberry Pi功能雖然比較簡單,但是卻相對容易操作而且穩定,而NXShield則是讓我們可以透過這塊板子來控制LEGO的電子零件,以下是以「機器人駕訓班」中的一個任務:將指定物件(例如:乒乓球)推開或取得,取得有額外加分。

首先我們先來看看機器人的核心:左邊是Arduino UNO控制板,右邊則是NXShield,NXShield主要可以接四個馬達與四個感應器,其他的特殊的針腳則可以用來接servo或I2C用

08注意到NXShield對感應器的支援上僅有NXT,如果想要支援EV3的話,則需另外購買轉接線,而馬達的部分則是NXT與EV3皆可使用,而mindsensors公司不愧是專門出產LEGO機器人相關的配備,對於支援的函式庫與感應器種類相當多,對於新手算是相當友善的選擇。

緊接著是機器人手部的設計,這次改用EV3的大馬達來取代先前的EV3中馬達,大馬達的扭力大概是中馬達的2~3倍,所以這次就直接裝在馬達上,而不用再另外裝齒輪組來加大扭力。

09

 

而電源供應的部分,筆者實際測試過的情況是必須要將兩塊板子各自都接上電源才行正常運作,只有接其中一塊板子的話,有可能會發生”插著USB線的時候可以正常運作,可是拔掉USB線(也就是只有吃電池的電源時)會發生運作不正常的現象,常常跑幾個步驟後就arduino就突然重新啟動了”。因為LEGO馬達的運作電壓是9V,所以筆者的作法是為兩個板子各自接上9V的電源,跑起來就是相當的有力啊

11_2 11

 

再來就是軟體的部分啦,開發環境的設定相當容易,先下載官方提供的函式庫(附上連結http://sourceforge.net/projects/nxshield/files/ ),然後打開電腦中的Arduino IDE->點選上方的草稿碼->點選匯入程式庫->匯入程式庫,然後選擇你剛剛下載的檔案就行大功告成了!

那麼我們就來看看實際跑起來的樣子,以下是簡單的範例程式:

#include <Wire.h>
#include <NXShield.h>

NXShield nxshield;
//引入必要函式庫與新增NXShield變數
void setup() {
 
  delay(500);
  nxshield.init(SH_HardwareI2C);//初始化I2C
  nxshield.bank_a.motorReset();//初始化馬達
  nxshield.bank_a.motorReset();
  nxshield.waitForButtonPress(BTN_LEFT);//等待按下左鍵才開始(NXShield板子上有四個按鍵分別是RIGHT,LEFT,RESET,GO)
 
}

void loop() {
  
  delay(5000);
  nxshield.bank_b.motorRunUnlimited(SH_Motor_1, SH_Direction_Forward, 20);//Bank B 的Motor-1以馬力20正轉,機器人將手臂往下壓
  delay(2000);
  nxshield.bank_a.motorRunUnlimited(SH_Motor_Both, SH_Direction_Reverse, 20);//Bank A 的Motor-1,Motor-2以馬力20反轉,向前進
  delay(2000); 
  nxshield.bank_a.motorRunUnlimited(SH_Motor_Both, SH_Direction_Forward, 30);//Bank A 的Motor-1,Motor-2以馬力20反轉,碰到蓋子後向後退
  delay(500); 
  nxshield.bank_a.motorStop(SH_Motor_Both, SH_Next_Action_BrakeHold);//Bank A 的Motor-1,Motor-2停止鎖死
  nxshield.bank_b.motorRunDegrees(SH_Motor_1, 
                     SH_Direction_Reverse, 
                     60,
                     70, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);//Bank B 的Motor-1以馬力60反轉70度,機器人手臂向上抬一個角度
                     
   nxshield.bank_a.motorRunDegrees(SH_Motor_Both, 
                     SH_Direction_Reverse, 
                     30,
                     230, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);
                     //Bank A 的Motor-1,Motor-2以馬力30反轉230度,機器人向前進一小段距離,只要改變這段距離就可以解決正方形或者是三角形的題型
                     
   nxshield.bank_b.motorRunUnlimited(SH_Motor_1, SH_Direction_Forward, 100);//Bank B 的Motor-1以馬力100正轉,機器人將手臂全力往下壓
   for(int i = 0; i < 5; i++)
   {
     nxshield.bank_a.motorRunUnlimited(SH_Motor_Both, SH_Direction_Reverse, 30);
     delay(130);
     nxshield.bank_a.motorRunUnlimited(SH_Motor_Both, SH_Direction_Forward, 30);
     delay(100);
   }//前後來回壓球,使得進球率變高
   nxshield.bank_a.motorStop(SH_Motor_Both, SH_Next_Action_BrakeHold);//Bank A 的Motor-1,Motor-2停止鎖死
   
   nxshield.bank_b.motorRunUnlimited(SH_Motor_1, SH_Direction_Reverse, 100);//Bank B 的Motor-1以馬力100轉,機器人將手臂全力往下上舉,把球收今去
   delay(300);
   nxshield.bank_b.motorStop(SH_Motor_1, SH_Next_Action_BrakeHold);//Bank B 的Motor-1停止鎖死

   nxshield.bank_a.motorRunDegrees(SH_Motor_Both, 
                     SH_Direction_Forward, 
                     30,
                     210, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);//機器人退回原位
   while(true){;}//無限迴圈當作程式的終點,方便觀察
   
}

 

實際運作的情形:

一、收取正方形區塊的物件

注意到影片中的機器人雖然一開始放得很歪,但是卻可以靠前面的導角來修正回來,是個可以參考的設計喔!

12

 

二、收取三角形區塊的物件

同樣的程式架構,也使用同樣的網子,只是改變了舉起手後機器人前進的角度,也是可以輕鬆入袋!

 

三、那如果網子裡面有上次的取得物件呢?

也是可以滿載而歸喔!

 

四、當然最安全的還是分開一次一次的收好啦

以上,希望透過這次一系列簡單的範例測試來吸引更多人一起來使用各種控制器來比這種開放是硬體的比賽,也預祝即將參賽的各位選手們比賽順利!

零件提供來源在這裡

Leave a comment

Your email address will not be published.


*