開發電路板初體驗 – Xadow微型穿戴式系列
Xadow系列是Seeedstudio開發的一套Open source穿戴式設備開發模組,使用ATmega32U4晶片,是相容於Arduino(所以聽說可以透過 Xadow Grove Adapter 來與其他的模組整合)的開發電路板。上網找了一下,Seeedstudio是一間大陸的公司,公司全名為「深圳矽遞科技有限公司」,所以你從一些感應器的協助開發工具(如:藍牙的Sscom32E、GPS的u-center)上都可以看到部分中文簡體的字樣。
Xadow主機板規格 | |
Microcontroller | ATmega32u4 (32K Flash and 2.5K SRAM and 1K EEPROM) |
Work Voltage | 3.3V |
DC Current per IO pin | 40mA |
Digital I/O Pins | 20 |
PWM Channels | 7 |
Analog Input Channels | 12 |
Operating Temperature | -20~70 ℃ |
Dimensions | 25.43mm x 20.35mm |
原本是想做一個訊號系統加裝在自己的車上,但後來發現軟排線的長度有不小的限制。取代的方式可以用兩組Xadow系統搭配藍牙來進行傳輸,或是用手機來做中介的Server端控制軟體。且因為它原本是設計做為穿戴式裝置的雛形,因此搭配的LED或OLED都只有一元硬幣左右的直徑大小,放在車上後車應該只看的到一個光點吧。但是還沒開始走,就先不亂想要怎麼飛了。目前台灣有販賣的地方好像只有台北光華的良興電子,如果是外縣市的話,可以透過良興的網站來進行購買,或是乾脆直接上淘寶買也可以。
良興老闆說到,主機板上居然還有附上電池,讓買的人少了一點費用支出,也方便了不少(畢竟是穿戴裝置嘛)。而且聽老闆說整體耗電量不高,還算蠻有撐的。至於多有撐?就等我之後實驗一下再來分享囉。下面就「硬體的串接」、「驅動程式的安裝」、「Arduino軟體的啟動」、「開發」各方面來筆記一下。我之前沒碰過這類東西,若其中有寫錯或觀念錯的的部分,再歡迎各位高手指導。謝謝 🙂
#00 Xadow主機板概圖 (圖片來源:Seeedstudio官網)
硬體的串接
主機板或感應器板的排線是有方向性的。這對我這個沒有接觸過的人來說,剛開始還真是摸不著頭緒。老覺得為什麼官網上說的那麼輕鬆,我的OLED就是連要出現一個畫面都很困難。弄了一陣子後悻悻然的跑去睡了一覺,果然起床時突然想到,會不會是主機板或感應板上的排線線位是有順序的(可能平常用太多防呆裝置,被養呆了)。果然,一換了方向後,馬上成功!至於怎麼樣是正確的方向呢?可以注意主機板與感應板的四周,連接時讓缺口的位置朝向同一邊就可以了。可以參考下圖。
#01 主機板與各感應板串接的模樣,串接的方向可以認主機板或感應板的四周的缺口,讓缺口朝向同一邊即可。
#02 主機板有多大?就跟個一元硬幣差不多大小而已
驅動程式的安裝
下載 驅動程式檔案,並於控制台處新增Xadow的驅動程式。
#03 透過 USB ←→ micro-USB 的連接線將主機板與電腦連線後,會偵測到這個硬體,但尚無法使用。這個時候我們在設備上點選右鍵、選取內容,就會看到以上的這個畫面,設備的狀態描述仍為「無法使用」。
#04 接著點選「硬體」分頁,點選Seeeduino Xadow,再點選「內容」 |
#05 點選「更新驅動程式」,並將檔案指定到剛才下載的檔案路徑下,之後就會進行安裝設定。 |
#06 驅動程式安裝成功
Arduino軟體的啟動
- 下載Arduino工具
聽良興的店員說Arduino-1.0.1 或 Arduino-1.5的版本都OK。但我是在官網下載1.5.6-r2抓回來後,與官網提供的路徑資訊不太一致,所以暫時沒有採用這個版本。最後下載1.0.5的zip版本來使用,下載完成後,進行解壓縮。 - 檔案覆蓋
先上網下載檔案 USBCore.cpp 以及 Borad.txt,分別覆蓋掉剛才抓回來的Arduino-1.0.5資料夾路徑「/hardware/arduino/cores/arduino」下的USBCore.cpp 與路徑「/hardware/arduino」下的board.txt。 - 啟動剛才下載的arduino.exe
#07 「Tools」→「Board」下的板子要選取「Seeeduino Xadow」
#08 接著我們從「控制台」→「裝置管理員」裡來找Xadow所使用的port number是多少 (以上圖為例,port為COM11)
#09 所以在「Tools」→「Serial Port」中要選取 COM11
開發
最簡單、最快的上手方式就是利用軟體中提供的範例程式。範例程式可以在這邊找到,「File」→「Examples」下就有許多的模組範例。如果是在網路上找到其他的範例程式,而也想要放置在這個路徑的話,可以有兩種放置的選擇。如果,
- 放在路徑「arduino-1.0.5-r2examples」:會出現在Examples清單的上半段
- 放在路徑「arduino-1.0.5-r2libraries」:會出現在Examples清單的下半段
#10 在「File」→「Examples」中可以找到許多容易上手的程式範例
#11 程式碼撰寫完成後,點選左邊紅框框的打勾符號,會進行程式的組譯。點選右邊紅框框的向右箭頭,會將編譯好的byte code透過USB上傳到Xadow主機板。以128×64的OLED面板來說,在文字模式下,最多可以有七列的文字。透過上面的範例,就可以簡單的在第一列顯示「Hello!」,第三列顯示「sya & shannon」。若是要顯示圖形的話,就需要每個位置去塞值以模擬出圖形囉!操作的API基本上都已經包裝好了,許多的程式撰寫相對來說都十分的直覺。
Arduido language建構在Wiring的基礎,因此是使用C/C++的語法,這與以Java為基礎的Processing language有所不同。在Arduino的網站上,還很貼心的整理了一些Arduino與Processing語法的不同,提供給開發者參考。在範例程式中,基本上會看到兩個function,一個是setup(),一個是loop()。
- setup():這個function在設備啟動或重啟的時候會被執行到,且只會執行一次。主要用來初始化pin mode、參數與使用的library。
- loop():在執行完setup()後,就會進入loop()。裡面一般就會放置真正要執行(或持續執行)的行為程式。
如果是原本軟體中沒有的模組,如128×64的OLED面板。針對這類的模組,可以先去下載相關的library。至於要在那邊找呢?可以參考 seeedstudio的Wiki網頁,在裡面找到相對應的產品種類,將相關的library下載回來。下載後,再放到你arduino軟體的「arduino-1.0.5-r2libraries」路徑分類下。其中example目錄的部分,我是又複製到「arduino-1.0.5-r2examples7.Display」的分類目錄下,以方便我之後的參考及使用。下面列一些另外找的感應板library:
下圖是Xadow主機板上的各種裝置I/O控制模式 (圖片來源:seeedstudio),主機板對其他延伸模組的控制可以透過IIC、Serial及Digital Signal,來對相對應的設備進行控制與操作。
- IIC介面
可以透過Arduino的 Wire library 來進行控制與傳輸。至於怎麼透過device address及對哪一個register進行寫入,可以分別參考下圖的P5、P6處定義的IIC Address與直接參考該sensor的data sheet(ex. 3-axis accelerometer)。 - SPI(Serial Peripheral Interface)介面
- Digital Signal介面
模組名稱 | 筆記 | |
GPS | 這個比較單純,其實就是GPS字串格式的瞭解與解析。 | |
3-Axis Accelerometer | 官網上的sample code 似乎是錯誤的,老天保佑我有好眼力,還好找到了。將以下程式碼紅色處修改為紅色的程式碼即可。
#include <Wire.h> #define ADXL345_DEVICE 0x00 #define ADXL345_POWER_CTL 0x2D #define ADXL345_DATAX0 0x32 #define ADXL345_DATAX1 0x33 #define ADXL345_DATAY0 0x34 #define ADXL345_DATAY1 0x35 #define ADXL345_DATAZ0 0x36 #define ADXL345_DATAZ1 0x37 #define ADXL345_ADDRESS 0x53 int X_Read,Y_Read,Z_Read; double ax,ay,az; void setup() { Wire.begin(); Serial.begin(19200); delay(100); //Turning on the ADXL345 Wire.beginTransmission(<span style="color: #ff0000;" data-mce-style="color: #ff0000;">ADXL345_ADDRESS</span>); // start transmission to device Wire.write(ADXL345_POWER_CTL); Wire.write(8); //measuring enable Wire.endTransmission(); // end transmission } void loop() { X_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAX0,ADXL345_DATAX1); Y_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAY0,ADXL345_DATAY1); Z_Read = readRegister(ADXL345_ADDRESS,ADXL345_DATAZ0,ADXL345_DATAZ1); /* Serial.print("The X,Y,Z Value are:"); Serial.print(X_Read); Serial.print(" , "); Serial.print(Y_Read); Serial.print(" , "); Serial.println(Z_Read); */ getAcceleration(); Serial.print("X="); Serial.print(ax); Serial.println(" g"); Serial.print("Y="); Serial.print(ay); Serial.println(" g"); Serial.print("Z="); Serial.print(az); Serial.println(" g"); Serial.println("**********************"); delay(500); } int readRegister(int deviceAddress,int address1,int address2) { long int value; int readValue1,readValue2; Wire.beginTransmission(deviceAddress); Wire.write(address1); // register to read Wire.write(address2); // register to read Wire.endTransmission(); Wire.requestFrom(deviceAddress,2); // read two byte if(Wire.available()<=2) { readValue1 = Wire.read(); readValue2 = Wire.read(); } //Wire.endTransmission(); readValue2 = readValue2<<8; value= readValue1 + readValue2; delay(100); return value; } void getAcceleration() { double gains; //Boring accelerometer stuff gains = 0.00390625; ax=X_Read * gains; ay=Y_Read * gains; az=Z_Read * gains; } |
|
BLE | 在之前嘗試用Gear Fit與HTC M8連接時,有稍微研究了一下藍牙BLE的架構。沒想到隔沒多久居然還真的要用上這邊的資訊。在BLE的架構上,可以看到定義了一層Attributes Protocol,用來作為傳輸機制的基礎。從DigiTimes上的一篇周維棻所撰寫的屋文章「淺談低功耗藍牙技術」中,很清楚的對ATT與GATT做了很清楚的說明:
因此在開發上,要對BLE進行操作,基本上就是要透過GATT Profile來進行。GATT針對設備上的行為,定義了一個主從關係,因角色的不同,使用的類別也不同。關於這個部分,可以參考 jimoduwu 的網頁,上面有蠻清楚易懂的圖示說明,對於初步的認識是個很不錯的踏腳石。而如果需要進一步的開發設計資訊,建議可以參考 這篇。最後我手機端上的BLE連接是參考 這篇 的程式範例。 忘了補充,我一開始Xadow的BLE模組一直無法連接、傳輸資料。在詢問廠商(Seeedstudio)後,廠商建議我先對板子下「AT+RENEW」的指令來恢復原廠預設值。或是將以下的程式碼燒錄到板子上加以執行。好像(因為隔了好一段時間,印象有點模糊了)在這個步驟後,就可以順利連接了。 #define SerialBaud 9600 #define Serial1Baud 9600 void setup() { Serial.begin(SerialBaud); Serial1.begin(Serial1Baud); while(!Serial.available()); // set slave Serial1.print("AT+RENEW"); delay(1000); } void loop() { for(;;) { // copy from virtual serial line to uart and vice versa //Serial1.print("test I am slave "); //delay(10000); if (Serial.available()) { Serial1.write(Serial.read()); } if (Serial1.available()) { Serial.write(Serial1.read()); } } } |
完整的其他人分享的Arduino Language Reference,可以參考最下面的參考連結。再來,就要來好好試試Xadow,希望能完成個有趣的小作品囉~
↑ (2014.07.08)實驗抓了些GPS模組的GPRMC、GPGGA與GPGSV的訊號然後顯示在OLED上。奇怪的是,從u-center上看不到GRRMC的訊號,但直接去解析其實是可以解析的到的。GPS模組定位的速度基本上與說明書上提到的23秒差不多,但在有遮蔽物或車內隔熱紙的情況下,有時候定位速度就有點慢了,還有碰過定位定了五分鐘還沒定到的情況。
參考文章: