189|0

26

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第1期】任务汇总 [复制链接]

  本帖最后由 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

【Follow me第二季第1期】任务汇总代码.rar (783.7 KB, 下载次数: 1)
感想与心得体会
这是我第一次见到如此小巧又搭载了如此多传感器的开发板。作为一名自动化专业大四的学生,在校期间主要用的是C语言和Python,这次活动让我体验了一次用JavaScript编写代码,不得不说,JavaScript不但有Python的面向对象的优点,也有C语言面向过程的简洁。
这也是我第一次参加Follow me的活动,参加活动的大佬们真的都好厉害,遇到不少问题看看大佬的解决办法都能感到醍醐灌顶。我觉得工程世界就是这样,大家互帮互助,技术水平才能不断提高。也希望Follow me活动能一直办下去,期待能体验到更多有趣的板子。
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表