基于MicroPython的ESP8266连接外设IO(三)

目录

PWM输出

模拟量输入--双轴摇杆

模拟量采集驱动PWM输出

SG90舵机控制


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)

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值