【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
[复制链接]
本帖最后由 jone5 于 2024-10-19 23:07 编辑
所有任务已完成,Follow Me参加了三期,以前大学的时候是自费去学习,现在EEWORLD能举办这种反费的活动,真的是很好的活动。本期的Adafruit Circuit Playground Express开发板传感器集成度很高,外设丰富,非常值得学习,感谢社区和得捷提供的机会,非常感谢得捷和EEWORLD为我们提高学习的机会,祝Follow me活动越办越好,期待后续活动再能出现一些有意思的板子~
项目视频如下:
物料清单如下:
任务成果展示
【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
本次任务主板为Circuit Playground Express,基于ATSAMD21微控制器,板载灯珠,温度传感器,按键滑动开关等,可玩性非常高,再次感谢EEWORLD提供这么丰富的创客开发板。
入门任务(必做):开发环境搭建,板载LED点亮
本次使用的IDE为Thonny,编码语言为CircuitPython,调用board的LED,设置其为数字IO输出,设置其值为True或False即可控制LED的亮灭。
代码如下:
from adafruit_circuitplayground import cp
import time
while True:
cp.red_led = True
time.sleep(0.5)
cp.red_led = False
time.sleep(0.5)
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
通过设置RGB三原色的亮度值可以调配出各种想要的色彩,板载炫彩LED可以通过adafruit_circuitplayground模块中的pixel来调用,其调用过程类似给长度为10的链表中的元素进行赋值,例如cp.pixels[0] = (255, 0, 0)即将第1颗灯珠设置为红色,另外其fill方法可以一次性设置所有灯珠的颜色。
下面的代码通过随机数来设置rgb色彩值,给所有灯珠设置随机颜色:
import board
import neopixel
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10) //10代表控制10个灯
pixels[0] = (0, 0, 10) //pixels[0]代表第0(1)个灯
pixels[4] = (10, 0, 0) //(0, 0, 10) 代表RGB颜色
pixels[8] = (0, 10, 0)
pixels.show()
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
本任务使用的是#include <Adafruit_CircuitPlayground.h>这个库,传感器的函数已封装成接口,直接调取cp.light即可获取光线值。
#Task 3
import time
from adafruit_circuitplayground import cp
cp.pixels.auto_write = False
cp.pixels.brightness = 0.3
minimum_temp = 24
maximum_temp = 30
while True:
light_now = cp.light
light_peak = round(light_now / 320 * 4)
for i in range(5):
if i <= light_peak:
cp.pixels[i] = (0, 255, 0)
else:
cp.pixels[i] = (0, 0, 0)
Temperature_now = cp.temperature
Temp_level = int((Temperature_now - minimum_temp) / (maximum_temp - minimum_temp) * 5)
print((light_now,Temperature_now))
print("Light level",int(light_peak))
print("Temperature level",int(Temp_level))
for i in range(9,4,-1):
if i >= 10 - Temp_level:
cp.pixels[i] = (0, 0, 255)
else:
cp.pixels[i] = (0, 0, 0)
cp.pixels.show()
time.sleep(0.1)
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
利用红外发射管发出红外脉冲,然后检测红外接收器信号强度来测算遮挡距离,在到达设定阈值后发出声光报警。
for i in range(32):
IR_Tx_pin.value = True
time.sleep(0.000013)
IR_Tx_pin.value = False
time.sleep(0.000013)
analog_now = analogin.value
analog_peak = int((analog_now - minimum_temp) / (maximum_temp - minimum_temp) * 10)
print((analog_now,analog_peak))
for i in range(10):
if i <= analog_peak:
cp.pixels[i] = (0, 255, 0)
else:
cp.pixels[i] = (0, 0, 0)
cp.pixels.show()
if analog_peak >= 8:
cp.play_tone(300, 0.1)
time.sleep(0.1)
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
本任务的原理主要是依据三轴加速度传感器的数值估算出不倒翁偏摆的方向,将偏摆方向映射到10个彩灯上,当不倒翁处于立直状态彩灯全为绿色,当发生偏摆则偏摆向下一侧的彩灯向红色变换,偏摆向上的彩灯向蓝色变换。
#Task 5
import time
from adafruit_circuitplayground import cp
R = 0
G = 0
B = 0
while True:
if not cp.switch:
print("Slide switch off!")
cp.pixels.fill((0, 0, 0))
continue
x, y, z = cp.acceleration
print((x, y, z))
cp.pixels.fill(((R + abs(int(x))), (G + abs(int(y))), (B + abs(int(z)))))
time.sleep(0.05)
■ 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
这里主要用了麦克风和舵机以及板子led灯模块;其中舵机模块主要通过A2脚输出PWM信号控制转动,缓存麦克风数据,每隔0.2s采集一次麦克风数据,采集到数据后通过计算得到功率值,如果无声音则章鱼哥动作,若处于嘈杂环境章鱼哥则静止
import time
import math
import board
import array
import audiobusio
import pwmio
from digitalio import DigitalInOut, Direction, Pull
from analogio import AnalogIn
import microcontroller
from adafruit_circuitplayground.express import cpx
microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)
color = {
"black": 0x000000,
"white": 0xFFFFFF,
"red": 0xFF0000,
"green": 0x00FF00,
"blue": 0x0000FF,
"cyan": 0x00FFFF,
"magenta": 0xFF00FF,
"yellow": 0xFFFF00,
}
# Not too bright!
cpx.pixels.brightness = 0.3
# Number of Pixel on board
pix_num = 10
def map_range(input_value, input_min, input_max, output_min, output_max):
std_value = (input_value - input_min) / (input_max - input_min)
return std_value * (output_max - output_min) + output_min
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if (pos < 0) or (pos > 255):
return color["black"]
if pos < 85:
return (int(255 - pos * 3), int(pos * 3), 0)
elif pos < 170:
pos -= 85
return (0, int(255 - (pos * 3)), int(pos * 3))
else:
pos -= 170
return (int(pos * 3), 0, int(255 - pos * 3))
# 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
#Task 6
import array
import math
import audiobusio
import board
import neopixel
import time
import pwmio
from adafruit_motor import servo
PEAK_COLOR = (100, 0, 255)
NUM_PIXELS = 90
CURVE = 2
SCALE_EXPONENT = math.pow(10, CURVE * -0.1)
NUM_SAMPLES = 160
def constrain(value, floor, ceiling):
return max(floor, min(value, ceiling))
def log_scale(input_value, input_min, input_max, output_min, output_max):
normalized_input_value = (input_value - input_min) / (input_max - input_min) #输入缩放
return output_min + math.pow(normalized_input_value, SCALE_EXPONENT) * (output_max - output_min)
#计算一组值的标准化均方根值,在计算RMS之前消除直流偏压
def normalized_rms(values): #该函数接受一个参数values,用于存储要进行处理的值的列表
minbuf = int(mean(values)) #计算给定值列表 values 的平均值,将结果转换为整数
#计算了一组已经减去平均值的样本值的平方和。
#使用列表解析来计算每个值减去平均值后的平方,并将这些平方值相加得到 samples_sum。
samples_sum = sum(float(sample - minbuf) * (sample - minbuf) for sample in values)
#计算标准化均方根值。首先将平方和除以值的数量得到平均平方值,
#然后使用 math.sqrt 函数计算其平方根。最后函数返回这个标准化均方根值
return math.sqrt(samples_sum / len(values))
#求平均值
def mean(values):
return sum(values) / len(values)
def volume_color(volume):
return 200, volume * (255 // NUM_PIXELS), 0
# create a PWMOut object on Pin A2.
pwm = pwmio.PWMOut(board.A2, duty_cycle=2 ** 15, frequency=50)
# Create a servo object, my_servo.
my_servo = servo.Servo(pwm)
mic = audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000, bit_depth=16)
samples = array.array("H", [0] * NUM_SAMPLES)
mic.record(samples, len(samples))
# Set lowest level to expect, plus a little.
input_floor = normalized_rms(samples) + 10
# OR: used a fixed floor
# input_floor = 50
# You might want to print the input_floor to help adjust other values.
print(input_floor)
# Corresponds to sensitivity: lower means more pixels light up with lower sound
# Adjust this as you see fit.
input_ceiling = input_floor + 500
angle_now = 0
systick = 0
while True:
if systick % 4 == 0:
mic.record(samples, len(samples))
magnitude = normalized_rms(samples)
c = log_scale(
constrain(magnitude, input_floor, input_ceiling),
input_floor,
input_ceiling,
0,
NUM_PIXELS,
)
if systick % 2 == 0:
if angle_now < c:
angle_now = angle_now + 2
if angle_now > c:
angle_now = angle_now - 2
if angle_now > 90:
angle_now = 90
elif angle_now < 0:
angle_now = 0
my_servo.angle = angle_now
print((c,angle_now))
time.sleep(0.01)
systick = systick + 1
可运行代码库:
https://download.eeworld.com.cn/detail/jone5/634253#related
项目总结:
我是第一次使用python对ATSAMD21进行开发,因此此次任务对我来说还是具有很强的学习意义的,非常感谢EEWORLD联合德捷的此次任务,给了我们很多学习的机会。因为第一次接触用python去开发ATSAMD21,由于工作繁忙,很多接口还不会使用,我会继续阅读学习源码,以熟悉此中开发方式原理并进行分享。
最后再次感谢EEWorld提供此学习机会及分享的平台。非常感谢
|