2011-12-17

NXShield_AVR程式庫相容Arduino 1.0更新版(0.0.95)已釋出

Arduino 1.02011/11/30正式釋出:Arduino 1.0下載
新版的Arduino 1.0 sketch附加檔名已由原來的.pde更改為.ino,以避免與ProcessingSketch混淆。同時無論在IDELibraries都有相當程度的更新:Arduino Software Release Note
(Arduino IDE 0.0.22
0.1.00比較)


NXShield_AVR程式庫也在2011/12/14更新了相容版本(0.0.95)
下載點:NXShield_AVR-0.0.95經過測試功能正常。

2011-12-10

NXShield API的功能擴充-加入Hitechnic IRReceiver裝置

NXShield API中提供了多款NXT類比式與I2C數位感應器的Device Class,幾乎涵蓋了Mindsensors所有上市中的產品,而如果要運用其他沒有預先提供Device Class的裝置,如HitechnicDexter的產品,特別是I2C裝置,也可以透過以下兩種方式來建立使用的功能:
(1)  Arduino sketch中使用NXShieldI2C class的通用I2C access methods,對於該裝置的registers進行存取或寫入指令,以實現所需要的控制功能。
(2)  製作該裝置的Device class加入NXShield _AVR程式庫中,後續就可以比照預設Device class的用法,在Arduino sketch中使用相關methodsproperties
以下以HitechnicIRReceiver sensor為範例,整理以上兩種運用方式。


(
NXShield API架構參考:NXShield Arduino API摘要整理)

2011-12-03

NXShield arduino API 摘要整理

NXShieldAPI(下載點)是以它的硬體配置以及Firmware功能作為發展基礎,使用的是C++語言,整體架構具結構化與彈性,運用時非常直覺,同時也很容易增加新的Device Class或擴充功能,對於NXT users不會覺得陌生且很容易上手。
NXShield的硬體配置分成兩種介面
(1)
使用Arduino IO pins:含ButtonsRGB LED63-pinRC Servo接腳.
(2)
使用I2C界面:含兩個Port Banks(BANK-ABANK-B各有兩個NXT motor
ports
sensor ports) ,以及一對4-pinI2C接腳.
NXShield firmware內建對於兩個port banks的控制功能兩個Port banks各有預設的I2C位址(0x060x08)以及一組registers,作為控制Motor ports (M1M2)動作與讀取Sensor ports (S1S2)類比式感應器Raw Value(10 bits)I2C操作界面.Registers相關資料:Advance Development Guide.Motor ports的控制功能與NXTMMX一樣,參考資料:Mindsensors NXTMMX的功能特性.ArduinoI2C bus腳位只有一組A5A4 pin (SCLSDA)NXShield串接在I2C bus的界面有:BANK-ABAN-B4-pinI2C接腳以及BANK-AS1 port(BAS1).所以,BAS1 port是可以接NXT的數位感應器.

NXT也可以使用BAS1 port來控制
NXShield.
因為這4個介面串接在同一個I2C bus上,所以彼此的I2C address必須唯一
.而其他的三個sensor ports就只能接類比式感應器.

2011-11-12

Mindsensors NXShield for Arduino裝置介面摘要

2011.11.11收到了NXShield,有了實際的產品,就可以先就硬體的外觀與介面進行觀察,後續再對於控制功能進行測試。
外觀與介面
NXT RJ12 Ports

NXShield正面的配置方式,左右各有一組四個PortsNXT RJ12接口,右邊為BANK-A(I2C
address
0x06),左邊為BANK-B(I2C address0x08)
 
Arduino pins中間左右的兩排接腳,即是用來連結Arduino UNO作為擴充板,但是因為NXShield在背面沒有配置堆疊用的接腳,所以,若需要堆疊其它Shield時,NXShield會是在最上層




2011-11-06

Mindsensors Arduino NXShield功能初探

MindsensorsNXShield在這個月初上市
這是一個可以提供Arduino UNO連接NXT週邊的硬體實作裝置,規格上就是具備NXT RJ12 IO 界面的Arduino擴充板,雖然還沒有實際的產品可以測試,不過由已經公佈的使用手冊API程式庫以及範例程式,先就它的功能與特性做初步的探討,同時也預先規劃一下收到產品時需要測試的重點。

NXShield硬體外觀
使用手冊來看,NXShield規劃了兩組各4RJ12Ports,這兩組各有其I2C位址:Bank-A: 0x06Bank-B: 0x08,而每一組分別具有兩個Motor Ports與兩個Sensor Ports,也就是說一個NXShield最多可以接4NXT馬達以及4個感應器。

對於Sensor Port,無論類比或數位感應器都可以使用,也可以透過MindsensorsPort Splitter連接更多的I2C數位感應器(I2C位址需不一樣)。同時,若再串接另一個NXShield,就可以多增加幾乎一倍的Ports可以使用,不過需要變更NXShield Bank的預設I2C位址,以維持惟一性。

至於Motor Port,參考NXShield Advanced Development Guide的說明,會發現其實它的功能就是移植自NXTMMX,無論Register LayoutI2C Command都是一模一樣,用法可以參考之前所整理的文章:〝 Mindsensors NXTMMX的功能特性〞。


此外,NXShield側邊還有4個按鍵開關,分別為Reset/Go/Left/Right,依據User Guide說明,後三個鍵是可以程式化控制的,不過似乎目前只有Mega版有列出對應的Digital IO pinsUNO版還是TBD,有待確認。
而在產品頁面有提到可以連接6RC Servo,同樣在說明文件中也沒有,所以應該就是直接使用Servo.h的功能。

NXShield所使用的Arduino腳位(IO Pins)
為了讓4Sensor Ports都可以連接I2C數位裝置,MindsensorsNXShield的程式庫實作了SoftI2cMaster的功能,以突破Arduino只能有一個Hardware I2C界面的限制,因此UNO版共使用了A0A1A2A4A5D2D4D7這些Pin以及Hardware Timer 2 (D3D11),詳細在NXShield Advanced Development Guide中有說明或直接參考API中的常數定義檔(SHDefines.h)


NXShield的程式開發
MindsensorsNXShield發展了功能相當齊全的程式庫:NXShield_AVR,以及整理完善的明文件與範例程式,這些也都包含在下載的程式庫檔案中,事實上這個版本的API也就是以原來的NXTI2CDevice Library為基礎所發展出來,以下為Class的架構圖:


以後如果想要自行擴充標準API的功能或製作新的Device Class,都可以運用以這個程式庫的功能為基礎來開發,比較能事半功倍,因為到底NXShield還算是一個有相當複雜程度的裝置。


結論摘要
Arduino的系統資源比起NXT可以說是差了一大截,不過NXShield卻幾乎移植了NXT主要的 IO裝置功能到Arduino來,而且尚有餘裕的空間可以再擴充NXT所缺的功能,例如TCP/IP的網路通訊。
我想最主要的原因有兩個,首先,
NXShield本身無論在Motor Control或類比式感應器等這些處理功能的齊全,分擔了Arduino相當多的工作,事實上,一個NXShield相當於結合兩個NXTMMX再加上許多額外的功能

其次,API程式庫的功能規劃的相當完善且很容易上手使用,這是個人覺得最值得讚賞的部份。

等到收到產品之後,接下來要測試的重點會是:
(1)
有沒有可能成為NXT的有力助手。
(2)
附加其他擴充版的應用。




  • 留言者: robotman
  • Email: tslinb@hotmail.com
  • 網址:
  • 日期: 2011-11-14 10:30:22
看到這篇文章..理論上看起來應該可以串接!!





  • 留言者: Yean
  • Email: drlego.tw@yahoo.com.tw
  • 網址:
  • 日期: 2011-11-08 00:17:44
可以借分享嗎,我們訂購的NXshield也快要到貨了,若您有意的話,到貨後我們送上一片給您測試。
[版主回覆11/08/2011 07:49:44]

沒有問題, 也歡迎一起研究與分享心得
我自己也訂了兩片, 所以已經有了, 感謝您的好意 : )


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







2011-08-24

NXT與Arduino多重I2C Master之實作測試




Arduino
有許多的I2C週邊或擴充板,如何來讓NXT也能使用這些週邊? 若是能夠藉由Arduino主板來存取,那就大大的提昇了這些週邊的使用範圍與彈性。

對於這樣的應用,首先要確認的是:Wire.h library能否支援多個Master的運作

更明確的說法是:Arduino主板是否可以同時身兼MasterSalve



當它與NXT進行通訊時須擔任Salve,但當要存取I2C週邊時又得作為Master




幾週前由Digital Cave這個網站,查到了以下對於Multi Master的說明資料:

The I2C protocol
is a multi-master protocol; however, the Wire library in the Arduino
distribution does not make it clear on how to implement this functionality.



 the documentation on the Arduino webpage
is slightly misleading in how
you would go about doing it. The documentation as currently written states that
for Wire.begin(address), the address is optional and 'if not specified, join
the bus as a master'. However, what is not stated is that if you transmit something from a device which has already
joined as a slave, it will assume the role of Master when it sends the data to another slave.


以上算是 Wire.h libraryMissing Manual

為了驗證以上的說法,延續之前NXTArduino之間的I2C通訊測試,實作了以下的測試Case

(1)
使用兩部UNO,都模擬成I2C Slave裝置,其Address分別是0x310x33,而uploadsketch功能皆相同:

當它們接收到0x42+0x01/0x02的控制指令資料時,就會去開/關接在D13LED(0x31為紅色,0x33為綠色),此外,又多增加了一個0x43的控制指令,附加的指令資料包含:另一部Slave的位址、要傳送的控制指令值以及LED的開關指令值。

(2)
將以上兩部UNONXT串接成I2C通訊架構。




首先由NXTLowspeedwrite()傳送[0x62, 0x43, 0x33, 0x42,
0x01]
的資料,


這時候0x31 Slave會接收到[0x43, 0x33, 0x42,
0x01]
的控制指令,


當它處理完onReceive() Handler之後,

接著它就會扮演起Master角色,send()[0x33, 0x42, 0x01]的資料,

這時候0x33 Slave就會接收到[0x42, 0x01]的資料而去執行開啟LED(綠色)的指令。

所以依據以上的測式情境,0x31 Slave就是身兼SlaveMaster的雙重角色。



NXT
新增的Function與呼叫程式碼:

void sendTransferCommand(const byte
deviceAddress,

                       const byte
deviceRegister,const byte anotherDevice,

                       const byte
anotherRegister, const byte anotherCommand)

{



     byte I2C_req_buf[];




     ArrayBuild(I2C_req_buf,
deviceAddress, deviceRegister,

              anotherDevice,
anotherRegister, anotherCommand);




     while(I2CCheckStatus(I2C_PORT)
== STAT_COMM_PENDING);




     LowspeedWrite(I2C_PORT,
0, I2C_req_buf);




}



sendTransferCommand(ARDUINO_RED_SEND_ADDRESS,

                   ARDUINO_TRANSFER_CMD,

                   ARDUINO_GREEN_ADDRESS,

                   ARDUINO_COMMAND_REG,
LED_ON);




Arduino
新增的Function與呼叫程式碼:

void loop()




{




     if
(isTransfer) {




       Wire.beginTransmission(anotherAddress);




      
Wire.send(anotherRegister);




      
Wire.send(anotherCommand);




      
Wire.endTransmission();




      
isTransfer = false;




     } 




}

void receiveEvent(int howMany)




{ 




   
requestRegister = Wire.receive();




    if
(requestRegister == 0x42) {




      
requestCommand = Wire.receive();




       if
(requestCommand == LED_ON) {




          digitalWrite(LED_PIN, HIGH);




       }




       else
if (requestCommand == LED_OFF) {




              
digitalWrite(LED_PIN, LOW);




           
}




    }




    else if
(requestRegister == 0x43) {




           
anotherAddress= Wire.receive();




           
anotherRegister = Wire.receive();




           
anotherCommand= Wire.receive();




           
isTransfer = true;




         }




}