Skip to main content

Rainbowduino LED ドライバープラットフォーム-ATmega328

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

Rainbowduinoボードは、プロフェッショナルなLED駆動能力を備えたArduino互換のコントローラーボードです。8x8 RGB LEDマトリックス(共通アノード)を駆動します。

  • 外部回路不要、接続してすぐに点灯!

  • 各120mAの24チャンネル定電流

  • 各500mAの8チャンネルスーパーソースドライバー

  • 6.5V-12VDCの広い出力電圧適応

  • 専用GPIOおよびADC

  • ハードウェアUARTおよびI2C通信

  • 簡単なカスケード接続

  • 小型で軽量

スタンドアロンモード(接続して点灯)


必要なハードウェア:

  • 1 x Rainbowduino

  • 1 x RGB LEDマトリックス

最も簡単な動作モードで、外部システムは不要です(ファームウェアをアップロードするためのTTLシリアルアダプターのみ必要)。LEDマトリックスの内容はRainbowduino自体によって生成されます。

使用例:

  • Rainbowduinoによって計算されたシンプルなリアルタイムアニメーション

  • 事前に保存されたアニメーションの表示(Rainbowduinoの32kb ROMに制限される)

UARTモード


必要なハードウェア:

  • 1x Rainbowduino

  • 1x RGB LEDマトリックス

  • 1x TTLレベルコンバーター

  • 1x UART送信ユニット(Arduino、PCなど)

コンピュータからRainbowduinoにデータ(LEDマトリックスの内容)を送信します。RainbowduinoにはUSBコネクタがなく、TTLシリアル接続を使用するため、TTLシリアルレベルコンバーター(BusPirate、UartSBee、Arduinoなど)が必要です。

使用例:

PCまたはArduinoで生成されたフレームを1つのLEDマトリックスに表示

I2Cモード


必要なハードウェア:

  • 1..n x Rainbowduino

  • 1..n x RGB LEDマトリックス

  • 1 x I2Cマスターデバイス(例: Arduino)

  • いくつかのケーブル

コンピュータから複数のRainbowduinoにデータ(LEDマトリックスの内容)を送信します。FTDI USBからシリアルアダプターを使用するArduino(Duemillanove、Diecimilaなど)を使用する場合、コンピュータからArduinoへのデータ送信には約16msの遅延があります。新しいArduino UNOでは遅延が大幅に短縮され、約4msです。

使用例:

PCまたはArduinoで生成されたフレームを複数のLEDマトリックスに表示

I2Cカスケード接続


Rainbowduinoは簡単にカスケード接続できるように設計されています。物理的に接続すると電力が供給され、I2Cでチェーンを制御できます。各RainbowduinoにはI2C通信のために一意のアドレスを割り当てる必要があることに注意してください。

電源接続の準備:

カスケード接続されたRainbowduino:

仕様


  • マイクロプロセッサ:Atmega 328

  • PCBサイズ:60mm 60mm 1.6mm

  • インジケーター:リセット、電源、ピン13 LED

  • 電源供給:6.5-12 VDC(推奨9 VDC)

  • 電源コネクタ:2ピン JST ターミナルブロック、3mm DCジャック

  • カスケード電源コネクタ:ターミナルブロック

  • プログラムインターフェース:UART / ISP

  • LEDドットマトリックスソケット:32

  • 拡張ソケット:2.54mm 曲げピンヘッダーのペア

  • 通信プロトコル:I2C / UART

  • RHOS:対応

  • 入力電圧:6.5~12V

  • 全体消費電流:600~2000mA

  • 定電流チャンネル(カソード):24

  • チャンネルごとの定電流(カソード):20~120mA

  • チャンネルごとのソースドライバ電流(共通アノード):500mA

  • チャンネルごとのソースドライバ電圧(共通アノード):9~12V

  • ソースドライブチャンネル:8

  • 駆動LED数:192

  • 回路応答時間:10ns

  • RGB LEDマトリックスのドットごとの色解像度:4096

  • UARTボーレート:115200baud

LEDデバイスの互換性


メスピンヘッダーに直接接続する前に、RGBドットマトリックスが互換性があることを確認してください。主な懸念はピン配置にあり、同じ色のLEDがクラスター化されている点です。以下にスキームと写真のデモンストレーションを添付します。制御ロジックはオープンソースで簡単に再プログラム可能なため、色の順序が変更される可能性があります。

Rainbowduinoの性能はRGBドットマトリックスを駆動する以上のものです。192の出力数と最大120mAの定電流容量により、大規模なLEDセットアップを簡単に構築できます。

各チャンネルの出力電流(IOUT)は外部抵抗Rextによって設定されます。IOUTとRextの関係は以下の図に示されています。詳細についてはMBI5168データシートを参照してください。1kポテンショメータを時計回りに調整すると出力電流が減少し(RGBドットマトリックスのデフォルト最小値は20mA)、反時計回りに回すと出力電流が増加します。ポテンショメータは単一の円形であり、強い力を加えると無限に回転可能になり、調整にはマルチメータが必要になる場合がありますので注意してください。

これにより、追加の抵抗なしで独自のLEDマトリックスを構築することが可能です。

デモンストレーション


必要なもの
  • Rainbowduinoボード

  • 共通アノードRGBマトリックス

  • Arduinoボード(オプション)

Rainbowduinoハードウェアの準備

RGB LEDマトリックスをRainbowduinoに接続し、「ピン1」を赤い接続ブロックに接続します。ピン1は四角いはんだポイントでマークされており、他のピンは丸いはんだポイントを使用しています。

ファームウェアのアップロード
  1. まずArduinoにコードをアップロードします: Rainbowduinoにファームウェアをアップロードするために、Arduinoがクリーンであることを確認してください。以下のような空のファームウェアスケッチをアップロードする必要があります。
void setup() {}

void loop() {}
  1. Rainbowduinoにファームウェアをアップロードします

Rainbowduinoファームウェアを開き、正しいボードを選択(ツール-->ボード--> Arduino DuemilanoveまたはNano w/ ATmega328)してファームウェアをアップロードします。理論的にはこれで完了です ;) 以下は接続スキームです:

外部電源を使用していますが、Arduinoの5Vを使用することも可能です。

注意: Rainbowduino v1ボードを所有している場合は、「Arduino Diecimila, Duemilanove, or Nano w/ ATmega168」を選択する必要があります!

ArduinoRainbowduino
RESETDTR
GNDGND
RXRX
TXTX
  1. UartSBを使用してファームウェアをアップロードする

以下のスクリーンショットは、UartSBeeをRainbowduinoに接続する方法を示しています:

UartSBeeをUSBバスに接続すると、新しいシリアルポートが登録されるはずです。新しいシリアルポートを使用してファームウェアをアップロードしてください。

  1. Buspirateを使用してファームウェア/ブートローダーをアップロードする

Buspirateを使用した3つのプログラミング方法を説明します(すべてISPを使用):

  • ISPを介したプログラミング
  • avrdudeと手動リセットを使用したプログラミング(パッチ不要)
  • avrdudeを使用した小さなパッチによるプログラミング

Rainbowduinoをディスプレイと電源から切断してください。

STEP 1: Buspirateを使用するには、新しいバージョンのavrdudeが必要です [1]。バージョン5.10を使用しており、'-c buspirate'プログラマーオプションを認識します。以下のコマンドでテストできます:

./avrdude -c buspirate -C ./avrdude.conf

プログラマーに関するエラーが表示された場合は、Buspirateの新しいバージョンが必要です。

STEP 2: BuspirateをRainbowduinoのISPコネクタに以下のように接続します:

BuspirateISPISPピン
GNDGND6
+5VVcc2
CSRESET5
MOSIMOSI4
MISOMISO1
SCL/CLKSCK3

STEP 3: 正しいブートローダーを見つけます(tiny optibootファームウェアを使用しています)。このファイルを新しくコンパイルしたavrdudeディレクトリにコピーします。

STEP 4: 以下のコマンドでATmega 328pをプログラムします:

./avrdude -v -c buspirate -p m328p -C ./avrdude.conf -P /dev/ttyUSB0 -U flash:w:optiboot_atmega328.hex

このプロセスは非常に時間がかかります...

私はブロック全体を以下のように日本語に翻訳しました:


私はブートローダーなしでファームウェアをアップロードすることから始めましたが、それは問題なく動作します。ポイントは、Arduino IDEからHEXファイルを取得することです。バージョン0.22-Linuxでは、これらのファイルは/tmp/buildXXXXXXXXXXXXに保存されており、スケッチディレクトリには保存されません。プログラマーを接続せずに「アップロード」コマンドを実行してください(「アップロード」ボタンを押す際に<shift>キーを押すと、Arduino IDEから多くのデバッグ情報を取得できます)。

Rainbowduinoにブートローダーをインストールした後は、Bus Pirateの透過的なシリアルインターフェースを使用できます。ボーレートを115200に設定し、'(3)'マクロを入力して透過モードを有効にします。これにより、Bus PirateはUSB-シリアルコンバーターとして動作します(他のFTDIのようなUSB-シリアルコンバーターも使用可能です)。Bus Pirateの問題点は、ArduinoをリセットするためのDTRがないことです。そのため、リセットとアップロードを手動でタイミングを合わせる必要があります。アップロードを開始した後にリセットを押すのが最も効果的です。

HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. JTAG
7. RAW2WIRE
8. RAW3WIRE
9. PC KEYBOARD
10. LCD
(1) >3
モード選択
シリアルポート速度を設定: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. 31250 (MIDI)
(1) >9
データビットとパリティ:
1. 8, NONE *デフォルト
2. 8, EVEN
3. 8, ODD
4. 9, NONE
(1) >
ストップビット:
1. 1 *デフォルト
2. 2
(1) >
受信極性:
1. Idle 1 *デフォルト
2. Idle 0
(1) >
出力タイプを選択:
1. オープンドレイン (H=Hi-Z, L=GND)
2. 通常 (H=3.3V, L=GND)
(1) >2
準備完了
UART>(3)
UARTブリッジ。スペースキーで継続、その他のキーで終了。
リセットで終了。

その後、以下のコマンドを使用してArduinoにブートローダーをプログラムできます:

./avrdude -v -c stk500v1 -p m328p -b 115200 -F -C ./avrdude.conf -P /dev/ttyUSB0 -U flash:w:Rainbow_Plasma.cpp.hex

さらに進めると、'arduino.c'ファイルでavrdudeを修正することができます。Bus PirateはArduinoに対して誤った極性で'rts'信号を送信しますが、1を0に、0を1に変更することで修正できます。その後、プログラマーとして'stk500v1'ではなく'arduino'を選択する必要があります。

static int arduino_open(PROGRAMMER * pgm, char * port)
{
fprintf(stderr, "arduino_open...\n");
strcpy(pgm->port, port);
serial_open(port, pgm->baudrate? pgm->baudrate: 115200, &pgm->fd);

/* RESETコンデンサを解除するためにDTRとRTSをクリア
* (例えばArduinoの場合) */
serial_set_dtr_rts(&pgm->fd, 1);
usleep(50*1000);
/* DTRとRTSを高に戻す */
serial_set_dtr_rts(&pgm->fd, 0);
usleep(50*1000);

/*
* 余分な入力を排除
*/
stk500_drain(pgm, 0);

if (stk500_getsync(pgm) < 0)
return -1;

return 0;
}

注: Arduino IDEで使用するプログラマータイプを'boards.txt'ファイルで変更してください。

出典: buspirate-avr-programming [2]、Bus_Pirate_AVR_Programming [3]、Optiboot [4]

Rainbowduinoファームウェア

Neorainbowduinoファームウェア

このファームウェアバンドルには、Arduino用とRainbowduino用の2つのファームウェアとProcessingライブラリが含まれています。シリアルラインを介して任意のアプリケーションからArduinoにデータを送信でき、Arduinoは対応するRainbowduinoデバイスに画像を送信します。簡単に始められるように、使いやすいProcessingライブラリを作成しました。

出典: http://code.google.com/p/neorainbowduino/

特徴:

  • I2C対応ファームウェア(複数のRainbowduinoをサポート)

  • Processingライブラリにより、ProcessingからRainbowduinoを簡単に制御可能!

  • ProcessingからRainbowduinoにフルフレームを送信

  • ProcessingからRGBマトリックスにフレームを送信。各フレームは8x8ピクセル、12ビットカラー解像度(4096色)。カラー変換はライブラリによって処理されます。

  • 最適化されたProcessingライブラリ - 必要に応じてRainbowduinoにのみフレームを送信(トラフィックを約50%節約 - もちろんフレームによります)

  • バッファスワッピングの修正(ちらつきなし)

  • I2Cバススキャナーを追加。Rainbowduinoのアドレスを忘れた場合に検索可能

対応動作モード: I2C

必要条件

このファームウェアを使用すると、Processingを使用してRainbowduinoを制御できます。そのため、以下が必要です:

Arduino IDEのパッチ

NeorainbowduinoファームウェアはI2C経由でフルフレーム(92バイト)を送信するため、ArduinoのI2Cバッファサイズをパッチして転送速度を最適化する必要があります。Arduinoが将来的に可変バッファサイズをサポートすることを期待しています。Arduino IDEを閉じていることを確認してください

パッチ対象ファイル: Java/libraries/Wire/utility/twi.h

理由: I2C速度を100kHzから400kHzに増加、I2Cバッファサイズを32バイトから98バイトに増加

元のファイル
#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

#ifndef TWI_BUFFER_LENGTH
#define TWI_BUFFER_LENGTH 32
#endif
パッチ後のファイル
#ifndef TWI_FREQ
#define TWI_FREQ **400000L**
#endif

#ifndef TWI_BUFFER_LENGTH
#define TWI_BUFFER_LENGTH **98**
#endif

パッチ対象ファイル: Java/libraries/Wire/Wire.h

理由: シリアルバッファサイズを32バイトから98バイトに増加

元のファイルパッチ後のファイル
#define BUFFER_LENGTH 32
#define BUFFER_LENGTH **98**
Rainbowduinoへのファームウェアのアップロード

ファームウェアをアップロードします(ファームウェアのアップロードを参照)。必要なファームウェアファイルはrainbowduinoFw/Rainbow_V2_71/Rainbow_V2_71.pdeです。

注: このファームウェアはI2Cプロトコルを使用して通信します。各Rainbowduinoには固有のI2Cアドレスが必要です。アドレスはRainbowduino.hファイルを編集することで設定できます(#define I2C_DEVICE_ADDRESS 0x06)。複数のRainbowduinoにこのファームウェアをアップロードする場合は、アドレスを変更することを忘れないでください!

Arduinoへのファームウェアのアップロード

RainbowduinoとArduino間のRX/TXラインを切断します。ArduinoファームウェアarduinoFw/neoLed/neoLed.pdeをArduinoにアップロードします。

Rainbowduinoとの対話

この章では、Rainbowduinoと通信する簡単な方法を紹介します。必要なものは、Arduino(シリアルからI2Cゲートウェイとして動作)と、I2Cアドレスが0x06のRainbowduinoです。

RainbowduinoとArduinoの接続は以下のようになります:

外部電源を使用していますが、Arduinoの5Vを使用することも可能です。

Arduino Rainbowduino
RESETDTR
GNDGND
Analog IN 4SDA
Analog IN 5SDL
Processingライブラリのインストール

Processingソフトウェアをインストールした後、neorainbowduinoライブラリをインストールする必要があります。ProcessingライブラリはprocessingLib\distribution\neorainbowduino-x.y\downloadディレクトリにあります。zipファイルをProcessingのホームフォルダに解凍してください(詳細なインストール手順についてはREADME.TXTファイルを参照してください)。

Processingを起動すると、neorainbowduinoライブラリをインポートできるはずです:

簡単な例

以下は、Rainbowduinoにランダムな矩形を送信する非常に簡単なProcessingスケッチです。

import processing.serial.*;
import com.neophob.lib.rainbowduino.test.*;
import com.neophob.lib.rainbowduino.*;

static final int SIZE = 400;
Rainbowduino r;

void setup() {
frameRate(15);
background(0);
size(SIZE, SIZE);

// Rainbowduinoを初期化
List<Integer> list = new ArrayList<Integer>();
list.add(6); // スレーブID 6のRainbowduinoを使用
try {
r = new Rainbowduino(this, list);
System.out.println("ping: "+r.ping());
} catch (Exception e) {
println("シリアルポートを開けませんでした!!");
e.printStackTrace();
}

smooth();
noStroke();
}

void draw() {
// 画面に簡単な図形を描画
color c1 = color(128+(int)random(64), 128, (int)random(255));
fill(c1);

int size = 80+(int)random(80);
int x = (int)random(SIZE);
int y = (int)random(SIZE);
rect(x, y, size, size);<br>
// PAppletをRainbowduinoライブラリに送信し、スレーブID 6に送信
r.sendRgbFrame((byte)6, this);
}

TODO スクリーンショットを追加

画像リサイズの仕組み

画像はエリア平均フィルターを使用してリサイズされます。そのため、画像が正しく整列されていることが重要です。整列されているとは、画像が8で割り切れる場合に結果が良好に見えることを意味します。以下は良い例と悪い例です:

良い例(整列済み)悪い例(未整列)

mtXcontrol ファームウェア

出典: http://www.rngtng.com/mtxcontrol/

特徴:

  • mtXcontrolは、複数のマルチカラーLEDマトリックスを含む出力デバイス用の画像シーケンスを簡単に作成するためにProcessingで書かれたエディタです。

対応する動作モード: ???

ファームウェア 3

出典: http://code.google.com/p/rainbowduino-firmware/

特徴:

  • リフレッシュレートに同期したダブルバッファリング

  • 4つの補助バッファ

  • 高レベル命令セット

  • 複数のハードウェア制御

  • I2C通信プロトコル

  • Eepromへのデータ永続保存

対応する動作モード: I2C

RainbowDashboard

出典: http://code.google.com/p/rainbowdash/

特徴:

  • クリーンで保守可能なコードベース

  • 標準ファームウェアと互換性あり

  • UARTモードをサポート(Arduinoホスト不要 - Rainbowduinoに直接接続可能)

  • ダブルバッファリングされたグラフィックス操作

  • ソフトウェアリアルタイムクロック

  • Rainbowduino自体によるアニメーション駆動

  • フルWindows ANSI (CP1252) 文字セット

  • 高レベルコマンドセット

対応する動作モード: UART

I2Cを使用するように簡単に変更可能。変更が必要なのは1つのファイル(RainbowDash.pde)のみ。

ファームウェアの動作原理

マイクロプロセッサ - Atmega 168/328

PORTD PORTB PORTC
pin02 / PD0 / RXDpin14 / PB0 / INT0pin23 / PC0 / SDI
pin03 / PD1 / TXDpin15 / PB1 / INT1pin24 / PC1 / CLK
pin04 / PD2 / INT0pin16 / PB2 / INT2pin25 / PC2 / LE
pin05 / PD3 / INT19pin17 / PB3 / INT3pin26 / PC3 / OE
pin06 / PD4 / INT20pin18 / PB4 / INT4pin27 / PC4 / SDA
pin11 / PD5 / INT21pin19 / PB5 / INT5/SCKpin28 / PC5 / SDL
pin12 / PD6 / INT22
pin13 / PD7 / INT23

PORTB はArduinoデジタルピン8から13にマッピングされます。上位2ビット(6 & 7)はクリスタルピンにマッピングされており、使用できません。

PORTC はArduinoアナログピン0から5にマッピングされます。ピン6 & 7はArduino Miniでのみアクセス可能です。

PORTD はArduinoデジタルピン0から7にマッピングされます。

定電流LEDドライバ

このドライバはMBI5168を使用します。MBI5168は8ビットのシフトレジスタです。シリアルデータをパラレルデータに変換します。3つのMBI5168はすべてLE、CLK、OE入力を共有します。

名前 説明
OE出力イネーブル。低(アクティブ)時に出力ドライバが有効化され、高時にはすべての出力ドライバが無効化されます(ブランク状態)。
LEデータストローブ入力端子。LEが高のときにシリアルデータがそれぞれのラッチに転送され、LEが低になるとデータがラッチされます。
SDIシフトレジスタへのシリアルデータ入力。
SDO次のドライバICのSDIに接続されるシリアルデータ出力。
R-EXTすべての出力チャネルの出力電流を設定するために外部抵抗を接続する入力端子。
CLKデータシフトのためのクロック入力端子(立ち上がりエッジで動作)。
スーパーソースドライバ

データのシフトアウト

LEDマトリックスにフルフレームを表示するには、Rainbowduinoの割り込みメソッドを128回呼び出す必要があります。8行と16段階の明るさレベルがあります。displayNextLine()メソッドが呼び出されるたびに、現在の明るさレベルで1行が更新されます。すべての8行が更新されると、明るさレベルが更新されます。このため、LEDマトリックスにフルフレームを表示するには、この関数を128サイクル実行する必要があります。

以下は、32、64、96、128サイクル後のLEDマトリックス表示を示しています。明るさが増加していることがわかります。

4096色(12ビット)以上のサポート

標準ファームウェア(およびほとんどのサードパーティ製ファームウェア)は12ビットの色解像度をサポートしています。これを増加させることが可能です:

色解像度 ペイロード 明るさレベル
12ビット(各色4ビット)、4096色96バイト(12ビット*64=768ビット)16
15ビット(各色5ビット)、32768色120バイト(15ビット*64=960ビット)32

各色4ビットを使用する利点はデータストレージにあります。1バイトで2つの色値を保持できるため、バイトバッファから色を簡単に取得できます。各色5ビットを使用する場合、より多くのCPUパワーまたはバッファスペースが必要になります(3つの色値に2バイトを使用 - 各色で1ビットを無駄にする)。

15ビットの色解像度を実現するには、ファームウェアに以下の2つの変更が必要です:

  • 明るさレベルを16ではなく32でループする

  • シフトアウト関数を変更する

リソース


技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しております。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルをご用意しています。

Loading Comments...