6351| 17
|
夏天到了,魔改一个带击杀音效的电蚊拍! |
本帖最后由 RRoy 于 2022-6-23 10:35 编辑 夏天来了,又到了蚊子嗡嗡嗡的季节,在这一点上,国内和海外并没有区别。 今天我们介绍的项目,就是魔改升级我们的武器——电蚊拍,让我们与蚊子的斗争更加有趣一些! 升级后的电蚊拍功能包括:
▼ 点击查看效果 创作思路 作者的想法是,当蚊子撞上电蚊拍的金属网并产生电弧时,电蚊拍的电路上一定有一些电流的变化。如果能在电路中找到一个可以被Arduino或ATtiny读取的地方(即0到5伏之间),那么就可以很容易地进行计数和显示分数,并播放声音。 声音功能可以用DFPlayer模块很容易地在ATtiny上添加。 分数将会用一个4位7段的显示器来显示,它的板载TM1637只用两根线(ATtiny的两个IO引脚)就能驱动这个显示器。 因为这些电子模块是在5V下运行的,而电蚊拍通常是用2节1.5V的电池的,所以顺便用USB充电电池升级一下电蚊拍的电源部分。 换句话说,这次的“武器升级”都是用相对容易找到的现成的电子模块来改造的,唯一的 复杂一点的地方是在信号计算方面,这块是由ATtiny通过编程处理的。 在下面的教程分享中,假定大家都对Ardiuno和如何编程有一些了解,如果没有,可以先学习一下Arduino基础教程。 在开始之前还需要说明一个安全问题: 材料 对于这个“终极”电蚊拍,我们需要:
工具部分,我们需要用到电烙铁、一把热胶枪和一台3D打印机(一些创意来修改拍子的手柄......) 第1步:如何升级我们的电蚊拍? 如果你不关心它的工作方式,只是想要做“终极”电蚊拍,那可以跳过这个步骤。 解释电蚊拍如何工作的资源可以在互联网上找到。https://www.homemade-circuits.com/mosquito-swatter-bat-circuit/ 它是振荡电路和一个将电压提升到数百伏的电路,再加上连接到拍子的金属网组成的。 首先遇到的问题是,找不到什么东西可以在这里挂上ATtiny(由于ATtiny的5伏限制,高压侧不能直接使用)。 为了解决这个问题,第二个想法是测量电流消耗。 当金属网上发生电弧,蚊子被电杀时,一定有一些能量消耗,应该可以通过ATtiny读取。 测量这个消耗的最好方法是测一下电流消耗,而测量电流的最简单方法是测量电阻上的电压,这一点ATtiny可以做到。 因此,计数蚊子的方法是在电池和电蚊拍电路之间插入一个小电阻,并监测这个电阻上的电压。 除此之外,我们使用已经制作好的电子模块(每个功能都有一个:声音、显示、充电器等),所以综合来说,这是一个相对比较简单的电子项目了。 第2步:准备电路 主要组件有:
我们最好先把它们摆放好,好确保它们能放进在手柄里,Digispark和DFPlayer可以靠近一点,根据它们在最终模块中的位置,给其他组件留出合适的电线长度(即USB充电器上有一个USB端口,需要可以用来充电)。 第3步:拆开电蚊拍 卸下电池,拆开拍子(应该只有几个螺丝)。 可以先看一下大概有多少空间留给我们来放附加的组件。 也可以顺便看看你的拍子是否与这个教程分享中使用的拍子一样。 需要注意的主要区别是拍子的推钮的 "位置"。在图中,它位于电池的+号和拍子的电路之间。如果是这样的话,就可以了(见照片)。 在某些拍子上,这个按钮位于地线-和电路之间。在这种情况下,下面修改和代码将不起作用。将会需要在硬件和软件方面进行一些调整。 第4步:魔改电蚊拍 在这个步骤中,我们:
第5步:构建电路并焊接元件 根据所有元件的最终位置预先进行布局,估计一下各种线的长度,开始焊接。 在上一步中,为了清楚起见,没有画出地线和VCC(5V)线,但所有的地线都需要相互连接,所有的VCC都需要相互连接。 对于VCC,Digispark有3个标有5V的引脚,它们是连在一起的,可以用来重新分配给其他元件。不要使用Digispark的VIN(VIN是一个需要高于6V的电压输入,我们不使用它,而是使用电池充电器的5V输出)。 建议从Digispark开始:
然后,继续进行电蚊拍电路、电池充电器、开关的连接:
第6步:隔离显示屏与电蚊拍电路 在测试中发现会遇到显示问题——当蚊子碰到电蚊拍的网眼时,显示屏会关闭或者出错。 怀疑这是由于高电压变化产生的电子干扰影响了显示电路和连接。 修复方法很简单,在电路上贴一些胶带,铝箔(电磁屏蔽),再贴胶带。 当然,不要把铝箔直接放在电路上…… 第7步:在SD卡上加载声音 DFPlayer播放的声音是存储在SD卡上的。 做法很简单,把卡装好,然后复制选择的声音:
DFPlayer将根据 "轨道编号 "播放声音。 根据观察,发现文件不是根据它们的名字来排序的,而是根据它们在卡上的inode号来排序的(在Linux上可以用 ls -id 查看) ls -id * | more 647 1_Monster_kill.mp3 648 2_mixkit-final-level-bonus-2061.wav 649 3_get_ready_to_the_newt_fight.mp3 650 mixkit-arcade-retro-scoring-counter-273.wav 651 mixkit-arcade-video-game-bonus-2044.wav 652 mixkit-arcade-video-game-scoring-presentation-274.wav 653 mixkit-game-bonus-reached-2065.wav 654 mixkit-game-experience-level-increased-2062.wav 655 mixkit-winning-an-extra-bonus-2060.wav 如果你从一张新成型的卡开始,轨道号/inode的顺序将是声音文件的复制顺序(即复制在卡上的第一个文件就是1号)。 在下面的代码中,文件/音轨的选择是通过setTrack()完成的。 // 0 is random betwen tracks 4 to 9 // 1 is monster kill = track 1 (listed by inode on card (ls -id)) // 2 is level up // 3 is power on if (sound_type==0) setTrack(int(random(4,9))); //SD card contains 9 files if (sound_type==1) setTrack(1); // monster kill if (sound_type==2) setTrack(2); //level up if (sound_type==3) setTrack(3); //power on 你可以自行修改这部分,让动作sound_type和播放的音频之间匹配上。 音频可以到文末打包下载。 第8步:打印一个新的握柄 如果电蚊拍和上面的一样,可以直接打印这个的手柄设计。 如果不一样,可能需要自己设计一个。 不过,有些拍子的手柄很大,然后里面几乎什么都没有,也可以直接装上附加电路。记得我们仍然需要为显示屏和扬声器找一个位置。 3D打印的文件可以到文末打包下载。 第9步:组装起来 这边用热胶枪将零件固定在它们的最终位置。 扬声器也是直接粘在拍子上的。 第10步:蚊子在哪里? 再次重申,如果你不关心它的工作方式,只是想得到你的“终极”电蚊拍的玩家,你可以跳过这一步......或者之后再来看。 一旦我们把所有的元件都焊接在一起,如果在ATtiny上加载一个简单的程序,只做一个模拟读取(A12),然后看一下原始数据: 原始数据看起来非常嘈杂,我们无法知道在图上什么地方/什么时候有蚊子(或其他东西,我没有等蚊子打我的球拍来调试代码 :) 它自己撞到了电蚊拍的网眼上(见图1)。 平均数是清理部分噪音的好方法,我的想法是将最后的平均数与 "长期 "平均数进行比较,但结果也有点让人失望(见图2)。 然后学习一下别人是怎么做的:https://www.iese.fraunhofer.de/blog/change-point-detection/ 这看起来正是我们寻找的,计算信号的标准差应该能让我们检测到蚊子被击杀了(见上面链接中的"Animation of change point detection via sliding window"部分)。 应用于我们的设置,会得到以下结果(图3)。 在程序中,我们计算了标准差的平方,我们可以看到,当按下或释放按钮时,它达到非常高的值(这是预期的,信号从0V到接近5V),但一旦这些阶段被排除,我们就可以监测这个标准差,并假设如果它达到一些高值,我们在电路中有一个干扰,这一定就是一个蚊子被“击杀”了(图4)! 现在我们知道了如何判断完成了“一次击杀”,剩下的就简单了(播放声音,增加分数)。 为了更准确,我们又增加了一些东西:
第11步:在Digispark Pro上加载程序 这个比较简单,可以使用Arduino IDE对ATtiny进行编程。 Wiki:http://digistump.com/wiki/Digispark/tutorials/connectingpro 对代码做一些解释: 在setup()函数中,我们初始化DFPlayer所需的串行通信,读取电位计值以调整音量(在设置时只读取一次,这意味着拍子需要关闭/打开电源来考虑到音量调整)。 对于计数器的重置,如果你想把分数重置为零,你需要按下重置按钮,打开拍子的电源,等待显示屏显示 "0"。 然后它就会读取存储在EEPROM中的分数。 它设置显示屏的亮度(否则它将保持关闭)。 在loop()函数中,我们基本上是处理拍子功率的平均值process_average()和标准差的平方,它告诉我们是否有杀伤力process_std_dev() 相关代码可以在文末下载。 第12步:更新Digispark micronucleus(可选) Digispark micronucleus是负责 "启动 "Digispark的一段代码。 它检查我们是否上传了一个新的程序,如果没有就启动已经加载的程序。 问题是它需要等待6秒钟,这个时间对于我们想要启动我们的武器来拍蚊子,就会显得比较长了。 不过,micronucleus有一些变种有不同的检查机制。如果你按照这些说明更新micronucleus(使用 "推荐 "配置),拍子将在一两秒后准备好。 参考:https://github.com/ArminJo/micronucleus-firmware 在更新micronucleus固件后重新加载你的程序即可。 第13步:故障排除 希望你不需要读这个, 一些提示,以防万一...... 1、工作不多......检查电线和焊料; 2、如果电蚊拍自己重新启动(你听到了启动的声音,但没有开/关),请给电池充电; 3、大约30秒后,电蚊拍就会自动关闭。
4、如果拍子的检测能力真的很差或经常检测错误...那么可能要做一些代码调整。 如果你想用USB端口来显示一些变量,你必须修改代码,以便使用DigiCDC库并删除SoftSerial(用于4位数显示)。但更重要的是,当这样做时,我们将从USB口而不是电池充电器口获得电源,这就有很大的区别......VCC的质量对我们计算的平均数和标准差有很大影响...... 换句话说,在USB上连接时进行的任何调整,在用电池运行时可能会失效。 获得一些小信息的方法是使用显示器本身(即在按下复位按钮时显示最后的标准差)。 知道了这些,你就可以试着调整代码中的以下数值,这些数值对我们的检测有很大的影响。 单次读取的样本数: int samples=10; 平均滑动窗口的大小: int nbr_slot=15; int value[16]; // array of (nbr_slot + 1) 标准差的阈值: int threshold=110; int monster_threshold=250; 第14步:继续改进电蚊拍,分享你的改进方法 如果你找到了更加简单的改造电蚊拍的方法或者是设计,欢迎分享出来! 原文链接:https://www.instructables.com/Ul ... r-Gamer-Add-Kill-C/ 项目作者: lmu34 译文首发于:DF创客社区 开源项目,转载请务必注明项目出处与原作者信息 |
3.22 MB, 下载次数: 3655
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed