2011-09-24

leJOS新書-Brain Bagnall"Intelligence Unleashed: Creating LEGO NXT Robots with Java"

昨天收到 Amazon DM,leJOS發展團隊的關鍵人物 Brain Bagnall 在繼 2007年的“Maximum LEGO NXT: Building Robots with Java Brains之後又有一本關於leJOS project的新書上市。



新書書名為:

Intelligence Unleashed: Creating LEGO NXT Robots with Java

在Amazon上的內容介紹為:

With user-friendly instructions for the leJOS NXJ software, this accessible manual is the perfect launch into LEGO Mindstorms NXT, an incredible kit for building and programming robots. Using Java, the most popular and easy-to-use programming language available, this book helps engineers and amateurs alike design and build their own customized robots, programmed however they desire. A diverse set of projects is accompanied by building tips, programming code, complete 3D-rendered building instructions, and hundreds of illustrations. The NXT intelligent brick’s Bluetooth capabilities are introduced, as are the newest available parts, from GPS to the RFID sensor, in this useful handbook that serves as the perfect compliment to the LEGO NXT kit.

以上看不出來有什麼吸引人的章節,倒是leJOS官網的簡介,還較能瞭解這本新書的重點內容:
As the title suggests, the projects focus on robotics intelligence and advanced capabilities: Segway, Ballbot, Monte Carlo localization, realtime map display, outdoor GPS, robotic arm, the new navigation model, A* Search, image analysis and much more! There are 29 chapters with complete plans for 10 unique robots.

前一本書在Amazon的書評有一些負面的意見,主要原因是當時leJOS還在發展階段,版本尚未穩定,部份內容並未能與實際的最新版本同步,造成讀者使用上的困擾。
之後有了第二版的上市消息,不過預購之後等了將近兩年還是無疾而終,如今這本書能夠上市倒還真的有購買的衝動,只是需要衡量有沒有多餘的時間能夠再次投入。

物件導向語言,個人覺得是最適合來建構機器人行為的發展平台,雖然有點門檻,不過深入研究之後後續的應用就無限寬廣了。
目前市面上的相關書籍並不多,熱情的CAVE團隊在去年也出版了一本“

機器人程式設計與實作:使用Java

”,曾獲贈一本,目前當作工具書用途,還蠻實用的。

2011-09-18

Arduino announce new products at Maker Faire in NYC.


消息來源:arduino.cc blog

Arduino 1.0,
we finally froze the Arduino API, the IDE and the layout of the boards. We’ve made some minor additions to the Arduino connectors to make them more flexible. Tomorrow you will be able to download the release candidate and in 1 month of frantic testing with the community, the platform will be ready and stable.


Arduino Leonardo,
a low cost Arduino board with the Atmega32u4. It has the same shape and connectors as the UNO but it has a simpler circuit. On the software side it has a nifty USB driver able to simulate a mouse , a keyboard, a serial port (with more drivers coming later). As usual for Arduino, everything will be released as open source (Core, Bootloader, Hardware).
UNO的升級版?


Arduino Due,
a major breakthrough for Arduino because we’re launching an Arduino board with a 32bit Cortex-M3 ARM processor on it. We’re using the SAM3U processor from ATMEL running at 96MHz with 256Kb of Flash, 50Kb of Sram, 5 SPI buses, 2 I2C interfaces, 5 UARTS, 16 Analog Inputs at 12Bit resolution and much more.


Instead of just releasing the finished platform we are opening the process to the community early on. We’re going to be demoing the board and giving away some boards to a selected group of developers who will be invited to shape the platform while it’s been created. After Maker Faire, we will begin selling a small batch of Developer Edition boards on the Arduino store (store.arduino,cc) for members of the community who want to be join the development effort. We plan a final and tested release by the end of 2011


Arduino Wifi Shield. It adds Wi-Fi communication capabilities to any Arduino. Instead of using any of the classic WiFi modules on the market we wanted to have something that will provide the maximum level of hackability to the user. The shield is based on a wifi micro module made by H&D Wireless coupled with a powerful AVR32 processor that carries the full TCP-IP stack leaving room to add your own protocols and customisations. We’ve also worked hard to make sure that you will be able to migrate your code from the Ethernet Shield with minor changes.
最期待的是這個Shield,終於有機會能夠讓 NXT 使用無線網路 :-)




2011-09-15

使用NXT控制Arduino Network Device



Arduino
I2C Wire.h Multi-Masters功能實作
中以Arduino+Gravitech
7-SEG Shield
組合成為一個I2C Slave Device,可以提供其它的Arduino使用I2C Master方式控制LED的顯示,藉以驗證Wire.h具備多重I2C Master的處理功能。


而原先的構想是任何可以進行I2C通訊的裝置,應該都可以控制這個I2C Slave Device,包含NXT在內,而事實上NXTArduinoI2C通訊也經由實際測試,運作正常。

不過經由多次的測試,NXT始終無法如同Arduino一般能夠正常的存取這個I2C Salve
Device
,而比較之前的測試Case,唯一的差別就在於Gravitech 7-SEG
Shield
擴充板所內建對於SDASCL4.7k ohm pull-up,實在是百思不解問題真正所在。




Arduino Network Device建構

(Photo)



而為了讓NXT可以使用Gravitech 7-SEG Shield的功能,所以改造原來的I2C Slave
Device
成為Network Device


不再使用I2C而改為Ethernet TCP/IP方式,:

(1).
Arduino UNO + Gravitech 7-SEG Shield +
Arduino Ethernet
Shield
組合成為 Telnet Server


(2).
另外使用 Arduino UNO + Arduino Ethernet Shield組合成為Telnet Client

至於NXT則透過I2C傳送指令與資料給Telnet Client,由ClientUNO組合成封包之後經由網路線傳送至Telnet Server接收,而Server端的UNO解析之後再以I2C控制Gravitech 7-SEG Shield執行指定的功能,有點複雜但可玩性十足。

(
架構圖)



(Demo Video)









NXT對於Network Device控制流程

整體架構共分成三個部份:

(1). NXT to Telnet Client


Telnet Client作為I2C Slave Device,規劃相關功能對應的Register AddressData需求:

0x00
-
回傳裝置資訊,這是用來測試I2C通訊功能是否正常。

0x41+
三色LED顯示指令(R/G/B)  -
控制Gravitech 7-SEG
Shield
顯示指定顏色。


0x42+
英數字串 - 控制Gravitech 7-SEG
Shield
將字串顯示在七段式LED


0x43+
整數值字串 - 控制Gravitech 7-SEG
Shield
將數字顯示在七段式LED


因此,NXT即將前述的指令以LowspeedWrite()傳送給Client端的UNO,而對於UNO即會觸發onReceive()handler進行接收。



(2). Telnet Client to Server


ClientUNO負責將接收到的NXT
request
解析並製作成資料封包後,使用Ethernet.h library的功能,透過Arduino Ethernet Shield以網路線傳送至Server端,而Server端的UNO同樣也是以Ethernet.h的功能接收封包資料。




(3). Telnet Server to
Gravitech 7-SEG Shield

Server端經解析來自Client端的資料之後,即分別使用Digital I/O控制三色LED的顏色顯示以及以I2C方式控制七段式LED顯示字串資料。






後記

(1).
Ethernet.h雖然區分成serverclient兩個classes的功能,但不是限制只能在個別角色中才能使用的methods,尤其在server端反而會用到很多Client
class
的功能來控制資料的接收,這一點是官方說明文件比較陽春的地方。

(2).
除了本case所使用的telnet(port 23)協定之外,外部很常見的http協定(port 80)就可以讓NXT結合Web server應用透過browser來控制,這是另外一個有趣的應用領域。



範例程式

(1) NXT
端程式:NXT_7SEG_DEMO.nxc

(2) Telnet Client
端程式:TelnetClient_I2CSlave.pde

(3) Telnet Server
端程式:TelnetServer_7SEGLED.pde

  • 留言者: ㄚ仁
  • Email: pciahb@yahoo.com.tw
  • 網址:
  • 日期: 2012-07-14 01:14:22
您好 想請教您一個問題 我將ethernet shield 接到Hub 然後把Arduino的範例程式(Web Server)燒進去我的Arduino UNO 後 輸入IP到網址列 卻沒有辦法連結到那個IP 請問是我IP輸入錯誤嗎? 如果是 那請問我應該如何得知我的IP應該輸入甚麼才恰當呢? 另外 範例程式裡有一個Web Client 程式碼裡面有一個IP是http://173.194.33.104/ 我有看到youtube裡的影片有關Ethernet的介紹 也看到他將http://173.194.33.104/這個IP輸入到網址列後 會連到GOOGLE 但是我自己測試卻不會 請問這兩件事之間有關連嗎? 我知道這和您這篇文章可能沒有任何關係 很抱歉 但我看了許多網站 都沒有辦法解決我的問題 因此請教您 煩請您撥空指教 感激不盡!
[版主回覆07/14/2012 12:30:59]Google的IP常常在變, 所以先使用命令提示字元去ping www.google.com, 就可以解析到正確的IP.
我剛才ping 到的IP是 74.125.31.147

2011-09-06

Arduino I2C Wire.h Multi-Masters功能實作(I2C Slave Device)



GravitechArduino
7SEG Shield
為具有三個I2C裝置的Arduino擴充板,包含:


(1) SAA1064晶片驅動的4位數7LED (I2C address: 0x38)

(2) TMP75數位溫度感應器 (I2C address:0x49)

(3) 24LC128 EEPROM (I2C address:0x50)


關於各I2C裝置的用法,可參考原廠Datasheet,同時也可以參照Gravitech所提供的Sample
Code
,示範由TMP75讀取溫度值然後顯示在LED的作法。




Arduino多功能I2C裝置實作




在前篇 NXTArduino多重I2C Master之實作測試對於Arduino Wire.h Library I2C Multi-Master功能的實作,這裡再以相同的應用方式改以Arduino UNO加上這個Shield組合而成為一個多功能I2C裝置作為實作範例,

並規劃
UNO兼具以下之I2C SlaveMaster雙角色功能:




UNO擔任Slave角色,負責接收與回應來自其他外部裝置對於多功能I2C裝置I2C操作需求。

UNO處理外部I2C訊息時,若需要控制擴充板裝置(SAA1064TMP75)的運作, UNO轉換成為Master角色,傳送I2C指令操作指定裝置。



因此就多功能I2C裝置而言,UNO就如同擔任代理人(Delegate) 角色,負責處理外部使用需求的介面。

依據這樣的應用,規劃多功能I2C裝置的功能如下:

 

(1)
UNO Sketch setup()先進行TMP75SAA1064的初始化設定(Master角色)

完成之後以0x31
address
加入I2C bus loop()即進入接收外部I2C通訊的待命狀態(Slave角色)




(2)
receiveEvent ()處理外部裝置使用LED顯示數字(Register
address: 0x42
)
字串(Register
address: 0x43
)
的功能,包含:數字、字母的LED字型轉換,以及字串以跑馬燈方式顯示。




(3)
requestEvent()處理回復裝置資訊的需求(Register
address: 0x00
)




(4)
對於TMP75數位溫度計考慮讀取效率,由外部裝置直接以Slave address(0x49)進行讀取(回復2Bytes),不間接透過UNO處理。




Arduino I2C
Slave Device
處理Master request須知




Arduino UNO作為Slave device,對於處理與回應外部I2C requestSketch程式碼,需要留意以下注意事項:



(1)
loop()中,應該專職於Slave的角色,除非是要處理來自Master的要求,不要主動去啟始對其他Slave DeviceI2C通訊,否則會造成外部裝置(Master)無法通訊的狀況。



(2)
receiveEvent ()中,只進行資料的接收,後續的需求處理,應該在接收完成後回到loop()再進行,以免干擾整體的通訊過程。



(3)
requestEvent()中,只處理資料的回復,必須維持以Slave角色完成通訊過程的完整性,如果要求回復的資料需要去向另一個Slave Device request,就必須拆分成兩次通訊過程來完成。




NANO作為外部裝置測試







(1)
要求UNO Slave (0x31)
回傳它的裝置資訊 (Register address: 0x00) ,會觸發requestEvent() 回傳UNO-Ox31的字串。




(2)
要求TMP75 (0x49)
回傳所測量的溫度值。




(3)
要求UNO Slave (0x31)
LED顯示數值資料(Register
address: 0x42
)
,會觸發receiveEvent() 接收顯示指令及數值,先判斷設定status flag (isDisplayNumber=true) 之後,回到loop () 即依據status flag啟始對SAA1064的數字顯示要求。




(4)
要求UNO Slave (0x31)
LED以跑馬燈方式顯示字串(Register
address: 0x43
)
,會觸發receiveEvent () 接收顯示指令及字串,先判斷設定status flag (isDisplayText=true) 之後,回到loop () 啟始對SAA1064的字串顯示要求。




Sketch程式:

(1)  Arduino I2C Slave Device -
Arduino_I2C_Device.pde

(2)  NANO
外部裝置 - NANO_CTRL_4SEG7.pde