【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的亮度。
|