JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

ドットマトリックスLED LTP-305を動かしてみた

部品箱を整理していると買い込んでみたものの買ったことすら忘れられている部品ってありますよね。この連休に整理していたら、ドットマトリックスタイプのLEDディスプレイ LTP-305HRが大量に出てきました(汗)。ちょうどmbedをいじっていたところなので光らせてみました。
LEDエレメントは5列7行のマトリクスでピン配置はこのとおり。

列のアノードと行のカソードがつながるとその交点のLEDが光るという仕組みで、デコーダーのようなものは内蔵されていません。文字を表示させるには各列(または各行)をダイナミック点灯していく必要があります。多桁表示し接続ピン数を節約するためには、行を並列接続し、列をスキャンさせていくのが良さそうです。
どこか探せばライブラリが見つかりそうですが、とりあえず数字「0」〜「9」を光らせることくらいなら自力で作ってみました。各文字のドットパターンを決めて、各列のパターン(一次元)をビットデータに置き換えて(行は7つなので先頭ビットを0に固定)1バイト表現してみました。つまり、各文字を5バイトを割り当てました。例えば、「0」は、{0x3e, 0x45, 0x49, 0x51, 0x3e}となります。各列ごと各行ごとに、ビットシフトして光らせるデータを取り出し、高速に列をスキャンしていき、チラ付かない程度のウェイトでループさせてみました。
マイコンLPC11U35の互換ボードを使ってみました。GPIOがたくさんあるので、3桁くらい光らせることができそうです。実際に動かしてみた動画がこちらです。

少し明るいところでは視認性が悪く、各点の明るさにバラツキがあるのが気になりますね。ディスプレイの上に曇りガラスやスモークを乗せると少し見やすくなりますが・・・。
デモのプログラムはこちらです。後日、mbedのレポジトリに登録したいと思います。

// Dot matrix led display LTP-305 demo using mbed LPC11U35
// copyright 2017 Oct, JF1DIR
// LTP-305 http://akizukidenshi.com/catalog/g/gI-07440/
//

#include "mbed.h"

Ticker sec_timer;
DigitalOut col[5]={P0_7, P0_8, P0_9, P0_10, P0_22}; // connected anodes
DigitalOut row[7]={P0_6, P0_21, P0_5, P0_4, P0_3, P0_2, P0_20}; // connected cathodes

unsigned char numdata[10][5] = {
                                {0x3e, 0x45, 0x49, 0x51, 0x3e}, // "0"
                                {0x00, 0x21, 0x7f, 0x01, 0x00}, // "1"
                                {0x21, 0x43, 0x45, 0x49, 0x31}, // "2"
                                {0x42, 0x41, 0x51, 0x69, 0x46}, // "3"
                                {0x0c, 0x14, 0x24, 0x7f, 0x04}, // "4"
                                {0x72, 0x51, 0x51, 0x51, 0x4e}, // "5"
                                {0x1e, 0x29, 0x49, 0x49, 0x06}, // "6"
                                {0x40, 0x47, 0x48, 0x50, 0x60}, // "7"
                                {0x36, 0x49, 0x49, 0x49, 0x36}, // "8"
                                {0x30, 0x49, 0x49, 0x4a, 0x3c}  // "9"
                                };
int sec = 0;

void countup()
{
    sec++;
    if (sec > 9) sec = 0;
}

int main() {
    unsigned char x;
    int k = 0; // number of col
   
    sec_timer.attach(&countup, 0.3);
    
    while(1) {
        for(int i = 0; i < 5; i++) col[i] = 0; // all segments turn off
        for(int i = 0; i < 7; i++) row[i] = 1; // all segments turn off
        x = numdata[sec][k];
        col[k] = 1;
        for(int i = 0; i < 7; i++) {
            if ((x & 0x40) == 0x40) row[i] = 0;
            x <<= 1;
        }
        k++;
        if (k > 5) k = 0;
        wait(0.002);
    }
}

※2017/10/10 追記
3桁バージョンも作ってみました。並列化の配線が大変だったのと、GPIOを22本も使ってしまったので利用価値が微妙です(苦笑)。waitを1ms以下にしないとちらつきが目立ちます。消費電流が大きいのでドライバを使うべきです。