開發電路板初體驗 – 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軟體的啟動

  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(<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 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