LCDライブラリ、かなりの曲者です!
arduinoのライブラリを使ってみる実験の続き。
キャラクターLCDライブラリを繋いで文字を
表示してみました。
ちなみにライブラリを使わずにベタにコーディング
したモノも公開されています。↓これ。
http://www.arduino.cc/en/Tutorial/LCD8Bits
せっかくなので、便利なライブラリを使ってみます。
液晶表示器ですが、秋月でずいぶん前に買った
HD44780U互換チップ登載の1行16文字表示
LCD(時価300円)が死蔵されていたので、それを
使ってみることに。
これは他のLCDモジュールと違って、14本のピンが
一列に並んでいるので、ブレッドボードにはもってこい
かと。(写真は下のほうにあります。)
ライブラリは8ビット用と4ビット用の2種類が公開
されています。どちらもOfficial Librariesではなく
Contributed Librariesとして公開されています。
いつものようにライブラリのzipファイルをダウンロード
後解凍して、\arduino-0011\hardware\libraries\ の下に
フォルダごと放り込んでおきます。8ビット版、4ビット版
それぞれ、
#include <LiquidCrystal.h>
#include <LCD4Bit.h>>
でコンパイル時に取り込めます。(不等号は全角に変えてます)
配線は↓このページのとおりなので迷うことはないでしょう。
http://www.arduino.cc/en/Tutorial/LCDLibrary
さて、サンプルスケッチを元に適当なスケッチを作り実行。
↓こんな感じ。
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal();
char string1[] = "1234567890";
void setup(void){
lcd.init();
}
void loop(void){
lcd.clear(); //clear the display
delay(1000); //delay 1000 ms to view change
lcd.printIn(string1);
delay(1000); //delay 1000 ms to view change
}
コンパイルエラー。エラーメッセージを眺めると、
内部で二重定義をしているところがある様子。
ネットを検索してみると、やはりハマッた人が
散見されます。
仕方が無いのでライブラリを眺めてみます。
(うーん、またしてもライブラリの中身を探ることに…)
ライブラリの間違え個所はわかりました。ただ、
どう直せば正解なのかは詳しくわかりません。
ひとまずライブラリの先頭から5行目くらいの所から
数行を以下のように変えて、事前に定義されている時は
取り込まない様にしてみました。↓
(修正前)
extern void pinMode(int, int);
extern void digitalWrite(int, int);
extern int digitalRead(int);
extern void portMode(uint8_t, uint8_t);
extern void portWrite(uint8_t, uint8_t);
extern uint8_t portRead(uint8_t);
(修正後)
#ifndef Wiring_h
extern void pinMode(int, int);
extern void digitalWrite(int, int);
extern int digitalRead(int);
extern void portMode(uint8_t, uint8_t);
extern void portWrite(uint8_t, uint8_t);
extern uint8_t portRead(uint8_t);
#endif
(…#ifndef~#endifで括っただけです。)
いずれにしても、Official Librariesではないので
今後ライブラリの中身自体がコロコロ変わること
でしょう。
これでひとまずコンパイルは通り、表示自体は
そこそこ出来るようになりました。

が、ここでまた問題発生。初期化ルーチンの内部処理です。
初期化時に、画面モードが1ライン用になっている
様ですが、今回試用したLCDは左8文字と右8文字の
アドレスが連続していません。多分2行表示モードだと
左8文字が1行目、右8文字が2行目に相当するアドレス
だと思います。
その結果、8文字以上表示すると途切れてしまいます。
画面モードを変更してみようという作戦に。
ライブラリ内では初期化コマンドを定数として
持っていて、それを順々に出力しているんですが、
これを初期化関数init()で設定することが出来ません。
仕方なく、またもやライブラリの定数定義をちょこちょこっ
と直してみます。が、思うように上手く動きません…。
どちらかというと4ビットモードで動かすことを
ひとまずのゴールに置いていたので、あまり8ビット
モードばかりでグダグダして居たくないし…。
ひとまず放置しておいて、4ビットモードを試して
みることにしました。
ところが、4ビットモードでも一ハマってしまいましたよ。
長くなったので、この続きはまた後ほど書きます。
それにしても、PIC用CCS-Cで液晶表示した時
と比べると、まさにドハマリという感じでした…(〒へ〒)
arduino + 2行LCDには鬼門があるようです…



|