Raspberry Pi 2でLEDドットマトリックスを制御してみました
以前作成したI2C接続で利用するLEDドットマトリックスをラズパイに繋げて制御してみました。
I2C接続で制御します。電源は直接ラズパイから供給しています。
4線だけの接続で済みました。
LEDドライバにはHT16K33を利用しています。
HT16K33は、ピン数のことなるバージョンがいくつかあるようですが、
28ピンの8x16の制御ができるバージョンを使っています。

動いている様子
プログラムはC言語で実装しました。GPIOまわりの制御は wiringPiライブラリを利用しました。
// file : matrix.c
// Raspberry Pi 8x16LEDマトリック表示制御 by たま吉さん 2016/1/5
// I2C接続LEDドライバHT16K33を使った8x16のLEDマトリックスを制御する
//
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define I2CADR 0x70 // I2Cアドレス
// HT16K33コマンド
#define HT_CMD_DATA 0x00 // データ送信
#define HT_CMD_SYSSET 0x20 // システムセットアップ
#define HT_CMD_BLINK 0x80 // 点滅表示周期の設定
#define HT_CMD_BRIGHTNESS 0xE0 // 明るさの設定
// HT16K33 レジスタ設定値
#define HT_SYSSET_OSC_ON 1
// HT16K33 点滅表示周期 設定値
#define HT_BLINK_OFF 0
#define HT_BLINK_DISPLAY_ON 1
#define HT_BLINK_2HZ 2
#define HT_BLINK_1HZ 4
#define HT_BLINK_05HZ 6
// グローバル変数
int fd; // I2Cファイルデスクプリタ
unsigned short buf[8]; // 8x16ドットパターン
// サンプルパターンデータ
char msg_saitama[][8] = {
{ 0x08, 0x08, 0x7E, 0x04, 0x24, 0x40, 0x3C, 0x00 }, // さ
{ 0x00, 0x88, 0x84, 0x82, 0x82, 0x50, 0x20, 0x00 }, // い
{ 0x20, 0xF0, 0x2E, 0x40, 0x48, 0x50, 0x8E, 0x00 }, // た
{ 0x08, 0x7E, 0x08, 0x7E, 0x08, 0x7C, 0x7A, 0x00 }, // ま
};
// HT16K33 コマンド送信
void ht_cmd(char cmd, char prm) {
wiringPiI2CWrite(fd, cmd|prm);
}
// 表示パターンの送信
void ht_update() {
int i;
for (i = 0 ; i < 8; i++) {
wiringPiI2CWriteReg8(fd, i*2, buf[i] & 0xff);
wiringPiI2CWriteReg8(fd, i*2+1,buf[i] >> 8);
}
}
// バッファクリア
void ht_clear_buffer() {
int i;
for (i = 0; i < 8; i++) {
buf[i] = 0;
}
}
// 表示のクリア
void ht_clear() {
ht_clear_buffer();
ht_update();
}
// バッファの指定座標のON/OFF
void ht_set_dot(int x, int y, int d) {
if (d) {
buf[y] |= 0x8000 >>x;
} else {
buf[y] &= ~(0x8000 >>x);
}
}
// バッファ上の指定座標に8x8パターンをセット(負座標指定可能)
void ht_write_at(char* p, int x, int y) {
int i;
if ((x > 15) || (y > 7) || (x < -7) || (y < -7) )
return;
for (i = 0; i <8; i++) {
if ((i+y >= 0) && (i+y < 8) ) {
if (x <= 8)
buf[i+y] |= p[i]<<(8-x);
else
buf[i+y] |= p[i]>>(x-8);
}
}
}
// 1文字左スクロール挿入
void ht_scrollIn(char* p, int wt) {
int i,j;
for (j = 0; j < 8; j++) {
for (i = 0; i < 8; i++) {
buf[i]<<=1;
}
ht_write_at(p, 15-j, 0);
ht_update();
delay(wt);
}
}
// HT16K33 初期化
void ht_init() {
ht_cmd(HT_CMD_SYSSET, HT_SYSSET_OSC_ON);
ht_cmd(HT_CMD_BLINK, HT_BLINK_DISPLAY_ON | HT_BLINK_OFF);
ht_cmd(HT_CMD_BRIGHTNESS, 0);
}
// メイン
int main(void) {
int i,x,y;
// GPIO利用のための初期化
wiringPiSetup();
// HT16K33の初期化
fd = wiringPiI2CSetup(I2CADR);
ht_init();
// デモ
while(1) {
// デモ1 ドット表示
for (i =1; i >=0; i-- ) {
for ( y=0; y < 8; y++) {
for ( x=0; x < 16; x++) {
ht_set_dot(x,y, i);
ht_update();
delay(10);
}
}
}
// デモ2 'さいたま' 表示
for (i = 0; i <4; i++) {
ht_scrollIn(msg_saitama[i], 100);
}
delay(500);
ht_clear();
}
return 0;
}
コンパイルは、
$ gcc -o matrix matrix.c -lwiringPi
とします。
美咲フォントを使って、コマンド引数に任意も文字列を指定して表示出来るようにしようと思います。
« Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う | トップページ | ゲームコンソールキット LameStation »
「表示器制御関連」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
「Raspberry Pi」カテゴリの記事
- 使い勝手の良いRP2040搭載「Seeed Studio XIAO RP2040」(2023.02.13)
- Raspberry Pi PicoにUSBキーボードを繋げてみる(2021.03.29)
- Pimoroni Pico VGA Demo Baseを入手しました(2021.03.25)
- Raspberry Pi Picoで4桁7セグLEDをダイナミック表示(2021.03.21)
- Raspberry Pi Picoのリセットボタンの実装(2021.03.15)
« Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う | トップページ | ゲームコンソールキット LameStation »

コメント