RaspberryPi Picoで単色LED Matrixボードを使う(AIP1640)

コンピュータ、組み込み

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 PicoLEDの点灯制御に使います。
CH32V003
SOP8基板実装
CH32V003でも動かしてみます。
WCH-LinkECH32V003を使用する場合の電源供給と、
スケッチの書き込みに使います。
ブレッドボード配線します。
ジャンパワイヤ数本
オス-メス
配線します。

イメージの作成

LED Matrixのテーブルは以下のようになっています。
縦方向に8個のLEDのビット配列が上から8ビットで1バイト。
横方向は左から1バイトのデータを16個です。


ドットパターンを作成するための補助にExcelを使いました。

このドットパターンを頭の中で想像したりメモで行うことが難しいため、Excelを使ってパターンを生成するようにしました。

使い方

発光させる

説明

RaspberryPi Picoを使用します。

Keystudioのサンプルスケッチを修正してドットイメージを表示します。
スケッチの先頭でドットイメージの配列を定義しています。

実行すると”NEGI”と表示します。

配線

LED Matrix基板に付属していたハーネスで接続します。

RaspberryPi Pico配線LED Matrix
3V3VCC
GNDGND
GPIO0SDA
GPIO1SCL

スケッチ

/**********************************************************************
【ライセンスについて】
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
VCCVCC3V3
GNDGNDGND
PC1SDA
PC2SCL

配線は動作時の状態です。
スケッチ書き込み時は、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);
}

結果

右から左へスクロールしました。

コメント

タイトルとURLをコピーしました