127|0

330

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

【Follow me第二季第4期】选做任务一:声音大小RGB效果呈现 [复制链接]

 

在之前的分享 【Follow me第二季第4期】任务三:PDM麦克风小知识+数据读取+波形呈现+wav存储 ,用到了Arduino® Nano RP2040 Connect的PDM麦克风,在分享 【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识 中,用的Arduino® Nano RP2040 Connect的RGB LED。

 

两者结合,可以完成本次任务的要求:选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小。

不过,需要注意的是,Arduino® Nano RP2040 Connect的RGB LED由 WiFiNina模块提供支持,目前仅支持普通GPIO的设置,也就是点亮或者熄灭,不支持PWM。

但是,Arduino® Nano RP2040 Connect板载的LED,对应D13(GPIO6),是RP2040直接控制的,支持PWM。

所以,完成该任务,颜色使用RGB LED,而亮度,则由载的LED来呈现。

 

一、点亮RGB LED

 

参考之前分享的代码即可:

from machine import Pin
import time

# 设定GPIO引脚
leds_name = (
    "LEDR",
    "LEDG",
    "LEDB",
)

leds = [Pin(name, Pin.OUT) for name in leds_name]

HS = (
    False,
    False,
    False
)

print("Hello DigiKey & EEWorld!")

index = 0
while True:
    i = index % len(leds)
    print(leds_name[i], leds[i], HS[i])
    
    for n in range(len(leds)):
        if n != i:
            leds[n].value(not HS[n])
            pass
    
    leds[i].value(HS[i])
    
    index += 1
    time.sleep(0.3)

RGB LED每一个颜色都可以单独控制,从而可以呈现7种颜色,8种状态(含熄灭)。

 

二、PWM控制板载LED

 

使用PWM即可直接控制板载LED,一个常见的呼吸灯效果的代码如下:

from machine import Pin,PWM
import time

led_name = 'LED'
led = PWM(Pin(led_name))
led.freq(1000)

while True:
    for i in range(0,65535,100):
        led.duty_u16(i)
        time.sleep_ms(1)

    for i in range(65535,0,-100):
        led.duty_u16(i)
        time.sleep_ms(1)

运行上述代码后,板载的LED就会呈现呼吸灯的效果。

 

三、声音大小RGB效果呈现 + 亮度呈现

结合上述逻辑,以及PDM的数据读取逻辑,完成如下的代码:

from time import sleep, time
from machine import Pin, PWM
import st34dt05a as pdm
import sys

# 设定GPIO引脚
leds_name = (
    "LEDR",
    "LEDG",
    "LEDB",
)

HS = (
    False,
    False,
    False
)

VOLS = (130, 200, 300)

leds = [Pin(name, Pin.OUT) for name in leds_name]

led_name = 'LED'
led = PWM(Pin(led_name))
led.freq(1000)

for i in range(len(leds_name)):
    for n in range(len(leds_name)):
        if n != i:
            leds[n].value(not HS[n])
            pass

    print(leds_name[i])
    leds[i].value(HS[i])
    sleep(0.3)

#sys.exit()

pcm_rate = 8_000 # Hz - default is 12kHz i.e. 3.072MHz bit-sample rate
pdm.bit_sample_freq = pcm_rate * 256

pdm_clk = Pin(23)
pdm_data = Pin(22)

record_flag = False

index=0
duty_n_pre = 0
duty_time = 0
def buffer_handler(inactive_buf):
    global index, record_flag, duty_n_pre, duty_time
    
    if record_flag:
        buff = pdm.get_buffer(inactive_buf)

        for i,n in  enumerate(buff):
            if index % 100 == 0:
                #print(index, len(buff), i, n)
                #print(n, end=" ")
                print(n)
                
                for j in range(len(leds_name)):
                    leds[j].value(not HS[j])
                
                for j,vol in enumerate(VOLS):
                    if n >= vol:
                        leds[j].value(HS[j])
                        #break
            
                duty_n = int((n if n > VOLS[0] else 0) / 512 * 65535 / 1000)
                if duty_n != duty_n_pre:
                    if time() - duty_time > 1:
                        duty_n_pre = duty_n
                        duty_time = time()
                        print("设置PWM", duty_n)
                        led.duty_u16(duty_n * 1000)
            
            #if index % 2000 == 0:
            #    print("")

            index += 1

pdm.init(pdm_clk, pdm_data, handler=buffer_handler)
pdm.start()

sleep(1) # wait whilst StateMachine inits

print("Start record:")
record_flag = True

while True:
    sleep(1)

record_flag = False
pdm.stop()
print("End record.")


在上述代码中,根据声音的范围,设置不同的颜色,点亮不同的RGB LED;

然后,再根据声音的大小,转换到PWM的duty设置,控制板载LED的亮度。

 

点赞(1) 关注
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表