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顯示看板』示範影片: