Arduino を買って,全然時間なくて触れてないんですが,とりあえず,LCD(Liquid Crystal Display)もセットで購入したので”Hello World!”くらいやっとこうかと。なかなかよくできたキットで接続は簡単。
しかし,簡単サンプルのスクラッチをコンパイルしても思ったように表示されません。
サンプルには
print("Hello World!");
で「Hello World!」が出るってのに僕のLCDには・・・
おい!一文字しかでてねえじゃねえか!!
というわけで,Google先生に相談です。
・・・でも,表示できないことに関する解決策はあるのですが,
一文字しか表示されない件の解決策は見当たらない。
ちなみに,最初は一文字しか表示されない原因は,print()の仕様かと思って一文字ずつしかでないならprint()を並べたらどうだろうと思い,こんな風にしてみてみました。
print("H"); print("e"); print("l"); print("l"); print("o"); print("!"); . . .
すると,ちゃんと“Hello!”と表示され,出力は期待したものになりました。
でも,これでは使い物にならないですよね。ラッパー書くのもなんだか香ばしいし・・・
って,思って検索したらやっぱり,ラッパー書いてる人もいたし・・・(;゜ロ゜)
しかたない,こういうときはやっぱりオフィシャルのフォーラムが一番ですよね。
ありました。「A problem with my liquidCrystal_I2C display」。
というわけで,どうやらLiqudCrystal_I2C ライブラリのwrite() functionを修正する必要があるようです。
Forumによると,まずこの問題はArduino IDE1.6.6以降で確認されている問題なようです。しかし,問題の原因はIDEではなく,LiqudCrystal_I2Cライブラリに起因するらしい。
write() functionの返り値が正しくは”1″となるべきところが”0″になっているんだと。
んで,IDE 1.6.5以前ではそもそもwrite()の返り値を無視していたので問題が生じていなかっただけとのこと。それが新しいバージョンではきちんと返り値を見て,エラー(”0″)が返されていたら文字の送信を停止するのだとか。
print()で与えられた文字列をライブラリが一文字ずつ出力処理(write())をする際に一文字目の出力時の返り値が”0″になってしまっていてエラーとして処理されていた。
ということなんですね。こういうときのデバッグはどうしたらいいんだろう。エラーが生じていることが確認できればもう少し対処しやすいと思うんだけどな。
IDEの仕様など,まだ,ほぼ何も弄ってみてないのでさっぱりわからないことだらけです。デバッグ方法はできるだけ初期に身に付けておくことがセオリーですね。また時間を見つけて記事に出来ればと思います。
では,以下,今回の問題の対処法です。
ちなみに開発環境はMacですので,ディレクトリ構造などはMacのもので説明します。
■解決法:LiquidCrystal_I2Cライブラリの中のwrite()を書き換える。
① Arduino IDEにインストールされたライブラリは
「書類」->「Arduino」->「libraries」
の中に入っています。この中の「LiquidCrystal_I2C」->”LiquidCrystal_I2C.cpp”をテキストエディタで開きます。
② 10行目あたりにあるWrite.write(args)の返り値が以下のようになっていると思いますので,”1″を返すように書き直します。(return 0; のところです)
#define printIIC(args) Wire.write(args) inline size_t LiquidCrystal_I2C::write(uint8_t value) { send(value, Rs); return 1; }
保存してIDEを再起動してコンパイルすれば完了です。
なんて簡単。でも,意外と日本語での解説がうまく見つからなかったのでメモしておきます。
ちなみに,Hello WorldのスクラッチはSampleそのままです。
//DFRobot.com //Compatible with the Arduino IDE 1.0 //Library version:1.1 #include <Wire.h> #include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27,16,2); void setup() { lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.print("Hello world..."); } void loop() { }
(参考)
コメント
コメント一覧 (21件)
ありがとうございました!どこを調べてもでてこなくて機器不良かと思ってましたー
おお!こんな辺境のブログを参考にしてくださる方がいたとは!!
滅多に更新されない自己満足メモブログですが,少しでもお役に立てたなら幸いです。もっと人のお役に立てるような良記事をアップしていけるよう精進します!
同じく、LCD壊れているのかと思ってました。
やっといろいろ遊べそうです。感謝!
僕自身、Arduino触る時間がとれなくて、続編を全然書けずですが、こんな拙いメモがお役に立てて幸いです!コメントありがとうございます!
LiquidCrystal_I2C_PCF8574 というライブラリにも同様のbugがありました。
解決法に従って、cpp ファイルを書き換えたところ、正しく表示されるようになりました。
大変助かりました。ありがとうございました。
お役に立てて光栄です!
コメントありがとうございます!
いつの頃から一文字しか現れなくなってほっておいていました。
鉄道模型コントロールをArduinoでやりたい一心でアッチこち調べていたら貴殿のHPに出会いました。以前、LCM1602(LiquidCrystal_I2C)が一文字しか映らないのは機器の故障だと思いほったらかしにしていましたらバグだったのね。小生これで生き返った心地です。とても助かりました。どうもありがとうございました。
コメントいただきありがとうございます!
やはりこの記事が一番世のためになっているようで,光栄です。
なかなか忙しくて私自身Arduino触れてませんが,もっと有用なメモ記事書けるよう精進いたします!
鉄道模型いいですね!!楽しみましょう!!
おかげで、修正できました m(. .)m
どうも、ありがとうございました m(. .)m
こちらこそコメントいただきありがとうございます!
ありがとうございます!
助かりました!サンプルコード通りでも表示できず悩んでました!
いえいえ、こちらこそコメントありがとうございます。お力になれて何よりです。
助かりました!!
一文字ずつ打つ破目になりそうだったので感謝です。
お力になれてよかったです!
おかげさまで直りました。
助かりました。
LCDに「H」の一文字しか表示されない…
こんな簡単なこともできないなんて…
きっとコロナが収束しないのも私のせいだ…
そんなどん底まで落ち込んでいたところ、こちらの記事を見つけました
これで勝つる!コロナも収束する!
ありがとうございます!
お役に立てたようでなによりです!早くコロナが落ち着けばいいですね!
昔作ったソフトを久しぶりに動かしたら、アレ!表示が・・・? LCDのライブラリーを更新したら動いたので
もやもやしながらもそんなものかと思っていました。でもこの記事に出会えたおかげですっきりしました。 IDEを起動するたびに更新案内メッセージが出ても問題もないのに更新なんかするもんか!というのが私の主義なんで何も変えていないつもりだったのですが、肝心な事を見落としていました。PCのハードディスクの調子が悪くなりSSDに交換した際にIDEのバージョンが意図無く上がっていました。なお、ライブラリの新しいバージョンではご指摘のリターン値がさりげなく”1”になっていました。 ありがとうございました。
コメント、ありがとうございます!
今年に入ってばたばたしていたため、せっかくいただいていたコメントを承認しそびれていました。大変失礼しました。
古い記事ですが、お役に立てて光栄です。今後の励みになります!!
ありがとうございます。
夜な夜な色々と探したどり着けました。
危なく店にクレームを入れるところでした。(^0^;)
数ヶ月もご返信を放置してしまいました。忙しくて自分のブログを覗きにくる暇さえ無く。。。。
こんな昔の記事がお役に立てましたのなら幸いです。逆に言うと、未だにこの不具合って解消されていないんですね。
もっとこういうニッチな記事が書けるように機械いじりをする時間を取らないとなぁ・・・
また、良ければ覗いてください。