2010-01-31

NXT LCD字元顯示的像素座標資訊

NXT LCD的像素相關資訊:

解析度: 100 x 64 像素
座   標: (0, 0) ~(99, 63)
原   點: 左下角


每一字元的像素為: 6 * 8
LCD字元的顯示數: 16行 * 8列 (X, Y)

第X行字元的像素座標為: (X-1)*6                             //X: 1~16
第Y列字元的像素座標為: LCD_LINE1 - (Y-1)*8   //Y: 1~8

1/0,        2/6,      3/12,     4/18,    5/24,     6/30,    7/36,    8/42
9/48,  10/54,   11/60,   12/66,  13/72,   14/78,  15/84,  16/90

LCD_LINE1/56
LCD_LINE2/48
LCD_LINE3/40
LCD_LINE4/32
LCD_LINE5/24
LCD_LINE6/16
LCD_LINE7/8
LCD_LINE8/0


HiTechnic NXT Angle Sensor的照片與產品摘要


由Google Archived中LegoEd的Hitechnic Nxt Angle sensor上架頁面中所留下來的照片, 不知道這樣的支撐結構是否能應付 PF motor的激烈操作? 個人覺得應該還要再加強一些.

還有從產品簡介:
The HiTechnic Angle Sensor provides a method to determine the angular position and rotation speed of an axle. When a LEGO Technic axle is connected to the Angle Sensor, the sensor will measure the axle rotation and output three properties:
(1)  angular position in the range of 0 to 359 degrees,
(2)  accumulated rotation angle in degrees,
(3)  and axle rotation speed (RPM).
(4) The Angle Sensor supports separate commands to reset the current angle and the accumulated angle registers and provides a low friction cross axle connection and is accurate to one degree resolution.

能輸出這麼多資料, 還可以reset讀取值, 可見就是用 I2C 方式存取, 唉 .... 這樣反應速度肯定慢


2010-01-28

Hitechnic 預計二月要出 NXT Angle sensor?





由NXTasy的這篇文章中傳出來的, 似乎從Lego Education的mail中得知, Hitechnic 將要在二月份要推出角度感應器, 可以具有1度的解析能力, 價格$44.


而連結到LegoEd的產品網頁, 頁面資料卻已經移除, 留下這樣的訊息, 似乎好像真的曾經上架過

Our apologies, but the product you requested, HiTechnic NXT Angle Sensor, is no longer available.



 



  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址:
  • 日期: 2010-01-31 11:58:49
也可以買大包裝12顆,$517.95

我想應該在HiTechnic也會同步上市吧?

[版主回覆01/31/2010 18:10:00]由LegoEd的說明看來, 除了可以回應角度以外還可以回應轉速, 所以應該是以I2C方式存取, 這樣反應速度會慢很多, 其實應該像Gyro一樣使用類比方式會比較實用

2010-01-09

Danny新書NXT Thinking Robots已經可以下載NXC Source code



大概是禁不起Amazon 1 顆星的評語, Danny終於在他的網頁提供NXC原始碼下載, 共包含了Tic-Tac-Toe player以及Rubik's Cube Slover程式, 至少比較不會有隔靴搔癢的感覺.


下載檔案需要密碼, 而密碼就藏在書中的內容, 很好玩的方式喔



2010-01-08

使用NXT來駕駛 LEGO Racer( L8183)






TechnicBricks.nl是我喜歡的網站之一, 新的一篇文章中介紹了2009年初LEGO Racer系列的L8183, 這個set特別的地方在於遙控器是Power FunctionsL8885, 而它的載台為包含轉向以及驅動all-in-one的功能, 靠車尾部份有一個突起的IR接收器, 車底有熟悉的IR頻道切換開關, 所以, 無疑這是一部具體而微的PF遙控車, 因此當然NXT相關的IR sensors都可以拿來操控這部車, 而我在2009.3也試著做了一部NXT+NRLink Racer, 前面加了一個Sonar sensor用來偵測障礙, 看起來蠻可愛的 :-)
測試這部車時, NRLink同時使用Combo Direct ModeCombo PWM Mode都運作順暢, 唯一美中不足的是, 小車的扭力不大, 背著NXT起步時偶而要推一下.


 


左後視圖, 可以看到NRLink


 



 


機體分離



 


小烏龜跑來跑去的影片




 


//


2010-01-06

使用NXC在程式中建立藍芽連結的方式

NXT的程式如果有需要使用藍芽來進行通訊時, 通常必須先以手動方式建立好連結之後, 再啟動程式的執行, 不過若使用John Hansen enhanced firmware的加強功能, 就可以直接在程式中啟動建立藍芽連結的程序, 省掉手動操作的步驟.


以下就說明如何以NXC來建立藍芽連結的方法.


NXC Comm module API用法說明


NXT firmware Comm module中有許多關於藍芽通訊的功能, 稱為Primary functions, 詳細的功能清單可以參考 NXC Programmer’s Guide” P40的表格, 在表格中的第4個功能: INTF_CONNECT亦即為建立藍芽連結的Primary function, 而執行這些Primary functionNXC API有以下兩個:


l   SysCall(funcID, args) - API用法請參考 NXC Programmer’s Guide” P42說明


這個API是用來執行NXT firmware內建的33個系統功能, 詳細的項目可以參考LEGO MINDSTORMS NXT Executable File Specification” P55, 不過如果是John Hansenenhanced firmware就額外多了5個加強功能, 其中CommExecuteFunction就是藍芽通訊功能的Function ID, 也是第1個參數funcID的值.


而第2個參數args則是依據不同Function ID所需求的struct 型態去宣告出來的變數, struct 所定義的member field 用來作為執行Function ID系統功能所需要的參數, CommExecuteFunction Function ID所使用的struct型態定義為:


struct CommExecuteFunctionType {
  unsigned int Result;
  byte Cmd;
  byte Parm1;
  byte Parm2;
  byte Parm3;
  string name;
  unsigned int RetVal
};


NXC已經內建定義了這個struct型態, 因此可以直接引用來宣告args參數變數:


CmmExecuteFunctionType args;


argsstruct各個member field的指定值為:


args.Cmd欄位存入INTF_CONNECT這個Primary function, 表示要執行建立藍芽連結的功能:


args.Cmd = INTF_CONNECT;


接下來參考 NXC Programmer’s Guide” P40表格的第3(Parm1,Parm2,Parm3,Name),













Cmd



Meaning



(Parm1,Parm2,Parm3,Name)



INTF_CONNECT



Connect to a Bluetooth device



(DeviceIndex,Connection,x,x)



對於INTF_CONNECT這個Primary function, args4member fields參數 (Parm1,Parm2,Parm3,Name)使用的定義為: (DeviceIndex,Connection,x,x), 所以args.Parm1存放的是Slave裝置在藍芽配對清單中的索引編號, 可以使用Brick nameBluetooth Device table中搜尋, 而若只有一筆則設成0即可,


args.Parm1 = 0;


args.Parm2存放對Slave裝置的Connection channel, 通常是1-3, 若只對單一Slave建立連結, 則設成1即可,


args.Parm2 = 1;


因此, 呼叫SysCall(funcID, args)函數的相關參數指派方式如下:


CmmExecuteFunctionType args; //宣告參數變數args


args.Cmd = INTF_CONNECT;  //指定Primary function


args.Parm1 = 0;               //Slave device index


args.Parm2 = 1;               //Connection channel


SysCall(CommExecuteFunction, args);


l   SysCommExecuteFunction(args) - API用法請參考 NXC Programmer’s Guide” P39說明


這個API事實上就相當於SysCall(CommExecuteFunction, args), 所以參數args的用法相同, 而呼叫SysCommExecuteFunction(args)函數的參數指派方式如下:


CmmExecuteFunctionType args; //宣告參數變數args


args.Cmd = INTF_CONNECT;  //指定Primary function


args.Parm1 = 0;               //Slave device index


args.Parm2 = 1;               //Connection channel


SysCommExecuteFunction(args);


實作範例說明


在以下的程式範例, Master NXT會先檢查是否已經與Slave NXT建立藍芽連結, 若沒有則進行建立連結的程序, 隨後remote start Slave NXT程式的執行.


Slave NXT的相關資料如下:


-  Brick name: "CH_NXT_B"


-  Connection channel: 1


-  Remote start program: "NRLink-8183CPM3.rxe"(NXT Remote control L8183 Racer driving unit)


l   檢查藍芽連結狀態:


if (BluetoothStatus(BtChannel) == NO_ERR) isOK = TRUE;     //檢查連結狀態
else if (Build_Connection(BtChannel, BtDevname)) isOK = TRUE;//
若無則建立連結
    else …


l   NXT Brick name搜尋Bluetooth Device table以取得Device index:


byte idx  = 0;
for (byte xii=0; xii<BTDeviceCount(); xii++) //
Search Bluetooth device table
{
   if (BTDeviceName(xii) == BtDevname)  //
If matched
   {
     idx  = xii;                        //
Get device index
     isOK = TRUE;
     break;
     }
 }


l   建立藍芽連結:


CommExecuteFunctionType cefArgs; //宣告參數變數
cefArgs.Cmd  = INTF_CONNECT; //
Primary function
cefArgs.Param1 = idx;            //
Slave Device index
cefArgs.Param2 = BtChannel;      //Connection channel

isOK  = FALSE;
for (byte xii=0; xii<20; xii++)      //
測試20次直到連結成功
{
   SysCommExecuteFunction(cefArgs);//
建立藍芽連結
   Wait(500);
   if (cefArgs.Result == LDR_SUCCESS)
   {
     isOK = TRUE;
     break;
    }
}


l   Master完整的範例程式(NXTCommM01.nxc)


 


2010-01-02

Rubik&#39;s Cube Solver NXT2.0版 組裝完成待測試


花了一個下午的時間裝好, 主要是Webcam不是書中使用的機型, 所以花點時間製作連結的機構以及調整位置,
不過顏色辨識還是不行, 綠色會辨識成藍色, 不知道是貼紙顏色的問題, 還是燈光問題, 總之, 還須要調整

機構的運作到還正常




  • 留言者: Bridan
  • Email: bridanwang@yahoo.com.tw
  • 網址:
  • 日期: 2010-01-03 19:49:00
Hi ch_lego‚
看來您被這應用程式限制‚我的初步建議是改變光源‚
甚至考慮撕掉一面貼紙或更換貼紙‚最後自己寫程式.
祝您好運!





  • 留言者: Bridan
  • Email: bridanwang@yahoo.com.tw
  • 網址:
  • 日期: 2010-01-03 00:09:45
Hi CH,

Happy New Year!
看見您正在測試 Rubik's Cube Solver,關於顏色辨識問題,
有興趣可以參考 研發養成所 http://4rdp.blogspot.com/2009/05/vb-color-identification.html
[版主回覆01/03/2010 12:11:04]

謝謝您熱心提供的資料,
因為是下載自這本書作者的程式, 可惜沒有Source code可以修改,
這支程式對於顏色辨識有提供幾個參數可以調整, 分別是:
Red上限值-可以增加Orange的辨識範圍
Orange上限值-增加Yellow的辨識範圍
還有就是黃色 及 白色的上限值, 但就是沒有對綠色辨識的調整參數,  
今天上午在自然光的環境下結果比昨晚使用白色檯燈光源效果更差,
連橙色都辨識不出來, 原先懷疑是Webcam問題, 不過使用Notebook的webcam結果相差不多,
總之, 還得再試試其他方式想辦法找出規則性, 再想辦法調整
先感謝囉 也祝您 2010事事順心