【Follow me第二季第1期】不倒翁+“绿色”章鱼哥
[复制链接]
没想到一个月时间很快就过去了,利用工作之余将【Follow me第二季第一期】的进阶任务和创意任务完成,再次感谢得捷电子以及EEworld的大力支持,让自己将工作的闲暇时光利用起来,学习编程方面的相关知识,并动手操作。
看到标题后,可能有的小伙伴就有疑问了,“我记得《海绵宝宝》中的章鱼哥是浅蓝色的呀,怎么是绿色的呢?”,因为我制作章鱼哥的时候是选择的矿泉水瓶,也算是一种响应国家号召,不随意丢垃圾,变废为宝的一种方式,这样就将原本一无是处的空矿泉水瓶变成一个有意思的创意作品,也是体现了矿泉水瓶的价值呢,所以我这里选择了“绿色”的章鱼哥的标题,也是希望看到帖子的小伙伴能从身边做起,让我们为世界更绿色,付出自己的一点努力。话不多说,直接进入正题。
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,矿泉水瓶,舵机,鸡毛不倒翁猫玩具,丝线,胶水,胶带,剪刀,笔、纸等工具
【编程软件】windows自带的Microsoft MakeCode,图形化编程工具,让更多玩家更易上手
【 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩】
先准备一个空矿泉水瓶,将其一分为二,一部分做章鱼的身体和腿,一部分做章鱼的头部;
按照章鱼的样子,剪下八条腿,并利用胶水将其固定在身体上;
利用丝线将章鱼哥的八条腿拉紧,并固定在舵机旋转盘上,
用笔在浅蓝色纸上画出章鱼哥的样子,并用胶带粘贴在章鱼哥的头部,组装好的具体效果图如下:
程序逻辑是跟随外界音量的大小,LED灯点亮的数量会随着声音的大小而变化,同时,舵机的速度会随着音量的大小而变化,舵机的角度固定,在45度~135度间转动(因为之前试过,将音量映射到舵机旋转角度上,效果不太好,就更换思路,音量体现在转动速度上),具体的图形化编程界面如下:
代码如下:
let VOL = 0
let speed = 0
let LEDcount = 0
let pos = 0
let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let numLED = 10
servos.A1.setRange(45, 135)
servos.A1.setAngle(45)
forever(function () {
speed = Math.map(VOL, 0, 255, 0, 100)
servos.A1.run(speed)
servos.A1.setAngle(45)
pause(40)
servos.A1.setAngle(90)
pause(40)
servos.A1.setAngle(135)
pause(40)
servos.A1.setAngle(90)
pause(40)
pause(100)
})
forever(function () {
let angle = 0
VOL = input.soundLevel()
LEDcount = Math.map(VOL, 60, 150, 0, 10)
for (let i = 0; i <= LEDcount; i++) {
light.setPixelColor(list[i], 0xff00ff)
control.waitMicros(10000)
}
for (let j = LEDcount; j <= 10; j++) {
light.setPixelColor(list[j], 0x000000)
}
console.logValue("x", input.soundLevel())
console.logValue("y", angle)
console.logValue("z", VOL)
})
演示视频如下:
VID_20240901_101032
章鱼哥的腿扭动的可能不太明显,线接的有点长了。。。,尴尬!不过,也算是可以扭动的“绿色”章鱼哥。
【进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果】
接下来,要介绍的任务就是必做任务,这个就是抢了猫咪的玩具,估计记仇了,要用拳头揍我了,附上照片。将猫咪不倒翁玩具拆开,将开发板固定在上面,改装成可以随着角度变化,点亮响应位置的LED灯,主要利用了加速度传感器,将一个圆分成四个象限,去判断x,y,z的值,去做相应LED灯的显示。
具体图形化编程界面如下图所示:
实现代码如下:
forever(function () {
if (input.acceleration(Dimension.X) == 0 && input.acceleration(Dimension.Y) == 0 && input.acceleration(Dimension.Z) == 1023) {
light.clear()
} else {
if (input.acceleration(Dimension.X) > 0) {
if (input.acceleration(Dimension.Y) > 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(7, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(5, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(6, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(9, 0xff0000)
light.setPixelColor(8, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
if (input.acceleration(Dimension.X) < 0) {
if (input.acceleration(Dimension.Y) < 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(0, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(1, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(3, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(2, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
light.setPixelColor(4, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
}
})
这里还要提醒各位小伙伴,这个makecode的界面上,开发板放置相当于就是面对着我们,并不是与地面水平的关系,因为我用界面的仿真工具调了半天,才发现下载进板子后,程序效果不对,太坑了,希望以后小伙伴在使用时候,避坑。。。。,本来都调好了,还能看到,x,y,z的值。但是,方向不对。。。。。
视频演示如下:
VID_20240831_161642
由于时间关系,并未做创意一,希望活动后再继续学习。
|