292|0

69

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

【得捷Follow me第二季第1期】任务汇总+舵机与AGS02MA气体传感器使用 [复制链接]

  本帖最后由 eew_Ya3s2d 于 2024-10-18 15:46 编辑

Hello,大家好,我是郑工,尘世间一个迷途小工程师。

 

这个帖子我们来汇总一下所有的任务与讲解一下

 

0、物料清单:

    CPX主板

    舵机

    AGS02MA气体传感器

 

首先是我自己感觉有些尴尬的视频讲解

【得捷follow Me第二季第1期】任务汇总+舵机与ags02ma气体传感器使用

这个视频拍着拍着就拍到差不多15分钟了,视频2个G,最后是压缩了之后才能上传,下次拍视频之前还是得选不要太高清才行

 

入门任务(必做):开发环境搭建,板载LED点亮

【Follow me第二季第1期】任务0:开发环境搭建,板载LED点亮 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

程序就是通过time.sleep函数产生一个pwm去点亮led,不断更改pwm的占空比,这样led看起来就led就会有亮暗变化,像呼吸灯

最主要的函数是下面这个,产生一个简单的pwm,控制led灯。

def onLed(onTime, duty):
    if onTime > 0:
        led.value = True
        time.sleep(onTime)
    if duty - onTime > 0:
        led.value = False
        time.sleep(duty - onTime)

3e2bb736792bc2a6a9b9d4cabaab92cb

 

基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换

【Follow me第二季第1期】任务1:控制板载炫彩LED,跑马灯点亮和颜色变换 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

这个其实就是控制WS2812B灯珠做流水灯,总体来说就是用neopixel库来实现彩色灯的效果,封装得太好,显得没有难度,其实中间一些时序问题,当年我也是想破头

颜色变换写了两种不同函数去遍历。

def Wheel2(i, r_in, g_in):
    if i < 0 or i > 10:
        r = g = b = 0
    elif i % 3 == 0:
        r = r_in
        g = g_in
        b = 255 - r - g
    elif i % 3 == 1:
        r = g_in
        b = r_in
        g = 255 - r - b
    else:
        g = r_in
        b = g_in
        r = 255 - b - g
    return (r, g, b)


def rainbow_cycle2():
    dir = True
    for r in range(255):
        start = 0
        stop = 255 - r
        step = 1
        if not dir:
            start = 255 - r
            stop = 0
            step = -1
        for g in range(start, stop, step):
            for i in range(10):
                pixels[i] = Wheel2(i, r, g)
            pixels.show()
            time.sleep(colorFulWaitTime / 50)
        dir = not dir


def wheel(pos):
    if pos < 0 or pos > 768:
        r = g = b = 0
    elif pos < 256:
        r = int(pos)
        g = int(255 - pos)
        b = 0
    elif pos < 512:
        pos -= 256
        r = int(255 - pos)
        g = 0
        b = int(pos)
    else:
        pos -= 512
        r = 0
        g = int(pos)
        b = int(255 - pos)
    return (r, g, b)


def rainbow_cycle():
    for j in range(767):
        for i in range(num_pixels):
            pixel_index = (i * 767 // num_pixels) + j
            pixels[i] = wheel(pixel_index % 767)
        pixels.show()
        time.sleep(colorFulWaitTime)

WeChat_20241014235724

 

基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度

【Follow me第二季第1期】任务2:监测环境温度和光线,通过板载LED展示舒适程度 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

这个任务就是读取AD任务,通过读取光敏AD上的值,获取照度,通过adafruit_thermistor库,可以直接获取温度值,也是站在别人的肩膀上,顿时感觉轻松好多

库的使用也非常简单,我写了一些注释,只要初始化设置好,后面直接得到温度,简单快捷

import adafruit_thermistor

# 模拟输入的管脚
pin = board.TEMPERATURE
# 热敏电阻的常温阻值
resistor = 10000
# 普通电阻的阻值
resistance = 10000
# 热敏电阻的阻值温度
nominal_temp = 25
# 热敏电阻的B系数
b_coefficient = 3950
# 还有最后一个参数,参数名为high_side,表示热敏电阻是否连接在上端,默认为True,可以不填

thermistor = adafruit_thermistor.Thermistor(
    pin, resistor, resistance, nominal_temp, b_coefficient)

程序通过灯珠数量反应照度值,通过灯珠颜色反应温度。不过灯珠就在光敏三极管旁边,还是有一些影响。

 

 

基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警

【Follow me第二季第1期】任务3:接近检测 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

这是我耗时最久的一个任务,用红外收发实在是完成不了,最后是用了超声波距离模块实现程序功能,超声波模块只需要测量反馈的脉冲长度就可以知道物体的距离的,测试距离使用time.monotonic_ns()函数计算时间戳的差值(单位ns)即可,如下面代码

    # 发送出发信号,时间是500us,只要比需求长就可以了
    ir_tx.value = True
    time.sleep(0.0005)
    ir_tx.value = False
    rx_count = 0
    # 等待回复的高电平
    while ir_rx.value is False:
        time.sleep(0.0001)
        rx_count = rx_count + 1
        if rx_count > 10000:  # 发送高电平之后等待时间太长,认为是发送失败
            break
    start_time = time.monotonic_ns()    #获取高电平开始的时间戳,单位是ns
    while ir_rx.value is True:
        pass
    end_time = time.monotonic_ns()    #获取高电平结束的时间戳,单位是ns
    duration = round((end_time - start_time)/1000000, 2)
    if duration < 0.05:  # 时间太短
        continue
    print(f'duration time:{duration} ms')
    distance = round(duration*17.0, 1)       # 时间*340m/s(34cm/ms)/2
    print(f'distance:{distance} cm')

WeChat_20241015000456

 

进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果

【Follow me第二季第1期】任务4:制作不倒翁——展示不倒翁运动过程中的不同灯光效果 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

这是一个整活的任务,其实我很多精力都用在搞那个不倒翁底座那里去了T_T

加速度传感器使用也非常简单,只需要调用库即可,如下

import board
import busio
import adafruit_lis3dh

i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)

# Set range of accelerometer (can be RANGE_2_G, RANGE_4_G, RANGE_8_G or RANGE_16_G).
lis3dh.range = adafruit_lis3dh.RANGE_2_G

ax, ay, az = [
        value / adafruit_lis3dh.STANDARD_GRAVITY for value in lis3dh.acceleration
    ]

WeChat_20241015000744(待转码)

 

最后补充一下我另外买的两个零件,一个是舵机,一个是AGS02MA气体传感器

 

舵机

舵机主要就是通过pwm占空比来控制舵机的动作,从规格书我们可以看到具体的控制方式

 

从上面可以看到,停止脉冲是1500us,顺时针方向是700-1500us,逆时针方向是1500-2300us

 

所以只要用pwmio库产生一个pwm就可以控制舵机

# create a PWMOut object on Pin A1.
pwm = pwmio.PWMOut(board.A1, frequency=50, duty_cycle=7536)
# 2294      0.7ms min
# 4915      1.5ms stop
# 7536      2.3ms max

我这里产生的是一个50hz的pwm波

 

AGS02MA气体传感器

这个要调试其实也有些麻烦,不过其实用法也简单,就那么两三个指令需要调试,不过直到我找到下面这个网站,所有困难都烟消云散了,还是得再次感叹一下python社区的人多力量大,我们都是站在巨人的肩膀上

adafruit-circuitpython-ags02ma - 用于 AGS02MA 气体传感器的 CircuitPython / Python 库_PyPI中文网

 

直接安装就可以了。然后找到文件

 

放到板子里面就可以使用了,文件里也说了使用方法

 

代码如下:

import board
import busio
import time
from adafruit_ags02ma import AGS02MA

# Initialize I2C bus.
i2c = busio.I2C(board.SCL, board.SDA, frequency = 20000)
ags = AGS02MA(i2c, address=0x1A)



while True:
    res = ags.gas_resistance
    tvoc = ags.TVOC
    print(f'tvoc:{tvoc},res:{res}')
    time.sleep(2)

可惜的是,CPX线路板的硬件I2C并不支持20k的通讯速率,而AGS02MA的最大通讯速率是30k。最后我是使用ESP-S3 feather这个板子来完成,同样是follow me活动的板子,同样是使用circuit python代码完成的

 

 

 

 

感想

最后的最后,还是得感谢举办方,感谢得捷电子,感谢EE。在不断摸索的过程中,感受到前人智慧的浩渺,我只是后来者,模仿者,轻松拿来使用的人。并没有什么值得骄傲的。科学进步才是社会发展的动力,我仍然需要虚心学习更多的知识,创造更美好的生活。

 

下面是课程链接:

【得捷Follow me第二季第1期】任务汇总+舵机与AGS02MA气体传感器使用-EEWORLD大学堂

源码:

Follow me第二季第一期 所有代码 + 库-嵌入式开发相关资料下载-EEWORLD下载中心

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表