フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う | トップページ | ゲームコンソールキット LameStation »

2016年1月 5日 (火)

Raspberry Pi 2でLEDドットマトリックスを制御してみました

以前作成したI2C接続で利用するLEDドットマトリックスをラズパイに繋げて制御してみました。

Dscn4664

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 »

表示器制御関連」カテゴリの記事

Raspberry Pi」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Pi 2でLEDドットマトリックスを制御してみました:

« Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う | トップページ | ゲームコンソールキット LameStation »