#はじめに
この夏、とうとうラズパイに手を出し始め、Raspberry Pi4や、Raspberry Pi Picoをいじっているのですが、Raspberry Pi Picoとこの組み合わせ、
- LCD(AQM0802-PCA9515)
- 温度センサー(LM61CIZ)
I2C接続のLCDと、アナログの温度センサーの組み合わせはRaspberry Pi Picoではまだあまり見かけないレアケース(?)かもしれないので、以下のサイトを参照した結果を記載します。
てなわけで、当方まだまだラズパイ(とPython)は初心者なので、間違い等がありましたら、ご指摘いただければ幸いです。
#参照サイト
以下のサイトを参照しました。特にPicoの情報はまだまだ少ないので、先人の方々に感謝!
[CircuitPythonに温度センサーLM61CIZ(analog)を接続する]
(https://beta-notes.way-nifty.com/blog/2020/03/post-366f1d.html)
[ラズパイでAD変換!Picoでアナログ入力してみた]
(https://misoji-engineer.com/archives/raspberrypi-ad-pico.html)
[Raspberry PiとTWE-Liteで室温・気圧を測ってみた (2)]
(https://www.zukeran.org/shin/d/2015/03/11/raspberry-pi-and-twe-lite-2/)
#部材
すべて秋葉原の秋月電子で購入しました。
Raspberry Pi Pico
ラズパイPico。OSさえ無い。MicroPython(とC/C++)が走るマイコン基板。たったの550円。
ブレッドボードに接続するため、20ピンヘッダーをはんだ付けしました。はんだ付けができない/面倒な方は、ツクレルからピンが付いたのが販売されていますのでそちらをどうぞ。
Raspberry Pi 3/4系(zeroも?)はアナログ入力に対応しておらず、アナログ出力のセンサーをつなぐ際はADコンバーターをかまさないといけませんが、Picoだと5pin(一応ADC0〜2の3つは使える)があるので、アナログ出力のセンサーを直接つなげられます。
ブレッドボード
定番のBB-801
LCD
AE-AQE0802+PCA9515
秋月電子で「Raspberry Pi キャラクタ液晶ディスプレイモジュール完成品」として販売されているものです。
「Raspberry Pi キャラクタ液晶ディスプレイモジュールキット バックライト付」でも良かったのですが、はんだ付けが面倒だったので、完成品にしてしまいました。
ブレッドボードへの接続は、ジャンパーピン接続だとケーブルだらけになってしまいますし、普通のピンヘッダーだとブレッドボードの上に立ってしまい表示内容が読みづらいので、ピンヘッダ (L型) 1×6 (6P)でブレッドボード上に寝かせるように接続しています。
温度センサー
高精度IC温度センサLM61CIZ
LC61CIZのスペックシートはメーカーのTI社の方針で、秋月電子のページからリンクもありません。TI社で公開しているスペックシートはこちら。
このセンサーのRaspberry Piでの使用例はあまり見かけませんでした(それで結構悩ませてくれました)。なので、解説本とかによく紹介されているMCP9700A-E/TOとかをお勧めします。LM61CIZより25円安い30円ですし。
【補足】 LM61CIZのピンの配置について
スペックシートに記載がありますが、ピンの配置はセンサーの平たい方を下にして足をこちらに向けて(スペックシートと逆の説明だなこりゃ)、左から
LM61CIZ | Pico |
---|---|
GND | GNDに接続 |
Vout | ADCに接続 |
+Vs | 3v3(OUT)に接続 |
となります。 |
その他
ジャンパーピン(オス-オス)多数。
#構築環境
iMac(10.13.6)
ちょっと古いです。逆に最新のM1チップを積んだMacだとThonnyとか動くのかなぁという心配もあって、当分この環境ですかね。
MacでRaspberry Pi Picoをつないで、MicroPythonを使える環境にする方法は、いろいろな方が親切懇切丁寧に説明されているので、そちらを参照してください。
#Raspberry Pi PicoとLCD+温度センサーの接続
最初、温度センサーだけをPicoにつないで動作確認。
次に、LCDだけをPicoにつないで動作確認。
その上で温度センサーとLCDの両方をPicoつなぐと、shell上で110℃と表示したり、LCDに何も表示できなかったりとハマりました。いろいろと出てきた値を見たり、ジャンパーピンの接続を変えた結果が、以下のとおりです。結局LM61CIZのGND接続を変えたら正常動作しました。GNDはどこでもOKと思ったのですが、選ぶんですかね?
Raspberry Pi PicoとLCD+温度センサーは以下の接続で動作を確認。
###Pico to AQM0802
Picoピン番号(GPIO) | AQM0802 |
---|---|
38([GND]) | GND |
36(3V3(0UT)→ブレッドボードの[+] | 3V3接続 |
32(GP27[ADC1]) | SCL |
31(GP26[ADC0]) | SDA |
###Pico to LM61CIZ
Picoピン番号(GPIO) | LM61CIZ |
---|---|
3([GND]) | GND |
34(GP28[ADC2]) | Vout |
36(3V3(0UT)→ブレッドボードの[+] | 3V3 |
両方とも3V3を使うので、AQM0802とLM61CIZの3V3はブレッドボードの[+]を経由して両方接続しています。 | |
LCDでADC0とADC1を使うので、LM61はGP28のADC2を使います。 |
で、先ほども書きましたが、なぜかLM61のGNDを23pinのGNDにつなぐと、センサーからの値(電圧ですね)が単体で動かした時と違う値になってしまいました。
それでピン番号「3([GND])」にためしに接続したところ、単体試験と同じような値となりました。
これを書きながら調べていたのですが、以下のサイト見ると、
https://kirikoshokunin.hatenablog.com/entry/2021/04/13/234321
ADC_VREFとAGNDの方をむしろ使えばよかったのかな?
てか、これ、もう動かしてる写真でした。。。
#コード
コメントに日本語まじりのところはご愛嬌。そこが試行錯誤したところです。
参照先のサイトに掲載されているものを切り貼りしています。
#LM61CIZ
import machine
import utime
#AQM0802
from machine import Pin, I2C
from micropython import const
from utime import sleep
#LM61 Vout connected to 34pin(ACD2)
#input LM61CIZ , convert voltage to temp value
sensor_temp = machine.ADC(2)
conversion_factor = 3.3 / (65535)
#AQM function
_ST7032 = const(0x3e)
_SETTING = const(0x00)
_DISPLAY = const(0x40)
#AQM initialized
def init(i2c):
orders = [b'\x38', b'\x39', b'\x14', b'\x73', b'\x56', b'\x6c',
b'\x38', b'\x0c', b'\x01']
sleep(0.04)
for order in orders[:6]:
i2c.writeto_mem(_ST7032, _SETTING, order)
sleep(0.001)
sleep(0.2)
for order in orders[6:]:
i2c.writeto_mem(_ST7032, _SETTING, order)
sleep(0.001)
sleep(0.001)
#AQM show setting
def show(i2c, string):
i2c.writeto_mem(_ST7032, _SETTING, b'\x01')
sleep(0.002)
for i in string:
i2c.writeto_mem(_ST7032, _DISPLAY, i.encode())
#AQM show setting
def main():
i2c = I2C(1, scl=Pin(27), sda=Pin(26))
init(i2c)
#display temp data
show(i2c, tempdata)
while True:
#センサーから値を取り出します
reading = sensor_temp.read_u16() * conversion_factor
#センサから取り出した電圧
#print(sensor_temp.read_u16())
# 電圧を温度に変換
temp_calc = (reading*1000-600) / 10
#shellに表示
#print("{0:.1f}".format(temp_calc) + "C")
#print(reading)
#tempdata = str(temp_calc)
#小数点以下1位のみ表示+ 温度のCをつける
tempdata = ("{0:.1f}".format(temp_calc) + "C")
#Run
if __name__ == '__main__':
main()
# 動作確認用のLチカ
led = machine.Pin(25, machine.Pin.OUT)
led.value(1)
utime.sleep(0.2)
led.value(0)
#each 2 second
utime.sleep(2)
動作確認用、というか、地味なLCD表示を2秒ごとに更新してるのですが、温度に変化がないと動いているかわかりません。
そこで動作していることを分かりやすくするためにRaspberry Pi Pico本体のLEDを点滅させています。
普通はいらないと思うので、お好みに応じてコメントアウトしてください。
逆にコメントアウトでたっぷり残しているところは、動かなくなった時、動作確認のため値を表示させていたところです。
#実行
Raspberry Pi Pico本体のLEDが点滅しています。
動作確認用に奥においた温度計は、これもまた秋月電子で180円で購入しました。
ミニサーモメーター(小型温度計モジュール) ブラック(黒)
8秒ごとに温度更新。なにせこの価格なので、あくまでもRaspberry Pi Pico側の動作確認するための比較対象としてです。
温度センサーのスペックシートを見ると「Accuracy at 25°C」で「±2°C or ±3°C」とありますので、まぁこんなものかな、と。比較対象の温度計も全然厳密に測定しているわけではないので(LCD込みで価格はLM61CIZの3倍以内というシロモノ)、だいたいこんなものでしょう。
この情報がどなたかのお役に立てば。。。
それにしても私の部屋、エアコン付けているのに暑いな。