2013年10月03日 | Ver. 1.00公開。 |
2015年06月01日 | Ver. 1.01公開。 |
Arduinoでキャラクタ液晶に半角カナを表示する時に、文字化けしない様に工夫した、液晶表示ライブラリです。
Arduino IDEには、標準で、LiquidCrystalライブラリという、キャラクタ型LCD(液晶)を制御するためのライブラリが付いています。たいていのキャラクタ型LCDはこのライブラリで制御できるため、多くの人に使われています。しかし、LiquidCrystalライブラリで半角カナを表示しようと思って、文字化けに悩んだ人も多いのではないでしょうか?
そこで、LiquidCrystalライブラリを拡張して、半角カナをprint関数の中で直接記述しても、文字化けしないライブラリを作りました。名づけてKanaLiquidCrystalライブラリです。
試しに、以下のスケッチを、お手持ちのArduinoとキャラクタ型液晶で実行してみてください。半角カナが文字化けして表示されます。なお、このスケッチのLCDのピン接続は、スイッチサイエンスで販売しているLCDシールドキット(緑)を仮定しています。ピン接続が違う場合は、それにあわせてスケッチの修正が必要です。
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.print("Hello コンニチハ"); } void loop() { }
私の場合、このスケッチを実行すると、次の様な画面になりました。
lcd.print("Hello コンニチハ");の"Hello "までは正常に表示されているのですが、その後の"コンニチハ"が文字化けしています。実は、Arduino IDEで半角カナを入力すると、半角文字なのに、1文字当たり3バイトで内部表現されます。ここでは詳しい話に立ち入りませんが、詳しい話がMGLCDライブラリのSetCodeMode関数の説明ページに載っています。
上記のページでも解説していますが、半角カナを正常に表示するためには、文字コード表を参照して、次の様にスケッチを書き換える必要があります。
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.print("Hello \xba\xdd\xc6\xc1\xca"); } void loop() { }
今度は文字化けせずに液晶に表示されていますが、スケッチの方が暗号のようになっています。(16進数で文字コードを直接書いているから) これでは、とても読みにくいスケッチになってしまいます。
このような問題を解決するために作ったのが、KanaLiquidCrystalライブラリです。このライブラリは、LiquidCrystalライブラリに、半角カナ表示の機能を付け加えるライブラリですので、必ずLiquidCrystalライブラリと組み合わせて使います。
KanaLiquidCrystalライブラリを使うと、先ほどのスケッチが、次の様になります。
#include <KanaLiquidCrystal.h> #include <LiquidCrystal.h> KanaLiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.kanaOn(); // 半角カナの表示を許可する lcd.print("Hello コンニチハ"); // 文字化けせずに表示される } void loop() { }
この様に、lcd.kanaOn();を実行すると、それ以降、print関数内でカナ文字を使っても、文字化けすることなくLCDに表示されるようになります。
KanaLiquidCrystalライブラリのバージョンにより、対応するArduino IDEのバージョンが異なりますので、ご注意ください。(下記の表を参照)
KanaLiquidCrystalライブラリ のバージョン |
対応するArduino IDE のバージョン |
動作検証に用いた Arduino IDE |
---|---|---|
1.00 | 1.0.1~1.0.6 | Windows版Arduino IDE 1.0.1、1.0.4および1.0.5 |
1.01以降 | 1.0.1~1.0.6および1.6.X | Windows版Arduino IDE 1.0.6、および1.6.4 |
また動作検証は、Arduino MEGA2560とLCDシールドキット(緑)の組み合わせで行いましたが、ライブラリに機種依存性のあるコードを含まないので、他の8ビットのArduinoでも動作すると思います。
KanaLiquidCrystalライブラリは、次のリンクからダウンロードできます。
古いバージョンのKanaLiquidCrystalライブラリをお使いの場合は、次のリンクからダウンロードできます。
ダウンロードしたZIPファイルを解凍すると、KanaLiquidCrystalというフォルダができます。それをArduinoのスケッチブックのフォルダ(Windowsなら、通常は マイドキュメント\Arduino)の下の、librariesというフォルダの中に、移動(またはコピー)すると、インストールが完了します。もし、librariesというフォルダがなければ、librariesフォルダを作成してから、移動(またはコピー)してください。なお、移動(またはコピー)の操作は、Arduino IDEが起動していない状態で行ってください。
KanaLiquidCrystalライブラリの使い方は、LiquidCrystalライブラリの使い方とほぼ一緒なので、LiquidCrystalライブラリ用のスケッチをKanaLiquidCrystalライブラリ用に書き換える方法を説明します。
LiquidCrystalライブラリを使うスケッチは、必ずLiquidCrystal.hをインクルードしているはずですが、それに追加して、KanaLiquidCrystal.hもインクルードしてください。どちらを先にインクルードするかは重要ではありません。
#include <KanaLiquidCrystal.h> // この行を追加する #include <LiquidCrystal.h>
また、LiquidCrystalライブラリを使うスケッチは、LiquidCrystalクラスの変数(名前はlcdにするのが慣例)を宣言している行があるはずですが、KanaLiquidCrystalクラスに変更してください。
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LiquidCrystalライブラリを使う場合は、こういう行があるはず。 KanaLiquidCrystal lcd(12, 11, 5, 4, 3, 2); // KanaLiquidCrystalクラスに変更する。
以上で、LiquidCrystalライブラリ用のスケッチをKanaLiquidCrystalライブラリ用に書き換えられましたが、まだ半角カナをprint関数で使えるようにはなっていません。次の行をスケッチのどこかに追加してください。この行を実行して以降は、半角カナが文字化けせずに表示されるようになります。通常はsetup関数の中で1度実行すればOKです。
lcd.kanaOn(); // この行を実行して以降、半角カナは文字化けせずに表示されます。
以上の手順で半角カナが表示できるようになりますが、場合によってはこの機能が邪魔になる事があります。その時は、次の行を実行してください。この行の実行以降は、文字変換(3バイトで表現された半角カナの1バイト表現への変換)を行わなくなります。つまり、LiquidCrystalと同じ動作をします。
lcd.kanaOff(); // この行を実行して以降、文字変換を行わなくなる。
また半角カナを表示したくなったら、lcd.kanaOn();を実行すれば、OKです。
Arduino IDEのファイル→スケッチの例→KanaLiquidCrystal→HelloWorldメニューから、サンプルスケッチを開けますので、こちらも参考にしてください。
もともと、print関数内で半角カナを使ってもLCDの文字化けをしないようにしたいと思ったのは、MGLCDライブラリという、グラフィックLCD用のライブラリを作っていた時でした。MGLCDライブラリは、S12232ZA、SG12232C、SG12864ASLB-GBといったグラフィックLCD用のライブラリで、直線や円などのグラフィック表示だけでなく、ライブラリにフォントを内蔵していて、文字も表示できるものです。
MGLCDライブラリのprint関数で半角カナを表示するために作ったプログラムの一部を、LiquidCrystalライブラリの拡張に流用しできたのが、今回作成したKanaLiquidCrystalライブラリです。
Arduinoに接続したLCDにたくさんの文字を表示したい場合、大型のキャラクタ型LCDを使うよりは、グラフィックLCDを使う方が安くつく場合もあります。このような場合にはMGLCDライブラリの使用も是非ご検討ください。
MGLCDライブラリは、122X32モノクログラフィックLCDシールドのように、たった2本のI/Oピンで動作するグラフィックLCDもサポートしていますので、こちらも合わせてご検討いただけると幸いです。