ESP32模块的MicroPython的基本实验


 

01 ESP32模块


ESP32是当前流行的WiFi,Bluetooth的SoC系统,有Espressif公司提供。现在市场中存在来自很多公司制作的带有ESP32模块的电路板。使用 MicroPython 可以为不同电路模块提供统一的软件编程界面。这其中也存在一些限制。在Espressif公司提供的参考电路中,给出了的很多端口的命名,但是对于你所使用的电路板,许可通过电路板的设计原理确认哪些是可以使用的。

▲ ESP32电路模块

▲ 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传感器的输出值

▲ 通过热风枪、永磁铁来改变温度以及HALL传感器的输出值

4.网络连接

(1)建立网络对象
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.active(True)
True
>>> wlan.scan()

▲ 输出的list的内容

▲ 输出的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的输出波形

▲ 测试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波形

▲ PIN22输出的PWM波形

(2)设置20kHzPWM
from machine import Pin,PWM

pwm2 = PWM(Pin(22), freq=20000, duty=512)

▲ 输出的PWM波形

▲ 输出的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输入模拟电压

▲ 使用电位器在PIN32输入模拟电压

▲ 输入电压与读出的ADC数值

▲ 输入电压与读出的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数值之间的关系

衰减:ADC.ATTN_2_5DB

▲ 输入电压与ADC读数

▲ 输入电压与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的电压波形

▲ 测量输出DAC的电压波形

 

▌结论


通过一些基本实验,验证了ESP32模块的基本功能。

■ 相关文献链接:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值