ArduinoでI2Cキャラクタ液晶を使う(その2) ライブラリの選定
ArduinoからI2Cインターフェイスのキャラクタ液晶を使う話の続きです。前回の記事で基本的な接続は確認出来たので、今回はライブラリを使って動かしてみます。実は、以前ライブラリの使用を試みたことがあるのですが、うまくいかなくて途中で断念しました。ライブラリを使わなくてもプログラムで頑張れば表示は出来ますが、いつもそんな面倒なことはやってられません。
▼回路図

テストの前提条件は上の回路図で動くことです(I2Cバスは変換基板上でプルアップされています)。つまり、Arduino UNO に秋月の I2C 接続キャラクタ液晶(AQM1602XA-RN-GBW)を接続して動かすことが目標です。たぶんこれ、現時点で一番多い使い方だと思います。なお、この回路では液晶の電源電圧とI2Cバスの信号レベルは共に5Vです。後の記事に出てきますが、この電圧の条件をクリア出来ないライブラリがいくつかありました。
▼テストの様子

I2Cバスの信号を見ながらテストしました。
ネットを検索してArduino で使えそうな I2C液晶のライブラリを探して、Arduino IDEに登録しました。ライブラリを登録すると、下の図のようにスケッチ例が出るようになるので、これを動かしてみれば正常に動くかどうか簡単に調べることが出来ます。なお、登録したライブラリが使えなかった場合は単にそのファイルを消すだけで済むはずで、後遺症は残らないと思います(たぶん)。
▼ライブラリに登録した様子

上を拡大したのが下の画面です。
▼今回登録したI2C液晶表示ライブラリ

今回は赤枠内の5種類のライブラリを登録しました。
以下、この画面に出ている順にテスト結果をレポートしていきます。
1.I2CLiquidCrystal Noriaki Mitsunaga さん
いきなりこの記事の結論が出てしまいました、このライブラリが一番具合がいいです。私はこれを使うことにしました。このライブラリからは、lcd.setCursorとか、lcd.print などパラレル液晶でおなじみのコマンドが使えます。それに何の修正も不要です。これこそ私が求めていたライブラリです。
少しだけ説明を加えたいと思います。 このライブラリは初期化ルーチンでいろいろなメーカーのLCDが選べるようになっています。今回私が探していたのは上の回路図に書いたように秋月で売られているLCD用のライブラリですが、それはこのライブラリのデフォルトで指定されている Straberry Linux の定義がそのまま使えました。昔はストリナで売ってたけど今では秋月でも取り扱うようになったということなんでしょう。
もう少し細かく説明すると、下記ルーチンで
なお、電源電圧指定の引数に論理値のキャスト(bool)が入っていますが、これは省略して下記のように書いてもかまわないと思います。 true という変数名は論理変数の真を表す予約語なのでキャストで明記する必要は無いと思うのですが、何か深い理由があるのかも知れません。
2.LiquidCrystal_I2C fdebrabander さん@gitHub
これ、gitHubに登録されていたものです。試してみたのですが全く動きませんでした。プログラムを見るとI2Cアドレスが0x27となっているので、全く別の液晶用のライブラリのようです。なお、gitHub内の説明資料やプログラムの中も見たのですが、液晶の型格が特定出来るような情報は発見出来ませんでした。ともかくライブラリ名だけで判断してはダメということですね。
3.skI2CLCDlib きむ茶工房さん
きむ茶工房さんのwebには参考になる情報がいっぱいあるので、よくお世話になっています。このライブラリは液晶モジュールの電圧設定がデフォルトでは3Vになっているので、これを下記のように修正して5Vに変更する必要があります。なおこのあたりの話は作者のWebに詳しく書かれています。
あと、きむ茶工房さんのサイトにこのキャラクタ液晶の昇圧回路について繰り返し注意が書かれています。これは私も気にしていた点で、同じ見解が書かれていたので安心しました。
それと、ライブラリの名前が skI2CLCDlib となっていて、先頭にsk という文字が入っているのは私の好きな作法です。このあたりの話はあとでもう一度触れたいと思います。
4.ST7032 オレ工房さん
このライブラリはとても良く出来ていて必要な関数は全て揃っています。もちろん lcd.print もあります。スケッチ例もたくさん揃っていてとても親切な作りになっています。
ただ残念なことに 昇圧回路が常にONになっていてライブラリからOFFにすることが出来ません。つまり液晶の電源電圧が3.3Vの場合しか使えません。Arduino UNOには3.3V電源を供給するピンがあるので、ここから液晶に電源を供給すればとりあえず動くとは思います。でも信号のレベルが合わないので I2Cバスのノイズマージンが確保出来ません。そんなことでこういう使い方はお勧め出来ません。
ということで私の結論は、このライブラリは使えない、ということになります。 あと、ライブラリの名称がドライバチップの名前をそのまま使っている、つまりST7032になっているのは、私としてはちょっと気になる点です。
5.wI2cLcdACN1602 エレキジャック、nakaoさん
これ動きませんでした。よく見ると液晶のPNがACM1602となっていますが今回の液晶はAQM1602です。おまけにドライバのチップはST7066ということで全然別の製品用でした。これくらいは事前にちゃんと理解してから探せよ→自分。ということなんですが、すみません私が悪いです。
◆まとめ
Arduinoで動かすI2Cキャラクタ液晶のライブラリなんて検索すれば簡単に見つかるだろう、と思っていたのですが。実際には簡単ではありませんでした。事実、今回は5種類試してそのまま使えたのは一つだけ(1.項の I2CLiquidCrystal)でした。昔、知識も無い状態で適当にネットで拾ったライブラリを入れてうまく動かなかったのはある意味当然の結果でした。
あと、今頃気付いたのですが、パラレルインターフェイスの液晶を使う場合のライブラリは、皆さん何も考えないで LiquidCrystal.h を使うと思います。つまりこれは、LiquidCrystal.h の完成度が素晴らしいので、他のライブラリを探す必要が全く無かった、ということなんですね。
◆ライブラリの名について
この記事の中でちょっと触れていますが、ライブラリの名前について私が以前から気になっていることがあります。それは、ライブラリの名前は後で改良版を作る人のことを考えて付けて欲しい、ということです。
デバイスの名前をそのまま使ったライブラリがよく作られています(ex:デバイス名がABC123ならライブラリ名もABC123.h )。でもそんなふうに、「ど真ん中の名前」を使われると、後で改良版を作る人はライブラリ名をどうするかちょっと困ってしまいます。改変版を作る場合、オリジナルの作者の方の権利を侵さない注意が必要で、ライブラリ名称についても同じだと思います。
もちろん最初の作者の方が、ずっとそのライブラリをメンテナンスしていただけるなら、ど真ん中の名前を使っていただいてかまいません。でも現実を見ていると、ArduinoIDEのバージョンアップなどに伴い、そのままでは動かなくなってしまったライブラリがいくつもあります。こうなると、道の真ん中にゴミが放置されているようなもので、すごく邪魔というか、はっきり言って迷惑です。
もちろん、ライブラリの名前は判り易くないといけません。でも少なくともチップの名前をそのまま使うのでは無く、ちょっと自分のイニシャルを追加して傷を付ける、というスタイルが良いのではないかと思います。今回の記事で取り上げたものでは、3.項と5.項のライブラリ名がそうなっています。
このくだりはちょっと余計だったかも知れません、また異論もあるでしょう。そもそもライブラリを一つも公開していない人間が偉そうなこと言うんじゃないよ、というお叱りを受けそうです。ただ、ずっと気になっていたのことなので、この機会に文章にしてみました。
▼回路図

テストの前提条件は上の回路図で動くことです(I2Cバスは変換基板上でプルアップされています)。つまり、Arduino UNO に秋月の I2C 接続キャラクタ液晶(AQM1602XA-RN-GBW)を接続して動かすことが目標です。たぶんこれ、現時点で一番多い使い方だと思います。なお、この回路では液晶の電源電圧とI2Cバスの信号レベルは共に5Vです。後の記事に出てきますが、この電圧の条件をクリア出来ないライブラリがいくつかありました。
▼テストの様子

I2Cバスの信号を見ながらテストしました。
ネットを検索してArduino で使えそうな I2C液晶のライブラリを探して、Arduino IDEに登録しました。ライブラリを登録すると、下の図のようにスケッチ例が出るようになるので、これを動かしてみれば正常に動くかどうか簡単に調べることが出来ます。なお、登録したライブラリが使えなかった場合は単にそのファイルを消すだけで済むはずで、後遺症は残らないと思います(たぶん)。
▼ライブラリに登録した様子

上を拡大したのが下の画面です。
▼今回登録したI2C液晶表示ライブラリ

今回は赤枠内の5種類のライブラリを登録しました。
以下、この画面に出ている順にテスト結果をレポートしていきます。
1.I2CLiquidCrystal Noriaki Mitsunaga さん
いきなりこの記事の結論が出てしまいました、このライブラリが一番具合がいいです。私はこれを使うことにしました。このライブラリからは、lcd.setCursorとか、lcd.print などパラレル液晶でおなじみのコマンドが使えます。それに何の修正も不要です。これこそ私が求めていたライブラリです。
少しだけ説明を加えたいと思います。 このライブラリは初期化ルーチンでいろいろなメーカーのLCDが選べるようになっています。今回私が探していたのは上の回路図に書いたように秋月で売られているLCD用のライブラリですが、それはこのライブラリのデフォルトで指定されている Straberry Linux の定義がそのまま使えました。昔はストリナで売ってたけど今では秋月でも取り扱うようになったということなんでしょう。
もう少し細かく説明すると、下記ルーチンで
I2CLiquidCrystal lcd(20, (bool)true); となっているものを I2CLiquidCrystal lcd(20, (bool)false); とすれば電源電圧3.3V用の設定(Voltage Boosterが動く)となりますが、今回は5Vで使うのでこのままで大丈夫です。このあたりは作者の方のWebに詳しい説明があるのでそちらを見た方が判り易いです。
// initialize the library
// uncomment next line if you are using a LCD from Straberry Linux
I2CLiquidCrystal lcd(20, (bool)true);
// | +--- set true if the power suply is 5V, false if it is 3.3V
// +-------- contrast (0-63)
なお、電源電圧指定の引数に論理値のキャスト(bool)が入っていますが、これは省略して下記のように書いてもかまわないと思います。 true という変数名は論理変数の真を表す予約語なのでキャストで明記する必要は無いと思うのですが、何か深い理由があるのかも知れません。
I2CLiquidCrystal lcd(20, true);
2.LiquidCrystal_I2C fdebrabander さん@gitHub
これ、gitHubに登録されていたものです。試してみたのですが全く動きませんでした。プログラムを見るとI2Cアドレスが0x27となっているので、全く別の液晶用のライブラリのようです。なお、gitHub内の説明資料やプログラムの中も見たのですが、液晶の型格が特定出来るような情報は発見出来ませんでした。ともかくライブラリ名だけで判断してはダメということですね。
3.skI2CLCDlib きむ茶工房さん
きむ茶工房さんのwebには参考になる情報がいっぱいあるので、よくお世話になっています。このライブラリは液晶モジュールの電圧設定がデフォルトでは3Vになっているので、これを下記のように修正して5Vに変更する必要があります。なおこのあたりの話は作者のWebに詳しく書かれています。
// ICON OFF,コントラスト(0-63),VDD=3.3Vで使うこれでライブラリとしては正常に動くようになります。ただ残念なことに、文字表示の関数としてLCD.putc( )と LCD.puts( )くらいしか用意されていないようで、肝心のlcd.print( ) がありません。これではArduinoの文化で育った私は困ってしまいます(すみません)。たぶんPIC使いの方なら大丈夫なんでしょう。
// LCD.Init(LCD_NOT_ICON,32,LCD_VDD3V) ;
LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ;
あと、きむ茶工房さんのサイトにこのキャラクタ液晶の昇圧回路について繰り返し注意が書かれています。これは私も気にしていた点で、同じ見解が書かれていたので安心しました。
それと、ライブラリの名前が skI2CLCDlib となっていて、先頭にsk という文字が入っているのは私の好きな作法です。このあたりの話はあとでもう一度触れたいと思います。
4.ST7032 オレ工房さん
このライブラリはとても良く出来ていて必要な関数は全て揃っています。もちろん lcd.print もあります。スケッチ例もたくさん揃っていてとても親切な作りになっています。
ただ残念なことに 昇圧回路が常にONになっていてライブラリからOFFにすることが出来ません。つまり液晶の電源電圧が3.3Vの場合しか使えません。Arduino UNOには3.3V電源を供給するピンがあるので、ここから液晶に電源を供給すればとりあえず動くとは思います。でも信号のレベルが合わないので I2Cバスのノイズマージンが確保出来ません。そんなことでこういう使い方はお勧め出来ません。
ということで私の結論は、このライブラリは使えない、ということになります。 あと、ライブラリの名称がドライバチップの名前をそのまま使っている、つまりST7032になっているのは、私としてはちょっと気になる点です。
5.wI2cLcdACN1602 エレキジャック、nakaoさん
これ動きませんでした。よく見ると液晶のPNがACM1602となっていますが今回の液晶はAQM1602です。おまけにドライバのチップはST7066ということで全然別の製品用でした。これくらいは事前にちゃんと理解してから探せよ→自分。ということなんですが、すみません私が悪いです。
◆まとめ
Arduinoで動かすI2Cキャラクタ液晶のライブラリなんて検索すれば簡単に見つかるだろう、と思っていたのですが。実際には簡単ではありませんでした。事実、今回は5種類試してそのまま使えたのは一つだけ(1.項の I2CLiquidCrystal)でした。昔、知識も無い状態で適当にネットで拾ったライブラリを入れてうまく動かなかったのはある意味当然の結果でした。
あと、今頃気付いたのですが、パラレルインターフェイスの液晶を使う場合のライブラリは、皆さん何も考えないで LiquidCrystal.h を使うと思います。つまりこれは、LiquidCrystal.h の完成度が素晴らしいので、他のライブラリを探す必要が全く無かった、ということなんですね。
◆ライブラリの名について
この記事の中でちょっと触れていますが、ライブラリの名前について私が以前から気になっていることがあります。それは、ライブラリの名前は後で改良版を作る人のことを考えて付けて欲しい、ということです。
デバイスの名前をそのまま使ったライブラリがよく作られています(ex:デバイス名がABC123ならライブラリ名もABC123.h )。でもそんなふうに、「ど真ん中の名前」を使われると、後で改良版を作る人はライブラリ名をどうするかちょっと困ってしまいます。改変版を作る場合、オリジナルの作者の方の権利を侵さない注意が必要で、ライブラリ名称についても同じだと思います。
もちろん最初の作者の方が、ずっとそのライブラリをメンテナンスしていただけるなら、ど真ん中の名前を使っていただいてかまいません。でも現実を見ていると、ArduinoIDEのバージョンアップなどに伴い、そのままでは動かなくなってしまったライブラリがいくつもあります。こうなると、道の真ん中にゴミが放置されているようなもので、すごく邪魔というか、はっきり言って迷惑です。
もちろん、ライブラリの名前は判り易くないといけません。でも少なくともチップの名前をそのまま使うのでは無く、ちょっと自分のイニシャルを追加して傷を付ける、というスタイルが良いのではないかと思います。今回の記事で取り上げたものでは、3.項と5.項のライブラリ名がそうなっています。
このくだりはちょっと余計だったかも知れません、また異論もあるでしょう。そもそもライブラリを一つも公開していない人間が偉そうなこと言うんじゃないよ、というお叱りを受けそうです。ただ、ずっと気になっていたのことなので、この機会に文章にしてみました。
- 関連記事
-
- キャラクタ液晶とスイッチでパラメーター設定する関数 (Arduino)
- ArduinoでI2Cキャラクタ液晶を使う(その3) 最終動作確認
- ArduinoでI2Cキャラクタ液晶を使う(その2) ライブラリの選定
- ArduinoでI2Cキャラクタ液晶を使う(その1) 基本動作確認
- ピンチェンジ割込みを使ってロータリーエンコーダーを読む (Arduino)