2014年11月10日 星期一

Arduino : MeArm 與雙搖桿

前一篇《雄 : DIY : 袖珍版機械手臂 MeArm》介紹了以牛皮紙硬紙板或冰棒棍製作的 MeArm V0.4,它使用四顆伺服馬達當作機械手臂的動力來源,分別用來驅動夾子、手臂伸展、手臂上下和機身旋轉,MeArm 網站的Arduino 範例程式是使用可變電阻當作動作訊號輸入,而 meArm.Joystick 使用雙搖桿來控制伺服馬達,可以直覺的操控機械手臂。


以我買的搖桿來說,當我們將搖桿的 VCC 和 GND 分別接在 Arduino 的 5V 和 GND 後,一個搖桿可以得 AX(橫向操作)、AY(縱向操作)共兩個電阻值(範圍0~1023),另外還有 SW(垂直下壓)的開關值,雙搖桿則可以有六個訊號可以輸入給 Arduino,我們只需要使用其中的 X/Y 方向四個值,分別為 L.AX、L.AY、R.AY、R.AX,哪一個針腳輸出的是什麼,照說看電路板上的標示即可,不過,像我圖片中買的雙搖桿讓我程式除錯除半天,因為它印的字樣根本 X、Y 顛倒了!所以,最好用電錶確認一下較好。

假設我們把四顆伺服馬達依底下的對應關係和 Arduino 連接:

  • 前方 Servo (前方爪子) : Arduino D5
  • 左方 Servo (前後伸展) : Arduino D9
  • 右方 Servo (上下移動) : Arduino D10
  • 下方 Servo (機身旋轉) : Arduino D11

搖桿和 Arduino 的連接:

  • L.AX : Arduino A0 (控制下方 Servo)
  • L.AY : Arduino A1 (控制左方 Servo)
  • R.AY : Arduino A2 (控制右方 Servo)
  • R.AX : Arduino A3 (控制前方 Servo)
MeArm 雙搖桿 & 伺服馬達接線圖


依前述的配置,寫了一個簡單的 Arduino 程式(2014.11.11更新),下載的網址如下:


程式主要的程序是每隔一小段時間(可用「delayMilliseconds」自行設定),檢查各搖桿傳給 A0~A3 的值(0~1023),搖桿都沒扳的狀態,應該會傳回中間值(約 512),如果大於正、負 100 (可用「joystickOffsetMin」自行設定),表示使用者有扳動搖桿,就加、減相對應的伺服馬達目前的角度一度。

搖桿哪個方向對到哪個伺服馬達,及伺服馬達轉動的最小角度、最大角度和初始角度,通通可以透過「servoConfig」這個二維整數陣列來設定,servoConfig 中,每一行代表著一顆伺服馬達的五個設定欄位,依序分別是:

  • 第一個欄位:搖桿連到的 Arduino 輸入腳位(0 代表 A0, 1 代表 A1 ......)。
  • 第二個欄位:伺服馬達訊號線(橙/黃色)接到 Arduino 的腳位。
  • 第三個欄位:伺服馬達的最小角度。
  • 第四個欄位:伺服馬達的最大角度。
  • 第五個欄位:伺服馬達的初始角度。
例如:


int servoConfig[SERVOS_TOTAL][5] = {
    { 0,  11,  0,  179,  90 },     //A0 = L.AX ,  Buttom
    { 1,  9,  179, 90, 150 },     //A1 = L.AY ,  Left
    { 2,  10, 179, 40,  90 },     //A2 = R.AY ,  Right
    { 3,  5,  179,  100, 110 },  //A3 = R.AX ,  Front
};

前例中的第一行是: { 0,  11,  0,  179,  90 },它告訴程式:搖桿接在 Arduino「A0」的方向控制接在 Arduino 「D11」的伺服馬達,伺服馬達可以由 0 度動到 179 度,接上電源後會先移動到 90 度。如果照前面的電路來看,「A0」是左搖桿的X軸方向(L.AX),用來控制「D11」上的下方伺服馬達,也就控制 MeArm 機身的旋轉。

以我買的搖桿來說,搖桿往右扳(或往上扳),Arduino 得到搖桿輸入的值會增加,反之往左扳(往下扳)會減少;對應到伺服馬達的動作,目前的程式是搖桿往右扳,馬達角度增加,往左扳則會讓馬達角度減少。如果發現搖桿扳動的方向和伺服馬達想動的方向是相反時,可以修改 servoConfig 的設定,將最小角度(第三個欄位)和最大角度(第四個欄位)的設定值交換,程式會自動將搖桿的動作方向顛倒。

例如範例程式中 servoConfig 的第二行是 { 1,  9,  179, 90, 150 },它把最小角度設定為 179,而最大角度設定為 90,哈~明明 179 大於 90,還叫「最小」角度,對啊!程式也知道不合理,所以它知道是故意要把原本搖桿讓角度增加的方向和減少的方向顛倒。此部份其實和馬達的安裝方向也有關係,可以依需求自行調整。

坐而言,不如起而行,設定值到底要多少較合適,調一下數值,觀察一下馬達的動作,再一次的調整參數,應該就能找到最佳的組合。像我手切的 MeArm 爪子,因為兩個齒輪的鋸齒並無法完全咬合,往往因為爪子張太大時會卡住,所以只好將控制爪子的設定設為:{ 3,  5,  179,  100, 110 },讓它只能在 179 ~ 100度之間開合,這個參數也是邊試邊調出來的。您的參數該如何設定呢?

相關文章




9 則留言:

  1. 不好意思,可以請教一下嗎?
    我也是買了這一塊雙搖桿,但是我在使用他的按鈕時好像都不是很穩定。
    我簡單的把L.SW接到D2,VCC接5V,GND接arduino的GND。但是用Serial Monitor去看都是0101的在跳,請問是我那裡接錯了嗎?謝謝

    回覆刪除
    回覆
    1. 您好:
      我接在 A0 ~ A5 可以正常工作, 按下時會顯示 0 , 放開時為 1, 您要不要換到 A0 ~ A5 試試看。

      刪除
    2. 原來要接類比信號,那我再試試看。謝謝

      刪除
  2. 不好意思,那天參加「雄哥MeArm Maker班」沒組完先走了,後面電路板如何組裝沒有聽到,請問您有講義或手冊嗎?
    學員許世宏敬上。

    回覆刪除
  3. 雄哥好,此篇沒有寫到如何將手臂的動作記憶起來,請問要怎麼將手臂的位置記憶起來呢?謝謝

    回覆刪除
  4. 雄哥好,末學向您請教:您文中的雙搖桿這個元件,在哪裡可以買到呢?謝謝。

    回覆刪除
  5. 您好:
    個人之前是在 "露天" 買的, 關鍵詞您已經知道, 去 search 一下應該就有了。

    回覆刪除
  6. Thank you Sir , you are very kind to share this amazing tutorial..

    回覆刪除
    回覆
    1. I'm glad to know you like this post. Have fun !

      刪除

 
© 2009. Design by Pocket