【Follow me第二季第1期】 进阶任务:不倒翁和创意可穿戴装饰
[复制链接]
继续来挑战一下进阶任务和创意任务。
1. 进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
在本次进阶任务中,我们将探索Adafruit开发板的六轴加速度传感器,以实现一个动态的灯光效果,随着不倒翁的摇摆而变化。这一任务的核心在于理解并应用加速度传感器的读数,以控制LED灯的颜色变化。
该任务主要需要使用的传感器可以参考教程中的Acceleration部分【Acceleration | CircuitPython Made Easy on Circuit Playground Express and Bluefruit | Adafruit Learning System】,通过cp.acceleration就可以获取传感器的x,y,z三轴的读数。虽然这些读数可能初看起来有些抽象,但它们实际上代表了开发板在空间中的位置和倾斜角度。这些读数会随着开发板的空间位置和倾斜情况而变化,为我们提供了丰富的数据来驱动灯光效果的变化。
利用这些参数,我们可以对LED灯的(R,G,B)三元组进行动态调整,以实现不倒翁在晃动过程中呈现出独特的灯光效果。具体的实现代码已经在教程中提供,我们可以直接采用并进行适当的修改,如下所示:
from adafruit_circuitplayground import cp
while True:
R = 0
G = 0
B = 0
x, y, z = cp.acceleration
print((x, y, z))
cp.pixels.fill(((R + abs(int(x))), (G + abs(int(y))), (B + abs(int(z)))))
根据不同的倾斜情况的传感器示数,可以调整RGB三色的配比,我们可以根据不同的倾斜情况实现不同的颜色变化。例如,当开发板平放时,灯光可以呈现蓝色;当板子垂直放置时,灯光可以呈现绿色;而当板子垂直后旋转,灯光则可以转变为红色。在视频演示中,我们可以观察到随着开发板的晃动,灯光效果随之不断变化,为不倒翁增添了一份动态的美感。
视频演示见视频的前半部分。
2. 创意任务一:有创意的可穿戴装饰——可结合多种传感器和灯光效果展示
我们设计了一款独特的可穿戴装饰,它不仅拥有绚丽的灯光效果,还具备音乐播放功能,让你在黑夜中也能享受快乐时光。这款装饰巧妙地结合了开发板的LED灯、蜂鸣器以及开关,为用户提供了丰富的互动体验。
在这款装饰中,我们使用了板载的LED灯和蜂鸣器,以及一个拨动开关和两个按键开关B。拨动开关用于在两种模式之间切换,而按键开关B则用于改变蜂鸣器的音调,使其能够演奏旋律。LED和蜂鸣器的使用在之前的普通任务中都已经介绍过,这里就不再赘述。
简单介绍一下开发板上的两种开关,在教程中分别是Slide Switch【Slide Switch | CircuitPython Made Easy on Circuit Playground Express and Bluefruit | Adafruit Learning System】和Buttons【Buttons | CircuitPython Made Easy on Circuit Playground Express and Bluefruit | Adafruit Learning System】。
开关的调用非常简单,用cp.switch和cp.button_a(/b)就可以分别访问拨动开关和两个按键开关的状态了。当拨动开关置右时,输出为True;当按键开关按下时,输出同样为True。
接下来分别介绍我们设计的创意装饰的两种不同模式:
- 当拨动开关置右时,LED灯进入自动变色模式。我们设计了一个颜色变换函数,确保在变色过程中颜色之间的过渡更加平滑,避免了突兀的颜色变化。同时,该模式确保LED灯始终处于点亮状态,不会出现黑色灭灯的情况。
- 当拨动开关置左时,LED灯进入手动变色模式。此时,用户可以通过按下按键B来改变LED灯的颜色,同时蜂鸣器会播放预设的音调。通过连续长按按键B,可以实现蜂鸣器播放旋律,并且LED灯随着旋律顺滑地变换颜色。
以下是具体的代码实现,首先介绍如何实现LED灯的顺滑切换。
我们预设了一个RGB颜色的允许取值范围,指定为[0, 63, 127, 191, 255],以确保选取的颜色都是相对正色。然后,我们编写了一个颜色更新函数,每次只从R,G,B三个通道中随机选择一个进行参数在允许的取值内随机改变,这样就保证了连续两个颜色之间不会产生特别大的差异。同时,在每一次颜色改变后,我们都会检查RGB三者是否同时取到了0,如果是,则会将这一次改变的通道在除了0以外的值内重新随机选择。具体的代码如下:
color_values = [0, 63, 127, 191, 255]
current_color = [255, 255, 255]
cp.pixels.brightness = 0.1
def change_color(current_color):
channels = ['R', 'G', 'B']
channel = random.choice(channels)
new_value = random.choice(color_values)
if channel == 'R':
current_color[0] = new_value
elif channel == 'G':
current_color[1] = new_value
else:
current_color[2] = new_value
if current_color == [0, 0, 0]:
new_value = random.choice(color_values[1:])
if channel == 'R':
current_color[0] = new_value
elif channel == 'G':
current_color[1] = new_value
else:
current_color[2] = new_value
return current_color
while True:
for i in range(10):
cp.pixels[i] = current_color
current_color = change_color(current_color)
cp.pixels.show()
time.sleep(0.1)
其次我们介绍如何实现蜂鸣器的旋律播放,根据教程中的Play Tone模块,我们可以通过cp.play_tone(262, 0.1)来播放音调,前者表示声音的频率(音高),后者表示持续的时间(应该存在最短的蜂鸣器持续时间,肯定不只0.1秒)。我们根据乐谱C调中低音do到高音do的频率,分别为[262,294,326,358,390,422,454,486],将一首乐曲Funky Town(鸡块旋转小曲)的旋律转换成频率的列表(列表中-1表示空拍,但是不知道什么原因依旧还有一声杂音)。每次检测到按键B被按下,蜂鸣器自动播放下一个音调。当按键B被长按时,就实现了旋律的连续播放。最终代码如下:
tone_list = [454,454,422,454,-1,358,-1,358,454,550,518,454,
358,358,326,358,-1,262,-1,262,358,454,422,358]
while True:
if cp.switch:
if cp.button_b:
cp.play_tone(tone_list[flag], 0.1)
flag = (flag + 1)%24
最终把两者结合起来,得到的主函数如下:
import time
import random
from adafruit_circuitplayground import cp
color_values = [0, 63, 127, 191, 255]
current_color = [255, 255, 255]
cp.pixels.brightness = 0.1
tone_list = [454,454,422,454,-1,358,-1,358,454,550,518,454,
358,358,326,358,-1,262,-1,262,358,454,422,358]
flag = 0
while True:
for i in range(10):
cp.pixels[i] = current_color
if cp.switch:
current_color = current_color
if cp.button_b:
cp.play_tone(tone_list[flag], 0.1)
current_color = change_color(current_color)
flag = (flag + 1)%24
else:
flag = 0
current_color = change_color(current_color)
cp.pixels.show()
time.sleep(0.1)
在视频演示中,我们可以看到,当拨动开关置右时,LED灯自动切换颜色;当拨动开关置左且按键B被按下时,LED灯手动切换颜色,同时蜂鸣器播放旋律。这一互动体验不仅增加了装饰的趣味性,也提升了用户的参与感。
视频演示见视频的后半部分。
不倒翁+创意可穿戴装饰
|