開發電路板初體驗 – Xadow微型穿戴式系列


  Xadow系列是Seeedstudio開發的一套Open source穿戴式設備開發模組,使用ATmega32U4晶片,是相容於Arduino(所以聽說可以透過 Xadow Grove Adapter 來與其他的模組整合)的開發電路板。上網找了一下,Seeedstudio是一間大陸的公司,公司全名為「深圳矽遞科技有限公司」,所以你從一些感應器的協助開發工具(如:藍牙的Sscom32E、GPS的u-center)上都可以看到部分中文簡體的字樣。

 

Xadow主機板規格 (資料來源:seeedstudio 官方網站)
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軟體的啟動】

  1. 下載Arduino工具
    聽良興的店員說Arduino-1.0.1 或 Arduino-1.5的版本都OK。但我是在官網下載1.5.6-r2抓回來後,與官網提供的路徑資訊不太一致,所以暫時沒有採用這個版本。最後下載1.0.5的zip版本來使用,下載完成後,進行解壓縮。
  2. 檔案覆蓋 
    先上網下載檔案 USBCore.cpp 以及 Borad.txt,分別覆蓋掉剛才抓回來的Arduino-1.0.5資料夾路徑「/hardware/arduino/cores/arduino」下的USBCore.cpp 與路徑「/hardware/arduino」下的board.txt。
  3. 啟動剛才下載的arduino.exe

    #07 「Tools」→「Board」下的板子要選取「Seeeduino Xadow」


    #08 接著我們從「控制台」→「裝置管理員」裡來找Xadow所使用的port number是多少 (以上圖為例,port為COM11)


    #09 所以在「Tools」→「Serial Port」中要選取 COM11


【開發】

  最簡單、最快的上手方式就是利用軟體中提供的範例程式。範例程式可以在這邊找到,「File」→「Examples」下就有許多的模組範例。如果是在網路上找到其他的範例程式,而也想要放置在這個路徑的話,可以有兩種放置的選擇。如果,

  1. 放在路徑「arduino-1.0.5-r2examples」:會出現在Examples清單的上半段
  2. 放在路徑「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(ADXL345_ADDRESS); // 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

BLE

  在之前嘗試用Gear Fit與HTC M8連接時,有稍微研究了一下藍牙BLE的架構。沒想到隔沒多久居然還真的要用上這邊的資訊。在BLE的架構上,可以看到定義了一層Attributes Protocol,用來作為傳輸機制的基礎。從DigiTimes上的一篇周維棻所撰寫的屋文章「淺談低功耗藍牙技術」中,很清楚的對ATT與GATT做了很清楚的說明:

  「低功耗藍牙在與Classic BT共用的底層架構之上(L2CAP/HCI),架構了以attribute為基礎的通訊架構(Attribute Protocol;ATT),將設備間的通訊切割成以request/response為基礎的資料交換。在ATT之上的是GATT(Generic Attribute Profile),定義了基於ATT進行通訊的設備之間的主從關係(Central/Peripheral/Broadcaster/Observer)、服務探索方式以及各種數據讀寫模式等等。這也是開發者所能接觸到的最底層功能。

  在GATT上,應用可以依據功能(Feature)將不同的數據群組以服務(Service)的方式發布出去,另外,針對不同需求、應用可以和一個或多個服務進行溝通,形成一個Profile。這部分在Classic BT和低功耗藍牙之間的定義是不同的。BluetoothSIG針對常用的功能已經定義了相當數量的Service/Profile,如心跳計、體溫計等,但開發者依然可以依照自己的需求在GATT之上發揮。」。

資料來源:DigiTimes 周維棻「淺談低功耗藍牙技術

  因此在開發上,要對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秒差不多,但在有遮蔽物或車內隔熱紙的情況下,有時候定位速度就有點慢了,還有碰過定位定了五分鐘還沒定到的情況。


參考文章:

  1. Wiki – Xadow
  2. Getting Start With Xadow
  3. Arduino – Language Reference

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *