この記事では、以前に紹介した
・1602 LCDモジュールに任意の文字列を表示する方法
・赤外線リモコンのボタンを識別する方法
を組み合わせて、1602 LCDモジュールをマルチモニター化する方法を紹介します。
赤外線リモコンの押されたボタンに応じて、表示する文字列を切り替えることで、限られた表示範囲に複数の情報を出力することが可能になります。
動作確認済み環境
OS: Raspbian Buster with desktop(Release date: 2019-09-26)
プログラミング言語: python2(version=2.7.16) or python3(version=3.7.3)
用意するもの
・ブレッドボード × 1個
・1602 LCD ディスプレイモジュール × 1個
・1602 LCD ブラック IIC/ I2C / TWI/SPI シリアル インタフェース ボード モジュール(以降は「I2CシリアルIFモジュール」と呼称) × 1個
・赤外線受信機(VS1838B) × 1個
・赤外線リモコン(Car mp3) ※テレビのリモコンでも可
・LED素子 × 1個
・抵抗器 × 1個
・ジャンパワイヤ(オスーオス) ※下記の回路を参考に必要数を揃える
・ジャンパワイヤ(オスーメス) ※下記の回路を参考に必要数を揃える
・赤外線受信機は「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているVS1838Bを使用します。この赤外線受信機の動作電圧は5Vであるため、「Raspberry Pi 」の5V出力端子と直接接続するのみで動作しますが、他の赤外線受信機を使用する場合は仕様に合わせた電源の確保や抵抗器の準備が必要になる可能性があります。
・抵抗器の抵抗値は、GPIOピンの出力電圧(3.3V)と、LED素子の最大定格電流から、オームの法則(電圧(V)=電流(I)×抵抗値(R))をもとに決定してください。最大定格電流を超える電流を流すとLED素子が故障する可能性があります。「Kuman 35個 電子工作入門キット ラズベリーパイ」に同梱されているLED素子を使用する場合は付属の「CDチュートリアル」を参考に、抵抗値は220Ωのものを使用します。
配線方法
(設計図)
(I2CシリアルIFモジュール)
- 「Raspberry Pi」の5V出力ピン(5V)を、「I2CシリアルIFモジュール」の「VCC」端子に接続する。
- 「Raspberry Pi」のGPIO2ピン(I2C_SDA1)を、「I2CシリアルIFモジュール」の「SDA」端子に接続する。
- 「Raspberry Pi」のGPIO3ピン(I2C_SCL1)を、「I2CシリアルIFモジュール」の「SCL」端子に接続する。
- 「Raspberry Pi」のグラウンド(GND)を、「I2CシリアルIFモジュール」の「GND」端子に接続する。
「Raspberry Pi」のGPIO2、GPIO3ピンは、I2C通信の「SDA」「SCL」端子として使用します。
(赤外線受信機)
- 「Raspberry Pi」の5V出力ピン(5V)を、赤外線受信機(VS1838B)の「VCC」端子に接続する。
- 「Raspberry Pi」のGPIOピン(g26)を、赤外線受信機(VS1838B)の「OUT」端子に接続する。
- 「Raspberry Pi」のグラウンド(GND)を、赤外線受信機(VS1838B)の「GND」端子に接続する。
GPIOピンは26番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。
(LED素子)
- 「Raspberry Pi」のGPIOピン(g16)を、抵抗器(220Ω)を挟んで、「LED素子」のプラス側に接続する。
- 「Raspberry Pi」のグラウンド(GND)を、「LED素子」のマイナス側に接続する。
GPIOピンは16番を使用していますが、任意に変更可能です。ただし、後ほど紹介するPythonスクリプトで指定するピン番号は使用したピン番号に対応させる必要があります。
(実際の配線イメージ)
※実際には、「I2CシリアルIFモジュール」の端子をブレッドボードに直に刺して、
ジャンパワイヤで中継させています。
端子を直に刺すことで、以下のようにディスプレイを自立させることができます。
(Raspberry Pi 3のピン配置)
※UART、I2C、SPI用のピンも使用可能です。
プログラミング
①事前準備
以下の二つの記事を参考に、作成した回路に問題がないことを確認してください。
・1602 LCDモジュールに任意の文字列を表示する方法
→文字列が表示可能なことを確認する
・赤外線リモコンのボタンを識別する方法
→16番のGPIOピンに接続したLED素子を対応したLEDボタンから点灯可能なことを確認する
※赤外線リモコンの学習パターンは、この記事で作成したものをそのまま使用します。
②赤外線リモコンの識別処理を関数化
led_turn_on_by_irrp.pyのメイン処理(127行目)以降を関数化し、文字列表示機能とは別スレッドでループ処理を実装します。
識別結果格納用の変数current_buttonはグローバル変数化し、文字列表示機能と共有できるようにしています。
③LCDモジュールに表示する文字列取得関数を複数定義
今回は、「現在時刻」と「ブログのPV数」取得用の関数を「get_*_thread」という名前で定義しています。
それぞれcurrent_buttonが「b1」「b2」の時に、文字列格納用のグローバル変数current_messageを格納するように実装しています。
④LCDモジュールの文字列更新処理をメイン関数化
上記②③で作成した関数を対象にスレッドを立ち上げた後に、LCDモジュールの文字列更新処理をメインループとして実行します。
メインループ内では、グローバル変数current_messageが変更された時にLCDモジュールの文字列の更新させ、LEDを点灯させます。
プログラム全文 ※ブログのPV数の取得方法はこちらの記事を参考にさせていただきました。