|
| 1 | +MicroPython port to the ESP32 |
| 2 | +============================= |
| 3 | + |
| 4 | +This is an experimental port of MicroPython to the Espressif ESP32 |
| 5 | +microcontroller. It uses the ESP-IDF framework and MicroPython runs as |
| 6 | +a task under FreeRTOS. |
| 7 | + |
| 8 | +Supported features include: |
| 9 | +- REPL (Python prompt) over UART0. |
| 10 | +- 16k stack for the MicroPython task and 64k Python heap. |
| 11 | +- Many of MicroPython's features are enabled: unicode, arbitrary-precision |
| 12 | + integers, single-precision floats, complex numbers, frozen bytecode, as |
| 13 | + well as many of the internal modules. |
| 14 | +- Internal filesystem using the flash (currently 256k in size). |
| 15 | +- The machine module with basic GPIO and bit-banging I2C, SPI support. |
| 16 | + |
| 17 | +Development of this ESP32 port was sponsored in part by Microbric Pty Ltd. |
| 18 | + |
| 19 | +Setting up the toolchain and ESP-IDF |
| 20 | +------------------------------------ |
| 21 | + |
| 22 | +There are two main components that are needed to build the firmware: |
| 23 | +- the Xtensa cross-compiler that targets the CPU in the ESP32 (this is |
| 24 | + different to the compiler used by the ESP8266) |
| 25 | +- the Espressif IDF (IoT development framework, aka SDK) |
| 26 | + |
| 27 | +Instructions for setting up both of these components are provided by the |
| 28 | +ESP-IDF itself, which is found at https://github.com/espressif/esp-idf . |
| 29 | +Follow the guide "Setting Up ESP-IDF", for Windows, Mac or Linux. You |
| 30 | +only need to perform up to "Step 2" of the guide, by which stage you |
| 31 | +should have installed the cross-compile and cloned the ESP-IDF repository. |
| 32 | + |
| 33 | +If you are on a Windows machine then the |
| 34 | +[Windows Subsystem for Linux](https://msdn.microsoft.com/en-au/commandline/wsl/install_guide) |
| 35 | +is the most efficient way to install the ESP32 toolchain and build the project. |
| 36 | +If you use WSL then follow the |
| 37 | +[Linux guidelines](http://esp-idf.readthedocs.io/en/latest/get-started/linux-setup.html) |
| 38 | +for the ESP-IDF instead of the Windows ones. |
| 39 | + |
| 40 | +Be advised that the ESP-IDF is still undergoing changes and only some |
| 41 | +versions are supported. To find which build is compatible refer to the line |
| 42 | +in the makefile containing the following: |
| 43 | +``` |
| 44 | +ESPIDF_SUPHASH := <Current supported ESP-IDF commit hash> |
| 45 | +``` |
| 46 | +After finishing "Step 2" you can roll back your current build of |
| 47 | +the ESP-IDF (and update the submodules accordingly) using: |
| 48 | +``` |
| 49 | +$ git checkout <Current supported ESP-IDF commit hash> |
| 50 | +$ git submodule update --recursive |
| 51 | +``` |
| 52 | +Note that you will get a warning when building the code if the ESP-IDF |
| 53 | +version is incorrect. |
| 54 | + |
| 55 | +The Espressif ESP-IDF instructions above only install pyserial for Python 2, |
| 56 | +so if you're running Python 3 or a non-system Python you'll also need to |
| 57 | +install `pyserial` (or `esptool`) so that the Makefile can flash the board |
| 58 | +and set parameters: |
| 59 | +```bash |
| 60 | +$ pip install pyserial |
| 61 | +``` |
| 62 | + |
| 63 | +Once everything is set up you should have a functioning toolchain with |
| 64 | +prefix xtensa-esp32-elf- (or otherwise if you configured it differently) |
| 65 | +as well as a copy of the ESP-IDF repository. |
| 66 | + |
| 67 | +You then need to set the `ESPIDF` environment/makefile variable to point to |
| 68 | +the root of the ESP-IDF repository. You can set the variable in your PATH, |
| 69 | +or at the command line when calling make, or in your own custom `makefile`. |
| 70 | +The last option is recommended as it allows you to easily configure other |
| 71 | +variables for the build. In that case, create a new file in the esp32 |
| 72 | +directory called `makefile` and add the following lines to that file: |
| 73 | +``` |
| 74 | +ESPIDF = <path to root of esp-idf repository> |
| 75 | +#PORT = /dev/ttyUSB0 |
| 76 | +#FLASH_MODE = qio |
| 77 | +#FLASH_SIZE = 4MB |
| 78 | +#CROSS_COMPILE = xtensa-esp32-elf- |
| 79 | +
|
| 80 | +include Makefile |
| 81 | +``` |
| 82 | +Be sure to enter the correct path to your local copy of the IDF repository |
| 83 | +(and use `$(HOME)`, not tilde, to reference your home directory). |
| 84 | +If your filesystem is case-insensitive then you'll need to use `GNUmakefile` |
| 85 | +instead of `makefile`. |
| 86 | +If the Xtensa cross-compiler is not in your path you can use the |
| 87 | +`CROSS_COMPILE` variable to set its location. Other options of interest |
| 88 | +are `PORT` for the serial port of your esp32 module, and `FLASH_MODE` |
| 89 | +(which may need to be `dio` for some modules) |
| 90 | +and `FLASH_SIZE`. See the Makefile for further information. |
| 91 | + |
| 92 | +Building the firmware |
| 93 | +--------------------- |
| 94 | + |
| 95 | +The MicroPython cross-compiler must be built to pre-compile some of the |
| 96 | +built-in scripts to bytecode. This can be done by (from the root of |
| 97 | +this repository): |
| 98 | +```bash |
| 99 | +$ make -C mpy-cross |
| 100 | +``` |
| 101 | + |
| 102 | +The ESP32 port has a dependency on Berkeley DB, which is an external |
| 103 | +dependency (git submodule). You'll need to have git initialize that |
| 104 | +module using the commands: |
| 105 | +```bash |
| 106 | +$ git submodule init lib/berkeley-db-1.xx |
| 107 | +$ git submodule update |
| 108 | +``` |
| 109 | + |
| 110 | +Then to build MicroPython for the ESP32 run: |
| 111 | +```bash |
| 112 | +$ cd ports/esp32 |
| 113 | +$ make |
| 114 | +``` |
| 115 | +This will produce binary firmware images in the `build/` subdirectory |
| 116 | +(three of them: bootloader.bin, partitions.bin and application.bin). |
| 117 | + |
| 118 | +To flash the firmware you must have your ESP32 module in the bootloader |
| 119 | +mode and connected to a serial port on your PC. Refer to the documentation |
| 120 | +for your particular ESP32 module for how to do this. The serial port and |
| 121 | +flash settings are set in the `Makefile`, and can be overridden in your |
| 122 | +local `makefile`; see above for more details. |
| 123 | + |
| 124 | +You will also need to have user permissions to access the /dev/ttyUSB0 device. |
| 125 | +On Linux, you can enable this by adding your user to the `dialout` group, |
| 126 | +and rebooting or logging out and in again. |
| 127 | +```bash |
| 128 | +$ sudo adduser <username> dialout |
| 129 | +``` |
| 130 | + |
| 131 | +If you are installing MicroPython to your module for the first time, or |
| 132 | +after installing any other firmware, you should first erase the flash |
| 133 | +completely: |
| 134 | +```bash |
| 135 | +$ make erase |
| 136 | +``` |
| 137 | + |
| 138 | +To flash the MicroPython firmware to your ESP32 use: |
| 139 | +```bash |
| 140 | +$ make deploy |
| 141 | +``` |
| 142 | +This will use the `esptool.py` script (provided by ESP-IDF) to download the |
| 143 | +binary images. |
| 144 | + |
| 145 | +Getting a Python prompt |
| 146 | +----------------------- |
| 147 | + |
| 148 | +You can get a prompt via the serial port, via UART0, which is the same UART |
| 149 | +that is used for programming the firmware. The baudrate for the REPL is |
| 150 | +115200 and you can use a command such as: |
| 151 | +```bash |
| 152 | +$ picocom -b 115200 /dev/ttyUSB0 |
| 153 | +``` |
| 154 | + |
| 155 | +Configuring the WiFi and using the board |
| 156 | +---------------------------------------- |
| 157 | + |
| 158 | +The ESP32 port is designed to be (almost) equivalent to the ESP8266 in |
| 159 | +terms of the modules and user-facing API. There are some small differences, |
| 160 | +notably that the ESP32 does not automatically connect to the last access |
| 161 | +point when booting up. But for the most part the documentation and tutorials |
| 162 | +for the ESP8266 should apply to the ESP32 (at least for the components that |
| 163 | +are implemented). |
| 164 | + |
| 165 | +See http://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html for |
| 166 | +a quick reference, and http://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html |
| 167 | +for a tutorial. |
| 168 | + |
| 169 | +The following function can be used to connect to a WiFi access point (you can |
| 170 | +either pass in your own SSID and password, or change the defaults so you can |
| 171 | +quickly call `wlan_connect()` and it just works): |
| 172 | +```python |
| 173 | +def wlan_connect(ssid='MYSSID', password='MYPASS'): |
| 174 | + import network |
| 175 | + wlan = network.WLAN(network.STA_IF) |
| 176 | + if not wlan.active() or not wlan.isconnected(): |
| 177 | + wlan.active(True) |
| 178 | + print('connecting to:', ssid) |
| 179 | + wlan.connect(ssid, password) |
| 180 | + while not wlan.isconnected(): |
| 181 | + pass |
| 182 | + print('network config:', wlan.ifconfig()) |
| 183 | +``` |
| 184 | + |
| 185 | +Note that some boards require you to configure the WiFi antenna before using |
| 186 | +the WiFi. On Pycom boards like the LoPy and WiPy 2.0 you need to execute the |
| 187 | +following code to select the internal antenna (best to put this line in your |
| 188 | +boot.py file): |
| 189 | +```python |
| 190 | +import machine |
| 191 | +antenna = machine.Pin(16, machine.Pin.OUT, value=0) |
| 192 | +``` |
| 193 | + |
| 194 | +Troubleshooting |
| 195 | +--------------- |
| 196 | + |
| 197 | +* Continuous reboots after programming: Ensure FLASH_MODE is correct for your |
| 198 | + board (e.g. ESP-WROOM-32 should be DIO). Then perform a `make clean`, rebuild, |
| 199 | + redeploy. |
0 commit comments