本帖最后由 FuShenxiao 于 2024-10-9 15:39 编辑
非常荣幸参加这次Follow me活动,我是一名自动化专业大四在读学生,这也是我第一次参加Follow me活动。
本次活动的主板为Adafruit Circuit Playground Express,这块主板小巧却有着相当丰富的外部传感器,让人眼前一亮是它众多的炫彩灯珠、光线传感器、红外输入输出以及运动传感器,它的焊盘还有模拟输入功能,非常适合多种DIY的实现。
到手后的板子和舵机
入门任务:开发板环境搭建,板载LED点亮
进入官网下载最新的uf2文件:https://circuitpython.org/board/circuitplayground_express/
按动开发板复位键,当周围的灯全部变绿后,电脑中会显示产生一个u盘
将下载的uf2文件拖入u盘中,即可实现固件的烧录升级,此时u盘内容如下图所示
在makecode网页上编辑程序,板载LED可以通过图形化编程实现
点击Download,生成uf2文件。保证开发板处于下载模式,将生成的uf2文件导入开发板的u盘中实现下载
下载完成后即可观察到开发板上的彩灯。
基础任务一:控制板载炫彩LED,跑马灯点亮和颜色变换
在makecode中图形化编写如下代码
手指按动对应焊盘,灯珠即可实现变换,实现具体效果如下表
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
A7 |
炫彩灯珠 |
灯珠全红 |
运动状态 |
灯珠全绿 |
灯珠闪亮 |
灯珠全蓝 |
星河效果 |
基础任务二:监测环境温度和光线,通过板载LED展示舒适程度
该任务需要搭配光线传感器。当温度大于10℃时,温度较高,灯珠显黄色;当温度小于10℃时,温度较低,灯珠显蓝色。当环境亮度越小,则灯珠亮度越亮。
代码实现如下:
let temp = 0
forever(function () {
lightlevel = input.lightLevel()
temp = input.temperature(TemperatureUnit.Celsius)
if (temp > 10) {
light.showRing(
"yellow yellow yellow yellow yellow yellow yellow yellow yellow yellow"
)
light.setBrightness(100 - lightlevel)
} else {
light.showRing(
"blue blue blue blue blue blue blue blue blue blue"
)
light.setBrightness(100 - lightlevel)
}
})
基础任务三:接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
改任务依然基于光线传感器实现:首先定义当前环境亮度为初始值,并将该初始值划分为十份,每一份作为一个亮度梯度。当物体逐渐靠近开发板,光线传感器得到的亮度逐渐降低,每降低一个梯度就点亮一盏灯,当亮度足够低时,触发蜂鸣器报警。
代码实现如下:
let presentlight = 0
let lightnum = 0
let i = 0
let lightlevel = input.lightLevel()
let size = Math.floor(lightlevel / 10)
forever(function () {
presentlight = input.lightLevel()
lightnum = 10 - Math.floor(presentlight / size)
for (i = 0; i < lightnum; i++) {
if (i < 3)
light.setPixelColor(i, 0x00ff00)
else if (i >= 3 && i < 6)
light.setPixelColor(i, 0xffff00)
else
light.setPixelColor(i, 0xff0000)
}
for (i = lightnum; i < 10; i++)
light.setPixelColor(i, 0x000000)
if (lightnum > 6) {
music.siren.play()
}
})
进阶任务:制作不倒翁——展示不倒翁运动过程中的不同灯光效果
我们知道,不倒翁运动过程中的摆动是时快时慢的,我们可以基于开发板的摆动,或者运动加速度来决定灯光效果。其具体实现是利用运动传感器计算当前加速度,根据加速度大小决定跑马灯停留时间:加速度越大,跑马灯一个状态的停留时间越短,跑马灯的速度越快。
代码实现:
let accelX = 0
let accelY = 0
let accel = 0
forever(function () {
accelX = input.acceleration(Dimension.X)
accelY = input.acceleration(Dimension.Y)
accel = Math.sqrt(Math.pow(accelX, 2) + Math.pow(accelY, 2))
// 计算跑马灯的速度
let normalizedStrength = Math.min(accel / 1023, 1) // 标准化到 [0, 1] 范围
let speed = 100 - (90 * normalizedStrength) // 速度范围从 10 毫秒到 100 毫秒
// 执行七彩跑马灯效果
runColorMarquee(speed)
})
// 运行七彩跑马灯
function runColorMarquee(speed: number) {
const colors = [0xff0000, 0xffa500, 0xffff00, 0x008000, 0x0000ff, 0x4b0082, 0xee82ee] // 红、橙、黄、绿、蓝、靛、紫
const numLEDs = 10
light.clear()
// 循环显示 LED
for (let i = 0; i < numLEDs; i++) {
light.clear()
light.setPixelColor(i, colors[i % colors.length])
light.setPixelColor((i + 1) % numLEDs, colors[(i + 1) % colors.length])
pause(speed) // 根据速度调整灯光切换速度
}
创意任务:根据音乐控制灯光和舵机律动
由于makecode的基本库中没有电机控制,因此需要在扩展库中添加电机控制。
电机控制需要用到麦克风,根据麦克风接收到的音量决定电机的转动和灯光的闪烁:音量越大,灯珠变换速度越快,同时音量的变化也会控制舵机的转速和转向。
需要注意的是,由于环境中存在噪声,大约为80-90,因此音量阈值不能设置太小,否则灯光和电机在无音乐时也会响应。
舵机与开发板的连接:
橙色——A1
棕色——GND
红色——VOUT
由于舵机的接线头是母头,所以可以在开发板上放置直径3mm的香蕉头,然后将舵机插口用双公头杜邦线和对应的香蕉头连接即可。
代码实现:
let servo = servos.A1;
let lastLevel = 0;
let threshold = 120; // 小于此音量时,停止伺服电机
// 控制伺服电机
forever(function () {
let level = input.soundLevel();
if (lastLevel != level) {
if (level < threshold) {
servo.run(0);
} else {
// 将音量映射到伺服电机速度
let speed = Math.map(level, threshold, 255, 0, 100);
// 确保映射后的值在有效范围内
speed = Math.max(0, Math.min(speed, 100));
// 随机决定正转或反转
let direction = Math.randomRange(0, 1) === 0 ? 1 : -1;
let finalSpeed = speed * direction;
console.log(finalSpeed);
servo.run(finalSpeed);
pause(100)
}
lastLevel = level;
}
});
// 跑马灯效果
forever(function () {
let level = input.soundLevel();
if (level >= threshold) {
// 计算跑马灯的速度
let lightSpeed = Math.map(level, threshold, 255, 500, 50); // 数字越大速度越慢
runLights(lightSpeed);
} else {
clearLights();
}
});
function runLights(delay: number) {
const colors = [
0xff0000, // Red
0xffa500, // Orange
0xffff00, // Yellow
0x008000, // Green
0x0000ff, // Blue
0x4b0082, // Indigo
0xee82ee // Violet
];
for (let i = 0; i < 10; i++) {
let level = input.soundLevel();
if (level < threshold) {
clearLights();
return;
}
for (let j = 0; j < 10; j++) {
light.setPixelColor((i + j) % 10, colors[j % colors.length]); // 设置当前灯光为多彩颜色
}
pause(delay); // 根据音量调整速度
}
}
function clearLights() {
light.clear(); // 清除所有灯光
}
视频展示:
网址:【Follow me第二季第1期】任务汇总展示
代码:
网址:download.eeworld.com.cn/detail/FuShenxiao/634088
感想与心得体会
这是我第一次见到如此小巧又搭载了如此多传感器的开发板。作为一名自动化专业大四的学生,在校期间主要用的是C语言和Python,这次活动让我体验了一次用JavaScript编写代码,不得不说,JavaScript不但有Python的面向对象的优点,也有C语言面向过程的简洁。
这也是我第一次参加Follow me的活动,参加活动的大佬们真的都好厉害,遇到不少问题看看大佬的解决办法都能感到醍醐灌顶。我觉得工程世界就是这样,大家互帮互助,技术水平才能不断提高。也希望Follow me活动能一直办下去,期待能体验到更多有趣的板子。
|