目次
概要
Raspberry Pi のI2Cインタフェースには、I2Cリピータが必要です(ドライブ能力の低いデバイスからの受信ができない)。
とはいえ、LCDの場合、表示データを送信できれば良いので、Raspberry Pi側の受信は必須ではありません。そこで、本稿では、I2C信号を一方的に送信しつづける方法で、I2Cリピータやプルアップ抵抗なしにLCDに表示します。
動作原理
下図は、動作中のI2C信号の様子です。上側の波形SDAは、I2Cデータで、無信号時はHレベルです。下側のSCLはクロックです。LCDは、8ビット毎にLレベルのACKを送信します。ところが、LCDのドライブ能力が不十分で約1Vの電圧が残留し、Raspberry Pi側はACKを受信することが出来ません。
ACKを受信できなかった場合、通常はエラーになります。しかし上図では、ACK未受信にも関わらず次のデータを送っています。これは、筆者が製作したRaspberry Pi用LCDドライバが、ACKを無視して、次の信号を送信するからです。
なお、この方法は、トランジスタ技術2016年9月号P.113で「ACKを無視すれば表示可能」と紹介した記事の詳細です。
使用機材
Raspberry Pi 全機種で動作すると思います。LCDモジュールは秋月電子通商の AE-AQM1602A(KIT) を使用しました。I2C接続のキャラクタ表示LCDであれば、他の多くのLCDでも動作すると思います。
- Raspberry Pi Zero/2/3/4 および周辺機器
- I2C接続キャラクタ表示LCD AE-AQM1602A(KIT)
- ミニブレッドボード 25穴 (配線用)
- 配線用の電線など
回路図
Raspberry PiのI2C信号と電源をLCDモジュールに直接、接続します。LCDの電源+Vは、Raspberry Piの3.3Vに接続しました。GPIOに接続して、LCDの電源を制御する方法もあります。
ハードウェアの製作
上記の回路図通りに4本の電線をLCDモジュール AE-AQM1602A(KIT) に配線すればハードウェアは完成です。
ソフトウェアの製作
筆者が作成したLCDドライバ用ソフトウェア raspi_lcd を、以下のコマンドで、ラズベリーパイにインストールしてください。
$ cd ⏎
$ sudo apt install raspi-gpio ⏎ (古いOSの場合のみ必要)
$ sudo apt install git ⏎ (LITE版OSの場合に必要)
$ git clone https://bokunimo.net/git/raspi_lcd ⏎
$ cd ~/raspi_lcd ⏎
$ make clean ⏎
$ make ⏎
raspi_lcd のテスト方法
動作確認を行うには、LCDドライバ用ソフトウェア raspi_lcd にオプション「-i」と「-w16」を付与して、LCDに表示したい文字列を渡してください。
$ ./raspi_lcd -i -w16 "Raspberry Pi LCD by bokunimo.net" ⏎
オプション「-i」は、LCDからのACKが無くても送信動作を継続するモードです。「-w16」はLCDの表示桁数の設定です。未指定時は8桁なので、AQM0802の場合は「-w16」が不要です。
raspi_lcd の使用法
「-h」オプションで raspi_lcd の使用法を表示します。
$ ./raspi_lcd -h
Usage:
./raspi_lcd [-i] [-f] [-r port] [-w lcd_width] [-y row] [text...]
echo text... | ./raspi_lcd [-i] [-f] [-r port] [-w lcd_width] [-y row]
./raspi_lcd -h
オプション(in Japanese):
-i I2C通信のエラーを無視する
-f 標準入力から待ち受けを行う(終了しない)
-rPORT 液晶のリセット信号用GPIOポート番号
-wWIDTH 液晶の表示桁数8または16
-yROW 表示行1または2
text... 表示したい文字列
-h 本ヘルプの表示
サンプル・プログラム
同じフォルダ内に、サンプル・プログラム example.sh を準備しました。表示したい文字列を、前述のLCDドライバ用ソフトウェア raspi_lcd へ受け渡す lcd 関数の定義と、表示例が含まれています。以下のように、lcd 関数に続く2行分の文字列を raspi_lcd に渡します。
# LCDへの文字列表示例
echo `date` "Example for AQM1602A/Y/Grove ----------" >> $LOG 2>&1
lcd "`date`" "AQM1602A/Y/Grove" >> $LOG 2>&1
sleep 5
lcd "0123456789ABCDEF" "16 ケタ マデ ヒョウジ" >> $LOG 2>&1
sleep 5
多言語表示
日本語カタカナ表示方法
かつて、キャラクタLCDには、日立製作所(当時)の HD44780 が搭載されており、現在もHD44780互換ICが主流となっています。その名残で、世界中で売られているキャラクタ液晶の多くが日本語のカタカナに対応しています。
文字コードUTF8の半角カタカナで、文字列を渡すだけでカタカナ表示が出来ます。
$ ./raspi_lcd -i -w16 "ボクニモワカルRaspiLCDfor Grove-LCD BL" ⏎
下図は、中国 Seeedstudio が販売する Grove-LCD での実行例です。ちゃんと、カタカナ表示ができました。
お Français 語表示
拡張ラテン文字の一部も内蔵しているので、フランス語表示も可能です。ただし、LCDに内蔵していない小文字の「œ」は「oe」で代用、大文字の多くは小文字で表示します。
こちらもカタカナ同様にUTF8の形式で渡しますが、フランス語の入力環境が必要です。手っ取り早く確認するにはダウンロードしたフォルダ内の french.sh を実行するのが良いでしょう。
筆者は、ダウンロードした楽曲の表示を目的としているので、フランス語の文字入力環境については調べていません(OSの言語設定をフランス語に変更し、フランス仕様のキーボードを接続すれば入力可能と思います)。
お Français 語表示の余談
実は、拡張ラテン文字の表示だけで丸1日を費やしました。日本語のカタカナは、キャラクタLCD用文字コードとUTF8との間で規則的な関係になっています。しかし、拡張ラテン文字は、下図のように規則性がありません。例えば、LCDでは「âäàå」と並ぶのに対し、UTF8では「àáâãä」です。さらに、OS上でラテン文字を扱うのにも時間を要しました。
(キャラクタLCD用の文字コード)
LCD 0x80~0x8F ÇüéâäàåçêëèïîìÄÅ
LCD 0x90~0x9F ÉæÆôöòûùÿÖÜñÑ//¿
LCD 0xE0~0xEF áíóú¢£\\/§ıÃãÕõØø
(UTF8の文字コード)
UTF8 0xC380~0xC38F ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
UTF8 0xC390~0xC39F ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
UTF8 0xC3A0~0xC3AF àáâãäåæçèéêëìíîï
UTF8 0xC3B0~0xC3BF ðñòóôõö÷øùúûüýþÿ
上図のテキストの作成だけでも、区別のつきにくいアルファベットに奮闘し、LCD画面で確認してバグ修正するにも、何度も見間違いをしました。まだ間違っているかもしれないので、もし誤りを見つけられた方は、ぜひ教えていただけるようお願いします。
GitHub Pages
ソフトウェアの最新情報は、下記で公開しています。
Raspberry Pi用 I2C LCDドライバの解説ページ
https://git.bokunimo.com/raspi_lcd/
ご注意
本LCDドライバ用ソフトウェア raspi_lcd でオプション「-i」を付与した場合、動作原理に記載の通り、本来のI2C通信で必要なACKの確認をしておりません。実証実験用やホビー向けとしては、一定の実用レベルで動作しますが、商品として販売する機器には向いていません。
筆者は、常時動作の機器の運転表示に使用していますが、LCDの電源をGPIOから供給し、一定の間隔(1分おき)でLCDをハードウェア・リセットを行うことで、通信エラーによる誤作動を防止しています。
関連記事
下記の図またはタイトルをクリックすると閲覧できます。
「I2Cキャラクタ LCD AQM1602 0802 を Raspberry Pi に直結」への2件の返信
[…] I2Cキャラクタ LCD AQM1602 0802 を Raspberry Pi に直結 […]
[…] 楽曲のファイル名を「アーチスト名␣-␣タイトル」の様式で保存すると、基本アルファベット以外のラテン文字を含む表示が可能 I2Cキャラクタ LCD AQM1602 0802 を Raspberry Pi に直結 […]