請自行腦補(bǔ)小黃人那賤賤的笑聲~(實(shí)物是有聲音的) 這個(gè)玩具還有個(gè)NB名字:BMW(別摸我) 制作背景
本玩具誕生于芯世界、創(chuàng)客空間、英特爾等機(jī)構(gòu)組織的極創(chuàng)48小時(shí)HACKATHON的比賽。并有幸獲得了本次比賽的第一名,感謝之前所有支持過我們的果殼er們! 在我們一群開發(fā)人猿的努力下,這個(gè)純手工制作的小黃人誕生了。 制作難度:3星 制作時(shí)間:比賽時(shí)我們3-4人工作了約8小時(shí) 制作材料電路控制部分骨架與裝飾材料
我們在小黃人的眼睛和雙手的位置分別裝了三個(gè)紅外傳感器(眼睛里的那個(gè)是不是毫無違和感呢,哈哈)。當(dāng)人手靠近傳感器時(shí),傳感器的信號會發(fā)生變化。Arduino控制器接收到這種變化后,會控制對應(yīng)的舵機(jī)轉(zhuǎn)動到相應(yīng)的角度,保持一段時(shí)間后恢復(fù)原位。我們總共有兩個(gè)舵機(jī),分別控制小黃人的向后倒和左右閃躲。同時(shí),Arduino控制器通過LM386芯片驅(qū)動揚(yáng)聲器,播放小黃人笑聲的wav音頻。 電路控制部分連接紅外傳感器到Arduino控制器
紅外反射式傳感器可以發(fā)射紅外線,并檢測紅外線是否被反彈回來。這個(gè)傳感器因?yàn)閮?nèi)部已經(jīng)集成了放大、濾波等電路,使用起來非常方便。傳感器有3個(gè)引腳,分別是電源、地和信號。經(jīng)過測量,當(dāng)傳感器前方有遮擋物時(shí),信號線電壓變低。
直接將信號線接到Arduino的數(shù)字端口上,判斷這個(gè)數(shù)字端口的值是否為0,即可判斷傳感器前方是否有手靠近了。 如果紅外傳感器的質(zhì)量不太好的話(產(chǎn)生的信號電壓不穩(wěn)或者不夠低),則可以將信號線連接到Arduino的模擬信號引腳上,使用Arduino的AnalogRead函數(shù)(封裝好的函數(shù)用起來就是簡單)就可以讀出這個(gè)信號線上的電壓。設(shè)置一個(gè)電壓閾值,就可以判斷傳感器前方是否有手靠近了。 連接舵機(jī)到Arduino控制器 關(guān)于舵機(jī)的使用,DIY站的前輩寫了一篇很好的文章:DIYer修煉:舵機(jī)知識掃盲 這里簡單描述一下: 舵機(jī)收到一個(gè)用PWM波模擬的電壓值,就會讓驅(qū)動軸帶動舵盤旋轉(zhuǎn)到一個(gè)固定的角度。而在Arduino中,完全可以利用封裝好了舵機(jī)的控制函數(shù),命令舵機(jī)轉(zhuǎn)到對應(yīng)的角度即可。 下圖中展示了一個(gè)舵機(jī)和一系列的舵盤。
這里使用兩個(gè)舵機(jī)分別控制小黃人前后旋轉(zhuǎn)和左右旋轉(zhuǎn)。 結(jié)合第一步中的紅外傳感器,此時(shí)便已經(jīng)可以實(shí)現(xiàn)如下功能: 當(dāng)紅外傳感器檢測到小黃人前方有手時(shí),就命令前后舵機(jī)向后轉(zhuǎn)動90度;當(dāng)左方有手時(shí),就命令左右舵機(jī)向右旋轉(zhuǎn)90度;當(dāng)右方有手時(shí),就命令左右舵機(jī)向左旋轉(zhuǎn)90度。 當(dāng)然,控制邏輯還可以有更多花樣。比如,當(dāng)我使出“雙峰貫耳”時(shí),小黃人會前撲進(jìn)行反擊~ PS:舵機(jī)在工作時(shí)會對電源電壓產(chǎn)生一定的干擾,因此需要接電容濾波或者是單獨(dú)供電。否則會影響紅外傳感器的正常工作。 連接揚(yáng)聲器到Arduino控制器由于器材限制,我們采用了比較簡單的音頻播放方法。使用單片機(jī)的PWM波來近似播放PCM編碼的單聲道音頻。為了操作簡單(不用外接flash或者ram),我們將音頻直接固化在程序中了。 這一段里我將介紹如何產(chǎn)生WAV音頻文件、如何將音頻文件固化在程序中、如何修改Arduino的PWM波產(chǎn)生函數(shù)的基本參數(shù)。 之前說了兩次Arduino封裝函數(shù)的方便,這里要來吐槽一下啦:有一些操作,在普通的單片機(jī),包括Arduino套件所采用的AVR中實(shí)現(xiàn)比較簡單,但是在函數(shù)高度封裝后的Arduino上,處理起來略有麻煩。 產(chǎn)生WAV音頻文件
12000個(gè)8bit的數(shù)的大小約是12KB。Arduino的RAM大小只有8KB,而其程序Flash的大小有128KB。因此最簡單的方法就是將它直接寫到程序里。 在Arduino中,直接定義數(shù)組的方法是: const byte sound[]={………………………………};這樣的話,數(shù)組中的內(nèi)容作為變量會被要求加載到RAM,于是RAM就爆了。 固化到程序里的方法是: #includePWM波使用不同占空比的方波,來模擬不同的直流電壓,就可以模擬一個(gè)模擬信號。(中文有點(diǎn)怪,英文是emulate an analog signal) Arduino可以很方便的產(chǎn)生一個(gè)指定模擬電壓的PWM,使用函數(shù)AnalogWrite即可。因此我們讓Arduino依次將12000個(gè)聲音點(diǎn)的值,用PWM波模擬出來,理論上就只要再通過濾波和放大就大功告成了。 這里需要的一個(gè)前提是,PWM波的頻率要遠(yuǎn)高于聲音的采樣頻率(8kHz)。否則會很難濾波甚至發(fā)生錯(cuò)誤。 不幸的是,AnalogWrite中無法指定PWM的頻率。查閱資料后發(fā)現(xiàn),PWM波的默認(rèn)頻率只有幾百赫茲,因此剛開始實(shí)驗(yàn)時(shí)喇叭里全是噪聲。參考了Arduino的官方網(wǎng)站的使用教程 [url=http://playground.arduino.cc/Main/TimerPWMCheatsheethttp://playground.arduino.cc/Main/TimerPWMCheatsheet]Adjusting PWM Frequencies[/url] 中的資料,將PWM波的頻率改成312500Hz。終于能夠?qū)崿F(xiàn)聲音的播放了。 此時(shí)直接將揚(yáng)聲器接到PWM的輸出端口上,已經(jīng)可以聽到聲音了(揚(yáng)聲器本身的結(jié)構(gòu)具有低通濾波器的特性,可以濾去高頻分量) 后續(xù)的濾波器以及功放電路就不描述了,時(shí)間倉促,設(shè)計(jì)的也不好。 至此,電路部分已經(jīng)設(shè)計(jì)完成。此時(shí)用手擋住任何一個(gè)紅外傳感器,均會有一個(gè)舵機(jī)開始旋轉(zhuǎn),并且有賤賤的笑聲。 機(jī)械部分由于我們沒有人是學(xué)機(jī)械或者設(shè)計(jì)的,不會畫CAD圖,無法使用高級的切割設(shè)備,只能采用手工加工木板。首先引用一段對舵機(jī)用法的介紹,出自于前面提到的 DIYer修煉:舵機(jī)知識掃盲 。
接下來的機(jī)械設(shè)計(jì)介紹,這可能會是你在果殼中看到的最坑爹的表達(dá)方式,大家對著實(shí)物圖和我畫的“偽三視圖”努力辨認(rèn)一下吧…
我們用了兩個(gè)舵機(jī)實(shí)現(xiàn)了兩個(gè)自由度。整個(gè)設(shè)備從下往上依次是:
PS. 小黃人還在繼續(xù)成長中~我們將會在這個(gè)簡單的小黃人的基礎(chǔ)上,開發(fā)出一款真正的玩具。嗯?那款玩具會是什么樣的?現(xiàn)在還不能告訴你,肯定會更可愛,更聰明(或者更笨),變得會學(xué)習(xí)、會有情緒,也許還可以和很多人一起玩。敬請期待吧! |