Arduino Modulino Pixels 教學

什麼是 Arduino Modulino Pixels 模組?

Arduino Modulino Pixels 模組是一款創客友善模組,具有 8 個可單獨尋址的彩色 LED 和 Qwiic 介面。 Pixels 模組(Arduino 零件號碼 ABX00109)最初是作為更大的 Arduino Plug and Make 套件的一部分提供。它是一個相對複雜的模組,因為它採用了 32bit STMicroElectronics ARM 微控制器來處理 Arduino UNO R4 和各個紅綠藍(RG​​B)LED 之間的通訊。ARM Cortex M0 微控制器位於圖 1 的左下角。

本工程簡介探討了軟體介面和底層硬體。本文僅限於使用預設 Modulino 尋址方案的基本操作。它不包括高階操作,例如更改 Pixels 模組的位址或在同一 I2C 網路上操作多個 Pixels 板。如果您有興趣執行這些複雜的操作,請在下面發表評論。如果 Arduino 提供單獨的 Modulino 板,這些先進技術在未來將變得越來越重要。


圖 1:Arduino Modulino Pixels 模組的圖像。 32bit STM ARM 微控制器在左下角可見。

Arduino Modulino Pixels 的軟體說明

Arduino 為 Modulino 模組提供了一個簡化的函式庫。此程式碼可以使用 Arduino IDE 的庫管理器安裝,如 Arduino 說明中所述。

Modulino 類別結構

Arduino Modulino 板的軟體介面使用類別結構進行處理。第一步是使用建構函數:

ModulinoPixels leds;

這將創建一個 LED 對象,然後可以使用多種方法對其進行操作,包括:

  • leds.clear(); 這是一種重載方法,用於清除單個或所有 LED。當不帶參數呼叫時,所有 LED 都會被清除。當使用索引 N 呼叫時,第 N 個 LED 被清除。
  • leds.set(); 這是一個用於設定 LED 強度和顏色的重載方法。
  • leds.show();此方法將由 clear() 和 set() 方法建立的內部資料傳輸到實體 LED。

modulino Pixels 的運作方式類似於雙緩衝區。我們使用 clear() 和 set() 方法來更改像素記憶體中的暫存器。這些變化發生在後台,對顯示沒有影響。只有當呼叫 show() 方法時,資料才會傳送到實體 LED。

技術提示:雙緩衝區是串列通訊的重要構建塊。它允許一次傳輸一份資料。當所有零件組裝完畢後,它們就可以同時呈現。例如,載入 LED 索引號、顏色和強度資料需要時間。然而,由 show() 方法觸發的單一事件可確保所有 LED 同時更新。

簡化的範例程式碼

為了更好地理解 Arduino Modulino Pixels 程式碼,請考慮這個簡化的程式碼清單。它展示如何配置 Arduino Modulino Pixels 模組。它示範如何設定顏色。最後,它展示如何使單一 LED 閃爍。與此程式碼相關的物理設定和視覺顯示如圖 2 所示。

#include <Modulino.h>

ModulinoPixels leds;                      // Constructor
ModulinoColor OFF(0, 0, 0); 
int brightness = 10;                      // Set brightness to 10 % as LEDs are very bright	

void setup() {
  Modulino.begin();
  leds.begin();
  pinMode(LED_BUILTIN, OUTPUT);
}


void loop() {

// Example colors including the built in RED, GREEN, BLUE, VIOLET, and WHITE as well as 
// custom colors established using the 8-bit Red, Green, and Blue values

  leds.clear( );
  leds.set(0, RED, brightness);      
  leds.set(1, GREEN, brightness);
  leds.set(2, BLUE, brightness);
  leds.set(3, VIOLET, brightness);
  leds.set(4, WHITE, brightness);
  leds.set(5, 0, 128, 128, brightness);     // teal	
  leds.set(6, 255, 192, 203, brightness);   // pink
  leds.set(7, 100, 100, 0, brightness);     // yellow
  leds.show( );			                    // Transfers data from memory to the physical LEDs.


// Blink the RED LED located at position zero
 while (1) {
    leds.clear(0);
    leds.show( );
    delay(500);
    leds.set(0, RED, brightness);
    digitalWrite(LED_BUILTIN, HIGH);          // Trigger used to visualize communications protocol
    leds.show( );
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
  }
}

image

圖 2:使用介紹性 Pixels 程式碼清單的實體設定和結果。

技術提示:一些 Arduino Modulino Pixels 方法已重載。重載函數很容易被識別,因為多個方法定義共享相同的名稱。在此範例中,呼叫不帶參數的 clear() 將清除所有 LED。過載時 clear(N) 將清除第 N 個 LED。同樣,set() 方法將接受內建顏色或單獨的 8bit RGB 值。

通訊協議

Modulino Pixels 板的主要介面是 Qwiic 連接。 Arduino Pixels 板有兩個 Qwiic 連接器,允許多個板以菊鏈(daisy chained)方式連接在一起。

作為一項學術練習,探索用於透過 Qwiic 總線進行通訊的通訊協定是很有趣的。最初,正如本筆記前一部分所暗示的那樣,我假設每個方法都會發送大量資訊。例如,我假設 set() 和 clear() 方法在呼叫時會立即將資料傳送到 Pixels 模組。

事實並非如此,事實上,只有 show( ) 方法似乎將資料從 Arduino 傳送到 Pixels,如圖 3 所示,相關設定如圖 4 所示。無論哪種方式,在呼叫 show() 方法之前都不會顯示資料。請注意,圖 3 中傳輸了 32bit 組的資料。對框架的進一步發現留作批判性思考練習。

請注意,該取樣是使用 100kHz 時脈發送的。因此,發送整個取樣大約需要 3ms。

image

圖 3:由 show( ) 方法啟動的、發送到 Arduino Pixels 模組的 I2C 取樣部分 此取樣以預設 Pixels 0x6C 位址開始。

技術提示:Qwiic 一詞是「快速」和「內部積體電路」(I2C) 兩個字的有趣組合。該系統確實快速且簡單,因為有許多 Qwiic 板可用。按此處了解有關 Qwicc 協議的更多資訊。

image
圖 4:用於觀察 Arduino UNO R4 和 Pixels 模組之間通訊協定的設定。Digilent
ADP2230 Analog Discovery Pro 在背景中可見。

技術提示:設計通訊協定時通常需要妥協。例如,如果對單一 LED 進行單一更改,Pixels 庫將發送整個 33bit 資料包。雖然這需要高頻寬,但我懷疑一刀切的記憶體方案更容易作為 Arduino 庫和 Pixels 韌體進行編程和實現。

完結前的感想

Arduino Modulino Pixels 允許使用者快速連接三色 RGB LED 並進行實驗。透過 Qwiic 進行硬體連接非常簡單。物件導向的軟體對於新手程式設計師來說可能具有挑戰性,因為它涉及建構函數和點符號可存取的方法。我懷疑大多數程式設計師都會很快識別出這些模式。然而,他們需要相當長的時間才能理解結構,甚至需要更多的時間來建立自己的基於類別的程式。

就我個人而言,我很驚訝地發現 Pixels 板上有 32bit ARM Cortex M0。此外,資料框架比我想像的更複雜。即使發生單一 LED 變化,Arduino 也不會發送與每種方法相關的小訊息,而是發送整個 33 位元組打包(位址加 32 位元組)。

在我們得出結論時,請務必回顧本文附加的基本和批判性思考問題。

請在下面的空白處留下您的意見和問題。

相關資訊

問題

以下問題將有助於強化文章的內容。

  1. 方法與函數的比較與對照。

  2. 辨識語句 leds.show( ); 中的每個元件。

  3. 描述應用於 Arduino Modulino Pixels 的雙緩衝區方案。

  4. 如果程式設計師忘記使用 show() 方法會發生什麼情況?

  5. 如果程式設計師忘記使用 clear() 方法會發生什麼事?

  6. 描述 Qwiic 物理連接的屬性。提示:是否安裝錯誤?

  7. I2C 總線中上拉電阻的用途是什麼?提示開漏電路

  8. 研究 Arduino UNO R4 和相關 Modulino 板的原理圖。I2C 匯流排的上拉電阻在哪裡?提示:幾乎每塊板都配備了電阻,但並未普遍安裝。

  9. Quiic 系統在電流和距離上有哪些限制?提示:Qwiic 連接系統 - SparkFun Electronics

  10. Modulino 的 Pixels 32bit 微處理器可以替換為 8bit 微控制器嗎?使用較小的 8bit 微控制器有哪些優點和缺點?

  11. 研究電磁干擾(EMI)和方波的諧波頻譜(傅立葉級數)。識別與 Qwicc 訊號、其 100kHz 時脈和非屏蔽線相關的潛在 EMI 問題。

批判性思考問題

這些批判性思考問題擴展了文章的內容,使您能夠對材料及其與相鄰主題的關係有一個全面的理解。它們通常是開放式的,需要研究,最好以論文形式回答。

  1. Modulino Pixels 函式庫似乎僅在呼叫 show( ) 方法時才傳送資料。該協議有哪些優點和缺點。

  2. 比較 I2C 和 SPI 通訊協定。請務必根據設備總數、線路數量、使用的數量和通訊速度來識別協定。

  3. 為了簡單起見,本文並沒有探討 discover() 方法。描述該方法以及何時使用該方法。提示Modulino.h

  4. 圖 3 顯示 32 位元組的資料從 Arduino 傳輸到 Modulino Pixels 板。反轉像素幀以確定每個位元組的含義。提示:所有 LED 的亮度都相同。此外,程式碼清單中的 LED 連續運行為紅色、綠色和藍色。最後,切換單一資料並觀察可能的單一位元組變化可能很有用。

  5. 為 Arduino Pixel 推薦兩個新協議。根據不同的使用者需求調整您的協議,例如經常更改單一 LED 的使用者和不經常更改所有 LED 的使用者。

  6. Arduino Plug and Make 產品旨在引入各種電子模組,而不需要麵包板,也無需複雜的設計。體現該產品對於創客和高等教育用戶的實用性。請務必描述使用者的體驗和學習成果。

  7. Arduino Modulino 軟體是根據什麼許可證發布的?如果您希望複製然後重新分發該軟體,會有什麼影響?

  8. 什麼是校驗碼?此應用程式是否可以保證額外的頻寬?