編集履歴一覧に戻る
eucalyのアイコン画像

eucaly が 2021年02月16日18時04分59秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

RaspberryPi

本文の変更

+

# ラズパイPico 使いづらいよ問題 いやあ、入手してみたんですが、、、これ - microPythonかC++での開発 - どちらもそれなりの環境セットアップが必要 - ThonnyだのVS Codeだの用意してな! - C++はもちろんコンパイルも要るよ!! ぶっちゃけ、、、気軽ではありません。 つーかこれなら素直にArduinoのほうがナレッジも溜まってるし楽だしゴニョゴニョ。。。 違います、そんなんじゃないんです、もっと気軽にこう・・・。 「適当にPythonコード流したらサクっと動く開発ボード」 が欲しいのです。 # シリアル経由で遊べるじゃんて話 確かにmicropythonのバイナリを放り込んでブートさせると、シリアル経由でmicroPythonが遊べるわけですが。 これだと「pyファイル突っ込んで自動起動」が出来ない、わけです。 # シリアル経由で色々やらかすには?、調査調査 ま、簡単なお話です。 microPythonの制御コードを、読んじゃえばいいのです。 つーわけで、「tools/pyboard.py」を直読みしてみると・・・。 ```python: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文字列の中、こんなんなっております。 ```python:ファイルシステム_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 '')) ``` 実際に動かしてみると・・・。 ```python:実行例 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行コマンド」なら何とかなりますが。 複数行にわたるインデントブロックがある場合、コピペが効きません。 ```python:やらかし例 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を読んでみると・・・。 ありました!。 ```python:初期化とか # 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] で実行(ソフトリセット) ## ファイル一覧の取得 以下コードを実行 ```python:ファイルシステム_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 '')) ``` ## ファイル内容の取得 以下コードを実行 ```python:ファイルシステム_cat with open('main.py') as f: while 1: b=f.read(512) if not b: break print(b,end='') ``` 「main.py」の内容取得の場合、ね。 他ファイルは適宜書き換えて!。 ## ファイルの書き込み 以下コードを実行 ```python:ファイル_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的なのを放り込んでリブートで 実行、あたりが使いやすいんだけど、それは今後に期待かな!?。