秋月のI2C接続キャラクタLCDを Raspberry Pi 使う方法を紹介します.
Rasberry Pi と LCD モジュールを接続しようとした場合,一般的な LCD モジュールは,I/O 電圧が 5V だったりインターフェースがパラレルだったりするので,ちょっと苦労することになります.
その点,この LCD モジュールは,3.3V での I2C で制御できるので,直結することができます.
問題点
ただし,一つ大きな欠点があります.それは,I2C の標準モード(Standard Mode) である 100kHz に対応していないこと.
データシートにの Clock Frequency の規定としては 100kHz とあるので一見問題無いようにみえるのですが,その下にある Clock Low Period が 5.2us と規定されており,100kHz Duty 50% 時の値である 5us を上回ってしまっています.
解決策
これを解決する方法としては,以下の2つあります.
- I2C の周波数を下げる
- LCD モジュールのファームを書き換えて 100kHz に対応させる
周波数を下げる場合,ドライバのロード時に引数で周波数を指定すればOK.例えば 50kHz にする場合,このページにあるように,下記のようにします.
1 |
$ sudo modprobe i2c-bcm2708 baudrate=50000 |
ただし,この方法だと 100kHz 対応しているデバイスとの通信も遅くなってしまうので,あまり嬉しくありません.
そこで,以降ではファームを書き換える方法について説明します.
ファームの書き換え
基本的には,下記のページで紹介されているファームを書き込めば OK です.
I2C LCD ACM1602NI用プログラム(解析資料)
http://www.ne.jp/asahi/air/variable/picmel/applications/ACM1602NI/
ただ,私もそうでしたが,PIC の書き換えを行ったことがない人にはこれだけだとちょっとハードルが高いので,以降では少し詳しく手順を紹介します.
- ファーム書き換え用のツールである PICkit3 を入手します.秋月では4,500円しますが,AliExpress とかを使って個人輸入すれば送料込みで 2,000円未満で済むのでお勧めです.
-
書き込みソフトである,PICkit 3 Programmer App and Scripting Tool を Microchip のページからダウンロードしてインストールします.
Downloads Archive
http://www.microchip.com/pagehandler/en-us/devtools/dev-tools-parts.htmlソフトを動かすには,.NET framework version 4.00 が必要になりますので,適宜こちらもダウンロードします.
-
LCD モジュールと PICkit の間を下記のように接続します.
余談ですが,接続に使用するケーブルは,AliExpress のJumper wire Dupont cableとかを利用するとリーズナブルです.
- パソコンと PICkit3 を USB ケーブルで接続し,PICkit 3 Programmer を起動します.
-
「Device」として PIC16F689 を選択します.
-
[File]→[Import Hex] をクリックして,書き換え対象のファームを読み込みます.
ファームは,以下のいずれかがお勧めです.- I2C LCD ACM1602NI用プログラム(解析資料)のファーム
- 「プログラムダウンロード」の場所からファイルをダウンロードし,中に含まれる dist/default/production/lcd_i2c_16f68x.X.production.hex がファーム.
- 上記をもとに私の手元でビルドしたファーム
-
ACM1602NI.zip
機能としては上記と変わりませんが,電源 ON すると,自動的に「Initializing…」と表示されるようにしてあります.実際になにか作るときの見栄えが良くなるかと思います.ソースの変更点については同封してある diff.txt を参照ください.
- Write ボタンをクリックしてエラーが出なければ書き換え完了.
-
Raspberry Pi 等と接続してやれば,普通に動作します.
例えば,下記のコマンドを入力すると,「ABCabc」と表示されます.
1234567891011$ sudo /usr/sbin/i2cset -y 1 0x50 0x00 0x01 # clear display$ sudo /usr/sbin/i2cset -y 1 0x50 0x00 0x38 # function set: 8bit, 2lines, 5x8$ sudo /usr/sbin/i2cset -y 1 0x50 0x00 0x0c # display on, no cursor$ sudo /usr/sbin/i2cset -y 1 0x50 0x00 0x06 # direction=INC, no shift$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x41 # 'A'$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x42 # 'B'$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x43 # 'C'$ sudo /usr/sbin/i2cset -y 1 0x50 0x00 0xc0 # move to second line$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x61 # 'a'$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x62 # 'b'$ sudo /usr/sbin/i2cset -y 1 0x50 0x80 0x63 # 'c'
コメント
ご存知だと思うのですが念のため。
AliExpressのPICKIT3はコピー品です。
サイト主様
大変参考になるページをありがとうございます。
こういうページがあると私みたいな素人には大変参考になります。
早速ですが、大切な注意点がひとつ抜けているとおもいます。
3のところで PIC KitのVDD端子をLCDのVDDにつながないといけないのに、
その結線が書かれていませんです。
結果そのため表示がうまく出来ませんでした。
それは知り合いの社長が教えてくださいました。
あとは大丈夫です。ありがとうございました。
ご指摘ありがとうございます.時間ができたときに図を変更したいと思います.
管理人様 早速の対応ありがとうございます。
助かります!
これでUECS-PIで表示が出来そうです。
[…] なやまして,あれこれ,くぐりましたがその原因にやっと行き着くことがで きました。やはり先達は,すごい。なんと,ACM1602NIは,I2Cの標準通信速度の要件をみたしていなかっ たのです […]