ディスプレイ
ディスプレイを買ってみた
amazonで見ていると、2行表示のディスプレイが190円で買えます。ディスプレイの表示ができれば使用範囲がぐっと広がるので、とりあえず買ってみることにします。
後からamazonを物欲しげに物色していると、これを使うには、「HiLetgo IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール Arduino 1602 LCD ディスプレイ」というのも買っておいた方が簡単なようです。
何が何やら分かりませんが、これも安いのでとりあえず注文することにします。
とりあえず接続してみる
ディスプレイにヘッダーピンをはんだ付けしてから、インタフェース ボード とブレッドボードに上下で差し込んで、インターフェースモジュールのVCC・GNDをそれぞれpowerの5番目5V・6番目GNDに接続。SDA・SCLをそれぞれSDA・SCLに接続します。
それぞれA4・A5に接続しても動きましたが、これは以前のSDA・SCL端子がないarduinoとの互換用のようです。(右の写真は、まだA4・A5に接続している時のものです。)
他の方の記事を見ていると、インタフェース ボード モジュールがなくてもディスプレイの表示はできるようですが、その場合は、接続しなければならないケーブルの数が半端でないです。
インタフェース ボード モジュールを使えば、それが4本接続するだけになるので、100円程度の投資なら、使わない手はないと思います。
このインタフェース ボード モジュールには、LCDの輝度調節用の半固定抵抗も付いています。
I2Cアドレス
テスト表示をさせるプログラムも、全く分からないなりに、インターフェースボートの評価記事を参考にして、以下のようにして、やっとうまく表示できるようになりました。
I2Cアドレスは、0×27でよかったようです。何をやったのか自分でもわかりませんが、いつの間にか、0x3fに変わっていました。なぜ表示が今までのようにうまくいかなくなったのか、突き止めるまでに大変でした。
平成29年5月20日に最初に注文したシリアルボードは、0×27でした。
これの一度ハンダ付けしてあるヘッダーピンを取って基盤にはんだ付けし直してやろうとした結果、失敗してシリアルボードを壊してしまいました。
それで今度6月16日に再注文した品では、同じプログラムのはずなのに、何をやってもディスプレイがきちんと動きません。それで分かったのが、アドレスの変化でした。
最初に使っていたarduinoとは違うボードを使ってやろうとして、arduino IDEの設定をいくらかはいじったので、その影響かもしれませんが、とりあえず今は0x3fで動いています。
テスト表示プログラム
まず最初に、Arduino IDEで、「スケッチ>ライブラリをインクルード>ライブラリを管理」から、LiquidCrystal_I2Cを検索して、インクルードします。
あとは、コピペです。
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
#define printIIC(args) Wire.write(args)
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
send(value, Rs);
return 1;
}
void setup() {
lcd.init();
lcd.backlight();
}
void loop(){
hyouji(0,0,16,"Hello, ネコworld!");
hyouji(0,1,16,"Fumio ドウラクモノ");
}
//液晶表示用関数 char
void hyouji(int yoko, int tate, int haba, char *text) {
utf_del_uni(text);
//文字化け防止のため1字ずつ表示
int i = 0;
int j = 0;
while (text[i] != ” && i<haba ) {
lcd.setCursor(yoko + i, tate);
lcd.print(text[i]);
i++;
}
while (i < haba) {
lcd.setCursor(yoko + i, tate);
lcd.print(‘ ‘);
i++;
}
}
// UTF-8 to ASCIIコード変換
void utf_del_uni(char *s){
byte i=0;
byte j=0;
while(s[i]!=”){
if((byte)s[i]==0xEF){
if((byte)s[i+1]==0xBE) s[i+2] += 0x40;
i+=2;
}
s[j]=s[i];
i++;
j++;
}
s[j]=”;
}
ディスプレイの輝度調節は必須
上の設定でうまく表示できるようになるまでに、A4とA5を逆に接続したり、I2Cアドレスを変えてみたり、いろいろしても、ディスプレイの電源は入るものの、表示が全く出ませんでした。
そこで、もう一度評価記事を読んでいて発見したのが、「液晶のコントラストがあってないと、スケッチは正常に動いていても、いつまでたっても文字が見えないので、要注意です」の記述。
インターフェースボードの可変抵抗でコントラストを調整したら、きちんと文字が出ていました。
カナ表示までの道は少し遠かった
まず、つないで普通に表示しただけでは、この シリアル インタフェース ボード モジュールの評価にあったように、最初の1文字だけしか表示しませんでした。
評価にあったソースをそのまま組み込んで、"Hello, world!"は表示されるようになったものの、今度は、カナ表示ができません。
それで、『Arduinoで日本語カタカナ表示』のページをコピペして、UTF8の文字コードを、ASCIIに変換して、カタカナも表示できるようになったと思ったら、今度は文字より後の部分に変な文字化けが続いて表示されてしまいます。
それで仕方なく、文字列の最後を判定しながら、一文字ずつ表示する部分を付け加えるようにして、ついでに、この表示部分を関数化しました。
上書きされない部分は旧表示が残る
表示を上書きするときに、旧表示よりも新しい表示の方が短いと、その上書きされない部分の旧表示が残ったままになります。それでは、正しい表示にはならないので、表示幅も関数に渡すようにして、表示幅より足りない部分は、スペースで埋めるようにしました。
20字×4行のディスプレイも設定は同じ
同じHiLetgoの製品に、 5V 2004 20X4 キャラクタ LCDディスプレイ IIC I2C TWI SPIというのがあります。
これも、
LiquidCrystal_I2C lcd(0x3f, 16, 2};);
のマーカー部分の右を、「20,4」にするだけの設定変更で、全く同じように利用できます。
ちょっと値段は高くなりますが、さすがに4桁表示は、余裕があって使いやすいです。