文章目录
▌01 ESP32模块
ESP32是当前流行的WiFi,Bluetooth的SoC系统,有Espressif公司提供。现在市场中存在来自很多公司制作的带有ESP32模块的电路板。使用 MicroPython 可以为不同电路模块提供统一的软件编程界面。这其中也存在一些限制。在Espressif公司提供的参考电路中,给出了的很多端口的命名,但是对于你所使用的电路板,许可通过电路板的设计原理确认哪些是可以使用的。
▲ ESP32电路模块
在两款带有WiFI的MicroPython模块:ESP32,ESP8266 博文中,介绍了如何对于刚刚购买到的两款WiFi通讯模块ESP32,ESP8266通过Thonny完成相应的固件升级,进而可以利用MicroPython 对模块进行相关实验。 。
本文根据 Quick reference for the ESP32 中的介绍来进行初步 测试。
▌02 测试实验
1.设置频率
可以通过machine.freq()函数来查看或者设置ESP32的工作时钟频率,它只能报扩:20MHz, 40MHz, 80Mhz, 160MHz or 240MHz这些频率设置。如果超出这个范围,则运行时就会出现错误。
import machine
print(machine.freq())
machine.freq(240000000)
print(machine.freq())
执行结果:
160000000
240000000
2.关于Flash
相关的功能参见 ESP32相关的功能
(1)获得扇区基本信息
import esp
print(hex(esp.flash_size()))
print(hex(esp.flash_user_start()))
给出的结果:
0x400000
0x200000
其中扇区的大小为0x1000(4096),用户起始扇区为512.
(2)扇区读取
b = bytearray(0x1000)
buffer = esp.flash_read(2097152, b)
print(b[:100])
print(b[-100:])
(3)扇区写入
a = bytearray(range(0x1000))
esp.flash_write(2097152, a)
(4)扇区擦除
esp.flash_erase(512)
通过下面程序证明了ESP32中可以使用的FLASH的扇区大小为0x1000.
import machine,esp
print(esp.flash_size())
print(esp.flash_user_start())
a = bytearray(range(0x2000))
esp.flash_write(2097152, a)
esp.flash_erase(512)
b = bytearray(0x2000)
buffer = esp.flash_read(2097152, b)
print(b[:100])
print(b[-100:])
下面是输出结果,可以看到前面0x1000的部分已经被flash_erase(512)给擦除了,但是后面的部分0x1000还存在数据。
▲ 测试扇区大小的输出结构
3.关于传感器
import machine,esp,esp32,time
print('Test Temperatur')
while True:
print(esp32.raw_temperature())
print(esp32.hall_sensor())
time.sleep_ms(500)
break
可以通过热风枪对于模块加热,可以观察到芯片的温度变化。使用外部的永磁铁可以观察到对应的HALL传感器的输出的变化。
▲ 通过热风枪、永磁铁来改变温度以及HALL传感器的输出值
4.网络连接
(1)建立网络对象
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.active(True)
True
>>> wlan.scan()
▲ 输出的list的内容
(2)连接网络
>>> wlan.isconnected()
False
>>> wlan.connect('TENDA626A', 'gniqouhz')
>>> wlan.isconnected()
True
>>> wlan.config('mac')
b'$\n\xc4Y\xd8@'
>>> wlan.ifconfig()
('192.168.0.119', '255.255.255.0', '192.168.0.1', '166.111.8.29')
>>>
import network,time
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
if not wifi.isconnected():
wifi.connect('TENDA626A', 'gniqouhz')
print(wifi.ifconfig())
5.延时和定时
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
6.管脚与GPIO
(1)基本函数
相关示例:
from machine import Pin
p0 = Pin(0, Pin.OUT) # create output pin on GPIO0
p0.on() # set pin to "on" (high) level
p0.off() # set pin to "off" (low) level
p0.value(1) # set pin to on/high
p2 = Pin(2, Pin.IN) # create input pin on GPIO2
print(p2.value()) # get value, 0 or 1
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation
关于管脚说明:
- Pins 1 and 3 are REPL UART TX and RX respectively
- Pins 6, 7, 8, 11, 16, and 17 are used for connecting the embedded flash, and are not recommended for other uses
- Pins 34-39 are input only, and also do not have internal pull-up resistors
- The pull value of some pins can be set to Pin.PULL_HOLD to reduce power consumption during deepsleep.
(2)输出方波波形
import machine,esp,esp32,time
print('Test Pins')
p0 = machine.Pin(22, machine.Pin.OUT)
while True:
p0.on()
time.sleep_ms(10)
p0.off()
time.sleep_ms(10)
▲ 测试GPIO:22的输出波形
7.PWM
(1)设置1000HzPWM
from machine import Pin,PWM
pwm0 = PWM(Pin(22))
pwm0.freq(1000)
print(pwm0.duty())
pwm0.duty(200)
▲ PIN22输出的PWM波形
(2)设置20kHzPWM
from machine import Pin,PWM
pwm2 = PWM(Pin(22), freq=20000, duty=512)
▲ 输出的PWM波形
8.ADC
(1)直接读取ADC
from machine import ADC,Pin
import time
adc = ADC(Pin(32))
while True:
print(adc.read())
time.sleep_ms(250)
▲ 使用电位器在PIN32输入模拟电压
▲ 输入电压与读出的ADC数值
(2)对输入进行衰减
adc.atten(ADC.ATTN_11DB)
['__class__', '__name__', 'read', '__bases__', '__dict__', 'ATTN_0DB', 'ATTN_11DB', 'ATTN_2_5DB',
'ATTN_6DB', 'WIDTH_10BIT', 'WIDTH_11BIT', 'WIDTH_12BIT', 'WIDTH_9BIT', 'atten', 'read_u16', 'width']
exp(log(10)*11/20) : 计算11dB对应的增益:
- 11DB:3.55V
- 2.5DB:1.333
使用ATTN_11DB衰减之后,读取输入电压与ADC的数值关系:
▲ 输入电压与读出数值
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# READM.PY -- by Dr. ZhuoQing 2021-02-28
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
THONNY_WINDOW = 'Thonny'
def readadc():
tspsendwindowkey(THONNY_WINDOW, "s", alt=1)
tspsendwindowkey(THONNY_WINDOW, "adc.read")
tspsendwindowkey(THONNY_WINDOW, "()", shift=1)
tspsendwindowkey(THONNY_WINDOW, "\r")
tspsendwindowkey(THONNY_WINDOW, "ac", control=1)
lines = clipboard.paste().split()
return int(lines[-2])
setv = linspace(0, 3.5, 100)
readv = []
for v in setv:
dh1766volt(v)
time.sleep(.1)
adc = readadc()
printff(v, adc)
readv.append(adc)
tspsave('measure', setv=setv, readv=readv)
dh1766volt(0)
plt.plot(setv, readv)
plt.xlabel("Voltage(V)")
plt.ylabel("Read")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : READM.PY
#============================================================
衰减:ADC.ATTN_6DB
▲ 输入电压与ADC数值之间的关系
衰减:ADC.ATTN_2_5DB
▲ 输入电压与ADC读数
9.DAC
(1)基本编程
参考资料: DAC数模转换
>>> from machine import DAC, Pin
>>> dac_pin = Pin(26, Pin.OUT)
>>> dac = DAC(dac_pin)
>>> dac.write(0x80)
>>> dac.write(0)
>>> dac.write(0xff)
可以在PIN26测量到电压的变化。
(2)输出锯齿波
from machine import Pin,DAC
import time
dac = DAC(Pin(26, Pin.OUT))
while True:
for n in range(256):
dac.write(n)
▲ 测量输出DAC的电压波形
▌结论
通过一些基本实验,验证了ESP32模块的基本功能。
■ 相关文献链接: