前回までは、PIC基礎編でした(おそらく)。ピンのオンオフのみを使って何かを動かしていましたね。今回は、PICに備わる機能を使っていく応用編に入っていきます。PICプログラミング大全」が発売されています。まとまった情報が欲しい方はこちらの購入をお勧めします。今回は、以下の動画のように「液晶ディスプレイ」に文字を表示していきます。すごく難しそうですが、動けばいいという視点でいえば、主要関数はほぼコピペで問題ないので簡単です。必要なもの基礎編からプラスで必要なのは液晶ディスプレイ(LCD)のみですが、一応全て列挙します。モデルとは異なりますが、よくある1602系のLCDにI2C変換を施したものも販売されているようです。こちらも基本的に使い方は同じでしょう。下にリンクを載せておきます。Displayの略で、そのまま日本語に直すと液体結晶ディスプレイ、つまり液晶ディスプレイです。非常に低消費電力で、PICのような小さなマイコンでも駆動することができます。暗くても見えるバックライト付きのLCDもあります。これは若干高価なので、今回は導入としてバックライトなしのI2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キットを使います。このLCDとPICをI2Cという接続方法を使って、接続します。Circuitの略で、いろいろな機器間の通信をたった2本の線で実現するすごい方式です(語彙不足)。マスター(主)とスレーブ(奴隷)I2Cには、命令を送るマスター(主)と、命令を受けて何かをするスレーブ(奴隷)となる機器があります。スレーブには番号(スレーブアドレスと呼ばれる)が付いており、基本的にマスターが、通信したいスレーブのアドレス信号を送るスレーブ「あ、私呼ばれた。命令待ち状態に入ります。」マスターが命令やデータを送るスレーブが命令に沿って何かをする(データを送る・LCDに文字を表示する等)おわりという手順を取ります。刑務所で「おい、1番、そこを掃除しろ!」と1番に命令しているのを想像してみれば分かりますね(例えが悪いですね、すみません)。「1番」の時点で他の2番や5番などは「私じゃないな」と分かり、次の「掃除しろ」命令が聞こえても行動に移しませんよね。このような挙動を示すことから、命令を出す側をマスター、受ける側をスレーブと呼んでいるみたいです。SCLとSDAマスターとスレーブは、以下の図のようにSCLと呼ばれる線とSDAという線でつながっています。SCLがLOWの時にSDAがHIGHだとほにゃらら...等の挙動をして、データを送ります。どれも同じ原理で動くので、コピペしてしましましょう。今回は、そのような方式で行きます。詳しくI2Cについて知りたい方は、こちらのサイトが参考になるでしょう。I2C通信の使い方PICとLCD間の通信I2CにはSCLとSDAという線があることは上で説明しました。データシートを見てみましょう。14番ピンがSCLで、15番ピンがSDAですね。これを、それぞれ繋ぎたいスレーブのSCL,SDAに繋げば、回路は完成です。今回使用するLCDは、I2Cで接続するためのSCL,SDAに加え、電源用のVDDとGNDの4本のみで駆動できるようになっています。これを実現するためにキットの中に入っている変換基板があるのですが、このはんだ付けが初心者には非常に難しくなっています。細かいところへのはんだ付けの方法をググってから取り付けるといいでしょう。失敗しても吸い取れば直せますので、暖め過ぎにだけ気を付けてください。はんだ付け前の様子はんだ付け後の様子この基板上のSCLとSDAを、それぞれPICのそれに繋ぎ、+Vと書かれた部分に5V、GNDは当然0Vへ繋ぎます。これで回路は完成です。完成回路は、以下の写真のとおりです。これに、PICkit3を接続して書き込みます。PICにプログラムを書き込んでみようI2C接続ライブラリ(完全コピペ)I2C接続ですが、海外の方が非常に有用で簡潔なライブラリを作ってくれています。これをそのままコピペすれば、I2C接続ができます。}LCD接続テンプレートこちらは、私が構成したLCDを動かすための関数群です。これもコピペでいいでしょう。実は、下の関数はI2CLCDの説明書に書いてあるものをそのままPIC用にしただけです(特にLCD_init()はほぼ同じ)。writeData(wk);}}完成プログラム文字を表示させるには、上記で作成したLCD_str()に配列を渡すだけで実現できます。LCD_str(moji);とすれば終わりです。Wak-tech”を繰り返すようにしてみました。以下のようになります。}途中、writeCommand()がたくさん出てきてますね。これは、LCDの機能を呼び出す関数(コマンド)です。次回色々なコマンドを解説します。writeCommand(0x01)はLCDの画面を全てまっさらにするコマンドだということは知っておいて損はないです。全体コード(そのままコピペで動く)上記のすべての関数を組み込んだコードです。これをコピペして書き込めば、動画のように文字が表示されるはずです。次回は、今回解説しなかったLCDのcommandについて解説します。文字を一文字ずつ右にずらす等の機能が備わっていて、それをPIC側から使う、ということをしていきます。PMすばらしいですね。本当にコピー&ペーストでできました。アマゾンで次の二個を購入しましたが、PICマイコン駆動のネット資料が少なく断念。LCDブルーブラックライトこちらのページを参考にLCDを買いなおし、あっさり出来たので拍子抜けしてしまいました。可能でしたら、上記モジュールとLCDユニットのサンプルも作っていただけるとありがたいです。先ほどの名前本名なので変更願います。PMありがとうございました。思ってもみなかったので、小躍りして喜びました。ありがとうございました。1936にプログラムを入れてみましたが、やはり同じで、21番ピンに電源を入れないと動きません。19番のVSSは、接続してもしなくても変わりません。ブレッドボードがおかしいのか??と思い、新品のブレッドボードでも組んでみましたが、一緒の状況です。TECH」と表示中です。本当に頭が下がる思いです。ありがとうございました。ご覧になって、ヒントでも頂ければ幸いです。AM田崎様この度は弊サイトをご覧いただきありがとうございました!サイトも拝見させていただきました。無事動くようになり記事を書いた甲斐がありました。その状態で動くのは非常に不可解ですね...しかし写真を見る限り確かに21番ピンにVDDが接続されてますね。I2CでLCDを制御したいと思い、いろいろ検索してヒットしました。1.45で開発しています。コピペでいけるか?と思ってやってみましたが、どうも下記関数で無限ループに入っていて、処理待ちになってしまいます。0x1Aだとループに入らずに進んでくれます(LCDには表示されませんが・・・)I2C自体初めてで、「LCDが表示されない」という現象だけでどこから手を付けていいかも分かりません。お時間があるときにご教授ください。PMわかりやすい記事ありがとうございます。calledと出ます。液晶に何も表示されません。ご教授いただけると幸いです。お手数お掛けして申し訳ありませんが、宜しくお願い致します。PMコメントありがとうございます!そのメッセージは「_I2C_Master_RepeatedStart」がプログラム中で使用されていないだけで、問題ありません。記事中に記述し忘れましたが、「プルアップ抵抗」をSCLとSDLにつけてあげると通信が安定します。https://www.macnica.co.jp/business/semiconductor/articles/analog_devices/127585/を参考にしてください。PM10kオームのプルアップ抵抗をつけることで表示されました。ありがとうございます。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。支援のお願いサイト維持のため、ご支援をお願いします。Wellington.。