name: xiao-micropython description: Complete MicroPython development for XIAO boards. Use when writing MicroPython scripts for XIAO (ESP32C3/C5/C6/S3, RP2040/RP2350, nRF52840, nRF54L15). Requires /xiao skill for board-specific pin definitions. Covers firmware flashing, ESP32/network modules (network, WiFi, BLE, MQTT), machine modules (Pin, I2C, SPI, UART, PWM, ADC), common libraries (urequests, umqtt, ssd1306, bme280, neopixel), and project examples.
XIAO MicroPython Development
Overview
Complete MicroPython development guide for SeeedStudio XIAO series. This skill works with the /xiao skill - use /xiao for pin definitions, /xiao-micropython for MicroPython-specific APIs and libraries.
Prerequisites
- Pin Definitions: Read
/xiaoskill first for board-specific pin mappings - Thonny IDE: Recommended for MicroPython development
- Firmware: MicroPython firmware flashed to board
- Code Verification: Install
mpy-crossfor fast offline syntax checking (recommended)
Environment Setup
For first-time MicroPython environment setup, see setup/:
- Thonny IDE Installation:
setup/thonny-ide.md - Firmware Flashing:
setup/esptool.md - Code Verification:
setup/mpy-cross.md(recommended for syntax validation)
Supported Boards
| Board | Firmware Download | Getting Started |
|---|---|---|
| ESP32C3 | micropython.org | getting-started/esp32c3.md |
| ESP32C5 | ESP32 generic (C3 works) | getting-started/esp32c5.md |
| ESP32C6 | micropython.org | getting-started/esp32c6.md |
| ESP32S3 | micropython.org | getting-started/esp32s3.md |
| RP2040 | micropython.org | getting-started/rp2040.md |
| RP2350 | micropython.org | getting-started/rp2350.md |
| nRF52840 | Community port | getting-started/nrf52840.md |
| nRF54L15 | Seeed port | getting-started/nrf54l15.md |
Note: SAMD21, MG24 MicroPython support is limited or requires community forks.
MicroPython Project Structure (CRITICAL)
MicroPython projects typically use these file patterns:
main.py- Main application script (auto-runs on boot)boot.py- Initialization script (runs before main.py)config.py- Configuration constants and settingslib/- Custom library modules
MicroPythonProject/
├── main.py # Main application (auto-runs)
├── boot.py # WiFi/initialization
├── config.py # Pin definitions, settings
└── lib/
├── wifi.py # WiFi connection module
└── sensor.py # Sensor driver module
Code Generation Workflow (CRITICAL)
When a user requests MicroPython code generation, you MUST:
Step 1: Create Project Files
- Use the
Writetool to create the actual.pyfile(s) - Follow the MicroPython project structure shown above
- Example: Create
xiao_expansion_base_rtc.pyor a full project withmain.py,config.py, etc.
Step 2: Verify Syntax (If mpy-cross is Available)
- After creating the file, run
mpy-crossto verify syntax - This catches errors without needing a physical device
- Report syntax validation results to the user
Quick Start
1. Flash Firmware
pip install esptool
esptool.py --chip esp32c3 --port COM3 write_flash -z 4MB 0 firmware.bin
2. Connect with Thonny
- Open Thonny IDE
- Tools > Options > Interpreter > MicroPython (ESP32)
- Select port and connect
3. First Script
from machine import Pin
import time
led = Pin(10, Pin.OUT) # D10
while True:
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
Machine Module Quick Reference
| Module | Reference | Usage |
|---|---|---|
| GPIO (machine.Pin) | api/gpio.md |
Digital I/O, interrupts |
| PWM (machine.PWM) | api/pwm.md |
Analog output, servo control |
| ADC (machine.ADC) | api/adc.md |
Analog input reading |
| I2C (machine.I2C) | api/i2c.md |
Sensor communication |
| SPI (machine.SPI) | api/spi.md |
High-speed peripherals |
| UART (machine.UART) | api/uart.md |
Serial communication |
GPIO Example
from machine import Pin
led = Pin(10, Pin.OUT)
led.on() # Turn on
led.off() # Turn off
led.toggle() # Toggle
button = Pin(6, Pin.IN, Pin.PULL_UP)
if button.value() == 0:
print("Pressed")
I2C Example
from machine import I2C, Pin
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
devices = i2c.scan()
print(f"I2C devices: {[hex(d) for d in devices]}")
Network Modules (ESP32)
| Module | Reference | Usage |
|---|---|---|
| WiFi (network.WLAN) | api/wifi.md |
Wireless connectivity |
| HTTP (urequests) | api/http.md |
Web requests |
| MQTT (umqtt) | api/mqtt.md |
IoT messaging |
| BLE (bluetooth) | api/ble.md |
Bluetooth Low Energy |
| Socket | api/socket.md |
TCP/UDP networking |
WiFi Quick Start
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('SSID', 'password')
while not wlan.isconnected():
time.sleep(1)
print(f'IP: {wlan.ifconfig()[0]}')
HTTP Request
import urequests
response = urequests.get('http://httpbin.org/get')
print(response.text)
response.close()
Common Libraries
| Library | Reference | Usage |
|---|---|---|
| SSD1306 | libraries/ssd1306.md |
OLED displays |
| BME280 | libraries/bme280.md |
Weather sensors |
| NeoPixel | libraries/neopixel.md |
RGB LEDs |
| DHT | libraries/dht.md |
Temp/Humidity sensors |
| SD (sdcard) | libraries/sdcard.md |
SD card storage |
SSD1306 OLED
from machine import Pin, I2C
import ssd1306
i2c = I2C(0, sda=Pin(0), scl=Pin(1))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("Hello XIAO!", 0, 0)
oled.show()
Code Verification
Quick syntax validation (no device needed):
# Install mpy-cross
pip install mpy-cross
# Verify syntax
mpy-cross script.py
# ✅ No error = valid, ❌ SyntaxError = fix code
Device testing (optional):
# Install mpremote
pip install mpremote
# Test on device
mpremote run script.py
For detailed verification workflow, see setup/mpy-cross.md and setup/mpremote.md.
Board-Specific APIs
ESP32 Series (C3/C5/C6/S3)
- Deep Sleep:
api/esp32-sleep.md - BLE:
api/esp32-ble.md - Camera (S3 Sense):
api/esp32s3-camera.md
nRF52 Series (nRF52840)
- Sleep:
api/nrf-sleep.md - BLE:
api/nrf-ble.md
RP Series (RP2040/RP2350)
- Sleep:
api/rp-sleep.md - PIO:
api/rp2040-pio.md
Expansion Boards
XIAO expansion boards add peripherals. For hardware specs, see /xiao/references/expansion_boards/.
| Expansion Board | Key Features | Reference |
|---|---|---|
| Expansion Base | OLED, RTC, SD card, buzzer | expansion-boards/expansion-base.md |
| Round Display | 1.28" touchscreen | expansion-boards/round-display.md |
| Grove Shield | 8 Grove connectors | expansion-boards/grove-shield.md |
| CAN Bus | MCP2515 controller | expansion-boards/can-bus.md |
| GPS/GNSS | L76K GNSS module | expansion-boards/gps-gnss.md |
Expansion Board Examples
Expansion Base (OLED + RTC)
from machine import Pin, I2C
import ssd1306
import time
# OLED (I2C address 0x3C)
i2c = I2C(0, sda=Pin(0), scl=Pin(1))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("XIAO Base", 0, 0)
oled.show()
# RTC (DS3231, I2C address 0x68)
def set_rtc(datetime_tuple):
i2c.writeto(0x68, bytes([0x00] + list(datetime_tuple)))
def get_rtc():
i2c.writeto(0x68, b'\x00')
data = i2c.readfrom(0x68, 7)
return (data[0], data[1], data[2])
# SD Card (SPI)
import sdcard, machine
sd = sdcard.SDCard(machine.SPI(0), machine.Pin(4))
vfs = os.VfsFat(sd)
os.mount(vfs, '/sd')
with open('/sd/data.txt', 'w') as f:
f.write('Hello from XIAO!')
Code Patterns
Main Loop with Exception Handler
import time
def main():
while True:
try:
# Your code here
time.sleep(1)
except Exception as e:
print(f"Error: {e}")
time.sleep(5)
if __name__ == "__main__":
main()
Non-blocking Delay
import time
last_check = 0
interval = 5000 # 5 seconds
while True:
current = time.ticks_ms()
if time.ticks_diff(current, last_check) >= interval:
last_check = current
# Do periodic task
# Other code here
Troubleshooting
| Issue | Solution |
|---|---|
OSError: [Errno 5] |
Check I2C/SPI pins with /xiao skill |
ImportError |
Verify module exists in firmware |
| WiFi won't connect | Ensure 2.4GHz network (ESP32 only) |
| Board won't upload | ESP32: Hold BOOT; RP2040: Hold BOOTSEL |
Resources
setup/
setup/thonny-ide.md- Thonny IDE installationsetup/esptool.md- Firmware flashingsetup/mpy-cross.md- Offline syntax verificationsetup/mpremote.md- Device testing and deployment
getting-started/
Board-specific setup instructions.
api/
MicroPython module documentation (GPIO, I2C, WiFi, BLE, sleep, etc.)
libraries/
Common libraries (SSD1306, BME280, NeoPixel, etc.)
examples/
Complete project examples:
examples/weather-station.md- BME280 weather station with MQTTexamples/ble-peripheral.md- BLE environmental sensorexamples/mqtt-sensor.md- MQTT temperature/humidity sensor
Related Skills
/xiao- Core board reference with pin definitions/xiao-arduino- Arduino development/xiao-esphome- ESPHome configuration

