SNSへはこちら

【速報】Raspberry Pi Picoに入門してみた(import array問題も記述あり)

ついにですよ!Raspberry Pi Pico がついに国内で発売されました!!僕はスイッチサイエンスで販売が開始された直後に買いましたが、今は秋月や千石でも買えるらしいです。
当初は在庫が割とすぐに無くなりましたが、今は潤沢にありそうな感じですよ。僕は3枚買いました

2/1 に購入し、2/3 にネコポスで到着。埼玉県在住で昼過ぎには来てたかなあ。

画像内に白いぶつぶつが見えますが、汚いものではなく、接着剤のたぐいでした。

Raspberry Pi Picoとは

まずは参考資料から。

このボード、一言でいうとデュアルコア ARM マイコンを搭載したただのマイコンボードです。とは言っても、デュアルコアマイコンが搭載されたマイコンボードが500円ちょっとで買えるのはすごいことじゃないですか。どう考えても(考えなくても)即買いですよ。
スペックはこんな感じらしい。実はよく調べずに買ったんだよね。

  • RP2040 マイコンがのったマイコンボード
    • ラズパイ財団が(おそらく)フルスクラッチで自作したマイコンらしい。すげぇ。
  • ROM: 2MB のオンボード Flash (via QSPI)。
    • チップ単体では、QSPI を利用して最大 16MB をオフチップで利用可能
  • RAM: 264KB の内蔵 SRAM
  • ペリフェラル: UART, SPI, I2C, USB 2.0(Host/Device), Timer(x1), PWM(16ch), ADC & 温度センサ, PIO (ペリフェラルという位置づけではない) など
    • その他、ARM コア内に SysTick タイマを搭載
    • PIO: Programmable I/O の略で、CPU を使わずにペリフェラルが独自の命令を独立して実行可能。ピン出力もできる

タイマーがちょっと(かなり)心許ないですが、Flash, RAM は十分ですね。デュアルコアというのが、SDK でどう扱われているのかも興味あります。
でも PIO を使えばタイマー自体も自作可能(ただし上級者に限る)ですので、その辺はあまり心配しなくても良さそう。

でもちょっと考えて見ると、これはただのマイコンボード。コアが ARM Cortex-M なので Linux が起動しません。なのに仰々しく Raspberry Pi と名付けるのはいかがなものなのか??と感じざるを得ません。おそらく財団の意向としては、「(Micro)Python が使えるという点で、Raspberry Pi だ!すごいだろう!!」という感じでしょうね。実際、そういった点では合理性があるのかもしれません。でも電子工作の知識がない人は誤解しそうな...。あと USB が Type-C じゃないのもどうしてこうなった。...水掛け論的になりそうなので非難はここまでにしときます。

誤解なきように言っておきますが、僕はこのマイコンボードにかなり期待しています。発売が楽しみでしょうがなかったんだよなこれが。

MicroPythonで入門してみた

とりあえず動かすために、MicroPython を用いたプログラミングをします。本当でしたら C 言語でいい感じにコードを書き書きしたかったのですが、時間の都合もありましたので、ひとまず速報記事ということで MicroPython での入門に留まらせていただきます。

参考になるページ

IDEの導入・マイコン側の準備

今回は最終的に MicroPython で Python のコードを書くことになるのですが、逐一 REPL でやってたら禿げそうになるので、IDE を導入しておきます。まずこちらから Thonny IDE をダウンロードします。ページ右上部ですね。Win/Mac/Lin 対応。記事執筆時はバージョン 3.3.3 でした。これより古いものは Pico に対応していないらしい。

インストールしたら起動してください。アイコンがデカめで、メニューバーのないモードで立ち上がったら、それを通常モードに直す必要があります。ウィンドウ右上のリンクっぽいところをクリックするとそれが出来ます。指示通りに IDE を再起動しましょ。

それでは IDE の使用する Python インタプリタを指定します。ウィンドウ右下のステータスバーをクリックして、Configure Interpreter... をクリック。ウィンドウが出てきたら、MicroPython (Raspberry Pi Pico)を選択してください。

お次はいよいよ Pico を PC に接続。基板上の BOOTSEL を押しながら接続。すると USB マスストレージとして認識されます。このとき IDE から「MicroPython 入れてくれ」と言われても無視してください(理由は後述)。自力で入れましょう。

最新版(20210202)は容易に手に入りますが、これだと問題があります。ここでは、一つ前のバージョン(20210121)をインストールします。MicroPython や Thonny IDE 公式で配布しているものはすでに最新版と unstable な過去版しかありませんから、以下のリンクいずれかからダウンロードしてください。

入手したら展開して、マウントされたドライブに uf2 ファイルをコピーすれば OK。Mac だと GUI じゃ無理かも。GUI GUI モルカー
転送が終わると勝手にマイコンが再起動され、USB シリアル機器として認識されることでしょう。

その後 IDE に戻って、ツールバー右側の停止ボタン(Stop/Restart backend)をポチィすれば画面下部の Shell にプロンプトが表示されるはずです。

此処から先は、詳しい方は上の Getting Started に従っていただいたほうが良いと思います

ひとまずかんたんにLチカ

上部のエディタに以下を打ち込みます。コードはドキュメンテーションから。

from machine import Pin
import time

led = Pin(25, Pin.OUT)
def blink() :
    while True :
        global led
        led.toggle()
        time.sleep(1)

blink()

あとはツールバーの再生ボタンを押せば動きます。ファイルの保存は PC 上あるいはマイコン内にできるらしい。また、マイコン内に保存した場合は MicroPython のバイナリを書き込み直してもデータ消えずに保持されていました。すごいね。

さあ、これでLチカが実行できました。途中でストップする際は C-c を押すと KeyboradInterrupt により停止します。

TimerでLチカ

タイマによる割り込みを利用します。ドキュメンテーションより引用。

from machine import Pin, Timer

led = Pin(25, Pin.OUT)
tim = Timer()
def tick(timer):
    global led
    led.toggle()

tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)

タイマーペリフェラルが裏で動作しますので、動作中でも他の入力等をすることが出来ます。停止したいときは tim.deinit() でどうぞ。

PIOでLチカ

先程の PIO を使います。ここ低レイヤっぽくていいですよね。Python なんか高レイヤですから、それに歯向かっている感じがして気持ちがいいです。

import time
from rp2 import PIO, asm_pio
from machine import Pin

# Define the blink program.  It has one GPIO to bind to on the set instruction, which is an output pin.
# Use lots of delays to make the blinking visible by eye.
@asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink():
    wrap_target()
    set(pins, 1)   [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    set(pins, 0)   [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    nop()          [31]
    wrap()

# Instantiate a state machine with the blink program, at 1000Hz, with set bound to Pin(25) (LED on the rp2 board)
sm = rp2.StateMachine(0, blink, freq=1000, set_base=Pin(25))

# Run the state machine for 3 seconds.  The LED should blink.
sm.active(1)
time.sleep(3)
sm.active(0)

こちらもコードはドキュメンテーションから。同じように実行できるはずです。
何やらよくわからない関数ばっかり呼んでいますが(あと隣の [31] とかね)、その辺は後々解明したいと思っています。
現状若干分かっているところはありますが、とにかく PIO についてのマニュアルがクソ MicroPython における記述についての情報が無いもんで、そのへんも調べたり試行錯誤してみたりしたいと思います。あ、もちろん脱 Python するのが第一目標ですよ???

ひとまず〆

ということで、とりあえず簡単に Raspberry Pi Pico でLチカをしてみるという記事でした。
最新版は若干うまく動かないということを述べている記事はないと思いますので、お役に立てたらと思います。それではひとまず以上。

蛇足

補足的な感じで雑に書いていきます。

最新バージョンではだめな理由

先程インストールした MicroPython のバージョンは 20210121 でした。一方で Pico の公式サイトでは最新版の 20210202 となっていて、これは import array がエラーになります。どういうこっちゃねん。このせいで PIO が利用できませんので、あえて古いバージョンをインストールしたわけです。