2011-05-06

以Mindsensors NumericPad作為Arduino的輸入裝置

這是我的第一個Arduinocase。
因為手中有一些NXT數位感應器,因此希望能夠結合Arduino豐富多樣的應用,在往後會有更多有趣的題材可以嘗試。
<Arduino_I 2C _NP_05.jpg>

而在這個以NumericPad作為Arduino輸入裝置的case中,會由Arduino board以I 2C通訊功能來寫入與讀取Mindsensors NumericPad的register,並將偵測到的按鍵狀態經由7-segment LED作為視覺化的輸出。
記錄的影片如下:




/video/

接下來是進行這個case所整理、記錄的資料:
Arduino UNO與NXT I 2C裝置的腳位對應
Arduino UNO board I 2C通訊所使用的腳位為A4(SDA)及A5(SCL),
對應NXT則為Pin 6(藍色)(SDA) 及 Pin 5(黃色)(SCL),以及以下兩個腳位的對應:
NXT Pin 4(
綠色)(4.3V Power) à Arduino 5V,
NXT Pin2/3(
黑/紅)(GND)    à Arduino GND,

如下圖:
<
Arduino_I 2C _PinMap.JPG>

<
Arduino_NXT_Pinout_Map.JPG>
Arduino NXT I 2C Device Library
Arduino I2C Communication Library為:<Wire.h>,撰寫操作NXT I 2C裝置的Arduino程式即可以運用這個Library的methods。
不過目前有一組NXT I2C Device Library DevTeam成員正以<Wire.h>發展NXT I2C Devices的專屬程式庫,相關資訊可參考本專案的網址,同時可以由這個下載點取得最新版本的Library檔案,裡面附有相當齊全的說明文件與範例程式,非常有參考價值。
在這個專案的Library,共包含兩個部分:

(1)  NXT I 2C Devices通用程式庫<NXTI2CDevice.h>:具備符合NXT register layout的基本I 2C methods,如同NXC、leJOS進行I 2C通訊的呼叫方式一樣,比起直接使用<Wire.h>,相對較為便利與熟悉。
(2)  部份NXT數位感應器專屬之Device Class:提供使用者程式可以直接呼叫裝置功能的methods,而不須處理Register的讀寫動作,就如同leJOS Device Class的使用方式。
目前已提供的共有11個Mindsensors數位裝置,如:NXTMMX、NXTHID、NXTServo、NXTCam以及PSPNX等。
至於只有mindsensors Device Class的原因,我想是因為Mr.
Deeptak Patil
也是NXT I2C Device Library Dev Team專案成員之一的緣故,不過其他的數位裝置,還是可以利用(1)的方式來處理。
Arduino程式
NumericPad並沒有專屬之Device Class,所以需要以(1) 的I 2C access methods來讀寫registers。
使用前須先留意一個在NumericPad User’s Guide中所沒有提到的初始化動作,我也是參考了NXC範例程式庫(np-lib.nxc)之後才發現的,所以同樣在Arduino程式中的setup()也需要先執行NumericPad的初始化程序。
Arduino
程式用法摘要如后:

(1)   呼叫 NXTI 2C Device
class
的建構子(constructor),同時傳入NumericPad的I 2C address(0xB4),來宣告及建立NumericPad的instance:(numpad為instance variable)

NXTI 2C Device numpad(0xB4);
(2)   在setup()中呼叫writeRegisters() method執行初始化動作:
numpad.writeRegisters(0x41, 9, Group1);
numpad.writeRegisters(0x 4A , 8, Group2);
numpad.writeRegisters(0x7D, 3, Group7);
(3)   在loop()中呼叫readInteger() method讀取NumericPad的按鍵狀態值(2 Bytes,以Integer type回傳),加上adjustbitSeq()的原因是為了要調整回傳值中bit 6/7與bit 10/11的順序,讓它能夠與layout一致,方便後續對應led pattern陣列的index:
numpad_keyValue = adjustBitSeq(numpad.readInteger(NUMPad_Register));
(4)   由bit 0開始逐一比對按鍵狀態,並輸出到7-segment LED作顯示。
範例程式:Here
Summary

以7-segment LED作為輸出將會囿於只能顯示一個按鍵值的限制,而無法展現NumericPad可以回應多重觸控的功能,我在另外一個Arduino程式使用Serial Monitor就可以顯示出所有的觸控按鍵值。
不過,因為Arduino擁有豐富的電子聲光週邊,所以用來發揮多樣化的視覺、聽覺效果應該會比NXT容易。




  • 留言者: CAVE教育團隊
  • Email: zero.five@msa.hinet.net
  • 網址:
  • 日期: 2011-05-09 00:08:44
CH_Lego:

   This is a good topic for MAKE magazine, if you like.

                                                       CAVE






  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址:
  • 日期: 2011-05-07 16:54:34
謝謝ch lego先生的好文,我會盡快發文介紹,分享給大家知道。

順便說一下,這個Team的成員除了Deepak外,Clinton是RobotC for Arduino的人。

所以就聚在一起了!

[版主回覆05/07/2011 17:19:49]
謝謝邱老師,
剛開始玩arduino, 現在有如好奇寶寶, 到處找資料

昨天發mail問Deepak 如何寫arduino library,
他問我是否要加入 Develop team, 若有意願的話可以發信給 Clinton,
果然這一組team都是 NXT圈內人

2011-04-14

NXT High Speed Communication over XBee

NXT High Speed Communication


NXT Firmware通訊模組(Comm module)支援的功能包含:Bluetooth、USB以及High Speed Communication,其中High Speed Communication指的是使用第四個Input port 以RS485進行全雙工的非同步傳輸通訊,用法則是以NXT Cable串接兩部NXT來進行雙向的資料傳輸。


 


RS485應用案例


Daniele Benedettelli在“Creating Cool MINDSTORMS NXT Robots”(2008 Apress)書中第八章的 JohnNXT機器人,在這個專案中共分成:機器人本體及遙控端兩部分,由於本體總共配置了6部馬達及5個sensor,所以需要以兩部NXT來進行協力控制,而因為藍芽通訊已經作為遙控端NXT對本體Main NXT傳送指令時所使用,於是本體的兩部NXT就採用High Speed Communication來進行串接溝通。


操作JohnNXT時會由本體的Master NXT接收來自遙控端NXT的藍芽指令,當需要由另一部Slave NXT協力來完成動作時,就會由Main NXT透過Port 4以RS485傳輸指令給Slave去執行所需的功能,而Slave NXT於完成工作之後就會回覆訊息給Main確認遙控端所下達的指令都已經執行完畢,接下來Main就會進入待命狀態準備接收下一個來自遙控端的藍芽指令。


這本書的NXC程式碼可以由官網下載,在Ch8本專案的資料夾裏有High Speed Communication的API程式庫 (HSlib.nxc),當初Danny在寫API時所用的都屬於較低階的NXC函數,所以需要對IO Buffer pointer作控制,而這些技術資料Mindstorms官方並沒有對外提供,一般人可能較不容易掌握確切的用法,還好John Hansen已經在最近版本的Bricxcc中封裝成較容易使用的高階函數,不過NXT需要更新成John Hansen所加持的enhanced firmware,以解除原有官方的功能限制。


Dexter NXTBee




而
Dexter的 NXTBee則是提供NXT能夠結合High Speed Communication及XBee無線通訊功能的外接模組,在傳輸的效能與距離方面都有優於藍芽的表現。

使用方式為連接Port 4並透過RS485進行無線非同步序列通訊,相當於取代實體Cable且大大的延伸連線範圍。
使用NXTBee時可以幾乎完全做到無縫切換,也就是說即使目前正以實體Cable進行有線通訊,可隨時接上NXTBee換成無線而不致於在過程中造成連線的中斷,且若切換回有線時也是一樣的穩定與可靠。
至於程式部分只須處理Port 4之RS485初始設定以及資料之傳送與接收控制,完全不須撰寫任何NXTBee相關的程式碼,NXTBee會自動接手無線傳輸工作。


接下來的測試為示範以RS485進行資料傳送與接收的流程,以及展示結合NXTBee的無線通訊能力。





RS485 over XBee應用測試


測試時共使用兩部NXT,分別為Main及Slave,進行的過程為:


1.          首先由Main NXT的畫面選單中選擇顏色指令(“R”、 “G”、 “B”),然後傳送給Slave NXT,之後就會進入等待Slave回覆執行完成指令的狀態。


2.          而Slave會先處於待命狀態並持續監聽是否有來自Main NXT的指令,一旦接收到Main指令時會先閃爍Light sensor燈號三次確認,接著依據指令執行閃爍Color sensor指定顏色燈號10次,完成之後會傳送確認字串“DONE“回覆Main已經執行完畢,然後再度進入待命狀態。


3.          而Main一但接收到Slave字串“DONE“的確認回覆時,會先閃爍Light sensor燈號三次,接下來即可再度接受選單之指令選擇。




<Video>


 




 


範例程式:

Main NXT 端程式:RS485Comm-Main.nxc


Slave NXT 端程式:RS485Comm-Slave.nxc



 


結論:


NXTBee雖然傳輸效能優於藍芽,但有安全性的顧慮,很有可能遭受到擷取或干擾,因此在Dexter的部落格中有一篇文章:Setting up a NXTBee Secure Network For Mindstorms NXT,教導設定安全網路的方式。



 



2011-04-05

使用Mindsensors NumericPad操控NXT RC Servo機械手臂

為了要測試NumericPad 的功能,因此使用了Mindsensors 的NXTServo 伺服機控制器以及5個RC Servo製作一個具四個自由度的機械手臂,再利用 NumericPad的12個按鍵設計成操控機械手臂動作的使用者控制面板。


使用NumericPad控制面板操控機械手臂之影片:
<Video>


機械手臂機構與功能


·             前面影片中的機械手臂共包含了以下四個自由度的控制:


1.             臂部 – 使用1顆RC Servo + Turntable控制180度的左右水平旋轉


2.             肩部 – 使用2顆RC Servo控制180度的前後垂直擺動


3.             肘部 – 使用1顆RC Servo + 連桿 控制手部上下約100度的垂直擺動


4.             手部 – 使用1顆RC Servo + 連桿 控制手部的張合動作


·                    以上各部共5個RC Servos使用Mindsensors NXTServo進行控制,並以L8878 PF電池作為外部電源。


另外以L8870 PF燈組透過轉接線連接NXT Output Port,作為可控制開關的探照燈。
詳如以下圖解說明:


NXTServo功能特性


如果以NXT motor來建構超過3個自由度的機構,除非使用Mindsensors的NXTMMX,會受NXT僅有3個Output port的限制,同時NXT motor實在有點大又重難免會影響機構的靈活性。
過去曾經以Mindsensors NRLink控制3個PF Motor製作3自由度的機械手臂,不過每兩個馬達就必須搭配1個IR接收器,而最大的問題在於無法掌控PF Motor的轉動位置以精確完成所需要的動作, 更談不上多自由度間運動的協調控制。
而NXTServo可操控8個RC Servo,雖然不能像NXT可讀取馬達的回饋位置,不過可以透過對RC Servo送出不同的脈衝寬度來控制它的角度位置,如:1.5 ms時為居中之0度位置,2.5 ms時往右90度,0.5 ms時往左90度等,而最大的優點在於NXTServo可同時設定不同channel 之RC Servo的角度位置與轉動速度,這提供了程式對機構的控制彈性,同時各部間的相依性協調運動也很容易透過程式來完成。
而NXTServo為NXT數位裝置的一種,因此以I2C操作方式對Input port傳送位置與速度設定值至對應channel的暫存器位址來操控RC Servo,由於每個channel都有獨立的位置與速度設定位址且位址連續,所以在符合NXT之I2C buffer長度16 Bytes的條件限制之內,可以對8個channel進行group control,這是相當有用且必備的功能。
關於NXTServo的詳細資料,可以參考其User’s Guide.


機械手臂之協調控制


臂部 – 將肩部以上機構建構在Turntable上,並以一顆RC Servo來驅動,由於是水平運動,重心的變化不大,因此動力足夠,只需考慮結構的強固。


肩部 – 因為需肩負肘部與手部的前後垂直擺動,考量承載負荷需求,因此以兩部RC Servo來驅動,由於在機構上彼此驅動方向剛好相反,所以需要維持兩部RC Servo位置設定值的和為 3 ms且速度一致才能保持同步運動。


肘部 -  為了要控制手部於工作時能夠保持所需要的姿勢,如垂直或水平,就必須同時協調肩部與肘部共同達成,如下圖,當肩部為向後45度時,則肘部之RC Servo即需驅動連桿向下45度以維持手部能夠與地面平行的姿勢。

以下則是兩者間的RC Servo位置值的相依關係圖:


手部 –抓取機構的張合動作也是使用 RC Servo驅動連桿來達成,可參考下圖:



使用者控制界面


要控制四個自由度的機械手臂再加上探照燈開關,需要一個功能完整且便利的使用端操作界面,NXT有很多輸入裝置可以用來作人機溝通,不過對於複雜的操控以目前已有的裝置而言,並不容易整合成簡潔的操作界面,因此,Mindsensors的NumericPad應該就是因應這個需求而發展出來,下圖就是應用它12個按鍵所規劃的操作面板,目的是提供使用端便利且直覺的操作體驗。
下圖即是使用Mindsensors所提供之Overlay template自行以Windows小畫家所製作之面板。


 NumericPad面板規劃



依據使用者操控需求的角度,將NumericPad的12個按鍵區分成5種類型控制群組:


1.        Home – 機械手臂回歸初始姿勢與狀態。


2.        方位 – 臂部三個方位的移動控制。


3.        姿勢 – 5種預設肩部與肘部組合姿勢切換。


4.        張合 – 手部的張/合控制。


5.        探照燈 – 開關切換。


操作時點按控制鍵,機械手臂即會依據按鍵所設定的對應動作運作,不過因為NumericPad可以偵測及回應多點觸控,所以在程式中也加入了這個功能,控制邏輯為:



1.      Home鍵具最高執行優先順序。


2.      群組內若有多個鍵被按下,會依據設定之優先順序擇一來執行,如:方位鍵’ 姿勢鍵’ 手部張合鍵等群組。


3.      除了以上兩種條件外,即會將所有偵測到的按鍵所對應之動作同時執行。


例如:同時按住方位鍵’ 姿勢鍵’ 手部收合鍵,機械手臂就會同時完成所有的動作。


** NXC範例程式:點選此連結。


NumericPad用途與特性


NumericPad的12個按鍵雖然預先刷好話機的 Layout,但它的功能其實純粹就是回應其12個鍵的點按狀態, 事實上回應值為儲存於2個Bytes暫存器中12個bits的狀態值而不是電話按鍵值,所以完全需要依照程式的需求自行定義,也應此Mindsensors才會提供其Overlay template供使用者可以修改成符合其程式的控制功能。

基於這個特性,個人推薦NumericPad是值得擁有的NXT週邊裝置之一。

關於NumericPad的詳細資料,可參考其”User’s Guide”。
接下來期待的是在Coming Soon已經放了好幾個月的”Touch Screen Overlay For NXT”,雖然Mindsensors對它的用途說明為作為NXT Screen的觸控螢幕,同時具備相同的畫素解析度(100*64),因此,若拿來作為類似NumericPad的輸入裝置,使用彈性就更大,唯一的缺點就是稍小了點,也許需要靠觸控筆才能使用,不然的話多買一組合著一起用也是可以。




  • 留言者: Yo
  • Email: boxing52007@gmail.com
  • 網址:
  • 日期: 2013-01-27 15:09:16
您好:
去年十月來這邊請教過NXT Servo的一些問題,
我是台科機械所的志豪,
擔任系上一門課「電腦輔助機電系統設計與實習」的助教。
這們課主要使用的平台就是NXT,
在您這邊得到很多幫助,這裡是我很重要的參考來源之一,
這們課結束了,我們請了實驗室一位夥伴做成了影片,
與您分享,謝謝你的幫忙。:D
影片網址如下「 http://youtu.be/DP63KhaQD1k 」
[版主回覆01/27/2013 22:45:32]

我看過影片了, 確實是很不錯的成果.
機器人運作得很穩定, 控制的精確度也不錯,
另外, 機器人運用了許多非NXT的電子元件, 是否為Arduino family?
再加上這些元件雖然增加了硬體與軟體的複雜度,
如果能夠妥善組合, 也擴大與延伸了NXT平台的功能,


台科大同學的素質確實如外界的口碑, 很優秀
也謝謝您的分享


PS. 我也認識幾位台科大的老師, 不過比較偏向土木 :-)







  • 留言者: Yo
  • Email: boxing52007@gmail.com
  • 網址:
  • 日期: 2012-10-24 09:52:39
謝謝~ 下次po成品與你分享:D
[版主回覆10/24/2012 21:51:42]不客氣, 祝您測試成功





  • 留言者: 豪哥..
  • Email: boxing52007@gmail.com
  • 網址:
  • 日期: 2012-10-23 21:02:10
您好:
想請問使用關於NXT Servo V2的問題
因為NXT只有三個輸出想將輸出多一些,並且能空多顆RC伺服機(組機器手臂)
但是NXTServo的程式指令有些不懂
像是將"NXTServo-lib.nxc"include 後
讓伺服馬達動的指令如下
NXTServo_Quick_Servo_Setup(SensorPort, ServoAddr, i, posA);
其中不太懂脈衝寬度
要如何正確地轉伺服機到想要角度,如10度轉到150度
感謝你~
[版主回覆10/23/2012 23:00:58]

NXTServo_Quick_Servo_Setup(SensorPort, ServoAddr, i, posA);
這個函數, SensorPort - NXTServo所接的sensor port no.(S1~S4)
                   ServoAddr - NXTservo的I2C位址, 為 0xb0
                       i               - 要控制哪一個 Servo port (1 ~ 8)
                     posA         - 要讓Servo轉到的位置(值由 50 ~ 250, 50在最右邊(180度), 150在垂直位置(90度)
                                                                                                             250在最左邊(0度), 可以依據比例計算出所要的角度







  • 留言者: WW
  • Email: wangamgc32@yahoo.com.tw
  • 網址:
  • 日期: 2011-04-06 09:38:46
您好:
超厲害,但我想問您的軟排線是自己做的還是買的,可一告訴我嗎
[版主回覆04/06/2011 22:25:58]

線材與RJ12水晶頭我是分開買, 然後再依據自己需要的長度壓線.
線材應該很容易找得到, 而NXT的RJ12接頭現在可以到台南創意林老師的露天賣場購買 


2010-11-23

Dexter dGPS 應用 與 功能初灠



昨晚收到dexter GPS sensor for Mindstorms NXT上市通知的mail,
而在產品頁面有對於dGPS應用生動的介紹:
將目的地GPS座標傳送到機器人來計算航程資訊,就可以運用強大的巡航計算器功能導航至目的座標。
< >


由上面的描述大致可以推測dGPS應該具備有這三項功能:


l   GPS定位資訊,可以知道目前所在的座標位置。


l   而如果要能導航也須要讓機器人知道目前的方位,所以可能也有電子羅盤(Compass)的功能。


l   有了以上兩種資訊,基本上就可以控制機器人朝目標座標前進,反正若目標緯度(Latitude)大於目前位置就往北走,而若目標經度(Longtitude)較大則往東走,這些都是程式可以做到的,因此不確定行程運算功能為何?可能是計算與目標間的方位與距離。


不過,因為小小的sensor裡面不可能存放圖資,所以機器人的活動範圍應該是戶外操場或廣場之類的地方,當然也可以拿來log航行座標記錄再輸出到Google Map劃出路徑。


控制功能


dGPS產品頁面有提供兩份文件:dGPS User Guide、dGPS Google Maps Tutorial,內容都是如何與Google Map結合使用,沒有其他的技術說明資料。
程式工具則有提供NXT-G Block,同時Xander所維護的3rd Party RobotC Driver V1.7.1也有相關的API,這剛好可以拿來參考dGPS的internal registers資訊:
dGPS Device address
:0x06
Register Layout
:
















































Address



Read



Write



0x00



讀取UTC衛星時間



 



0x01



衛星連線狀態
0-No link, 1-link



 



0x02~0x03



目前位置緯度(Latitude)



 



0x04~0x05



目前位置經度(Longtitude)



 



0x06



速度資訊(cm/秒)



 



0x07



指向角度資訊



 



0x08



與目標間的距離



 



0x09



與目標間的方位角度



 



0x0A



 



設定目標之緯度



0x0B



 



設定目標之經度



摘要


dGPS要價$105還算合理,實用性亦高(究竟這是給機器人用的GPS而不是人用的,不能拿市面上手持式GPS來比),只有使用場所便不便利的問題,若有足夠空曠的戶外場地、晴朗的天氣,到還是有它好玩之處。



  • 留言者: 阿呆
  • Email: phushu@yahoo.com.tw
  • 網址:
  • 日期: 2011-05-25 09:09:55
您太客氣了~我懂的都是在作業系統上的應用程式,本身也都是在做應用程式開發,所以如果單純只是coding都也還可以,但是這不只光是軟體上的東西,還有硬體上的知識.
我是覺得只光懂軟體,不懂一些硬體是夠的,所以才買了arduino,是看其它前輩說到不用懂電子電路,一樣也可以玩電子電上的東西.
GPS是看到有些前輩使用不同的mcu來實作,剛好要看到您的部落格上有提到,我想說至少GPS上的知識,至少像原理之類,一定都瞭解,所以才向前輩您提出問題,望前輩您多指導小弟.不勝感激






  • 留言者: 阿呆
  • Email: phushu@yahoo.com.tw
  • 網址:
  • 日期: 2011-05-23 23:31:25
您好~在下是arduino新手,想要學習gps模組~
但是我完全不懂gps的原理,所以要請教前輩您~
我打算前輩您使用發文方式對談詢問一些gps的相關問題
望前輩您能夠多多幫助後輩

[版主回覆05/24/2011 22:13:10]其實我也是從今年四月才第一次接觸Arduino, 也算是還不到兩個月的新手,
之前都是以Mindstorms NXT為主, 再加上目前並沒有任何GPS模組,
所以不確定能否對你有任何的幫助,
若有任何可以切磋的問題, 倒是歡迎提出來一起討論

2010-11-11

Mindsensors Numeric Pad多重觸控測試

探奇 邱老師詢問Numeric Pad可否接受複合鍵?
所以就簡單作了一下測試,發現這個功能是可以的,甚至因為它是平面的電容感應式面板,手指很容易在鍵盤間滑動,加上回應靈敏因此很有機會能透過程式來偵測手勢達到如同iPhone、iPad的多重觸控操作效果一樣,希望不是異想天開,有空時就以這個為目標進行測試。


以下擷取畫面就是同時碰觸多個鍵盤時的回應結果:


< >< >

< >
測試之範例程式:NumPad-T01.nxc