16 x 8 の単色LED Matrixボードを入手しました。
RaspberryPi PicoやCH32V003を使って表示やスクロールをしてみます。
今回紹介するもの
LED Matrixボード(AIP1640)
特徴
16×8の128個の青色LEDが実装されたボードです。
電源 | 3.3V ~ 5V |
LED個数 | 16 x 8 (128個) |
発光色 | 青 |
通信 | I2C※ |
I2Cアドレス | 不明 |
配線コネクタ | HX 2.54 4pin |
入手の目安 | Ali Express \650 ~ \750(送料込み) Amazon \1,400 ~ \1,600(送料込み) (Jan/2024) |
※Arduinoで使用するWireオブジェクトを使ったI2C制御ができませんでした。
下記Keystudioのサンプルスケッチを使用することで制御できます。
参考サイト : KS0357A Keyestudio 8×16 LED Matrix Panel – Keyestudio Wiki (keyestudio)
外観
前面
背面
全個発光させても大人しい目の輝度です。
今回はどうやらハズレを引いたようです...。
一番下の列に発光していないLEDがありました。
機会があればLEDを交換しようと思います。
画像の発光で濃淡が見えるのは、LEDのダイナミック点灯が撮影した画像に現れているようです。
使用感
Arduinoのライブラリマネージャから利用できるライブラリは見つかりませんでしたが、keyestudioサイトのサンプルスケッチを利用しました。
I2Cで点灯パターンを転送するもので、線や円などの図形を関数一つで表示する便利なものはありませんが、理解するには十分です。
Arduinoで使用するWireオブジェクトからは制御できませんでした。
あらかじめ用意したビットパターンを使うことで簡単な表示物は対応できます。
準備
使うもの
画像 | 名称、型番 | 用途 |
---|---|---|
LED Matrixボード AIP1640 | 光ってもらいます。 | |
Raspberry Pi Pico | LEDの点灯制御に使います。 | |
CH32V003 SOP8基板実装 | CH32V003でも動かしてみます。 | |
WCH-LinkE | CH32V003を使用する場合の電源供給と、 スケッチの書き込みに使います。 | |
ブレッドボード | 配線します。 | |
– | ジャンパワイヤ数本 オス-メス | 配線します。 |
イメージの作成
LED Matrixのテーブルは以下のようになっています。
縦方向に8個のLEDのビット配列が上から8ビットで1バイト。
横方向は左から1バイトのデータを16個です。
ドットパターンを作成するための補助にExcelを使いました。
このドットパターンを頭の中で想像したりメモで行うことが難しいため、Excelを使ってパターンを生成するようにしました。
使い方
発光させる
説明
RaspberryPi Picoを使用します。
Keystudioのサンプルスケッチを修正してドットイメージを表示します。
スケッチの先頭でドットイメージの配列を定義しています。
実行すると”NEGI”と表示します。
配線
LED Matrix基板に付属していたハーネスで接続します。
RaspberryPi Pico | 配線 | LED Matrix |
---|---|---|
3V3 | 赤 | VCC |
GND | 黒 | GND |
GPIO0 | 白 | SDA |
GPIO1 | 茶 | SCL |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
Raspberry Pi Pico
【スケッチの説明】
"NEGI"と表示します。
【ライブラリ】
Raspberry Pi Pico/RP2040 > Raspberry Pi Pico
【準備】
Raspberry Pi Pico <-> AIP1640
3V3 <-> VCC
GND <-> GND
GPIO0 <-> SDA
GPIO1 <-> SCL
【バージョン情報】
2024/2/1 : 新規
**********************************************************************/
#include "Wire.h"
#define IIC_SCL 1
#define IIC_SDA 0
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 Matrixは最下列のLEDが1個発光しないので”E”がの一部が欠けてしまいました。
調査
RP2040のボードライブラリのWireオブジェクトを使って発光させられないか試してみましたが動作しませんでした。
横スクロール
説明
CH32V003 と SOP8ピッチ変換基板を使って制御します。
上記「発光させる」を修正し、右から左にスクロールさせます。
実行すると”TAMANEGI”が右から左へスクロールします。
配線
CH32V003 SOP8 | 配線 | AIP1640 | 配線 | WCH-LINKE |
---|---|---|---|---|
VCC | 赤 | VCC | 赤 | 3V3 |
GND | 黒 | GND | 黒 | GND |
PC1 | 白 | SDA | ||
PC2 | 茶 | SCL |
配線は動作時の状態です。
スケッチ書き込み時は、WCH-LINKEのSWDIOをCH32V003のPD1(SWIO)に接続します。
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
CH32V003
【スケッチの説明】
横48, 縦8 ドットのビットイメージを左スクロールさせる。
【ライブラリ】
CH32 MCU EVT Boards > CH32V00x
【準備】
CH32V003 <-> AIP1640
VCC <-> VCC
GND <-> GND
PC1 <-> SDA
PC2 <-> SCL
【バージョン情報】
2024/2/1 : 新規
**********************************************************************/
#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);
}
結果
右から左へスクロールしました。
コメント