2015-07-30

EVShield筆記(4 - 2) : EVShield WiFi Web Server Arduino 軟體功能

在前篇 " (4-1) 結合 Arduino WiFi Shield 的 EVShield Web Server " 中,主要探討的是硬體介面相關,包含: SPI介面Shields 推疊 以及 Arduino 腳位配置 

本篇將以軟體功能為主,包含:建立 WiFi 連結啟動 Web server 以及 處理瀏覽器的 HTTP request

【參考資訊】

(1) Arduino WiFi.h 程式庫 
(2) HTTP Headers for Dummies 
(3) EVShield筆記(2):UI Module使用者介面擴展板程式摘要 

【1. 建立WiFi連結】


  • 連接無線網路,需要確認 SSID 與 加密方式 ,再以 WiFi.begin() 進行加密認證。
  • 通過加密認證之後,會由 DHCP 配置動態 IP,也可以先以WiFi.config() 設定靜態 IP後再進行加密認證。
  • IP 位址可以由 WiFi.localIP() 取得資料型態為IPAddress,實際上為四個元素陣列的IPV4 格式

2015-07-23

EVShield筆記(4 - 1) : 結合 Arduino WiFi Shield 的 EVShield Web Server(硬體介面)

以EVShield 結合 Arduino WiFi Shield,就可以實現透過無線網路控制 EV3/NXT 的馬達與感應器。
而最簡單便利的人機控制介面就是在 Arduino UNO建置 Web server,這樣任何平台的裝置,即只需以瀏覽器開啟網頁方式遙控機器人的操作,而不需要開發專屬的 App。

下圖為本次所計畫建置的 EVShield WiFi Web server,將會以瀏覽器控制 EVShield 上兩組 RGB LED 的顏色顯現,並同時在 UI Module 的 LCD 螢幕上顯示目前所執行的顏色設定指令。 

【示範影片】


【擴展板推疊方式】
EVShield WiFi Web server 的所有組件如下圖:除Arduino UNO之外,另還包含 UI Module shield、EVShield 以及 WiFi Shield 等三個擴展板。
  

2015-07-06

EVShield筆記(3):測試 EV3 以 I2C 連線控制 EVShield

EVShield 是作為Arduino連接 Mindstorms NXT/EV3 馬達與感應器擴展板
EVShield具備的功能中,除了 Servo pins 之外,都是透過 I2C 方式進行控制,包含:三個按鍵、兩個 RGB LED、四個 Motor ports 以及 四個 Sensor ports
而對於同樣具有 I2C 通訊
介面的 EV3主機 Sensor ports,應該也可以取代 Arduino 直接連接及運用 EVShield 的功能,以下即是對於這個需求所進行的測試記錄。


【EV3 接線方式】:
如下圖,將 EVShield 背面正下方的 4 pins I2C 接腳轉接成 RJ12 cable 之後
連接 EV3 的 Sensor Port。

【EV3 使用軟體】:
EV3 程式使用 RobotC 4.32 版。
至於 EV3 軟體,目前已知 Mindsensors 與 DI 的 EV3-I2C Programming Blocks,在功能方面並不適用。
 

EVShield I2C 架構

如下圖,EVShield 由兩個 I2C Slave 裝置所組成,分別為 Bank A ( 位址:0x34 ) 與 Bank B 0x36 ),其中 LED 與 按鍵 的控制功能都建立在 Bank A,詳細的 I2C 暫存器資訊需參考 "EVShield Advanced Development Guide文件

2015-06-28

EVShield筆記(2):UI Module使用者介面擴展板程式摘要

EVShield 雖然可以透過 Arduino IDE 的 Serial Console來顯示訊息或輸入資料,不過必須是與電腦連線的狀態,而 mindsensors 則推出了一個 UI Module For EVShield or Arduino 擴展板,具備 320x240 解析度的 2.2" 彩色 TFT 螢幕 以及 一個五向搖桿,提供更方便與彈性的使用介面。




UI Module Arduino程式庫

UI Module本身是Arduino擴展版,並不需要與 EVShield搭配才能使用。
其中TFT LED 是 SPI介面的 Adafruit ILI9340,五向搖桿則是使用 Arduino的 A1(Up)、A2(Down)、A0(Right)、A3(Left)、D2(Center) 五個Digital pins。

在mindsensors官網中共提供了三個下載的Arduino程式庫:

  • Adafruit_GFX這是 Adafruit 原廠 LCD/OLED 顯示器的通用繪圖及文字顯示功能程式庫,須搭配特定顯示器的程式庫一起使用,如:Adafruit ILI9340。
    詳細使用方式可以參考手冊
    : "Adafruit GFX Graphics Library"。

  • EVs_UIModule這是 mindsensors 提供的 UI Module程式庫,除繼承前面兩個程式庫的顯示控制功能之外,另定義讀取五向搖桿狀態以及簡化的螢幕控制與文字功能。
在Arduino sketch中需要按照以下順序 include程式庫,才能夠使用定義的功能:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9340.h>
#include <EVs_UIModule.h>

void  setup()
{
  Serial.begin(115200);  
  delay(1000); 
  
  uim.begin();
}
  

UI Module使用者介面實作

UI Module雖然具有比 EV3 更生動的彩色螢幕,不過受限於 Arduino 硬體資源,需要妥善規劃運用方式,才能夠充分發揮效果,因此,就先以預計要移植到 EVShield 的 "樂高積木顏色分類機" 的需求,實作一個顯示積木顏色的 UI 畫面。

在下圖中,將螢幕UI畫面區分成三個功能區:


2015-06-27

EVShield 筆記(1):Mindsensors EVShield 特性摘要

EVShieldmindsensors 為Arduino平台連接使用 Mindstorms NXT/EV3周邊所開發的擴展板。
 

比較前一代的NXShield,增加支援了使用 UART介面的 EV3感應器,包含:Color、Gyro、IR、Touch與Ultrasonic等,不過由於取消了 Software I2C Master功能,所以無法使用 NXT的Ultrasonic sensor。
至於 NXT 的其他類比式感應器與 mindsensors 的數位感應器/控制器等,在 EVShield 程式庫 中都有提供對應的 API  ( 下載連結 ) 。

 

  

EVShield介面
 

2015-06-18

Arduino筆記:移植『EV3樂高積木顏色分類機』至Arduino平台(NXShield or EVShield) - ( II )

※ 本文接續自:
『EV3樂高積木顏色分類機』移植Arduino平台計畫 Part I 

◎ 本文 Brick Feeder、Brick Loader及 Robot Arm等三個功能單元測試影片


  1. Brick Feeder
      

    【控制功能】
     
    Brick Feeder的功能是將已經完成顏色辨識的積木透過以下動作傳送給Brick Loader機構:
    (1) 驅動 EV3 M-Motor(Reverse)抓取積木,當抓緊積木之後,經由Under-Actuation 機制會轉動爪取手臂將積木開始往Brick Loader傳送,同時透過另一組齒輪系抬起托盤。

    (2) 當積木已經傳送到托盤所抬起的目標位置時,會因齒輪的作用造成EV3 馬達停滯無法繼續運轉,而這個狀態需要透過程式判斷,在RobotC可以使用偵測馬達的 RPM值達成,至於 NXShield的 API則需以讀取EV3馬達 Encoder值的變化來判斷。

    (3) 再以反向驅動 EV3 M-Motor(Forward)釋放積木至托盤,同樣經由Under-Actuation 機制,除了會將爪取手臂轉回EV3顏色感應器所在的位置之外,同時也會放下托盤將積木滑至Brick Loader。

     【Arduino程式】
     

    對於Brick Feeder,程式最重要的功能就是判斷 EV3 馬達的停滯狀態(stalled),原廠的說明文件中曾提到,每一個Motor port會有一個Status Byte,其中 bit7可以檢測 "Motor is stalled"狀態,實際上測試似乎沒有作用,因此,改成以讀取馬達的 Encoder value作為判斷,以下為Arduino程式碼:
    
    ////////////////////////////////////////////////////////////////////////////////
    // Control the Brick Feeder(EV3 M-Motor)
    ////////////////////////////////////////////////////////////////////////////////
    void controlBrickFeeder(bool isFeeding) {
      int32_t curr_encoder, prev_encoder;
      
      nxshield.bank_b.motorStop(SH_Motor_2, SH_Next_Action_Brake);
      delay(300);
      nxshield.bank_b.motorResetEncoder(SH_Motor_2);
      curr_encoder = nxshield.bank_b.motorGetEncoderPosition(SH_Motor_2);
      prev_encoder = curr_encoder;
      if (isFeeding)
        nxshield.bank_b.motorRunUnlimited(SH_Motor_2, SH_Direction_Reverse, 30);
      else
        nxshield.bank_b.motorRunUnlimited(SH_Motor_2, SH_Direction_Forward, 50);
      delay(1000);
      while(true) {
        curr_encoder = nxshield.bank_b.motorGetEncoderPosition(SH_Motor_2);
        if(abs(curr_encoder - prev_encoder) < 10) break;
        prev_encoder = curr_encoder;
        delay(500);
      }
      nxshield.bank_b.motorStop(SH_Motor_2, SH_Next_Action_Float);
      delay(500);  
    }
        

Arduino筆記:移轉『EV3樂高積木顏色分類機』至Arduino平台(NXShield or EVShield) - ( I )

在五月底曾答應 Mindsensors 的 Mr. Deepak要將『樂高Technic Beam積木顏色分類機』由 EV3 + RobotC 移轉至 Arduino + EVShield 平台,而在等候 EVShield寄達之前,先行以 NXShield測試各個組成機構轉換成Arduino的功能,接下來在移轉至EVShield時,就可以直接整合,省掉單元測試的工作。

EV3 to Arduino 轉換計畫


EV3版的『樂高Technic Beam積木顏色分類機』共由五個主要機構所組成,包含:
  • 托盤 及 輸送帶:使用 PFMate+PF IR接收器 控制 PF L-Motor 以及 EV3觸控感應器
  • 顏色辨識:使用 EV3顏色感應器
  • Brick feeder:使用 EV3 中型馬達
  • Brick loader:使用 PFMate + PF IR Receiver 控制 PF Servo Motor。 
  • Robot Arm:使用 NXTServo 控制四顆 RC Servo
EV3 版 的五個組成機構
在計畫先以 Arduino + NXShield 平台進行單元測試前,需因應 NXShield 與 EV3 感應器的相容問題調整以下的配備:

以下圖示為單元測試之所有機構:

NXShield版測試機構

以下圖示為單元測試之功能架構圖:


2015-06-05

Arduino筆記:以Sparkfun LED Strip(LED燈條)裝飾樂高聖誕樹

去年底應景做了『讓EV3播放聖誕音樂』,同時也以樂高零件搭配LED燈條組合成聖誕樹,展現的燈光效果確實很有年節的氛圍

樂高 LED燈飾聖誕樹
而其中LED燈條使用的是『Sparkfun RGB LED Strip』,共串接了32顆的 RGB LED,每一個LED各自由一顆 WS2801 驅動IC控制,因此可以獨立控制每一顆LED的顏色顯現(addressable),透過程式即可以展現出如下面影片中的特殊效果。


重要技術資訊

Sparkfun官網中的範例程式部分資訊有誤,以下則是經測試後確認功能確實可以正常運作:
  1. 燈條首尾分別為四芯的公與母接頭,可繼續延伸串接,四芯線與Arduino的接線方式為:
    ● 紅色 - 5V
    ● 藍色 - CKI (Data Clock Input)
    ● 綠色 - SDI (Serial Gray Scale data input)
    ● 黃色 - GND
     
  2. 每一顆LED以 24-bit 顏色值資料控制顏色的顯示:

2015-06-02

Arduino筆記: Sparkfun 8X16 RGB LED矩陣顯示控制

Sparkfun的8X8 LED矩陣使用SPI介面控制顯示64個LED,同時背板也具備Daisy Chain功能,可串接多個同型的LED矩陣,透過Arduino(SPI Master)傳送資料給第一個控制板,會依序傳遞給所有鏈結的LED矩陣,控制所有LED的顏色顯示。
SparkFun 8x8 LED 矩陣控制板
過去曾經使用過以單一LED矩陣製作『NXT顯示裝置(NXT RGB LED訊息看板)』,由於8X8 LED數量的限制,因此只適用於水平捲動顯示英數字型的訊息。對於筆劃較複雜的中文字型,則至少需要有16X16的解析度,所以這次將會以Daisy chain串接兩個8X8 LED矩陣成為8X16的顯示面板用來顯示中文訊息。
在以下的影片中,會展示以水平捲動方式顯示8X8英文字型以及垂直捲動顯示16X16中文字型等兩種效果。

『EV3 8x16 LED顯示看板』示範影片:


2015-05-12

RobotC 4.X實作:樂高Technic Beam積木顏色分類機(LEGO BRICKS SORTER)

RobotC 4.X版原來對於EV3的I2C功能一直不是很穩定,常出現Bus error的錯誤,不過從4.27版之後就已經能夠正常支援了,所以這次以mindsensors的PFMateNXTServo(V1.0)兩個I2C數位控制器,再搭配EV3中型馬達以及觸控' 顏色兩種感應器實作一個『樂高Technic Beam的積木顏色分類機(LEGO BRICKS SORTER)』,用來測試RobotC相關的EV3功能,包含:馬達、感應器、I2C通訊以及EV3的多工作業等。

示範影片:


機構總覽:

Bricks Sorter整體機構