16 x 8 の単色LED Matrixボードを入手しました。
RaspberryPi Pico他多種マイコン基板で動かしてみます。
AIP1640
簡単紹介
単色固定輝度のマトリクスLEDパネルです。
少ない配線で各LEDを個別に制御できます。

I2Cとなっていますが、Arduino上のWireオブジェクトを使った通信では制御できません。
Keyestudioにサンプルスケッチがあり、使用することで制御ができました。
参考サイト : KS0357A Keyestudio 8×16 LED Matrix Panel – Keyestudio Wiki (keyestudio)
◆同梱品
本体と、I2Cハーネスです。

◆入手
Ali Expressで\700(送料込み)
Amazonでも入手できるようです。
外観

ピン配置

使ってみた
◆開発環境
Arduino環境でRaspberry Pi Picoを使いました。
ほかにもESP32-WROOM32 NodeMCU、Arduino Nanoを使い同じスケッチでの動作をしています。
本記事では、Raspberry Pi Picoで動作したときの内容を記事にしています。
なお、AIP1640はI2Cによる制御となっていますが、Arduinoで使用するWireオブジェクトを使ったI2Cでは制御できませんでした。
また、Arduinoのライブラリマネージャから利用できるライブラリは見つかりませんでしたが、keyestudioサイトのサンプルスケッチを利用しました。
サンプルを使用することでI2C以外の任意のピンを使って制御ができるので、I2C専用ピンに縛られることない自由な設計ができます。
◆使ってみた
keystudioのサンプルをArduino環境から書き込んでみました。
複数のパターンを1秒ごとに切り替えながら表示するサンプルでした。

輝度は低めで全数発光させた状態で直視してもさほどまぶしいと感じません。
今回の購入品は一番下に発光していないLEDがありました。
機会があればLEDを交換しようと思います。
画像の発光で濃淡が見えるのは、LEDのダイナミック点灯が撮影した画像に現れているようです。

簡単な命令セットのおかげで、安価なマイコンでもGPIOとウエイトの組み合わせで表示制御ができます。
準備
◆開発環境
Arduino環境でRaspberry Pi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
◆ボードライブラリ
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
| 追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
| 検索 | RP2040 |
| ボードライブラリ | Raspberry Pi Pico/RP2040/RP2350※ |
| 選択するボード | Raspberry Pi Pico/RP2040/RP2350 > Raspberry Pi Pico |
◆モジュールライブラリ
追加でインストールするモジュールライブラリはありません。
イメージの作成
LED Matrixのテーブルは以下のようになっています。
縦方向に8個のLEDのビット配列が上から8ビットで1バイト。
横方向は左から1バイトのデータを16個です。

バイトオーダーを視覚的に作るためにExcelを使いました。

使い方
発光させる
説明
RaspberryPi Picoを使用します。
Keystudioのサンプルスケッチを修正してドットイメージを表示します。
スケッチの先頭でドットイメージの配列を定義しています。
実行すると”NEGI”と表示します。
配線
AIP1640基板に付属していたハーネスで接続します。

スケッチ
#define IIC_SDA (0)
#define IIC_SCL (1)
void IIC_start();
void IIC_send(unsigned char send_data);
void IIC_end();
unsigned char table[] = {0x0f,0x02,0x04,0x0f,0xf8,0xa8,0xa8,0x88,0x1c,0x22,0x32,0x34,0x88,0xf8,0x88,0x00};
void setup()
{
pinMode(IIC_SCL,OUTPUT);
pinMode(IIC_SDA,OUTPUT);
digitalWrite(IIC_SCL,LOW);
digitalWrite(IIC_SDA,LOW);
IIC_start();
IIC_send(0x40);
IIC_end();
IIC_start();
IIC_send(0xc0);
for(long c = 0; c < 16; c ++)
{
IIC_send(*(table + c));
}
IIC_end();
IIC_start();
IIC_send(0x8A);
IIC_end();
}
void loop()
{
}
void IIC_start()
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SDA,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SDA,LOW);
delayMicroseconds(3);
}
void IIC_send(unsigned char send_data)
{
for(char i = 0;i < 8;i++)
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
if(send_data & 0x01)
{
digitalWrite(IIC_SDA,HIGH);
}
else
{
digitalWrite(IIC_SDA,LOW);
}
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
send_data = send_data >> 1;
}
}
void IIC_end()
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SDA,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SDA,HIGH);
delayMicroseconds(3);
}結果
”NEGI”と表示されました。
今回使った製品では最下列のLEDが1個発光しないので”E”がの一部が欠けてしまいました。

ESP32-WROOM32 NODE MCUとArduino Nanoでも同じスケッチを使いました。
通信部はI/Oとウエイトの組み合わせなのでマイコン依存せず、どのマイコンでも動かすことができそうです。

調査
RP2040のボードライブラリのWireオブジェクトを使って発光させられないか試してみましたが動作しませんでした。
横スクロール
説明
CH32V003 と SOP8ピッチ変換基板を使ってスクロール制御します。
2画面分使い”TAMANEGI”イメージを表現し、3画面目で全消去になるようスクロールします。
配線

スケッチ
#define IIC_SCL (PC2)
#define IIC_SDA (PC1)
void IIC_start();
void IIC_send(unsigned char send_data);
void IIC_end();
//ビットパターン TAMANEGI
unsigned char table[] = {
0x02,0x02,0x1e,0xe2,0x52,0x50,0xe0,0x0f,0x02,0x04,0x02,0x0f,0x70,0x28,0x28,0x70,
0x0f,0x02,0x04,0x0f,0xf8,0xa8,0xa8,0x88,0x1c,0x22,0x32,0x34,0x88,0xf8,0x88,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void setup()
{
pinMode(IIC_SCL, OUTPUT);
pinMode(IIC_SDA, OUTPUT);
digitalWrite(IIC_SCL, LOW);
digitalWrite(IIC_SDA, LOW);
}
void loop()
{
//横48ドット分のループ
for (long Width = 0; Width < 48; Width ++)
{
IIC_start();
IIC_send(0x40);
IIC_end();
IIC_start();
IIC_send(0xc0);
//全体の16ドット分を表示する処理
long offset;
for(long Pattern = 0; Pattern < 16; Pattern ++)
{
offset = Pattern + Width;
if(offset > 47) offset = offset - 48;
IIC_send(*(table + offset));
}
IIC_end();
IIC_start();
IIC_send(0x8A);
IIC_end();
//スクロールウエイト
delay(50);
}
}
void IIC_start()
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SDA,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SDA,LOW);
delayMicroseconds(3);
}
void IIC_send(unsigned char send_data)
{
for(char i = 0;i < 8;i++)
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
if(send_data & 0x01)
{
digitalWrite(IIC_SDA,HIGH);
}
else
{
digitalWrite(IIC_SDA,LOW);
}
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
send_data = send_data >> 1;
}
}
void IIC_end()
{
digitalWrite(IIC_SCL,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SDA,LOW);
delayMicroseconds(3);
digitalWrite(IIC_SCL,HIGH);
delayMicroseconds(3);
digitalWrite(IIC_SDA,HIGH);
delayMicroseconds(3);
}結果
右から左へスクロールしました。


コメント