有幸入围了电子工程世界与得捷电子创办的Follow me活动的第二季的第一期的活动。
这次活动提供的开发板是Adafruit Circuit Playground Express,具有NeoPixel LED、运动传感器、温度传感器、光传感器、声音传感器、 红外发射器和接收器 、迷你扬声器体积小巧,配置丰富。
并且Adafruit 官网和 CircuitPython官网都提供了大量的历程,对于新手上手特别友好。 微软的MakeCode可视化的编程和仿真更是实现了所见即所得。美中不足的是使用的是MicroUSB接口。
物料展示
物料全家福(BNO086已经焊接成板子了)
本次活动我主要完成了以下任务:
入门任务:开发环境搭建,板载LED点亮
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
创意任务(创意任务三):水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果
首先是入门任务:
我选择的开发环境是CircuitPython,首先按照Adafruit 官网的教程安装CircuitPython。
1、去官网下载对应的固件
2、将开发板用数据线连接电脑后,双击重置按钮,会看到CPLAYBOOT盘符
3、将固件放置到CPLAYBOOT盘中,开发板将自动重启,CircuitPython安装完成
开发工具使用的是Thonny,可以去官网下载
安装完成后,打开软件,在右下角选择接口
使用(help)board可以查看所有的IO资源。
点亮板载LED,对应的是board.LED或者board.D13
所使用的板载元件:
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
演示:
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
这个可以查看官网给的例子
可以使用固件自带的neopixel库驱动炫彩LED
使用rainbowio 的colorwheel来便于颜色转换
流程图:
所使用的板载元件:
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)
演示:
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
这个可以查看官网给的例子
温度传感器官网例程中直接有转化公式,而光线传感器是通过A8接口直接读取模拟量的。
所以要映射一个范围
流程图:
所使用的板载元件:
温度传感器、光照传感器、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)
演示:
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
这个根据活动界面的提示,使用的是红外发射器和接收器 (DSOP38338),特别需要注意的是不要让红外发射一直发射,一会就会特别烫,可能会烧坏。
流程图
所使用的板载元件:
红外发射、红外接收、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)
演示:
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
这个我使用的是一同购买的BNO086传感器作为姿态传感器,然后通过某立创免得做的PCB手工焊接的。刚开始测试的时候使用的是ESP32 S3 TFT,iic一直通讯不上,查阅官方资料发现ESP32和BNO086的iic通讯问题是硬件的。然后换串口模式成功通讯。切换为这次的开发板后,发现无法加载驱动,应该是硬件资源不够,然后又切换为adafruit_bno08x_rvc驱动才成功的跑起来。
流程图:
所使用的板载元件:
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
演示:
创意任务(创意任务三):水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果
选择的是第三个,水果钢琴,这个需要的东西最少,孩子还最感兴趣,只是喇叭的声音太小了。使用的是七个电容式触摸输入和小喇叭。每个按键对应一个音符,从网上查找对应的频率是262,294,330,349,392,440,494.
流程图
所使用的板载元件:
触摸按键
其他器件:
水果和导线
代码:
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)
演示:
活动的心得体会:
这次活动的每个任务我都有和我家孩子展示,可能是孩子太小了,最感兴趣的还是灯。不过小孩子能够感觉到世界的神奇就行。对于我个人来说,官方给的例程和驱动很丰富,完成任务的难度不大,主要问题在于我自选的BNO086,需要自己焊接测试版和测试,消耗了大量的时间,不断的在怀疑是焊接的问题还是测试的问题,主要还是因为前期了解的资料太少,所以自选配件还是要事前好好的了解相关资料。
项目源码
https://download.eeworld.com.cn/detail/%E9%9A%94%E5%A3%81%E5%B0%8F%E9%BB%91/634242
任务视频
看上去真棒啊