いっぺーちゃんの いろいろやってみよ~

micropython on ESP32 でダウンローダを使う

プログラムを作成して、逐一コピペするのは面倒だなぁ、と思うでしょ?
micropythonにはダウンローダが用意されています。tools/pyboard.py がそれです。

/work2/esp/micropython-esp32/tools/pyboard.py --device /dev/ttyUSB0 file名

で実行できるはずなんですが、ちょっとうまく動きません(PATHが通ってないのでフルパスで指定)。
どうも、ESP32をリセットした後からシリアルを接続するとうまく接続できない現象が影響しているようです。
そこで、pyboard.pyが動作開始時にソフトリセットを行っている部分をハードリセットに変更する変更を行います。
ついでに、--device オプションのデフォルト値を /dev/ttyUSB0 に変更しておきます。
以下がそのパッチです。
あ、手動でリセットボタン押す修正をしたときの残骸がコメントアウトされて残ってる。。。(^^ゞ

diff --git a/tools/pyboard.py b/tools/pyboard.py
index d15f520..992b1ac 100755
--- a/tools/pyboard.py
+++ b/tools/pyboard.py
@@ -220,6 +220,12 @@ class ProcessPtyToTerminal:
     def inWaiting(self):
         return self.ser.inWaiting()
 
+    def setRTS(self, data):
+        return self.ser.setRTS(data)
+
+    def setDTR(self, data):
+        return self.ser.setDTR(data)
+
 
 class Pyboard:
     def __init__(self, device, baudrate=115200, user='micro', password='python', wait=0):
@@ -278,13 +284,47 @@ class Pyboard:
         return data
 
     def enter_raw_repl(self):
-        self.serial.write(b'\r\x03\x03') # ctrl-C twice: interrupt any running program
+        ## self.serial.write(b'\r\x03\x03') # ctrl-C twice: interrupt any running program
+        # print("Reset Target and Hit CR key!!")
+        # sys.stdin.readline()
+        # print("continue...")
+        # time.sleep(1)
+        # ====== haedware reset ! =======
+        """
+            == truth table ==
+            RTS DTR |RESET BOOT
+            --------+----------
+             0   0  | 1     1
+             0   1  | 0     1
+             1   0  | 1     0
+             1   1  | 1     1
+
+        """
+        print("Reseting Target ....")
+        self.serial.setDTR(False)  # DTR = HIGH  
+        self.serial.setRTS(True)   # RTS = LOW   IO0=HIGH, EN=LOW  reset assert
+        time.sleep(0.3)
+        self.serial.setRTS(False)  # RTS = HIGH  IO0=HIGH, EN=HIGH  reset deassert
+        time.sleep(0.8)
+        print("Done")
 
         # flush input (without relying on serial.flushInput())
         n = self.serial.inWaiting()
+        if n == 0 :
+            print("probably reset failure...")
+        """
         while n > 0:
-            self.serial.read(n)
+            a = self.serial.read(n)
+            print(a)
             n = self.serial.inWaiting()
+        print("^^^^^^^^ boot message end ^^^^^^^^")
+        """
+        # waiting prompt...
+        print("waiting prompt")
+        data = self.read_until(1, b'>>>')
+        if not data.endswith(b'>>>'):
+            print(data)
+            raise PyboardError('could not get prompt')
 
         self.serial.write(b'\r\x01') # ctrl-A: enter raw REPL
         data = self.read_until(1, b'raw REPL; CTRL-B to exit\r\n>')
@@ -295,7 +335,6 @@ class Pyboard:
         self.serial.write(b'\x04') # ctrl-D: soft reset
         data = self.read_until(1, b'soft reboot\r\n')
         if not data.endswith(b'soft reboot\r\n'):
-            print(data)
             raise PyboardError('could not enter raw repl')
         # By splitting this into 2 reads, it allows boot.py to print stuff,
         # which will show up after the soft reboot and before the raw REPL.
@@ -384,7 +423,7 @@ def execfile(filename, device='/dev/ttyACM0', baudrate=115200, user='micro', pas
 def main():
     import argparse
     cmd_parser = argparse.ArgumentParser(description='Run scripts on the pyboard.')
-    cmd_parser.add_argument('--device', default='/dev/ttyACM0', help='the serial device or the IP address of the pyboard')
+    cmd_parser.add_argument('--device', default='/dev/ttyUSB0', help='the serial device or the IP address of the pyboard')
     cmd_parser.add_argument('-b', '--baudrate', default=115200, help='the baud rate of the serial device')
     cmd_parser.add_argument('-u', '--user', default='micro', help='the telnet login username')
     cmd_parser.add_argument('-p', '--password', default='python', help='the telnet login password')

 

このパッチをあてて

/work2/esp/micropython-esp32/tools/pyboard.py file名

と実行するとfile名で指定したプログラムがダウンロードされ、実行されます。
プログラムの実行が完了し、プロンプトが返ってきたらダウンローダは終了します。
ただし、前回のプログラムのように、プロンプトが返ってきた後も割り込みが発生するようなプログラムではダウンローダが終了すると割り込み処理結果を得ることができません。
その場合は、--follow オプションを指定して実行してください。プロンプトが返ってきたあともダウンローダは終了せず、ESP32からのデータを表示し続けます。
終了するにはCTRL-Cを入力します。
--followオプション指定時、プロンプトが表示されてもキー入力はできませんので注意してください。