そういえば Raspberry pi Pico って試したことなかったなってことで、買ってみました。
なんかいつの間にか Wi-Fi 搭載モデルの Raspberry pi Pico W なんてのまで出てたようなので両方とも買ってみました。
お値段的にはスイッチサイエンスで Pico が 700 円、Pico W が1200 円くらいでした。
登場した当初は1つ500円程度だったとおもうのでちょっと値上がりしたのかな?
半導体供給が落ち着いて値段が戻るといいのですが…
Raspberry pi Pico とは
Raspberry pi Pico は Raspberry pi 財団が開発したマイコンボードで、名前こそ Raspberry pi とついてますが Linux は動かず、どちらかというと Arduino に近い存在らしいです。
現時点では、無印、H
、W
、WH
の4種類があるみたいですが、W
は Wi-Fi
の W
、H
はヘッダー(ピンヘッダー)のH
で、ピンヘッダーがはじめからはんだ付けされてるか、じぶんでやるかの違いみたいです。
項目 | 無印 | H | W | WH |
---|---|---|---|---|
ピンヘッダー | × | ○ | × | ○ |
Wi-Fi | × | × | ○ | ○ |
ハンダ付けが苦手だったり面倒な人、すぐに使い始めたい人は H
がついてるモデルが楽かもしれないですね。
そのかわりちょっとだけ高いみたいです。殆ど誤差レベルですが。
Wi-Fiの件は、値段も倍近く違うので悩ましいところですが、とりあえず MicroPython で遊んでみるだけなら無印でもいいかも。
ただ、追加の外部ライブラリを使いたいときとかは、Wi-Fi モデルにはパッケージマネージャ(upip
、mip
)がついてるので、実はそっちの方が楽な場合もあります。
無印の場合は、自分でボードに転送する必要があるようです。
開発言語について
Arduino 同様 C++ での開発のほか、Raspberry pi らしく、Python も使えます。
正確には、MicroPython という組込み向けの Python と互換性のある言語、みたいな感じらしいんですが、基本的なお作法とかは Python のそれっぽい感じみたいですね。
さらに、Adafruit がこれをフォークしてつくった CircuitPython というのもあるのですが、今回は MicroPython でやってみます。
MicroPython のインストール
Raspberry pi Pico は、BOOTSEL
ボタンを押しながら PC と接続すると、USB メモリとして認識されるので、そこにファームウェアを書き込むことで MicroPython を使えるようになります。
MicroPython の入手先は、この BOOTSEL
を押して接続したときに、認識される USB メモリの中にある INDEX.HTM
を開けば誘導される…のですが、普通に
ここから落とせばOKです。
今回はまずは Wi-Fi なしのモデルから試すので、Raspberry Pi Pico
のほうをダウンロードします(W
がついてないほう)
uf2 という拡張子のファイルがダウンロードされるのでそのまま先ほどの INDEX.HTM
がある場所にドラッグ&ドロップします。
ファイルがコピーされると自動的に再起動するみたいで、その時点で USB が引き抜かれた扱いになりますので、最近の OS だと、デバイスの不正な取り外しみたいなメッセージが出てきたりしますが、これは無視しても問題ないようです。
次回からは BOOTSEL
を押さずに接続して、プログラムをアップロードしていくことになります。
開発環境の準備
今回は PyCharm を使ってみます。
PyCharm のプラグインとして、 MicroPython があるので、それをインストールしておきます。
プロジェクトを作成したら、Settings
を開いて、Languages & Frameworks
→ MicroPython
と進み、以下のように設定します。
Enable MicroPython support
にチェックを入れるDevice type
はRaspberry Pi Pico
を選択Device path
はRaspberry Pi Pico
が認識されてるデバイスを選択
(1台しか同時につながないならAuto-detect device path
にチェックを入れる感じでもよいかも)
Hello, World
print("Hello, World!")
とりあえずこんな感じでかいて、main.py
として保存しておきます。
プロジェクトビューからファイルを右クリック→Run 'Flash main.py'
をクリックすると転送されます。
成功すればこんな感じのログが出るはず。
Connecting to /dev/cu.usbmodem143101
Uploading files: 0% (0/1)
/Users/nagi/ju9box/workspace/raspberry-pi-pico/co2-monitor/main.py -> main.py
Uploading files: 100% (1/1)
Soft reboot
エラーになる場合は、デバイスを抜き差ししてみるとよいかもです。その時に、BOOTSEL
を押してしまわないように注意。
(USBメモリとして認識されてるときは転送できません)
続いて、サイドバーから MicroPython
アイコンを押すか、Tools
→ MicroPython
→ MicroPython REPL
をクリックし、REPL を開きます。
REPL とは、Read Eval Print Loop の略で、対話的にコードを実行できる環境のことです。
開くと、たぶん Hello, World!
ってなってると思いますが、何も出ずに
Quit: Ctrl+] | Stop program: Ctrl+C | Reset: Ctrl+D
Type 'help()' (without the quotes) then press ENTER.
>>>
とだけ出てる場合もあるかもしれません。そういうときは、REPL のウィンドウをクリックして、Ctrl+D
を押してみてください。
これでソフトリセットがかかるので正しく表示されるようになるはずです。
本来上にある通り、転送後自動で Soft reboot
が実行されるはずなんですが、PyCharm から転送してる限りうまくいってないように見えます。なので、手動で Ctrl+D
でリセットしてるってわけです。(ほかのエディタだと試してないのでほかがどうかまではわかりません。。)
Lチカ
マイコンといったらやっぱりこれですよね。
ということで、main.py
を書き換えます。
import machine
import utime
led = machine.Pin(25, machine.Pin.OUT)
while True:
led.value(1)
utime.sleep(2)
led.value(0)
utime.sleep(2)
で、転送するんですが、PyCharm の場合、先ほどの Run はRun/Debug
に入ってるので、次からは右上の再生ボタンでも転送できます。
(このとき、再生ボタンの横の名前がFlash main.py
になってることを確認しておきましょう。これは最後に実行したやつが出てるっぽいので途中で別のファイルを転送してたり、リントを動かしたりしてるとそっちが動いてしまうのでそういうときは落ち着いて名前の横の▼押して Flash main.py
を選択し直してから再生ボタンを押せばOK)
簡易温度計
Pico の内蔵温度センサーを使って温度を取得してみます。
import machine
import utime
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / 65535
while True:
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706) / 0.001721
print(temperature)
utime.sleep(2)
まず、このADC(4)
ってのが謎ですよね。データシートとかみてもよくわからず 、最終的に ChartGPT に聞いてみたところ、
Raspberry Pi Picoの内蔵温度センサーへのアクセスには、machine.ADC(4)を使用しますが、実際には温度センサーがピン番号4に接続されているわけではありません。このピンは内部的に予約されており、温度センサーに接続されているかわからないです。
とのこと。
とりあえず、machine.ADC(4)
にアクセスすれば温度がわかる。ただし、本来の使い方ではないので、正確性はわからない。ってことかもしれません。
上記は、公式チュートリアルにも載ってたらしいですが、見つけることはできず、ほかのサイトに載っていたサンプルであったり、Copilot が出してくれたコードをもとにつくってます。というかほぼそのまま。
もしかしたら、そのチュートリアルのページが見つかれば、そこにこの辺のからくりが載ってるかもしれないし載ってないかもしれない。。。