[作品提交] 【Follow me第二季第1期】任务汇总,选做水果钢琴

隔壁小黑   2024-9-1 06:40 楼主

有幸入围了电子工程世界与得捷电子创办的Follow me活动的第二季的第一期的活动。

这次活动提供的开发板是Adafruit Circuit Playground Express,具有NeoPixel LED、运动传感器、温度传感器、光传感器、声音传感器、 红外发射器和接收器 、迷你扬声器体积小巧,配置丰富。

image-20240901063322-1.jpeg  

并且Adafruit 官网和 CircuitPython官网都提供了大量的历程,对于新手上手特别友好。 微软的MakeCode可视化的编程和仿真更是实现了所见即所得。美中不足的是使用的是MicroUSB接口。

Adafruit 官网

 Circuit Python官网

MakeCode

 

物料展示

image-20240901063322-2.png  

物料全家福(BNO086已经焊接成板子了)

image-20240901063322-3.png  

 

本次活动我主要完成了以下任务:

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

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

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

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

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

创意任务(创意任务三):水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果

 

首先是入门任务:

我选择的开发环境是CircuitPython,首先按照Adafruit 官网的教程安装CircuitPython。

1、去官网下载对应的固件

2、将开发板用数据线连接电脑后,双击重置按钮,会看到CPLAYBOOT盘符

3、将固件放置到CPLAYBOOT盘中,开发板将自动重启,CircuitPython安装完成

开发工具使用的是Thonny,可以去官网下载

安装完成后,打开软件,在右下角选择接口

image-20240901063322-4.png  

使用(help)board可以查看所有的IO资源。

image-20240901063322-5.png  

点亮板载LED,对应的是board.LED或者board.D13

image-20240901063322-6.png  

所使用的板载元件:

LED灯,触摸按键A1

代码:

import board
import digitalio
import touchio
led = digitalio.DigitalInOut(board.D13)
led.switch_to_output()

touch = touchio.TouchIn(board.A1)
#为了拍摄效果关闭周围的灯
import neopixel
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)
pixels.fill((0,0,0))#关灯
while 1:
    led.value=touch.value

演示:

image.png  

 

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

对应的硬件资源是 image-20240901063322-7.png  

这个可以查看官网给的例子

可以使用固件自带的neopixel库驱动炫彩LED

使用rainbowio 的colorwheel来便于颜色转换

流程图:

image-20240901063322-8.png  

所使用的板载元件:

LED灯,触摸按键A1

代码:

import time
import board
from rainbowio import colorwheel
import neopixel
import touchio
touch = touchio.TouchIn(board.A1)
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)
pixels.brightness=0.2# 亮度
pixels.fill((0,0,0))#关灯
color=[colorwheel(0)]*10#创建一个变换的数组
for i in range(10):
    color[i]=colorwheel(i*23)
while 1:
    for i in range(10):
        pixels[i]=colorwheel(color[i])
    if touch.value:
        
        color=color[1:10]+[color[0]]
    else:
        color=[color[9]]+color[0:9]
    time.sleep(0.1)

演示:

image.png  

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

这个可以查看官网给的例子

温度传感器

光线传感器

温度传感器官网例程中直接有转化公式,而光线传感器是通过A8接口直接读取模拟量的。

image-20240901063322-9.png  

所以要映射一个范围

流程图:

image-20240901063322-10.png  

所使用的板载元件:

温度传感器、光照传感器、LED灯

import time
import board
from rainbowio import colorwheel
import neopixel
import adafruit_thermistor#温度传感器驱动
import analogio

from rainbowio import colorwheel

import simpleio

pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)
pixels.brightness=0.2# 亮度
pixels.fill((0,0,0))#关灯

#初始化温度传感器
thermistor = adafruit_thermistor.Thermistor(
    board.TEMPERATURE, 10000, 10000, 25, 3950)



light = analogio.AnalogIn(board.LIGHT)#获取A8接口电压

peak = simpleio.map_range(light.value, 2000, 62000, 0, 9)#将模拟量的值范围(2000,62000)映射到(0.9)

while True:
    temp_c = thermistor.temperature#获取当前温度
    peak = simpleio.map_range(light.value, 2000, 62000, 0, 9)#将模拟量的值范围(2000,62000)映射到(0.9),获取当前光照强度
    color=simpleio.map_range(temp_c, 15, 35, 0, 170)#将温度转化为颜色,温度23到33,转化为颜色蓝到红
    for i in range(0, 9, 1):
        if i <= peak:
            pixels[i] = colorwheel(170-color)
        else:
            pixels[i] = (0, 0, 0)
    time.sleep(0.01)


演示:

image.png  

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

这个根据活动界面的提示,使用的是红外发射器和接收器 (DSOP38338),特别需要注意的是不要让红外发射一直发射,一会就会特别烫,可能会烧坏。

流程图

image-20240901063725-14.png  

所使用的板载元件:

红外发射、红外接收、LED灯

代码:

import board
import digitalio
import time
import simpleio#范围替换
import analogio#模拟量
from rainbowio import colorwheel#颜色
from adafruit_circuitplayground import cp

cp.pixels.fill((0, 0, 0))
IR_OUT = digitalio.DigitalInOut(board.IR_TX)
IR_OUT.switch_to_output()
IR_IN = analogio.AnalogIn(board.IR_PROXIMITY)


while True:
    IR_OUT.value = 1
    time.sleep(0.01)
    IR_OUT.value = 0#一定要开启后关闭,不然会特别热
    
    light = IR_IN.value

    print(light)
    distance=simpleio.map_range(light, 1000, 35000, 1, 170)#光强转化为距离范围
    print(distance)
    cp.pixels[1]=colorwheel(170-distance)
    if distance>160:
        cp.play_tone(440,0.1)
    time.sleep(0.1)

演示:

image.png

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

这个我使用的是一同购买的BNO086传感器作为姿态传感器,然后通过某立创免得做的PCB手工焊接的。刚开始测试的时候使用的是ESP32 S3 TFT,iic一直通讯不上,查阅官方资料发现ESP32和BNO086的iic通讯问题是硬件的。然后换串口模式成功通讯。切换为这次的开发板后,发现无法加载驱动,应该是硬件资源不够,然后又切换为adafruit_bno08x_rvc驱动才成功的跑起来。

流程图:

image-20240901063816-15.png  

所使用的板载元件:

LED灯

其他元器件:

Bno086测试板、孩子的不倒翁

代码:

import time
import board
import busio
from rainbowio import colorwheel
import simpleio#范围替换
import neopixel

uart = busio.UART(board.TX, board.RX, baudrate=115200, receiver_buffer_size=2048)


from adafruit_bno08x_rvc import BNO08x_RVC  # pylint:disable=wrong-import-position


pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)
pixels.brightness=0.2# 亮度
pixels.fill((0,0,0))#关灯

rvc = BNO08x_RVC(uart)
print("1111111111111")
time.sleep(0.1)
yaw_0, pitch_0, roll_0, x_accel_0, y_accel_0, z_accel_0 = rvc.heading
#roll_0前后(-,+)

#pitch_0左右(-,+)
#yaw_0顺时针正,逆时针负
#前4,5
#后0,9
#左2
#右5
while 1:
    yaw, pitch, roll, x_accel, y_accel, z_accel = rvc.heading
    front=int(roll-roll_0)
    lift=int(pitch-pitch_0)
    hor=int(yaw-yaw_0)
    color=(255-front,255-lift,255-hor)
    if front>=0:
        pixels[4] =color
        pixels[5] =color
        pixels[0] =(0,0,0)
        pixels[9] =(0,0,0)
    elif front<0:
        pixels[4] =(0,0,0)
        pixels[5] =(0,0,0)
        pixels[0] =color
        pixels[9] =color
    if lift>=0:
        pixels[2] =color
        pixels[7] =(0,0,0)
    elif lift<0:
        pixels[2] =(0,0,0)
        pixels[7] =color

演示:

image.png  

创意任务(创意任务三):水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果

选择的是第三个,水果钢琴,这个需要的东西最少,孩子还最感兴趣,只是喇叭的声音太小了。使用的是七个电容式触摸输入和小喇叭。每个按键对应一个音符,从网上查找对应的频率是262,294,330,349,392,440,494.

流程图

image-20240901063322-13.png  

所使用的板载元件:

触摸按键

其他器件:

水果和导线

代码:

from board import *
import digitalio
import touchio
import time
from adafruit_circuitplayground import cp
#pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)
#pixels.brightness=0.2# 亮度
a=(100,100,100)
cp.pixels.fill(a)#
touch = []
for i in range(1,8):
    touch.append(eval(f"touchio.TouchIn(A{str(i)})"))
for j in range(100):
    for i in touch:
        while i.value:
            i.threshold+=100
    time.sleep(0.01)

cp.pixels.fill((0,0,0))
pix=[6,8,9,0,1,3,4]
sound=[262,294,330,349,392,400,494]
while 1:
    cp.pixels.fill((0, 0, 0))
    for i in range(len(touch)):
        if touch[i].value:
            cp.pixels[pix[i]]=a
            cp.play_tone(sound[i], 0.1)

演示:

image.png  

活动的心得体会:
这次活动的每个任务我都有和我家孩子展示,可能是孩子太小了,最感兴趣的还是灯。不过小孩子能够感觉到世界的神奇就行。对于我个人来说,官方给的例程和驱动很丰富,完成任务的难度不大,主要问题在于我自选的BNO086,需要自己焊接测试版和测试,消耗了大量的时间,不断的在怀疑是焊接的问题还是测试的问题,主要还是因为前期了解的资料太少,所以自选配件还是要事前好好的了解相关资料。

项目源码

 

https://download.eeworld.com.cn/detail/%E9%9A%94%E5%A3%81%E5%B0%8F%E9%BB%91/634242

 

任务视频

【Follow me第二季第1期】任务汇总,选做水果钢琴

回复评论 (1)

看上去真棒啊

点赞  2024-9-1 09:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复