LCD1602の接続部の拡大写真
ライブラリ(パッケージ、モジュール)の入手
プログラムを作成するに当たっては1つ問題があります。I2C通信は非常に複雑で、そのまま扱おうとすると、何をやっているのか理解するまでにかなりの時間を要します。しかしありがたいことに、プログラミングの先人たちがこれを簡単に行えるライブラリやパッケージを公開してくれています。
ではどうやって探せばよいのでしょう? 以下にその一般的な方法を紹介します。
ライブラリを探す
ライブラリにもさまざまなものがあるので、それが自分の問題を解決してくれるものかどうかは、実際に使ってみないと分かりません。
入門キットに含まれているものを使う方法
一番確実。使い方はキットの説明書に書かれています。
Thonnyで探す方法
Thonnyにはライブラリを検索する機能がついています。メニューの[ツール]->[パッケージを管理]を選択すると、検索画面が表示されるので、バーにキーワードを入力して検索します。
検索結果には簡単な説明文が書かれているので、それをヒントに使えそうなものを探しリンクをクリックします。すると、詳しい情報のページに飛ぶので、そこでさらに調べたり、そこからダウンロードしたりできます。
githubのmicropython /micropython-libで探す方法
githubのmicropython /micropython-lib では、MicroPythonでの動作に特化したライブラリが多く公開されているので、そこで探します。
インターネット一般で検索して探す方法
Webページの投稿記事などを検索し、成功例を探します。中には情報が古いものや正確でないものもあるので、そこは注意します。
パッケージの入手とPicoへの保存
以降では、githubの[sshahryiar/Raspberry-Pi-PICO—RP2040]ページにあるI2C LCD Test から、I2C_LCD.pyとPCF8574.pyを入手して使用する例を紹介します。
以下は具体的な手順です。
Thonnyのエディタに新規ファイルを開いておきます。
I2C_LCD.pyのページを開き、ページ右にある[コピー]ボタンをクリックして、Thonnyのエディタにペーストします。
[ファイル]->[名前を付けて保存]を選択して、[Raspberry Pi Pico]をクリックして選択します。
表示される保存ダイアログで、ファイル名にI2C_LCD.pyを入力し(大文字小文字も正確に)、[OK]ボタンをクリックします。
PicoのストレージにI2C_LCD.pyが保存されます。
同じことをPCF8574.pyで繰り返します。
LCD1602を使用するこのプログラムでは、Picoの手の届くところに、I2C_LCD.pyとPCF8574.pyが必要なので、Picoに保存する必要があります。プログラムではI2C_LCD.pyをインポートし、I2C_LCD.pyではPCF8574.pyをインポートするので、これらは下図の依存関係にあると言えます。
Picoへのアップロード
PC本体にダウンロードし、それをPicoに送ることもできます。Thonnyの[ファイル]ビューで送信したいファイルを右クリックし、表示されるコンテキストメニューから[/をアップロード]を選択します。
プログラムコード
githubのプロジェクトページには、ライブラリやパッケージの使い方が書かれている場合が多くあります。もちろん個人やグループが記述しているものなので、企業のマニュアルほど丁寧ではありませんが、無償で利用できるので文句は言えません。
[Raspberry-Pi-PICO—RP2040/I2C LCD Test/ ]の場合には、簡単なプログラムがmain.pyに書かれているので、これを参考にします。
# sshahryiar/Raspberry-Pi-PICO---RP2040
# https://github.com/sshahryiar/Raspberry-Pi-PICO---RP2040
from machine import Pin,I2C
import utime
# main.pyを参考にインポート文を書く
from I2C_LCD import TWI_LCD
sda = Pin(0) # PicoのSDAはGP0ピン(I2C0 SDA)
scl = Pin(1) # PicoのSCLはGP1ピン(I2C0 SCL)
# I2C()関数にチャンネル番号、SDA、SCLのピン、周波数を渡して、I2Cオブジェクトを作成する
i2c = I2C(0,sda=sda, scl=scl, freq=400000)
# 通信相手のLCD1602を特定する固有の値(アドレス)を調べる
addr = i2c.scan()
print(addr[0]) # 39、10進数
print(hex(addr[0])) # 0x27、16進数
# TWI_LCD()関数に、I2CオブジェクトとLCD1602のアドレスを渡して、
# LCD1602を操作するTWI_LCDオブジェクトを作成
lcd = TWI_LCD(i2c,0x27)
lcd.clr_home
lcd.goto_xy(1, 0)
lcd.put_str("RP2040 uPython")
コメント文を入れているので少し長くなっていますが、必要なライブラリやパッケージをインポートし、PinとI2Cオブジェクトを作成して、通信相手のLCD1602を特定する数値を調べ、それらを使ってLCD1602を操作するオブジェクトを作って、実際の画面に文字を表示する、ということを行っています。
インポートしたパッケージを使っているのは最後の4行だけです。このパッケージを利用すると、たった4行で文字の表示までたどり着けます。
分かりづらいのが、addr = i2c.scan()の行でしょう。実はI2C通信では、マスター(制御する側)であるPicoに2つスレーブ(制御される側)が接続できるので、どれを通信相手にするのかを特定する必要があります。ここではi2c.scan()を使って、LCD1602固有の値を調べています。
i2c.scan()は値を10進数で返しますが、インポートしたパッケージのTWI_LCD()関数には16進数で渡す必要があるので、hex()関数を使って16進数値を調べています。
デジタル温度計の作成
ここまで来ると、後はもう難しくありません。これまでに得た知識と経験でらくらくです。
プログラムコード
from machine import Pin,I2C,ADC
import utime
from I2C_LCD import TWI_LCD
# Picoの温度センサー
sensor_temp = ADC(ADC.CORE_TEMP)
conversion_factor = 3.3 / (65535)
# I2C通信
sda = Pin(0)
scl = Pin(1)
i2c = I2C(0,sda=sda, scl=scl, freq=400000)
# LCD
lcd = TWI_LCD(i2c,0x27)
lcd.clr_home
# 温度センサーの値を読み取り、LCDに表示する
while True:
reading = sensor_temp.read_u16()*conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
lcd.goto_xy(1, 0)
lcd.put_str("Temp: " + str(temperature))
utime.sleep(10)
プログラムを実行すると、LCD1602に温度が表示されます。Picoに息を吹きかけるなどして温度を上げると、LCDに表示される数字も大きくなります。
投稿ナビゲーション
ありがとうございます こんなに丁寧に書いて頂ける 再度初めてみました
初心者にはとても助かります ありがとうございました
とても分かりやすいです