Skip to main content

Seeed Studio XIAO ESP32C3 与 CircuitPython

本教程介绍如何在 Seeed Studio XIAO ESP32C3 开发板上安装和运行由 Adafruit Industries 开发的官方 CircuitPython! CircuitPython 是一种编程语言,旨在简化在低成本微控制器板上的实验和编程学习。它让入门变得前所未有的简单,无需预先下载桌面软件。一旦设置好开发板,打开任何文本编辑器,就可以开始编辑代码。更多信息,请参考这里。

安装 CircuitPython​

方法 1:命令行 esptool​

安装 Esptool​

如果您还没有安装 esptool.py,可以在您的电脑上使用 pip 进行安装:

pip install esptool

下载 XIAO ESP32C3 CircuitPython 固件​

您需要从 circirtpython.org 下载固件二进制文件 下载正确的 bin 文件后,导航到该文件夹,并在那里打开一个 cmd 终端。 截至最终草稿,最新版本的 bin 文件是:

adafruit-circuitpython-seeed_xiao_esp32c3-en_GB-9.1.1.bin

将 XIAO ESP32C3 连接到您的电脑​

您需要在将 type C USB 线缆插入电脑的同时,按住 XIAO ESP32C3 开发板上的 BOOT 按钮,以进入"bootloader"模式。

检查端口​

找出您电脑上的所有串行设备。

  • Linux

在 Linux 上,您可以使用 dmesg 命令查看已连接的设备:

dmesg | grep tty

或者,您可以使用 ls 列出串行设备:

ls /dev/ttyS* /dev/ttyUSB*
  • Windows

在 Windows 上,您可以通过设备管理器检查串口。查看"端口 (COM 和 LPT)"部分以查看可用的串口。您也可以在命令提示符中使用 mode 命令来列出串口:

mode
  • macOS

在 macOS 上,您可以使用 ls 命令列出可用的串行端口:

ls /dev/cu*

这将显示所有串口设备。

tip

如果端口繁忙,您可以使用以下命令查找并终止使用该端口的进程(在 macOS 上): 识别使用端口的进程:

lsof | grep port

此命令列出打开的文件并搜索使用指定端口的任何进程。 从输出中找到进程ID(PID)并终止该进程:

kill -9 <PID>

将 PID 替换为找到的实际进程 ID。

Erase flash​

esptool.py --chip esp32c3 --port /dev/cu.usbmodem11301 erase_flash

将 '/dev/cu.usbmodem11301' 替换为您系统中正确的端口名称(例如 Windows 上的 COM3,Linux 上的 /dev/ttyUSB0)。

写入闪存​

将固件刷写到 XIAO ESP32C3:

esptool.py --chip esp32c3 --port /dev/cu.usbmodem11301 --baud 460800 write_flash -z 0x0 adafruit-circuitpython-seeed_xiao_esp32c3-en_GB-9.1.1.bin

再次,将 '/dev/cu.usbmodem11301' 替换为正确的端口名称,将 'adafruit-circuitpython-seeed_xiao_esp32c3-en_GB-9.1.1.bin' 替换为您的空白固件文件的路径。 通过 RTS 引脚进行硬复位...

方法 2:Web Serial esptool​

WebSerial ESPTool 被设计为一个基于 Web 的选项,用于编程具有基于串行 ROM 引导加载程序的 Espressif ESP 系列微控制器板。它允许您擦除微控制器的内容并在不同偏移量处编程多达 4 个文件。请参考 Web Serial ESPtool。

然后可以开始使用您喜欢的工具为 XIAO ESP32C3 编译脚本!

CircuitPython 推荐编辑器​

通常,当 CircuitPython 完成安装,或者您将已安装 CircuitPython 的 CircuitPython 板插入计算机时,该板会在您的计算机上显示为名为 CIRCUITPY 的 USB 驱动器。 但是,不支持原生 USB 的 ESP32 或 ESP32-C3 微控制器无法呈现 CIRCUITPY 驱动器。 在这些板上,有其他方法来传输和编辑文件。您可以使用 Thonny,它使用发送到 REPL 的隐藏命令来读取和写入文件。或者您可以使用在 Circuitpython 8 中引入的 CircuitPython web workflow。Web workflow 提供基于浏览器的 WiFi 访问 CircuitPython 文件系统,请参考 使用代码编辑器开始使用 web workflow

1. Thonny​

安装并打开 thonny,然后按照说明配置 Thonny:

pip install thonny
#open thonny after installation
thonny

转到 Run-->Configure Interpreter,确保 Thonny 选项中的 Interpreter 选项卡如下图所示,选择"CircuitPython (generic)"和端口:

在对话框中点击"OK",您应该会在 thonny 窗口底部看到 Micropython shell,如下图所示。 然后您可以使用 Read-Evaluate-Print-Loop,或 REPL 进行串行连接,这允许您输入单独的代码行并在 shell 中立即运行它们。如果您在特定程序中遇到问题并且无法找出原因,这非常方便。它是交互式的,因此非常适合测试新想法。请参考 REPL 获取更多信息。

使用 help() 与 REPL 交互,它会告诉您从哪里开始探索 REPL。要在 REPL 中运行代码,请在 REPL 提示符旁边输入代码。 要列出内置模块,请输入 help("modules"),这将显示所有内置到 CircuitPython 中的核心模块列表,包括"board"。

然后可以在 REPL 中输入 "import board" 并按回车。接下来,在 REPL 中输入 "dir(board)" 并获取您开发板上所有引脚的列表。

2. CircuitPython Web Workflow​

CircuitPython 代码编辑器 在编辑运行最新版本 CircuitPython 的基于 ESP32 的设备上的文件时,提供了更完整和更丰富的体验。 该编辑器允许您使用 web 蓝牙、USB 和通过 WiFi 的 Web Workflow 来编辑文件。

引脚定义/端口信息​

在 XIAO ESP32C3 上开始使用 CircuitPython​

Network-WLAN​

对于没有原生 USB 的开发板(如 ESP32-C3 或 ESP32),您需要使用 REPL 连接到 Wi-Fi。当名为 settings.toml 的文件添加到 CircuitPython 文件系统的根文件夹时,Wi-Fi 功能就会启用。 通过 REPL 创建 settings.toml 文件:

f = open('settings.toml', 'w')
f.write('CIRCUITPY_WIFI_SSID = "wifissid"\n')
f.write('CIRCUITPY_WIFI_PASSWORD = "wifipassword"\n')
f.write('CIRCUITPY_WEB_API_PASSWORD = "webpassword"\n')
f.close()
  • 将 wifissid 替换为您本地 wifi 网络的名称
  • 将 password 替换为您本地 wifi 密码
  • 另一个密码 webpassword 用于通过网页浏览器访问开发板时使用。将其设置为您想要的任何值

连接后,您可以按下 Reset 按钮来启动固件,然后按几次回车键进入 REPL 提示符。然后将设备重新连接到 Thonny,您的 XIAO ESP32C3 的 IP 地址就会显示出来。

note

别忘了,ESP32 不支持 5 GHz 网络,所以如果您有两个网络,请使用您的 2.4 GHz SSID。

延时和定时​

time 模块:

import time
time.sleep(1) # sleep for 1 second
time.sleep_ms(500) # sleep for 500 milliseconds
time.sleep_us(10) # sleep for 10 microseconds
start = time.ticks_ms() # get millisecond counter
delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference

引脚和 GPIO​

可以使用模块 "board" 和 "microcontroller" 通过以下代码控制 gpio,并将 LED 连接到 D5:

# using board module
import board
import digitalio
import time

led = digitalio.DigitalInOut(board.D5)
led.direction = digitalio.Direction.OUTPUT

while True:
led.value = True # turn on LED
time.sleep(1)
led.value = False # turn off LED
time.sleep(1)

# using microcontroller module
import microcontroller
import digitalio
import time

led = digitalio.DigitalInOut(microcontroller.pin.GPIO7)
led.direction = digitalio.Direction.OUTPUT

while True:
led.value = True # turn on LED
time.sleep(1)
led.value = False # turn off LED
time.sleep(1)

UART(串行总线)​

使用 busio 模块:

import board
import busio

# initialise UART
uart = busio.UART(board.TX, board.RX, baudrate=9600)

# send data
uart.write(b"Hello UART\n")

# receive data
while True:
if uart.in_waiting > 0:
data = uart.read()
print("Received:", data)

XIAO ESP32C3 有一个硬件 UART。引脚列表如下:

UARTPin
TXD6
RXD7

PWM(脉宽调制)​

使用 pwmio 模块:

import board
import pwmio
from digitalio import DigitalInOut
import time

# initialise PWM
pwm = pwmio.PWMOut(board.D5, frequency=5000, duty_cycle=0)

# a dimming led
while True:
for duty_cycle in range(0, 65535, 1000):
pwm.duty_cycle = duty_cycle
time.sleep(0.1)

ADC(模数转换)​

使用 analogio 模块:

import board
import analogio
import time

# initialise ADC
adc = analogio.AnalogIn(board.A0)

while True:
value = adc.value
print("ADC Value:", value)
time.sleep(1)

SPI​

import board
import busio
import digitalio

# initialize SPI
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)

# choose a chip
cs = digitalio.DigitalInOut(board.D5)
cs.direction = digitalio.Direction.OUTPUT
cs.value = True

# send and receive data
data_out = bytearray([0x01, 0x02, 0x03])
data_in = bytearray(3)
spi.write_readinto(data_out, data_in)
print("Received:", data_in)
SPIPin
SCKD8
MOSID10
MISOD9

I2C​

import board
import busio

# Initialize I2C
i2c = busio.I2C(board.SCL, board.SDA, frequency=400000)

XIAO 扩展底板​

前提条件:

XIAO ESP32C3
已焊接排针
XIAO 扩展底板Grove 光传感器

读取光传感器数据​

import time
import board
import analogio

# Initialize the analog input on A0
analog_in = analogio.AnalogIn(board.A0)

def get_voltage(pin):
return (pin.value * 3.3) / 65536

while True:
# Read the raw analog value
raw_value = analog_in.value
# Convert the raw value to voltage
voltage = get_voltage(analog_in)

# Print the raw value and voltage to the serial console
print("[Light] Raw value: {:5d} Voltage: {:.2f}V".format(raw_value, voltage))

# Delay for a short period of time before reading again
time.sleep(1)

点亮OLED屏幕​

下载并解压库包:

  • 前往库并下载适用于CircuitPython的库包。要安装,请下载适合您的CircuitPython版本的相应包。

将库复制到CIRCUITPY:

  • 解压库包ZIP文件。您将找到一个名为lib的文件夹,其中包含各种*.mpy*文件。
  • 打开Thonny-->查看-->文件,然后将必要的.mpy文件和lib文件夹复制到CircuitPython设备/lib。 您需要从包中手动安装必要的库:
    • adafruit_ssd1306
    • adafruit_bus_device
    • adafruit_register
    • adafruit_framebuf.mpy

创建您的CircuitPython代码:

  • 创建一个code.py文件(或main.py)。此文件应包含您的CircuitPython代码。
import board
import busio
import displayio
import adafruit_ssd1306
import terminalio

# Initialize I2C
i2c = busio.I2C(board.SCL, board.SDA)

# Define the display parameters
oled_width = 128
oled_height = 64

# Initialize the OLED display
oled = adafruit_ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

# Fill the display with the color 0
oled.fill(0)
# Set the first pixel white
oled.pixel(0, 0, 1)
oled.show()

"卸载" CircuitPython​

我们的许多开发板都可以使用多种编程语言。例如,Circuit Playground Express 可以与 MakeCode、Code.org CS Discoveries、CircuitPython 和 Arduino 一起使用。您可能想要回到 Arduino 或 MakeCode。没有什么需要卸载的。CircuitPython 只是"另一个程序",被加载到您的开发板中。因此,您可以简单地加载另一个程序(Arduino 或 MakeCode),它将覆盖 CircuitPython。

备份您的代码​

在替换 CircuitPython 之前,不要忘记备份您在 CIRCUITPY 驱动器上的代码。这意味着您的 code.py 和任何其他文件、lib 文件夹等。当您移除 CircuitPython 时,您可能会丢失这些文件,所以备份是关键!只需将文件拖到您的笔记本电脑或台式电脑上的文件夹中,就像您对任何 USB 驱动器所做的那样。

转移到 Arduino​

如果您想使用 Arduino,您只需使用 Arduino IDE 加载一个 Arduino 程序。这里是上传一个简单的"Blink" Arduino 程序的示例,但您不必使用这个特定的程序。 首先插入您的开发板,然后双击复位,直到您看到板载 LED 灯亮起。

感谢您阅读本文!欢迎在评论中分享您的想法。

资源​

技术支持与产品讨论​

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...