BS21 Lab の製品 - RaspberryPi 用 漢字/カナ LCD シールド - ソフトウエア

19/dec/2013 新規
26/dec/2013 更新


工事中。

まだ、きっちり書けていません。


本ページは、
共通の解説ページです。


※ 小生自身、Linux は初めてなので、間違いなど有るかもしれません。その場合は、御指摘頂ければ幸いです。



・ライブラリ

wiringPi 用ライブラリを用意しています。
以下の圧縮ファイルをダウンロードして、解凍してください。

BS21Lab-RPi-wiringPi-klcd4pi-v1.00b.zip 2013年12月26日版:LGPL扱いにしました


・インストール

wiringPi を使用しています。
最初に libi2c-dev を apt-get し、続いて、wiringPi を git clone しておいてください。
※ libi2c-dev と wiringPi の導入方法については、ネット上に各種説明がありますので、そちらに譲ります。


wiringPi v2 (point 03) の場合、wiringPiI2C.h と wiringPiI2C.c の改造が必要になります。以下の様に改造してから、再度 ./build してください。

wiringPi/wiringPi/wiringPiI2C.h の追加箇所:
extern int wiringPiI2CRead           (int fd) ;
extern int wiringPiI2CReadReg8       (int fd, int reg) ;
extern int wiringPiI2CReadReg16      (int fd, int reg) ;

extern int wiringPiI2CWrite          (int fd, int data) ;
extern int wiringPiI2CWriteReg8      (int fd, int reg, int data) ;
extern int wiringPiI2CWriteReg16     (int fd, int reg, int data) ;

// ここを追加します。wiringPi v2 (point 03) なら、このfileを wiringPiI2C.h と置き換えてもOKです。
// ↓↓↓↓↓↓↓↓↓↓↓↓
extern int wiringPiI2CWriteQuick     (int fd) ;  // added by I.Kato @ BS21 Lab
// ↑↑↑↑↑↑↑↑↑↑↑↑
// ここまで。

extern int wiringPiI2CSetupInterface (const char *device, int devId) ;
extern int wiringPiI2CSetup          (const int devId) ;

wiringPi/wiringPi/wiringPiI2C.c の追加分:どこかに、以下を追加してください。
// ここを追加します。wiringPi v2 (point 03) なら、このfileを wiringPiI2C.c と置き換えてもOKです。
// ↓↓↓↓↓↓↓↓↓↓↓↓

/**********************************************************************************************
  Send an I2C address only.
     added by I.Kato @ BS21 Lab
     based on http://elk.informatik.fh-augsburg.de/pub/elinux/ngw100/i2c/AVR32412/i2c-dev.h
**********************************************************************************************/

int wiringPiI2CWriteQuick (int fd)
{
  return i2c_smbus_access (fd, I2C_SMBUS_WRITE, 0, I2C_SMBUS_QUICK, NULL) ;
}

// ↑↑↑↑↑↑↑↑↑↑↑↑
// ここまで。

続いて、wiringPi/devLib ディレクトリに、knjlcd.h, knjlcd.c, kanalcd.h, kanalcd.c をコピーし、 makefile を以下の様に改造してから、再度 ./build してください。

SRC	=	ds1302.c maxdetect.c  piNes.c	\
		gertboard.c piFace.c		\
		lcd128x64.c lcd.c			\
		kanalcd.c knjlcd.c			\      ← これを追加
		piGlow.c

(中略)

install-headers:
	@echo "[Install Headers]"
	@install -m 0755 -d		$(DESTDIR)$(PREFIX)/include
	@install -m 0644 ds1302.h		$(DESTDIR)$(PREFIX)/include
	@install -m 0644 maxdetect.h	$(DESTDIR)$(PREFIX)/include
	@install -m 0644 piNes.h		$(DESTDIR)$(PREFIX)/include
	@install -m 0644 gertboard.h	$(DESTDIR)$(PREFIX)/include
	@install -m 0644 piFace.h		$(DESTDIR)$(PREFIX)/include
	@install -m 0644 lcd128x64.h	$(DESTDIR)$(PREFIX)/include
	@install -m 0644 lcd.h		$(DESTDIR)$(PREFIX)/include
	@install -m 0644 kanalcd.h		$(DESTDIR)$(PREFIX)/include      ← これを追加
	@install -m 0644 knjlcd.h		$(DESTDIR)$(PREFIX)/include      ← これを追加
	@install -m 0644 piGlow.h		$(DESTDIR)$(PREFIX)/include

(中略)

uninstall:
	@echo "[UnInstall]"
	@rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h
	@rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h
	@rm -f $(DESTDIR)$(PREFIX)/include/piNes.h
	@rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h
	@rm -f $(DESTDIR)$(PREFIX)/include/piFace.h
	@rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h
	@rm -f $(DESTDIR)$(PREFIX)/include/lcd.h
	@rm -f $(DESTDIR)$(PREFIX)/include/kanalcd.h      ← これを追加
	@rm -f $(DESTDIR)$(PREFIX)/include/knjlcd.h       ← これを追加
	@rm -f $(DESTDIR)$(PREFIX)/include/piGlow.h
	@rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.*
	@ldconfig

(中略)

# DO NOT DELETE

ds1302.o: ds1302.h
maxdetect.o: maxdetect.h
piNes.o: piNes.h
gertboard.o: gertboard.h
piFace.o: piFace.h
lcd128x64.o: font.h lcd128x64.h
lcd.o: lcd.h
kanalcd.o: kanalcd.h      ← これを追加
knjlcd.o: knjlcd.h        ← これを追加
piGlow.o: piGlow.h


これで、klcd4pi-v1.00 ディレクトリ内の *.c がコンパイル可能になるはずです。


・テキスト

「漢字 LCD シールド」の場合、半角文字で16桁×2行分の領域を持っています。
LCD 画面上に表示できるのも、この16桁×2行分のみです。
画面シフト機能はありません。(実は SG12832A 自体には有るのですが、ATmega328 のメモリ容量の関係で仮想画面がそれだけ分を確保できない為、サポートを断念しました)

一方、「カナ LCD シールド」の場合、内部的には、半角文字で40桁×2行分の領域を持っています。
ただし、ある瞬間に LCD 画面上に表示できるのは16桁×2行分のみです。残りの24桁×2行分は、画面シフトさせないと見えるようになりません。
画面シフトに関係するコマンドは、kanalcdEntryModeSet関数, kanalcdShift 関数の2つです。また、kanalcdInit関数, kanalcdHome関数, kanalcdClear 関数の3つは、画面シフトを初期化します。
この画面シフト機能ですが、正しく使いこなさないと、変な領域を表示するようになってしまい、肝心な領域が見えなくなってしまいますので、注意が必要です。








・表示できる文字


















・グラフィック

漢字 LCD シールドのみ、グラフィック機能を持っています。(カナ LCD シールドにはありません)

一旦、knjlcdXxx 関数で、漢字 LCD コントローラ内の仮想画面(横128×縦32)に描いておいてから、knjlcdFlip 関数で一括して LCD へ転送する事で、初めて表示されます。
引数の x/x0/x1 は 0〜127、y/y0/y1 は 0〜31、color は 0 の時は消去、0 以外の時は描画、です。
注意1:文字を書くと、半角文字なら 16x8 単位、全角文字なら 16x16 単位で、その部分のグラフィックが消えます。つまり、文字とグラフィックは重ねられません。
注意2:激しく遅いです。過度の期待はしないように。



・ライブラリ

ライブラリに含まれる関数の説明です。

漢字 LCD シールドカナ LCD シールド戻り値引数説明コメント
knjlcdInitkanalcdInit成功時:fd値,
失敗時:-1
int i2c_addr指定された i2cアドレスを持つ LCD シールドの初期化画面クリア、カーソル位置(0,0)、LCD 表示 ON、カーソル非点滅、カーソル非表示、バックライト・ソフトOFF、汎用出力ピン全4点デジタル出力OFF になります
knjlcdHomekanalcdHomeエラーコードint fd画面内容はそのままで、カーソル位置だけ (0,0) にする※カナ LCD シールドの場合、処理に約 1.52ms+α かかります
knjlcdClearkanalcdClearエラーコードint fd画面をクリアし、カーソル位置を (0,0) にする※漢字 LCD シールドの場合、処理に約 60ms かかります
※カナ LCD シールドの場合、処理に約 1.52ms+α かかります
knjlcdDisplaykanalcdDisplayエラーコードint fd,
int state
LCD を表示させる/させない
knjlcdCursorkanalcdCursorエラーコードint fd,
int state
カーソルを表示させる/させない※漢字 LCD シールドの場合、半角/全角に関係なく、常に全角文字単位で表示されます。
knjlcdCursorBlinkkanalcdCursorBlinkエラーコードint fd,
int state
カーソル位置の文字を点滅させる/させない※漢字 LCD シールドの場合、半角/全角に関係なく、常に全角文字単位で点滅されます。
knjlcdPositionkanalcdPositionエラーコードint fd,
unsigned int col,
unsigned int row
カーソル位置を設定
col=0〜15(漢字LCDシールドの場合) or 39(カナLCDシールドの場合),
row=0〜1 の範囲で指定
※漢字 LCD シールドの場合、全角文字は偶数col のみ指定可能です。半角文字は奇数col でもOK です。
該当無しkanalcdCharDefエラーコードint fd,
unsigned int index,
unsigned char font_data [8]
ユーザー定義文字フォント(5x8dots)を設定index = 0〜7 の範囲
※カナ LCD シールドのみ
knjlcdPutcharkanalcdPutcharエラーコードint fd,
char ch
文字コードを1バイト転送するマルチバイト文字の場合は、複数回呼び出しで、始めて1文字分が表示されるようになります。
knjlcdPutskanalcdPutsエラーコードint fd,
const char * str
文字列を転送する自動改行はしないので、改行させたい時は '\n' を指定する必要があります。
knjlcdPrintfkanalcdPrintfエラーコードint fd,
const char * fmt,
...
文字列を転送する書式は printf 関数に準拠
該当無しkanalcdEntryModeSetエラーコードint fd,
unsigned int ems
Entry Mode を設定します。機能の詳細はデータシートを参照してください。
※カナ LCD シールドのみ
該当無しkanalcdShiftエラーコードint fd,
unsigned int shift
Cursor/Display Shift を実行します。機能の詳細はデータシートを参照してください。
※カナ LCD シールドのみ
knjlcdBacklightkanalcdBacklightエラーコードint fd,
int state
LCD バックライトを ON/OFF させるシールド上の DIPSW3 で、バックライト・ソフトON/OFF モードにしている場合のみ有効。バックライト強制ON モードにしている場合は、本コマンドに関係無く、バックライトON される
knjlcdPset該当無しエラーコードint fd,
int x,
int y,
int color
仮想画面に点を描画x は 0〜127、y は 0〜31、color は 0 の時は消去、0 以外の時は描画
knjlcdLine該当無しエラーコードint fd,
int x0,
int y0,
int x1,
int y1,
int color
仮想画面に線を描画x0/x1 は 0〜127、y0/y1 は 0〜31、color は 0 の時は消去、0 以外の時は描画
knjlcdRect該当無しエラーコードint fd,
int x0,
int y0,
int x1,
int y1,
int color
仮想画面に四角形(塗りつぶし)を描画x0/x1 は 0〜127、y0/y1 は 0〜31、color は 0 の時は消去、0 以外の時は描画
knjlcdBitmap該当無しエラーコードint fd,
int x,
int y,
unsigned int size,
const unsigned char * bitmap
仮想画面に Bitmap(モノクロ8画素単位)を1ライン分転送x は8画素単位(0,8,16,...,120)、y は 0〜31、size は転送バイト数。画面右端を超える分の bitmap は無視される。
knjlcdFlip該当無しエラーコードint fd,
int x0,
int y0,
int x1,
int y1
仮想画面から LCD のグラフィック面に転送
ここで初めて LCD に表示される
x0/x1 は 0〜127、y0/y1 は 0〜31
※ 処理に最大約 60ms かかります。領域が狭ければ狭いほど、早く終わります。
knjlcdPinModekanalcdPinModeエラーコードint fd,
unsigned int pin,
int mode
指定の汎用出力ピン(PWM0/PWM1/OUT0)を OUTPUTモードか PWM_OUTPUT モードに設定する
knjlcdDigitalWritekanalcdDigitalWriteエラーコードint fd,
unsigned int pin,
int state
指定の汎用出力ピン(PWM0/PWM1/OUT0/OUT1)をデジタル ON/OFF させるPinMode が OUTPUTモードになっている必要あり。state が 0 の時は OFF、0 以外の時は ON が出力される。
knjlcdPwmWritekanalcdPwmWriteエラーコードint fd,
unsigned int pin,
unsigned int val
指定の汎用出力ピン(PWM0/PWM1/OUT0)から PWM 出力させる。PinMode が PWM_OUTPUTモードになっている必要あり(PWM_OUTPUTモードでない時に呼び出しても、内部設定されるだけで PWM 出力されません)。指定できる値は 0〜255 の範囲。


RaspberryPi 用 漢字 LCD シールドに戻る

Copyright (C) 2013 BS21 Lab, All rights reserved.