1
本帖最后由 HonestQiao 于 2021-9-11 23:18 编辑
MicroPython是一个强大的工具,降低开发难度,让极客们能够立刻操刀控制硬件,不需要复杂的编译过程,简单的功能调试,还可以边输入边运行结果,而不需要上载,使用非常简单方便。
关于MicroPython的基础概念,我们就不多说,下面是网上的:
MicroPython
是 Python 3 语言的精简高效实现 ,包括Python标准库的一小部分,并针对嵌入式微控制器(单片机)和受限制的环境进行了优化,它是Python延伸出来的一个落地产物。MicroPython是运行在微控制器硬件之上的完全的Python编译器和运行时系统,它提供给用户一个交互式提示符(REPL)来立即执行所支持的命令。除了包括选定的核心Python库,MicroPython还包括了给予编程者访问低层硬件的模块。
下面,跟着我一步一步来,就能顺利的在 FireBeetle Board ESP32-E IoT 开发板 上,把MicroPython跑起来,最后,我们还要做一个板载LED呼吸灯的示例。
主要的操作步骤,来自于官方文档:Quick reference for the ESP32
第一步:烧录MicroPython固件
1. 下载MicroPython固件
官方下载地址:MicroPython downloads,进入Generic ESP32 module,下载最新的稳定版本:https://micropython.org/resources/firmware/esp32-20210902-v1.17.bin
2. 安装ESPTool工具
ESPTool是基于Python的,所以,你应该先安装Python3,尽量安装Python3.7及以上版本。
Python3.x最新版本:https://www.python.org/downloads/,按照自己的系统需要,下载对应的版本安装即可。
安装完成后,打开命令行窗口,执行如下命令安装ESPTool:
- % python -V
- Python 3.9.7
- % pip install esptool
复制代码
3. 烧录固件:
要收录固件,首先需要使用erase_flash擦除,然后使用write_flash写入新的固件,具体操作如下:
- cd 到固件存放的路径
- esptool.py --chip esp32 --port serial_port erase_flash
- esptool.py --chip esp32 --port serial_port write_flash -z 0x1000 esp32-20210902-v1.17.bin
复制代码
如果是在Linux系统或者Mac系统,serial_port的获得,通过ls /dev/* | grep wch来获得,如Mac系统为:/dev/cu.wchu***serial1420,则最终的最终命令为:
- esptool.py --chip esp32 --port /dev/cu.wchu***serial1420 erase_flash
- esptool.py --chip esp32 --port /dev/cu.wchu***serial1420 write_flash -z 0x1000 esp32-20210902-v1.17.bin
复制代码
如果是在Windows系统下,则前往系统设备,查看连接后的COM端口,如为COM4,则最终的最终命令为:
- esptool.py --chip esp32 --port COM4 erase_flash
- esptool.py --chip esp32 --port COM4 write_flash -z 0x1000 esp32-20210902-v1.17.bin
复制代码
烧录后,结果如下:
# erase_flash结果 esptool.py v3.2-dev Serial port /dev/cu.wchu***serial1420 Connecting.... Chip is ESP32-D0WD-V3 (revision 3) Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz MAC: 08:3a:f2:39:12:60 Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 17.9s Hard resetting via RTS pin... # write_flash 结果 esptool.py v3.2-dev
Serial port /dev/cu.wchu***serial1420
Connecting....
Chip is ESP32-D0WD-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 08:3a:f2:39:12:60
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00175fff...
Compressed 1527504 bytes to 987584... Writing at 0x00053c6d... (100 %)
Wrote 1527504 bytes (987584 compressed) at 0x00001000 in 88.2 seconds (effective 138.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
如果发生异常,请检查端口是否正确,固件下载是否正确。
4. 测试固件是否运行
固件烧录成功后,即可使用串口工具连接板子,连接后,将直接进入Python执行环境,也就是REPL环境。REPL具体表示:“读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL),也就是一个基础的交互编程环境,可以边输入代码,边执行输出结果,方便调试查看。
- # Windows环境,可以试用putty_telnet或者mobaxterm
- # Mac或者Linux环境,可以使用screen /dev/cu.wchu***serial1420 115200
复制代码
然后使用使用命令:
- import sys
- print(sys.version)
- print('Hello World!')
复制代码
如果连接后,按照如上基础命令执行,并输出,说明我们的开发版,已经具备好了MicroPython环境啦。
第二步:MicroPython功能测试
在MicroPython的REPL环境下,我们可以开始直接输入Python语句,来执行对应的功能:
一、硬件相关的模块功能:
1. 通过machine模块,获取系统时钟频率:
- import machine
- machine.freq() # 获取 CPU 时钟频率
- machine.freq(240000000) # 设置时钟频率
复制代码
machine模块,还能进行系统睡眠等功能。
2. 通过esp模块,读取板子的信息:
- import esp
- esp.flash_size() #flash大小
- esp.flash_user_start() # 用户空间起始地址
复制代码
通过esp模块,还能对flash进行擦写操作。(慎用!!!)
3. 通过esp32模块,读取板载传感器信息
- import esp32
- esp32.hall_sensor() # 系统霍尔传感器的数量
- esp32.raw_temperature() # 获取MCU温度,单位为华氏温度
复制代码
二、网络相关的功能:
- >>> import network
- # 连接到WiFi
- >>> wlan = network.WLAN(network.STA_IF) # 创建网络接口
- >>> wlan.active(True) # 激活接口
- >>> wlan.scan() # 扫描AP
- >>> wlan.isconnected() # 检查是否已经连接到AP
- >>> wlan.connect('AP SSID名称', 'AP密码') # 连接到 AP
- >>> wlan.config('mac') # 获取接口MAC硬件地址
- >>> wlan.ifconfig() # 获取接口连接信息,包括: IP、netmask、gw、DNS
- # 把自身设置为热点:
- >>> ap = network.WLAN(network.AP_IF) # 创建网络接口
- >>> ap.config(essid='ESP-AP') # 设置热点名称为ESP-AP
- >>> ap.config(max_clients=10) # 设置同时可以连接的最大设备数量
- >>> ap.active(True) # 激活接口
复制代码
三、时间模块:
- import time
- time.sleep(1) # sleep 1秒
- time.sleep_ms(500) # sleep 500 毫秒
- time.sleep_us(10) # sleep 10微秒
- start = time.ticks_ms() # 获取毫秒计数器
- delta = time.ticks_diff(time.ticks_ms(), start) # 计算时差
复制代码
四、定时器:machine.Timer
- from machine import Timer
- tim0 = Timer(0) # 使用计数器0,系统支持0-3一共4个计数器
- tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0)) #设置周期,类型=一次运行,回调函数
- tim1 = Timer(1) # 使用计数器1
- tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1)) #设置周期,类型=周期性运行,回调函数
复制代码
五、GPIO端口操作:
- from machine import Pin
- # 可以操作时,观察板子上LED的点亮和熄灭
- p2 = Pin(2, Pin.OUT) # 设置IO2为输出端口,用于控制板载LED
- p2.on() # 设置为高电平
- p2.off() # 设置为低电平
- p2.value(1) # 设置为高电平,如果为0则表示低电平
- p3 = Pin(3, Pin.IN) # 设置IO3为输出输出
复制代码
以上为部分基础操作指令,更多的操作指令,可以从官方文档了解: https://docs.micropython.org/en/latest/esp32/quickref.html
第三步:FireBeetle Board ESP32-E IoT 开发板 LED闪烁
首先,我们通过板子的硬件和使用文档,了解板载单色LED为IO2,Arduino之中对应为D8。在另外一篇文档中,我们使用的3色LED,为IO5,对应Arduino的D9,不要弄混了。【如格式不正确,请查看附件中的blink.py】
- from machine import Pin
- import time
- p2 = Pin(2, Pin.OUT)
- state=0
- while True:
- state = not state
- print('LED %s' % ('On' if state else 'Off'))
- p2.value(state)
- time.sleep(1)
复制代码
通过MicroPython,我们可以使用Python简单易用的语法,强大的扩展库,来充分挖掘开发版的功能,让开发版的功效发挥到极致。
第四步:FireBeetle Board ESP32-E IoT 开发板 LED呼吸灯
在上面的实例中,我们都需要在命令行敲入命令,这对于一些简单的简短指令来说,比较方便快捷,能够马上看到运行结果。
但是,如果我们要编写的程序比较长,那么通过这种方式,就不是很方便,一旦输入错误,想要修改,就非常的不便。
好在MicroPythoh提供了上传接口,我们可以通过adafruit-ampy工具,在命令行,直接把python文件上传到板子上,从而调用或者运行。要控制一个基础的LED呈现呼吸灯状态,实际也是通过输出电平对应的占空比,来实现。在这个实例中,我们需要用到PWM,通过调整PWM的周期、PWM的占空比从而达到控制充电电流的目的,并使得电流的变化平滑过渡,从而表现出来就是LED呈现自然的呼吸灯状态。
这个部分的代码,我们参考: http://www.1zlab.com/wiki/micropython-esp32/pwm/,具体如下:文件:swicth.py 为PWM控制的基础类【如格式不正确,请查看附件】
- from machine import PWM
- from machine import Pin
- class Switch():
- """
- 创建一个开关类
- """
- def __init__(self, pin, freq=1000):
- """
- 初始化绑定一个引脚,设置默认的PWM频率为1000
- """
- self.pwm = PWM(pin,freq=freq)
- def change_duty(self, duty):
- """
- 改变占空比
- """
- if 0 <= duty and duty <= 1023:
- self.pwm.duty(duty)
- else:
- print('警告:占空比只能为 [0-1023] ')
- def deinit(self):
- """
- 销毁
- """
- self.pwm.deinit()
复制代码
文件:switch_led.py 为控制灯的逻辑处理【如格式不正确,请查看附件】
- import machine
- import utime, math
- from switch import Switch
- from machine import Pin
- switch_led = Switch(Pin(2))
- def pulse(switch, period, gears):
- # 呼吸灯核心代码
- # 借用sin正弦函数,将PWM范围控制在 23 - 1023范围内
- # switch 开关对象
- # period 呼吸一次的周期 单位/毫秒
- # gears 呼吸过程中经历的亮度档位数
- for i in range(2 * gears):
- switch.change_duty(int(math.sin(i / gears * math.pi) * 500) + 523)
- # 延时
- utime.sleep_ms(int(period / (2 * gears)))
- # 呼吸十次
- for i in range(100):
- pulse(switch_led, 2000, 100)
- # 释放资源
- switch_led.deinit()
复制代码
在以上代码中,我们设置了呼吸灯100个循环,然后退出。
将以上两个文件保存后,我们就利用adafruit-ampy,来将文件上传到开发版的MicroPython环境,具体操作如下:
- # 安装adafruit-ampy
- pip install adafruit-ampy
- # 上传python文件
- ampy --port /dev/cu.wchu***serial1420 put switch.p
- ampy --port /dev/cu.wchu***serial1420 put switch_led.p
复制代码
注意,进行以上操作时,需要退出串口连接,否则无法上传。
上传完成后,我们就可以调用执行了:
执行到这一步的时候,界面会停住,这时需要看开发版上的绿色LED了。
实际表现如以下视频:
LED呼吸灯
|
|