真間

2023年8月12日

Raspberry pi pico

先日秋葉原のマルツパーツに行くと、マイコンボードのichigojamとRaspberry pi picoが売られていました。

マイコンボードは触ったことがなく事前情報もなかったので、この機会に触ってみようと思い購入してみました。

こどもパソコンichigojam

プログラミングお試しセットといった感じの国産のマイコンボードです。

本体が2500円、スターターフルセット1万円程度と少々高いがキットを揃えればこれ単体でプログラミングを体験可能なマイコン

古き良きBASICを元にした言語でプログラミングを行う

raspberry pi pico

まずははんだごてを握ることからはじまるTHE 電子工作

イギリスのrasberry pi財団によって開発されている。

1000円前後で買えるマイコン

USBケーブルでPCにつなげてThonnyというIDEを使用して操作する

micro Pythonを使用でき、流行りのpythonと同じ文法(厳密には違う模様)でマイコンを操作できる。

共通

ブレッドボードやジャンパ線、LED、LCDディスプレイ、各種センサーやICなどを駆使して電子工作ができる(らしい)

ichigojamはアナログ入力のあるテレビ(!)とキーボードがないので使えませんでした。

raspberry piははんだごてでピンヘッダさえつければ使えるようになります。

ピンヘッダーは通常は別売りですが、今回は付属されているマルツさんのキットを購入しました。

取り付けはそんなに難しくないのでさっくりと作業しました。

この状態にできたものの、何に使うか悩みました。

長年、パイプタバコを吸っているのですが、頻度が少ないので一つ買っても吸いきらない事が多いです。

そのため、溜めてしまって完全に乾いてしまっていました。

着香系のタバコはだいたい湿度70~75%がよいと言われています。

高すぎると味が薄くなり、低すぎると辛くなります。

どれも乾ききっていたのでとりあえず全て加湿をして、よく吸うものはボトルに入れようかと思いました。

そこで、ボトルにいれるだけだとつまらないので、Raspberry pi picoで湿度がわかるようにできれば良いと思いました。

偶然にも過去に使ったDHT22(温度・湿度センサー)がありました。

当初はLEDの青黃赤だけで表現しようかと思いましたが、LCDディスプレイもあったので数値も表示させることにしました。どこのご家庭にも落ちている抵抗とブレッドボード、ジャンパ線をつかって組みました。配線図としては以下です。

Micro Pythonと言ってもかなりPythonに近く、Pythonのライブラリがそのまま使えるので、Thonnyで接続してライブラリをいれてペロッと書きます。(ほとんどライブラリのサンプルプログラムを流用していますが…)

ブレッドボードにつけて動作テストをして、問題なければ100均で買ってきたボトルに穴を開けて配線、DHT22と配線はグルーガンで固定します。

全体としてはこのようになりました。

ちゃんとボトル内の温度と湿度を表してくれています。湿度によってLEDが点灯するようにしました。高すぎたり低すぎたりすると赤が点灯します。ちょうどよければ青が点灯します。

PicoはOSもなく、電源もUSB端子を抜くか刺すかだけなので刺したらそのままmain.pyを実行して動きだしてくれます。非常に素直です。

電子工作は全くできない素人な私でも比較的簡単に作ることができました。この手のものでは結構オーソドックスなもの(Lチカ、温度湿度取得、LCDディスプレイでの表示)の組み合わせだったので、調べれば情報も多かったので助かりました。

三連休の空いた時間で作る自由工作にはちょうどよいと思いました。

最後に使ったライブラリとmain.pyを記載します。

良ければ作ってみてください。

使ったライブラリ

python lcd

https://github.com/dhylands/python_lcd

PicoDHT22

https://github.com/danjperron/PicoDHT22

from machine import Pin
 
from PicoDHT22 import PicoDHT22
 
import time
 
from esp8266_i2c_lcd import I2cLcd
 

 
dht22 = PicoDHT22(Pin(20,Pin.IN,Pin.PULL_UP))
 

 
led_blue=Pin(13,Pin.OUT)
 
led_yellow=Pin(14,Pin.OUT)
 
led_red=Pin(15,Pin.OUT)
 

 
I2C_ADDR = 0x27
 
sda = machine.Pin(0)
 
scl = machine.Pin(1)
 

 
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
 
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
 

 
while True:
 
T, H = dht22.read()
 
now = time.localtime()
 

 
#print(now)
 
if H is None:
 
lcd.putstr("Error!!\nError!!\n")
 
led_blue.value(1)
 
led_yellow.value(1)
 
led_red.value(1)
 
elif H <= 60:
 
lcd.putstr("T={:3.1f}\xdfC\nH={:3.1f}%\n".format(T,H))
 
led_blue.value(0)
 
led_yellow.value(0)
 
led_red.value(1)
 
elif H <= 72:
 
lcd.putstr("T={:3.1f}\xdfC\nH={:3.1f}%\n".format(T,H))
 
led_blue.value(0)
 
led_yellow.value(1)
 
led_red.value(0)
 
elif H <= 80:
 
lcd.putstr("T={:3.1f}\xdfC\nH={:3.1f}%\n".format(T,H))
 
led_blue.value(1)
 
led_yellow.value(0)
 
led_red.value(0)
 
elif H > 80:
 
lcd.putstr("T={:3.1f}\xdfC\nH={:3.1f}%\n".format(T,H))
 
led_blue.value(1)
 
led_yellow.value(1)
 
led_red.value(0)
 
lcd.putstr("")
 
time.sleep_ms(1000)