MicroPython is a software implementation of a programming language largely compatible with Python 3, written in C, that is optimized to run on a microcontroller.

MicroPython consists of a Python compiler to bytecode and a runtime interpreter of that bytecode. The user is presented with an interactive prompt (the REPL) to execute supported commands immediately. Included are a selection of core Python libraries; MicroPython includes modules which give the programmer access to low-level hardware.

MicroPython does have an inline assembler, which lets the code run at full speed, but it is not portable across different microcontrollers.

The source code for the project is available on GitHub under the MIT License.

History

MicroPython was originally created by the Australian programmer Damien George, after a successful Kickstarter-backed campaign in 2013. The original Kickstarter campaign released MicroPython with an STM32F4-powered development board "pyboard". In the meantime MicroPython has been developed to support a number of ARM based architectures. The ports supported in the mainline are ARM Cortex-M (many STM32 boards, RP2040 boards, TI CC3200/WiPy, Teensy boards, Nordic nRF series, SAMD21 and SAMD51), ESP8266, ESP32, 16-bit PIC, Unix, Windows, Zephyr, and JavaScript. Also, there are many forks for a variety of systems and hardware platforms not supported in the mainline.

In 2016, a version of MicroPython for the BBC Micro Bit was created as part of the Python Software Foundation's contribution to the Micro Bit partnership with the BBC.

In July 2017, MicroPython was forked to create CircuitPython, a version of MicroPython with emphasis on education and ease of use. MicroPython and CircuitPython support somewhat different sets of hardware (e.g. CircuitPython supports Atmel SAM D21 and D51 boards, but dropped support for ESP8266). As of version 4.0, CircuitPython is based on MicroPython version 1.9.4.

In 2017, Microsemi made a MicroPython port for RISC-V (RV32 and RV64) architecture.

In April 2019, a version of MicroPython for the Lego Mindstorms EV3 was created.

In January 2021, a MicroPython port for the RP2040 (ARM Cortex-M0+, on Raspberry Pi Pico and others) was created.

Features

Ability to run Python

MicroPython has the ability to run Python, allowing users to create simple and easy-to-understand programs. MicroPython supports many standard Python libraries, supporting more than 80% of the features of Python's most used libraries. MicroPython was designed specifically to support the typical performance gap between microcontrollers and Python. Python code is able to directly access and interact with hardware, with increased hardware possibilities that are not available using a normal Python application that is run on an operating system.

Code portability

MicroPython's utilisation of hardware abstraction layer (HAL) technology allows developed code to be portable among different microcontrollers within the same family or platform and on devices that support and can download MicroPython. Programs are often developed and tested on high-performance microcontrollers and distributed with the final application used on lower-performance microcontrollers.

Modules

MicroPython offers functionality, once new code has been written, to create a frozen module and use it as a library which can be a part of developed firmware. This feature assists with avoiding repetitive downloading of the same, already error-free, tested code into a MicroPython environment. This type of module will be saved to a microcontroller's modules directory for compiling and uploading to the microcontroller where the library will be available using Python's import command to be used repeatedly.

Read–eval–print loop

The read–eval–print loop (REPL) allows a developer to enter individual lines of code and have them run immediately on a terminal. Linux-based and macOS systems have terminal emulators that can be used to create a direct connection to a MicroPython device's REPL using a serial USB connection. The REPL assists with the immediate testing of parts of an application as each part of the code can be run and the results visually examined. Once different parts of code are loaded into the REPL, additional REPL features can be used to experiment with that code's functionality.

Helpful REPL commands (once connected to a serial console): : keyboard interrupt : reload : help message : lists built-in modules : lists all the pins on your microcontroller board that are available to be used in a program's code

Limitations

Although MicroPython fully implements Python language version 3.4 and much of 3.5, it does not implement all language features introduced from 3.5 onwards, though some new syntax from 3.6 and more recent features from later versions, e.g. from 3.8 (assignment expressions) and 3.9. It includes a subset of the standard library.

MicroPython has more limited hardware support in the microcontroller market than other popular platforms, like Arduino with a smaller number of microcontroller choices that support the language. MicroPython does not include an integrated development environment (IDE) or specific editor unlike other platforms.

Syntax and semantics

MicroPython's syntax is adopted from Python, due to its clear and easy-to-understand style and power. Unlike most other programming languages less punctuation is used with fewer syntactical machinations in order to prioritise readability.

Code blocks

MicroPython adopts Python's code block style, with code specific to a particular function, condition or loop being indented. This differs from most other languages which typically use symbols or keywords to delimit blocks. This assists with the readability of MicroPython code as the visual structure mirrors the semantic structure. This key feature is simple but important as misused indentation can result in code executing under a wrong condition or an overall error from the interpreter.

A colon (:) is the key symbol used to indicate the ending of a condition statement. The indent size is equivalent to one tab or 4 spaces.

Operations

MicroPython has the ability to perform various mathematical operations using primitive and logical operations.

+ Supported operations Type Operator Name Example Arithmetic Addition Subtraction Multiplication Division Modulo division Comparison Equals Not equal Less than Greater than Less than or equals Greater than or equals Logical bitwise and bitwise or bitwise exclusive or bitwise complement logical and logical or

Libraries

MicroPython is a lean and efficient implementation of Python with libraries similar to those in Python. Some standard Python libraries have an equivalent library in MicroPython renamed to distinguish between the two. MicroPython libraries are smaller with less popular features removed or modified to save memory.

The three types of libraries in MicroPython: derived from a standard Python library (built-in libraries) specific MicroPython libraries specific libraries to assist with hardware functionality

MicroPython is highly customisable and configurable, with language differing between each board (microcontroller) and the availability of libraries may differ. Some functions and classes in a module or the entire module may be unavailable or altered.

+ Standard Python libraries in MicroPython Library name Description array operations on arrays cmath provides math functions for complex numbers gc garbage collector math provides basic math operations for floating-point numbers sys system-level functions; provides access to variables used by the interpreter binascii functions for converting between binary and ASCII collections operations for collections and container types that hold various objects errno provides access to error codes hashlib operations for binary hash algorithms heapq operations to implement heap queue algorithm io operations for handling input/output streams json handles conversion between JSON documents and Python objects os functions for filesystem access and basic operating system functions re implements regular expression matching operations select functions for handling events on multiple streams socket connecting to sockets (networks), providing access to socket interface struct performs conversions to Python objects by packing and unpacking primitive data types time provides time and date function, including measuring time intervals and implementing delays zlib operations to decompress binary data

+ MicroPython-specific libraries Library name Description framebuf provides a frame buffer that can be used to create bitmap images to be sent to a display machine functions assisting with accessing and interacting with hardware blocks micropython access and control of MicroPython internals network assists with installing network driver, allowing interactions through networks ctypes access binary data structures

Custom MicroPython libraries

When developers begin to create a new application, standard MicroPython libraries and drivers may not meet the requirements, with insufficient operations or calculations. Similar to Python, there is the possibility of extending MicroPython's functionality with custom libraries which extend the ability of the existing libraries and firmware.

In MicroPython, files ending with .py take preference over other library aliases which allows users to extend the use and implementation of the existing libraries.

Supporting hardware

As MicroPython's implementation and popularity continues to grow, more boards have the ability to run MicroPython. Many developers are building processor specific versions that can be downloaded onto different microcontrollers. Installing MicroPython on microcontrollers is well documented and user-friendly. MicroPython allows interactions between microcontroller hardware and applications to be simple, allowing access to a range of functionality while working in a resource constrained environment, with a strong level of responsiveness.

The two types of boards used to run MicroPython: MicroPython loaded when manufactured, meaning only MicroPython can be run. boards that have firmware that allows MicroPython to be installed to the board.

Executing code

To move a program onto a MicroPython board, create a file and copy it onto the microcontroller in order to execute. With the hardware connected to a device, such as a computer, the board's flash drive will appear on the device allowing files to be moved to the flash drive. There will be two existing python files, boot.py and main.py that are typically not modified, main.py may be modified if you wish to run the program every time the microcontroller is booted, otherwise, programs will be run using the REPL console.

Pyboard

The pyboard is the official MicroPython microcontroller board which fully supports MicroPython's software features. The pyboard's hardware features include:

microcontroller (MCU consisting of CPU, flash ROM and RAM) microUSB connector micro-SD card slot IO pins switches, LEDs, servo ports, real time clock, accelerometer

The booting process

The pyboard contains an internal drive with filesystem named /flash which is stored within the board's flash memory, additionally, a microSD card can be inserted into a slot and is accessible through /sd. When booted up, a pyboard must select a filesystem to boot from either /flash or /sd with the current directory being set to either /flash or /sd. By default, if an SD card is inserted, /sd will be used, if not, /flash is used. If needed, the use of the SD card for the booting process can be avoided by creating an empty file called /flash/SKIPSD which is stored on the board flash memory to skip the SD card for the booting process.

Boot modes