ラズパイ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
さんが
2021/02/16
に
編集
をしました。
(メッセージ: 初版)
-
eucaly
さんが
2021/02/16
に
編集
をしました。
ログインしてコメントを投稿する