DIY

红外避障玩具:“别摸我”小黄人

DIY互动玩具,《神偷奶爸2》中的避障小黄人

狂刀 发表于  2014-01-21 14:34

请自行脑补小黄人那贱贱的笑声~(实物是有声音的)

这个玩具还有个NB名字:BMW(别摸我)

制作背景

本玩具诞生于芯世界、创客空间、英特尔等机构组织的极创48小时HACKATHON的比赛。并有幸获得了本次比赛的第一名,感谢之前所有支持过我们的果壳er们!!

在我们一群开发人猿的努力下,这个纯手工制作的小黄人诞生了。

制作难度:3星

制作时间:比赛时我们3-4人工作了约8小时

制作材料

电路控制部分

  • Arduino Mega2560*1
  • 红外传感器*3
  • 舵机*2
  • 扬声器*1
  • LM386*1
  • 导线、面包板、洞洞板*N

骨架与装饰材料

  • 可乐瓶*1
  • 木板*N
  • A4纸*N
  • 工具部分:
  • 彩笔*N
  • 锯条、螺丝刀、螺丝钉等常见工具

实现原理

我们在小黄人的眼睛和双手的位置分别装了三个红外传感器(眼睛里的那个是不是毫无违和感呢,哈哈)。当人手靠近传感器时,传感器的信号会发生变化。Arduino控制器接收到这种变化后,会控制对应的舵机转动到相应的角度,保持一段时间后恢复原位。我们总共有两个舵机,分别控制小黄人的向后倒和左右闪躲。同时,Arduino控制器通过LM386芯片驱动扬声器,播放小黄人笑声的wav音频。

电路控制部分

连接红外传感器到Arduino控制器

红外反射式传感器可以发射红外线,并检测红外线是否被反弹回来。这个传感器因为内部已经集成了放大、滤波等电路,使用起来非常方便。传感器有3个引脚,分别是电源、地和信号。经过测量,当传感器前方有遮挡物时,信号线电压变低。

直接将信号线接到Arduino的数字端口上,判断这个数字端口的值是否为0,即可判断传感器前方是否有手靠近了。

如果红外传感器的质量不太好的话(产生的信号电压不稳或者不够低),则可以将信号线连接到Arduino的模拟信号引脚上,使用Arduino的AnalogRead函数(封装好的函数用起来就是简单)就可以读出这个信号线上的电压。设置一个电压阈值,就可以判断传感器前方是否有手靠近了。

连接舵机到Arduino控制器

关于舵机的使用,DIY站的前辈写了一篇很好的文章:DIYer修炼:舵机知识扫盲

这里简单描述一下:

舵机收到一个用PWM波模拟的电压值,就会让驱动轴带动舵盘旋转到一个固定的角度。而在Arduino中,完全可以利用封装好了舵机的控制函数,命令舵机转到对应的角度即可。

下图中展示了一个舵机和一系列的舵盘。

这里使用两个舵机分别控制小黄人前后旋转和左右旋转。

结合第一步中的红外传感器,此时便已经可以实现如下功能:

当红外传感器检测到小黄人前方有手时,就命令前后舵机向后转动90度;当左方有手时,就命令左右舵机向右旋转90度;当右方有手时,就命令左右舵机向左旋转90度。

当然,控制逻辑还可以有更多花样。比如,当我使出“双峰贯耳”时,小黄人会前扑进行反击~

PS:舵机在工作时会对电源电压产生一定的干扰,因此需要接电容滤波或者是单独供电。否则会影响红外传感器的正常工作。

连接扬声器到Arduino控制器

由于器材限制,我们采用了比较简单的音频播放方法。使用单片机的PWM波来近似播放PCM编码的单声道音频。为了操作简单(不用外接flash或者ram),我们将音频直接固化在程序中了。

这一段里我将介绍如何产生WAV音频文件、如何将音频文件固化在程序中、如何修改Arduino的PWM波产生函数的基本参数。

之前说了两次Arduino封装函数的方便,这里要来吐槽一下啦:有一些操作,在普通的单片机,包括Arduino套件所采用的AVR中实现比较简单,但是在函数高度封装后的Arduino上,处理起来略有麻烦。

产生WAV音频文件

  • 截取:这步比较简单,我是用KMPlayer从电影中抓取了1.5s的小黄人的笑声音频。
  • 转码:之后用GoldWave将其转码成WAV格式,参数选择是PCM unsigh 8-bit mono,并将其采样率降低到8KHz(语音信号的采样率的最低要求是6.8KHz,这里就先不多解释了)。8bit单声道的PCM的编码,就是用一个8bit的值表示当时的声音强弱,一秒钟8000个点,我的音频总共12000个点。因此,只要Arduino能够如实的将这12000个点的值变成电压值,去驱动喇叭,就可以发声了。
  • 取值:我用ultraedit打开wav文件,在16进制的模式下能看到值,但是无法复制。最后被迫用了matlab去读取wav文件,将12000个值取了出来。如果谁会更简单的方法告诉我一下吧~

音频文件固化在程序中

12000个8bit的数的大小约是12KB。Arduino的RAM大小只有8KB,而其程序Flash的大小有128KB。因此最简单的方法就是将它直接写到程序里。

在Arduino中,直接定义数组的方法是:

const byte sound[]={………………………………};

这样的话,数组中的内容作为变量会被要求加载到RAM,于是RAM就爆了。

固化到程序里的方法是:

#include <avr/pgmspace.h> //开头要引用这个文件
const byte sound[] PROGMEM={………………};//定义时候要加上关键字
…………
a=pgm_read_byte(&sound[i]);//程序中的数组的使用方法

用PWM波模拟声音

PWM波使用不同占空比的方波,来模拟不同的直流电压,就可以模拟一个模拟信号。(中文有点怪,英文是emulate an analog signal)

Arduino可以很方便的产生一个指定模拟电压的PWM,使用函数AnalogWrite即可。因此我们让Arduino依次将12000个声音点的值,用PWM波模拟出来,理论上就只要再通过滤波和放大就大功告成了。

这里需要的一个前提是,PWM波的频率要远高于声音的采样频率(8kHz)。否则会很难滤波甚至发生错误。

不幸的是,AnalogWrite中无法指定PWM的频率。查阅资料后发现,PWM波的默认频率只有几百赫兹,因此刚开始实验时喇叭里全是噪声。参考了Arduino的官方网站的使用教程 Adjusting PWM Frequencies 中的资料,将PWM波的频率改成312500Hz。终于能够实现声音的播放了。

此时直接将扬声器接到PWM的输出端口上,已经可以听到声音了(扬声器本身的结构具有低通滤波器的特性,可以滤去高频分量)

后续的滤波器以及功放电路就不描述了,时间仓促,设计的也不好。

至此,电路部分已经设计完成。此时用手挡住任何一个红外传感器,均会有一个舵机开始旋转,并且有贱贱的笑声。

机械部分

由于我们没有人是学机械或者设计的,不会画CAD图,无法使用高级的切割设备,只能采用手工加工木板。首先引用一段对舵机用法的介绍,出自于前面提到的 DIYer修炼:舵机知识扫盲 。

舵机的支架和连接装置

  • 想在你的项目中用上舵机,就要满足两个条件:一是需要个能把舵机固定到基座上的支架,二是得有个能将驱动轴和物体连在一起的连接装置。支架一般舵机上就有,而且带有拧螺丝用的安装孔。如果你仅仅是测试的话,用点儿热熔胶或者双面泡沫胶带就能轻松的固定住舵机。
  • 怎样连接驱动轴呢,你会发现舵机都附带了一些有孔的小东西,这就是舵盘,它可以套在驱动轴,臂上打上了些小孔。你只要用连接棒或者线把物体连到孔上,就可以将舵机的旋转运动变成物体的直线运动了,当然了,选用不同的舵盘或固定孔就能产生不同的运动啦。
  • 图示的是几种不同的舵盘。前面4个白色的是舵机附带的舵盘,右边四个是用激光切割机切割塑料得到的DIY舵盘。最右边的2个是舵盘和支架的组合,如果你想实现两个舵机的组合运动,把这个舵盘的支架固定到另一个舵机的支架上就OK了。

接下来的机械设计介绍,这可能会是你在果壳中看到的最坑爹的表达方式,大家对着实物图和我画的“伪三视图”努力辨认一下吧…

我们用了两个舵机实现了两个自由度。整个设备从下往上依次是:

  • 大木板A
  • 一个大木板A上竖直的固定了一个小木板B,固定方式用的是一个直角的金属,名字未知……
  • 在小木板B上挖了一个槽,将一个舵机卡到了里面,并用螺丝固定。
  • 在舵机的驱动转盘上固定一个小木板C,这个木板会随着这个舵机的驱动转盘实现前后旋转。
  • 小木板C上用螺丝固定了第二个舵机。
  • 第二个舵机的驱动转盘上固定木条D,这个木条D可以在驱动转盘的带动下,实现左右旋转。
  • 在木条D上固定大可乐瓶,在可乐瓶的适当位置开洞,固定3个红外传感器。
  • 最后,在可乐瓶外侧,用白纸画上小黄人的外观,就大功告成啦!

PS. 小黄人还在继续成长中~我们将会在这个简单的小黄人的基础上,开发出一款真正的玩具。嗯?那款玩具会是什么样的?现在还不能告诉你,肯定会更可爱,更聪明(或者更笨),变得会学习、会有情绪,也许还可以和很多人一起玩。敬请期待吧!

热门评论

  • 2014-01-21 19:03 女仆长的PAD

    玩Arduino的都是土豪啦,我这种屌丝只能用那种5元一个的白菜价的stc51了,自己弄那惨不忍睹的洞洞板……

    [3] 评论

显示所有评论

全部评论(114)
  • 1楼
    2014-01-21 14:48 我开心vacation

    杀,处女杀,杀完再看......

    [0] 评论
  • 2楼
    2014-01-21 14:53 我开心vacation

    怎么又是Arduino.....没学过单片机的顶多看看,笑笑罢了......
    不过还是挺有意思的\(^o^)/~

    [1] 评论
  • 3楼
    2014-01-21 18:44 yangff
    我用ultraedit打开wav文件,在16进制的模式下能看到值,但是无法复制

    右键16进制复制所选字符。

    [0] 评论
  • 4楼
    2014-01-21 18:56 吴xxR

    ×

    [0] 评论
  • 5楼
    2014-01-21 19:03 女仆长的PAD

    玩Arduino的都是土豪啦,我这种屌丝只能用那种5元一个的白菜价的stc51了,自己弄那惨不忍睹的洞洞板……

    [3] 评论
  • 6楼
    2014-01-21 19:09 女仆长的PAD
    引用@Greeny 的话:arduino严格来讲不算单片机,而且比单片机好学多了,及格初中物理水平的玩家上手基本没有门槛。

    为什么不算呢,atm系列就是属于mcu的啊,虽然没开发过atm,但是它的手册明明写的是mcu的啊

    [2] 评论
  • 7楼
    2014-01-21 19:34 空山新雨qwe

    哇哇哇 好像很好玩的样子!!!出了玩具请一定告诉我!我一定会买的!如果不贵的话。。。。学生党囊中羞涩呐。。。

    [1] 评论
  • 8楼
    2014-01-21 20:21 云不知

    可以用玻璃打它

    [0] 评论
  • 9楼
    2014-01-21 20:34 风引之牙

    AVR的单片机又贵相对于同等价格的也没有性价比的优势。。质量也没有优势。。

    [1] 评论
  • 10楼
    2014-01-21 20:37 初中生经理
    引用@Greeny 的话:arduino严格来讲不算单片机,而且比单片机好学多了,及格初中物理水平的玩家上手基本没有门槛。

    整套设备需要多少钱啊?话说半年后我初中毕业时,花60h,做得出这个吗?

    [0] 评论
  • 11楼
    2014-01-21 22:39 whyisveryme 法理学硕士

    这东西可以做玩具给运动失调的孩子玩诶。

    如果足够灵敏还可以做成电子陪练给拳击运动员用=。=好贱。。。

    [2] 评论
  • 12楼
    2014-01-22 01:20 狂刀 微电子博士生
    引用@yangff 的话:右键16进制复制所选字符。

    哦,我试试看,我直接切换到16进制然后复制的时候会把乱码复制进去

    [0] 评论
  • 13楼
    2014-01-22 01:23 狂刀 微电子博士生
    引用@初中生经理 的话:整套设备需要多少钱啊?话说半年后我初中毕业时,花60h,做得出这个吗?

    arduino一套200元吧,如果你比较熟悉的话可以不用买套装,会比较便宜。不过套装适合入门学习。
    舵机30一个,传感器20元一个(不过我如今在优化,做了一圈传感器,成本5元~不过比较复杂就是了)。

    [0] 评论
  • 14楼
    2014-01-22 01:26 狂刀 微电子博士生
    引用@我开心vacation 的话:怎么又是Arduino.....没学过单片机的顶多看看,笑笑罢了......不过还是挺有意思的\(^o^)/~

    谢谢支持~~~Arduino真的很简单,不需要学过单片机。只要有点软件和电路基础就ok了

    [0] 评论
  • 15楼
    2014-01-22 01:28 狂刀 微电子博士生
    引用@Greeny 的话:arduino严格来讲不算单片机,而且比单片机好学多了,及格初中物理水平的玩家上手基本没有门槛。


    引用@manageryzy 的话:为什么不算呢,atm系列就是属于mcu的啊,虽然没开发过atm,但是它的手册明明写的是mcu的啊

    应该还是算单片机的,只是函数封装的非常好,很对针对单片机的操作都简化了,非常适合原型快速开发。不过偶尔会有麻烦的地方。

    [0] 评论
  • 16楼
    2014-01-22 01:29 狂刀 微电子博士生
    引用@manageryzy 的话:玩Arduino的都是土豪啦,我这种屌丝只能用那种5元一个的白菜价的stc51了,自己弄那惨不忍睹的洞洞板……

    握爪,我一般也是这样,比赛时候时间紧嘛~

    [0] 评论
  • 17楼
    2014-01-22 01:30 狂刀 微电子博士生
    引用@空山新雨qwe 的话:哇哇哇 好像很好玩的样子!!!出了玩具请一定告诉我!我一定会买的!如果不贵的话。。。。学生党囊中羞涩呐。。。

    好嘞~你要不加我个微博或者关注一下神马的~出了玩具会第一时间宣传滴

    [0] 评论
  • 18楼
    2014-01-22 01:31 狂刀 微电子博士生
    引用@whyisveryme 的话:这东西可以做玩具给运动失调的孩子玩诶。如果足够灵敏还可以做成电子陪练给拳击运动员用=。=好贱。。。

    哈,我试过给他一个鞭腿……然后,我等他倒下腿都要定抽筋了

    [0] 评论
  • 19楼
    2014-01-22 01:31 狂刀 微电子博士生
    引用@悲恸的灰太狼 的话:可以用玻璃打它

    您太油菜了~~!!~~下次要换超声波的

    [0] 评论
  • 20楼
    2014-01-22 01:32 狂刀 微电子博士生
    引用@风引之牙 的话:AVR的单片机又贵相对于同等价格的也没有性价比的优势。。质量也没有优势。。

    其实一般没有接触过AVR的单片机,还是低端的51用的多。比赛时候时间紧,快速开发,才arduino的

    [0] 评论
  • 21楼
    2014-01-22 01:39 狂刀 微电子博士生
    引用@空山新雨qwe 的话:哇哇哇 好像很好玩的样子!!!出了玩具请一定告诉我!我一定会买的!如果不贵的话。。。。学生党囊中羞涩呐。。。

    要不做个调查呗~说不定你会影响我们最终的玩具形式哦
    你希望的价位、材料和大小分别是什么样的啊?

    [0] 评论
  • 22楼
    2014-01-22 07:24 冰火梦幻

    3米外一脚怒射,看你横行到几时^0^

    [0] 评论
  • 23楼
    2014-01-22 08:54 whyisveryme 法理学硕士
    引用@狂刀 的话:哈,我试过给他一个鞭腿……然后,我等他倒下腿都要定抽筋了

    太不灵敏了。。。。。

    [0] 评论
  • 24楼
    2014-01-22 09:32 EdwardXn

    最好能有把像我头像一样的光剑啊

    [0] 评论
  • 25楼
    2014-01-22 10:16 养猫的洋葱

    这…我是第一个看成红外避孕玩具的人吧……= =!

    [2] 评论
  • 26楼
    2014-01-22 10:24 初中生经理
    引用@whyisveryme 的话:这东西可以做玩具给运动失调的孩子玩诶。如果足够灵敏还可以做成电子陪练给拳击运动员用=。=好贱。。。

    我当时也是这么想的。。。。。。

    [0] 评论
  • 27楼
    2014-01-22 10:27 初中生经理
    引用@狂刀 的话:arduino一套200元吧,如果你比较熟悉的话可以不用买套装,会比较便宜。不过套装适合入门学习。舵机30一个,传感器20元一个(不过我如今在优化,做了一圈传感器,成本5元~不过比较复杂就是了)。

    我还是很好奇一个人花整整三天的时间能搞定吗。。。。。。

    [0] 评论
  • 28楼
    2014-01-22 11:38 狂刀 微电子博士生
    引用@whyisveryme 的话:太不灵敏了。。。。。

    舵机问题,转速不够快。不过太快的话,手工制作的会散架……

    [0] 评论
  • 29楼
    2014-01-22 11:39 狂刀 微电子博士生
    引用@初中生经理 的话:我还是很好奇一个人花整整三天的时间能搞定吗。。。。。。

    有过一些动手+电路制作基础的应该可以

    [0] 评论
  • 30楼
    2014-01-22 11:41 狂刀 微电子博士生
    引用@_Edward 的话:最好能有把像我头像一样的光剑啊


    造型很酷,可以考虑加上
    PS你是要教他反击么

    [0] 评论

显示所有评论

你的评论

登录 发表评论

狂刀
狂刀 微电子博士生

更多科研事,扫码早知道

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2015] 0609-239号    新出发京零字东150005号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区