eucalyのアイコン画像

Raspberry Pi Pico を、コンパイル/統合環境無しで使ってみる

eucaly 2021年02月16日に作成  (2021年02月16日に更新)

Raspberry Pi Pico を、コンパイル/統合環境無しで使ってみる

ラズパイPico 使いづらいよ問題

いやあ、入手してみたんですが、、、これ

  • microPythonかC++での開発
  • どちらもそれなりの環境セットアップが必要
  • ThonnyだのVS Codeだの用意してな!
  • C++はもちろんコンパイルも要るよ!!

ぶっちゃけ、、、気軽ではありません。
つーかこれなら素直にArduinoのほうがナレッジも溜まってるし楽だしゴニョゴニョ。。。

違います、そんなんじゃないんです、もっと気軽にこう・・・。
「適当にPythonコード流したらサクっと動く開発ボード」
が欲しいのです。

シリアル経由で遊べるじゃんて話

確かにmicropythonのバイナリを放り込んでブートさせると、シリアル経由でmicroPythonが遊べるわけですが。
これだと「pyファイル突っ込んで自動起動」が出来ない、わけです。

ちなみに標準的なUSBシリアルなので、Windows10の場合、ドライバとか入れなくても普通に認識します。
なのでまあteraterm的なのがあればそれだけで遊べます。
キャプションを入力できます

シリアル経由で色々やらかすには?、調査調査

ま、簡単なお話です。
microPythonの制御コードを、読んじゃえばいいのです。
つーわけで、「tools/pyboard.py」を直読みしてみると・・・。

pyboard.pyの一部

def fs_ls(self, src): cmd = ( "import uos\nfor f in uos.ilistdir(%s):\n" " print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))" % (("'%s'" % src) if src else "") ) self.exec_(cmd, data_consumer=stdout_write_bytes)

・・・・ちょいまちこれ、もしかして。
microPythonを垂れ流してその場で実行させてる感じ!?。
上のcmd文字列の中、こんなんなっております。

ファイルシステム_ls

import uos for f in uos.ilistdir("/"): print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))

実際に動かしてみると・・・。

実行例

MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040 Type "help()" for more information. >>> import uos >>> for f in uos.ilistdir("/"): ... print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else '')) ... 0 %s 146 main.py >>>

お、普通に動くじゃん!。

ただコレ、問題があります。
自動インデントが有効なので、lsのような「1行コマンド」なら何とかなりますが。
複数行にわたるインデントブロックがある場合、コピペが効きません。

やらかし例

MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040 Type "help()" for more information. >>> with open('main.py') as f: ... while 1: ... b=f.read(512) ... if not b: ... break ... print(b,end='') ... Traceback (most recent call last): File "<stdin>", line 6 IndentationError: unindent doesn't match any outer indent level >>>

しょぼんぬ。

ユーザーフレンドリーなモード解除があるはずだ!、と。
pyboard.pyを読んでみると・・・。

ありました!。

初期化とか

# Try to enter raw-paste mode. self.serial.write(b"\x05A\x01") data = self.serial.read(2) if data == b"R\x00": # Device understood raw-paste command but doesn't support it. pass elif data == b"R\x01": # Device supports raw-paste mode, write out the command using this mode. return self.raw_paste_write(command_bytes) else: # Device doesn't support raw-paste, fall back to normal raw REPL. data = self.read_until(1, b"w REPL; CTRL-B to exit\r\n>") if not data.endswith(b"w REPL; CTRL-B to exit\r\n>"): print(data) raise PyboardError("could not enter raw repl") # Don't try to use raw-paste mode again for this connection. self.use_raw_paste = False

まあ、色々分かったので、下にまとめておきますよ、と。

コマンドラインの使い方

コントロールキー制御

コマンドラインモードでは、以下コマンドで切り替えができます。

コマンド 内容
[CTRL+C][CTRL+C] 実行中プログラムの強制中断
[CTRL+A] RAW入力モード
[CTRL+B] ユーザーフレンドリー入力モード
[CTRL+D] ソフトリセット

pythonコードをコピペして動かす場合

  • [CTRL+A] を押す
  • pythonコードをコピペ
  • [CTRL+D] で実行(ソフトリセット)

ファイル一覧の取得

以下コードを実行

ファイルシステム_ls

import uos for f in uos.ilistdir("/"): print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))

ファイル内容の取得

以下コードを実行

ファイルシステム_cat

with open('main.py') as f: while 1: b=f.read(512) if not b: break print(b,end='')

main.py」の内容取得の場合、ね。
他ファイルは適宜書き換えて!。

ファイルの書き込み

以下コードを実行

ファイル_write

string = '''from machine import Pin import utime led = Pin(25, Pin.OUT) while True: led.value(1) utime.sleep(1) led.value(0) utime.sleep(1) ''' f = open('./main.py', 'w') f.write(string) f.close()

「string」変数のヒアドキュメントを書き込みたい内容に書き換えてね。
main.py」に書き込みよ!。
適宜書き換えて!。

自動起動と実行

上記コマンド使って「main.py」を作ってくださいな。
ブート処理後に自動実行されます。

自動起動中断

シリアルから、[CTRL+C] [CTRL+C] [CTRL+B] を連打!。
CTRL+C 2回による実行中断後の再起動はかなり高速なため、CTRL+B受付猶予が非常に短いです。
何度もやると成功します。

他コマンドは

pyboard.pyをご参照下さいな。
以下URLです!。
https://github.com/micropython/micropython/blob/master/tools/pyboard.py

なるほどこれは使えるかも

「USBシリアル接続の汎用Pythonインタプリタ環境」としてなら。
このボード、存在意義があるのかな!?。
本当は、BOOTSELスイッチでマスストレージマウント→main.py的なのを放り込んでリブートで
実行、あたりが使いやすいんだけど、それは今後に期待かな!?。

eucalyのアイコン画像
いつも、てきとうです
ログインしてコメントを投稿する