フィジカルコンピューティング with Raspberry PI Pico
13 デジタル温度計

今回は、温度をディスプレイで表示するデジタル温度計プログラムを作成します。

液晶ディスプレイ(LCD)

温度の表示には液晶ディスプレイ(LCD)を使用します。多くの入門用キットに含まれていて、安価で入手しやすいLCD1602というモデルを使用します。LCD1602では、16文字 x 2行が表示できます。単品で買うときには必ず3.3V用のLCDを買うようにします。5V用のものを使うとPicoがダメージを受けるおそれがあります。

液晶ディスプレイ(LCD)と有機EL(OLED)の違い

身近なところでは、スマホの画面の種類で耳にすることがよくあります。LCDは、後ろから光を当て、電圧を操作して液晶(液体と結晶の化合物)の並びを変えることで、表示内容を表現します。有機EL(OLED)と比べると安価で、安いスマホの画面によく使われます。OLEDはこれに対し、それ自体が発光する有機物質が使われているので、明るい場所でも画面が見やすく、高価なスマホの画面に使われます。

I2Cプロトコル

PicoはI2C(アイ・スクエアド・シー、アイ・アイ・シー)という名前の通信の決まり(プロトコル)を使って、LCD1602とやりとりします。やりとりにはSDAというデータ用の線と、SCLというタイミングの同期のための線を使います。

PicoにはI2C0とI2C1の2つのチャンネルがあり、I2C0 SDAとI2C0 SCLを、I2C1 SDAとI2C1 SCLをペアで使用します。

配線
Raspberry Pi Pico LCD1602
GP0(I2C0 SDA) SDA
GP1(I2C0 SCL) SCL
VSYS VCC
GND GND

LCD1602の接続部の拡大写真

ライブラリ(パッケージ、モジュール)の入手

プログラムを作成するに当たっては1つ問題があります。I2C通信は非常に複雑で、そのまま扱おうとすると、何をやっているのか理解するまでにかなりの時間を要します。しかしありがたいことに、プログラミングの先人たちがこれを簡単に行えるライブラリやパッケージを公開してくれています。

ではどうやって探せばよいのでしょう? 以下にその一般的な方法を紹介します。

ライブラリを探す

ライブラリにもさまざまなものがあるので、それが自分の問題を解決してくれるものかどうかは、実際に使ってみないと分かりません。

  1. 入門キットに含まれているものを使う方法
  2. 一番確実。使い方はキットの説明書に書かれています。

  3. Thonnyで探す方法
  4. Thonnyにはライブラリを検索する機能がついています。メニューの[ツール]->[パッケージを管理]を選択すると、検索画面が表示されるので、バーにキーワードを入力して検索します。

    検索結果には簡単な説明文が書かれているので、それをヒントに使えそうなものを探しリンクをクリックします。すると、詳しい情報のページに飛ぶので、そこでさらに調べたり、そこからダウンロードしたりできます。

  5. githubのmicropython /micropython-libで探す方法
  6. githubのmicropython /micropython-libでは、MicroPythonでの動作に特化したライブラリが多く公開されているので、そこで探します。

  7. インターネット一般で検索して探す方法
  8. Webページの投稿記事などを検索し、成功例を探します。中には情報が古いものや正確でないものもあるので、そこは注意します。

パッケージの入手とPicoへの保存

以降では、githubの[sshahryiar/Raspberry-Pi-PICO—RP2040]ページにあるI2C LCD Testから、I2C_LCD.pyとPCF8574.pyを入手して使用する例を紹介します。

以下は具体的な手順です。

  1. Thonnyのエディタに新規ファイルを開いておきます。
  2. I2C_LCD.pyのページを開き、ページ右にある[コピー]ボタンをクリックして、Thonnyのエディタにペーストします。
  3. [ファイル]->[名前を付けて保存]を選択して、[Raspberry Pi Pico]をクリックして選択します。
  4. 表示される保存ダイアログで、ファイル名にI2C_LCD.pyを入力し(大文字小文字も正確に)、[OK]ボタンをクリックします。
  5. PicoのストレージにI2C_LCD.pyが保存されます。
  6. 同じことを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に表示される数字も大きくなります。

“フィジカルコンピューティング with Raspberry PI Pico
13 デジタル温度計” への1件の返信

  1. ありがとうございます こんなに丁寧に書いて頂ける 再度初めてみました
    初心者にはとても助かります ありがとうございました
    とても分かりやすいです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


2023年7月
 12
3456789
10111213141516
17181920212223
24252627282930
31