极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18347|回复: 6

创意玩具DIY:调皮小黄人——极创48小时大赛作品

[复制链接]
发表于 2013-12-17 17:40:02 | 显示全部楼层 |阅读模式
本帖最后由 future3321 于 2013-12-17 17:40 编辑

此教程由我的队友:狂刀编辑而成。原帖地址:http://www.guokr.com/blog/489781/

先上图

请自行脑补小黄人那贱贱的笑声~(实物是有声音的)
这个玩具还有个NB名字:BMW(别摸我)

制作背景
周五至周日,本人去参加了芯世界、创客空间、英特尔等机构组织的极创48小时HACKATHON的比赛。
现场提供了英特尔的三项物联网技术API:室内定位、视频监测、空气监测。不过,我们都没有用o(╯□╰)o
现场还提供了3D打印机、激光切割机等一系列高科技加工设备,不过,我们还是没有用……(好吧,我承认这段话无聊了)
最终,在我们一群开发人猿的努力下,这个纯手工制作的小黄人诞生了,并获得了比赛中第二名成绩(year~请脑补小黄人的叫声,谢谢~year~~~~)

重要
比赛尚未结束,希望各位geekers支持我们的作品一下!给我们投一票,投票结果将会让我们的项目启动资金有数量级的差别~
关注“芯世界社会创新中心”的微信公共帐号,回复 “投票+调皮小黄人+10字以上的有效投票理由” 即可完成投票啦~非常感谢哦,详细请见:http://us.upan.pro
之前看过本贴并投票的童鞋也再支持一下吧,之前的投票结果由于有人刷票,已经作废了,并诞生了这么BT的投票方式……

好,下面开始全力奉献!!!

制作材料
电路控制部分:
  • Arduino Mega2560*1
  • 红外传感器*3
  • 舵机*2
  • 扬声器*1
  • LM386*1
  • 导线、面包板、洞洞板*N

骨架与装饰材料:
  • 可乐瓶*1
  • 木板*N
  • A4纸*N

工具部分:
  • 彩笔*N
  • 锯条、螺丝刀、螺丝钉等常见工具



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

技术要点
不好意思啊,比赛时时间太紧了,没有来及一张张拍照,只能口述要点了。

机械部分
由于我们没有人是学机械或者设计的,不会画CAD图,无法使用高级的切割设备,只能采用手工加工木板。
接下来的机械设计介绍,肯定会是你在果壳中看到的最坑爹的表达方式,大家对着实物图努力辨认一下吧………………
我们用了两个舵机实现了两个自由度。整个设备从下往上依次是:
  • 大木板A
  • 一个大木板A上竖直的固定了一个小木板B,固定方式用的是一个直角的金属,名字未知……
  • 在小木板B上挖了一个槽,将一个舵机卡到了里面,并用螺丝固定。
  • 在舵机的驱动转盘上固定一个小木板C,这个木板会随着这个舵机的驱动转盘实现前后旋转。
  • 小木板C上用螺丝固定了第二个舵机。
  • 第二个舵机的驱动转盘上固定木条D,这个木条D可以在驱动转盘的带动下,实现左右旋转。
  • 在木条D上固定大可乐瓶,在可乐瓶的适当位置开洞,固定3个红外传感器。



电路控制部分
1、红外传感器——>Arduino
器材限制,我们只买到了红外反射式传感器(发射红外线,并检测红外线是否被反弹回来)

这个传感器有3个引脚,分别是电源、地和信号。经过测量,当传感器前方有遮挡物时,信号线电压变低。
我们将信号线连接到Arduino的模拟信号引脚上,使用Arduino的AnalogRead函数(封装好的函数用起来就是简单)就可以读出这个信号线上的电压。设置一个电压阈值,就可以判断传感器前方是否有手靠近了。

2、Arduino——>舵机
舵机收到一个用PWM波模拟的电压值,就回让驱动转盘旋转到一个固定的角度。
有了第一步的结果,下面的事情就很简单了(简单还是因为Arduino中以及封装好了舵机的控制函数,用起来so easy)
两个舵机分别控制小黄人向前后旋转和左右旋转。
当前方有手时,就命令前后舵机向后转动90度。当左方有手时,就命令左右舵机向右旋转90度;当右方有手时,就命令左右舵机向左旋转90度。
当然,控制逻辑还可以有更多花样。比如,当我使出“双峰贯耳”时,小黄人会前扑进行反击~

3、Arduino——>喇叭
由于器材限制,我们采用了比较简单的音频播放方法。使用单片机的PWM波来近似播放PCM编码的单声道音频。为了简单(不用外接flash或者ram),我们将音频直接固化在程序中了。
之前说了两次Arduino封装函数的方便,这里要来吐槽一下啦~这一段里我将介绍如何产生WAV音频文件、如何将音频文件固化在程序中、如何修改Arduino的PWM波产生函数的基本参数。后两者在普通的单片机,包括Arduino套件所采用的AVR中实现比较简单,但是函数高度封装后的Arduino,处理起来略有麻烦。

a、产生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个值取了出来。如果谁会更简单的方法告诉我一下吧~


b、音频文件固化在程序中
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);//程序中的数组的使用方法

c、用PWM波模拟声音
PWM波使用不同占空比的方波,来模拟不同的直流电压,就可以模拟一个模拟信号。(中文有点怪,英文是emulate an analog signal)
Arduino可以很方便的产生一个指定模拟电压的PWM,使用函数AnalogWrite即可。因此我们让Arduino依次将12000个声音点的值,用PWM波模拟出来,理论上就只要再通过滤波和放大就大功告成了。
这里需要的一个前提是,PWM波的频率要远高于声音的采样频率。否则会很难滤波甚至发生错误。
不幸的是,AnalogWrite中无法指定PWM的频率。查阅资料后发现,PWM波的默认频率只有几百赫兹,因此刚开始实验时喇叭里全是噪声。
参考了http://playground.arduino.cc/Main/TimerPWMCheatsheet
http://playground.arduino.cc/Main/TimerPWMCheatsheet
中的资料,将PWM波的频率改成312500Hz。终于能够实现声音的播放了。
此时直接将扬声器接到PWM的输出端口上,已经可以听到声音了(扬声器本身的结构具有低通滤波器的特性,可以滤去高频分量)后续的滤波器以及功放电路就不描述了,时间仓促,设计的也不好。

最后再次恳请各位geekers支持我们的作品一下!给我们投一票,投票结果将会让我们的项目启动资金有数量级的差别~
关注“芯世界社会创新中心”的微信公共帐号,回复 “投票+调皮小黄人+10字以上的有效投票理由” 即可完成投票啦~非常感谢哦,详细请见:http://us.upan.pro
如果你现在用的是电脑,那么你可以用微信扫描下面的二维码(微信扫二维码的功能,打开微信,“发现”->“扫一扫”)
关注成功后,就可以点击”查看消息“进入与公共帐号对话的界面了,回复 “投票+调皮小黄人+10字以上的有效投票理由” 即可完成投票啦~


代表小黄人感谢你~~~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-12-17 19:34:37 | 显示全部楼层
好凶残,,,吓尿了。
回复 支持 反对

使用道具 举报

发表于 2013-12-17 20:42:25 | 显示全部楼层
好凶残,,,吓尿了。
回复 支持 反对

使用道具 举报

发表于 2013-12-18 21:49:15 | 显示全部楼层
亮点之重是arduino播放wav,是成本所限还是希望探讨一种实现方法呢?其实可以考虑语音模块呀。
回复 支持 反对

使用道具 举报

发表于 2013-12-21 23:44:19 | 显示全部楼层
可以写一个自动wav2arduino代码的程序,好像目前没见别人搞过这个case吧,我原先也为发声头疼了
回复 支持 反对

使用道具 举报

发表于 2013-12-22 09:24:42 | 显示全部楼层
arduino可以播放啊,,,就是PWM方式输出音频咯。。。有个库,可以从SD卡读取数据播放,论坛有介绍过
回复 支持 反对

使用道具 举报

发表于 2014-4-24 20:54:38 | 显示全部楼层
求源代码
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 23:05 , Processed in 0.044771 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表