Pi picoを早速購入しました。まずは、基本のLチカから。Lチカだけでは終わらず、勢い余ってI2C接続OLEDの表示まで確認できました。
準備
Pi picoは、基板だけで足が付いていません。試験等をするのはブレッドボードなのでピンヘッダーをつけないといけません。片側20ピンです。ブレッドボードに差してから半田付けすると動かなくて作業しやすいです。
長い足を付けておくと、上からメスコネクタの配線が出来るので便利になるかもしれません。
足を半田付けして、ブレッドボードに差しておけば準備完了です。
ソフトウェア
オンボードLEDを点滅させるバイナリーが公開されています。ここから、取ってきて読み込ませればいいです。読み込ませるのは、専用シリアルプログラムは必要なく、USBケーブルで接続するとストレージに見えるbootプログラムが書き込まれており、そこへバイナリーをコピーすれば自動的にリセットがかかって、実行してくれます。
開発環境
専用開発環境のSDKがまとまっています。無理やりVScodeでも開発できますが、拡張機能のplatformIOにはまだpi picoは準備できていません。間もなくarduinoでも開発できるようです。
今回は、こちらを参考にwin10上のWSL2で起動可能なdebian上にSDKを展開したいと思います。
Raspberry Pi Pico を WSL からあつかう - Qiita
cmakeは、新しいのものに入れ替えないといけないようです。
Download | CMake
CMakeのインストール方法 - jskangarooのブログ
このCmakeってのが、最近はやりなのかちょっと前からなのよく見ます。今一つ使い方と設定の書き方がよくわかりませんが、srcとバイナリを違うディレクトリで管理できるのでスッキリはします。
すべてのサンプルコードは、u2fファイルになりましたので、試したいu2fファイルをPi picoに放り込んでいけばリセットかかって動きます。
オンボードLEDのblinkやGPIOに接続したLEDとの交互点滅や、オンボードLEDのPWM制御も簡単に切り替えることができます。
micropythonはどうよ
お手軽お試しには、C/C++よりはハードル低いはずです。こちらから、micropythonのu2fファイルを取ってきて、放り込めばPi picoに自動的にリセットがかかってmicropythonは動きます。
お好きなシリアル端末でUSB経由のCOMポートをたたけばmicropythonのコマンドプロンプトが表示されます。
Ctrl-Dでソフトリセットがかかります。
>>>
MPY: soft reboot
MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
VScodeではpico-GOという拡張機能があり、同様にシリアル接続が可能です。VScodeで書いたものを、Pi picoへ送信してくれるので標準IDEのような感じになります。
お試しで、I2C接続したOLEDに文字を書いてみましょう。
試行錯誤した結果、以下の3つのファイルを作成しました。
boot.py
main.py
ssd1306.py
pico-GOからuploadすると、最初はエラーが出ますが、何度かやってると書き込まれるようです。
Ctrl-DにてSW restすると自動的に起動するようになります。
>>>
MPY: soft reboot
boot start..
I2C Address : 0X3C
I2C Configuration: I2C(0, freq=200000, scl=5, sda=4)
無事OLEDにも表示されました。それぞれのファイルの内容は、ページ最下部に貼っておきます。なんかまだ違っているような気もします。OLEDは、ちゃんと表示できてます。
今日のまとめ
pi picoのC/C++開発環境をWin10のWSL2(debian)に構築して、サンプルバイナリーを作成し実行できることを確認しました。micropythonは、VScode+pico-GO拡張機能を使って、OLEDの表示を確認しました。C/C++は、ちょっと独自な記述が必要な感じです。arduinoも対応できるようになれば過去の成果が活用できます。micropythonは、母艦環境の構築がすべてですね。標準IDEがいいのでしょうけど、マイコンごとに使い方が異なるのがよくないです。
参考サンプルコード等
とりあえず、ベタっと張っておきます。Githubの使い方もそのうちマスターします。
boot.py
print("boot start..")
import main
import ssd1306
boot.py
# Display Image & text on I2C driven ssd1306 OLED display
from machine import Pin, I2C
from micropython import const
from ssd1306 import SSD1306_I2C
import framebuf
import utime
WIDTH = 128 # oled display width
HEIGHT = 64 # oled display height
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000) # Init I2C using pins GP8 & GP9 (default I2C0 pins)
print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c)) # Display I2C config
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display
# Raspberry Pi logo as 32x32 bytearray
buffer = bytearray(b"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|?\\x00\\x01\\x86@\\x80\\x01\\x01\\x80\\x80\\x01\\x11\\x88\\x80\\x01\\x05\\xa0\\x80\\x00\\x83\\xc1\\x00\\x00C\\xe3\\x00\\x00~\\xfc\\x00\\x00L'\\x00\\x00\\x9c\\x11\\x00\\x00\\xbf\\xfd\\x00\\x00\\xe1\\x87\\x00\\x01\\xc1\\x83\\x80\\x02A\\x82@\\x02A\\x82@\\x02\\xc1\\xc2@\\x02\\xf6>\\xc0\\x01\\xfc=\\x80\\x01\\x18\\x18\\x80\\x01\\x88\\x10\\x80\\x00\\x8c!\\x00\\x00\\x87\\xf1\\x00\\x00\\x7f\\xf6\\x00\\x008\\x1c\\x00\\x00\\x0c \\x00\\x00\\x03\\xc0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00")
# Load the raspberry pi logo into the framebuffer (the image is 32x32)
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB)
while True:
# Clear the oled display in case it has junk on it.
oled.fill(0)
# Blit the image from the framebuffer to the oled display
oled.blit(fb, 96, 0)
# Add some text
oled.text("PI pico",5,8)
oled.text("SSD1306 test",10,30)
oled.text("Kaji tech",28,50)
# Finally update the oled display so the image & text is displayed
oled.show()
utime.sleep(1)
oled.fill(0)
utime.sleep(5)
ssd1306.py
micropython/micropython