目录
PWM输出
用ESP8266上的led灯进行测试,通过改变占空比控制灯亮度,相关指令如下
from machine import Pin, PWM
pwm2 = PWM(Pin(2)) # 将GPIO02口设置为PWM模式
pwm2.freq() # 查询当前频率
pwm2.freq(1000) # 设置频率,值范围1-1000
pwm2.duty() # 查询当前占空比
pwm2.duty(200) # 设置当前占空比,值范围0-1023,对应0-3.3V,当=0时灯最亮,此时输出为0V
pwm2.deinit() # 关闭PWM设置
上述指令也可以采用下面一条指令进行创建
pwm2 = PWM(Pin(2), freq=1000, duty=200) # 创建PWM输出口并赋值
模拟量输入--双轴摇杆
本次所用的模拟量传感器为双轴摇杆模块,但是由于ESP8266只有A0一个模拟量接口
编写测试程序如下(将其转换为-1000值1000):
import machine
import time
adc = machine.ADC(0)
def getAnalgeVal(curOri, oriMin, oriMax, resultMin, resultMax):
return (curOri-oriMin)*(resultMax-resultMin)/(oriMax-oriMin) + resultMin
def main():
while True:
val =adc.read()
print("原始数据:", val)
#ESP8266上模拟量的范围为0-1024
print("转换为量程数据:", getAnalgeVal(val, 0, 1024, -1000, 1000))
time.sleep_ms(500)
将上述程序封装为驱动程序,名称为analge.py,内容如下
import machine
adc = machine.ADC(0)
class ADC0:
def __init__(self, valMin=0, valMax=1024):
self.valueMin = valMin
self.valueMax = valMax
def getAnalgeVal(self, curOri, oriMin, oriMax, resultMin, resultMax):
return (curOri - oriMin) * (resultMax - resultMin) / (oriMax - oriMin) + resultMin
def oriValue(self):
return adc.read()
def value(self):
val = adc.read()
return self.getAnalgeVal(val, 0, 1024, self.valueMin, self.valueMax)
模拟量采集驱动PWM输出
综合上述案例,编写下述案例,用摇杆来控制ESP8266上led灯亮度
通过这种组合的方式可使用多种场合,如遥控小车的速度控制等
#模拟量输入和PWM输出测试
from analge import ADC0
value = ADC0(-1000, 1000)
from machine import Pin, PWM
pwm2 = PWM(Pin(2)) # 将GPIO02口设置为PWM模式
pwm2.freq(500) # 设定频率
while True:
pwm2.duty(value.oriValue())
print("原始数据:", value.oriValue())
print("转换后数据:", value.value())
time.sleep_ms(200)
SG90舵机控制
本次使用的舵机为SG90,转动范围为0-180度,为模拟量舵机,通过PWM输出来控制舵机角度,如果需要好一点的舵机,可以选择数字舵机MG90,要控制多个舵机,可以选择带I2C接口的PCA9685舵机驱动板(16路PWM模块)。
有关SG90的控制说明这里不进行展开了,网上有很多介绍资料,简单总结为,需要产生一个20ms,即50hz的脉冲,在这个20ms内,0.5ms至2.5ms的高电压对应舵机角度0-180°,把要控制的角度转换为xxms的高电压,再转换为占空比即可。
如下的案例:通过摇杆控制舵机旋转角度
注意:当ESP8266连接舵机后,putty打开会报错,尚不知什么原因
from machine import Pin, PWM
p5 = Pin(5, Pin.OUT)
pwm0 = PWM(p5)
pwm0.freq(50)
from analge import ADC0
value = ADC0(0, 1023)
while True:
#pwmTest()
#由摇杆控制舵机角度
pwm0.duty(int((0.5 + 2 * value.value()/1023) / 20 * 1023))
time.sleep_ms(2000)