資料介紹
描述
靈感
我對這個(gè)項(xiàng)目的最初想法是讓我的團(tuán)隊(duì)在度過艱難的一天時(shí)可以使用一些有趣的東西,或者只是需要減輕心情。當(dāng)我環(huán)顧辦公室時(shí),我注意到了舊的 Magic 8ball。
我想我可以做類似的事情并大大擴(kuò)展可能的答案數(shù)量。把它放在你可以提供你自己的答案和大量答案的地方。
我還注意到一個(gè)谷歌語音工具包,我?guī)缀跏前资制鸺业摹?/font>我還沒有用那個(gè)工具包做任何事情,這似乎是一個(gè)絕好的機(jī)會(huì)。
連接一切
連接一切都非常簡單。
- 確定街機(jī)按鈕上的 LED 和開關(guān)連接。
- 將一些跳線焊接到連接上。
- 將陰極(負(fù))引線插入 LED 上,并將開關(guān)的一側(cè)插入擴(kuò)展板中的接地(GND)引腳。
- 將開關(guān)的另一端插入擴(kuò)展板上的 D2。
- 將 LED 上的陽極(正極)引線插入擴(kuò)展板上的 D13。
- 將揚(yáng)聲器線焊接到 1/8 音頻插頭上。使黑色成為外部(地面),紅色成為最中間的連接。應(yīng)該無關(guān)緊要,因?yàn)榇隧?xiàng)目的所有音頻輸出都設(shè)置為單聲道。
- 按照有關(guān)組裝 Google 外殼的說明進(jìn)行操作。
- 將 Spresense 安裝在外殼底部。我用了一些維可牢尼龍搭扣來防止它四處移動(dòng)。
- 插入USB線
您現(xiàn)在應(yīng)該準(zhǔn)備好開始編寫草圖了
讓按鈕工作
定義按鈕及其 LED 將使用的引腳:
const int buttonPin = 2; // Pin used to detect a button press
const int ledPin = 13; // Pin for the highside of the button LED
設(shè)置一個(gè)變量來跟蹤按鈕的狀態(tài):
// Variables used in interrupt service routines and other parts of the program should be volatile
// 2 is used to indicate there has not been an interrupt yet
// 1 is button released
// 0 is button pressed
volatile int buttonState = 2;
初始化引腳和中斷以處理按鈕狀態(tài)更改:
// setup the button and LED
pinMode(ledPin, OUTPUT); // will raise and lower this output to toggle the LED.
pinMode(buttonPin, INPUT); // will watch this pin to detect the button press.
// attaching and interrupt to the pin
attachInterrupt(buttonPin, pinIsr, CHANGE);
編寫中斷處理例程:
void pinIsr()
{
buttonState = digitalRead(buttonPin);
digitalWrite(ledPin, buttonState);
if (buttonState == 1)
canPlayQuip = true;
delayMicroseconds(200);
}
記錄俏皮話
我使用開源工具 Audacity 錄制了這個(gè)項(xiàng)目中的所有音頻。我這樣做有兩個(gè)原因:
- 這些是我自己的錄音,所以不會(huì)出現(xiàn)版權(quán)問題。
- 我喜歡使用 Audacity,一有機(jī)會(huì)就大聲疾呼
在錄音中要記住的是,當(dāng)您保存它們時(shí),它們需要采用以下格式:
- 恒定比特率
- 192kbps 比特率
- 幾秒長
應(yīng)該有辦法不具備這些要求。我相信您應(yīng)該能夠擁有大量的比特率。我嘗試了很多選項(xiàng),但這些是唯一適用于 Spresense 播放器初始化設(shè)置的選項(xiàng)。
這是執(zhí)行該初始化的行:
/*
* Set main player to decode stereo mp3. Stream sample rate is set to "auto detect"
* Search for MP3 decoder in "/mnt/sd0/BIN" directory
*/
err = theAudio->initPlayer(AudioClass::Player0, AS_CODECTYPE_MP3, "/mnt/sd0/BIN", AS_SAMPLINGRATE_AUTO, AS_CHANNEL_MONO);
我為采樣率或通道類型設(shè)置了什么似乎并不重要,除非使用上述比特率,否則 MP3 無法正確播放。
從 SD 卡讀取
設(shè)置一個(gè)變量來了解如何訪問 SD 卡:
SDClass theSD;
設(shè)置一個(gè)變量來保存文件信息:
File myDir;
打開SD卡根目錄》
Serial.println("Reading available quips from the SD card...");
myDir = theSD.open("/");
讀入文件并將它們放入一個(gè)數(shù)組中,以便稍后處理:
void getQuips(File dir, int numTabs)
{
String endTest = ".mp3";
while (true)
{
File entry = dir.openNextFile();
if (!entry || numQuips >= MAX_QUIPS)
{
// no more files
break;
}
String entryName = entry.name();
entryName.remove(0,1);
if (!entry.isDirectory() && entryName.endsWith(endTest) && !entryName.equals("init.mp3"))
{
foundQuips[numQuips] = entryName;
numQuips++;
}
entry.close();
}
}
關(guān)閉目錄:
myDir.close();
您一次只能打開一個(gè)文件。在這種情況下,與大多數(shù)文件系統(tǒng)一樣,目錄只是磁盤上的一個(gè)特殊文件。
讓聲音播放
設(shè)置一個(gè)變量來保存音頻實(shí)例:
AudioClass *theAudio;
設(shè)置音頻的基礎(chǔ):
void setupAudio()
{
puts("checking audio initialization");
// make sure we are not calling this if there is nothing to call
if(audioInitialized)
{
puts("shutting down the audio subsystem");
theAudio->end();
sleep(1);
audioInitialized = false;
}
// start audio system
theAudio = AudioClass::getInstance();
theAudio->begin(audio_attention_cb);
puts("initialization Audio Library");
/* Set clock mode to normal */
theAudio->setRenderingClockMode(AS_CLKMODE_NORMAL);
puts("setting player mode");
/* Verify player initialize */
if (err != AUDIOLIB_ECODE_OK)
{
printf("Player0 initialize error\n");
exit(1);
}
/* Main volume set to -16.0 dB */
theAudio->setVolume(60);
audioInitialized = true;
}
找出要玩的俏皮話:
if (canPlayQuip)
{
playQuip(foundQuips[(int)random(numQuips)]);
currentQuip++;
Serial.print("currentQuip: ");
Serial.println(currentQuip);
}
設(shè)置播放器播放俏皮話并播放:
void playQuip(String fileName)
{
canPlayQuip = false;
Serial.print("Playing: ");
Serial.println(fileName);
/* Open file placed on SD card */
File myFile = theSD.open(fileName);
/* Verify file open */
if (!myFile)
{
printf("File open error\n");
exit(1);
}
printf("Open! %s\n", myFile.name());
theAudio->setPlayerMode(AS_SETPLAYER_OUTPUTDEVICE_SPHP, AS_SP_DRV_MODE_LINEOUT);
puts("player initialization");
/*
* Set main player to decode stereo mp3. Stream sample rate is set to "auto detect"
* Search for MP3 decoder in "/mnt/sd0/BIN" directory
*/
err = theAudio->initPlayer(AudioClass::Player0, AS_CODECTYPE_MP3, "/mnt/sd0/BIN", AS_SAMPLINGRATE_AUTO, AS_CHANNEL_MONO);
/* Send first frames to be decoded */
err = theAudio->writeFrames(AudioClass::Player0, myFile);
printf("Error: %d\n", err);
if ((err != AUDIOLIB_ECODE_OK) && (err != AUDIOLIB_ECODE_FILEEND))
{
printf("File Read Error! =%d\n",err);
myFile.close();
exit(1);
}
puts("Play!");
theAudio->startPlayer(AudioClass::Player0);
delay(100);
puts("Stop!");
sleep(1);
theAudio->stopPlayer(AudioClass::Player0);
puts("closing file");
myFile.close();
puts("returning to ready mode");
theAudio->setReadyMode();
}
確保在完成后關(guān)閉文件,因?yàn)槟荒艽蜷_一個(gè)文件。此外,將播放器返回到“就緒模式”,以便再次播放。
進(jìn)一步的想法
我認(rèn)為這是一個(gè)非常整潔的董事會(huì),有很多可能性。我有點(diǎn)驚訝,板上沒有內(nèi)置無線連接。有附加板可以解決這個(gè)問題,本節(jié)中的其他項(xiàng)目已經(jīng)展示了如何做到這一點(diǎn)。我確實(shí)希望有一種方法可以通過 Arduino IDE 使用多個(gè)內(nèi)核。這是一次很棒的學(xué)習(xí)經(jīng)歷。
我開始考慮可以使用與我對這個(gè)項(xiàng)目所做的類似的方法來完成的其他項(xiàng)目。以下是其中的一些想法:
基于位置的答案
連接到傳感器并能夠通過讀取傳感器級別給出更有創(chuàng)意的答案。
把這個(gè)放在狗項(xiàng)圈里,這樣他們就可以和你說話了。
做一些鼓舞人心的俏皮話,讓它因團(tuán)隊(duì)房間里的一些事件而消失,以激勵(lì)團(tuán)隊(duì)走向偉大!
?
- Helping Finger開源硬件
- 顏色循環(huán)開源硬件
- Ada SensorTile開源硬件
- 開源硬件-警燈
- AirBits開源硬件
- 園藝助手開源硬件
- 閃爍的LED開源硬件
- 智能積木開源硬件
- 音箱開源硬件分享
- HBus開源硬件
- 門鈴開源硬件
- Arduino手表開源硬件
- 機(jī)械臂開源硬件
- 基于Arduino硬件光控?zé)糁谱髻Y料 6次下載
- 主流的開源硬件有哪些詳細(xì)資料說明
- 安信可小安派-Knob旋轉(zhuǎn)編碼器驅(qū)動(dòng)板簡介 481次閱讀
- 安派-Eyes-DU開發(fā)板的參數(shù)說明 534次閱讀
- 用小安派開源硬件制作一個(gè)桌面天氣站 809次閱讀
- 影響膠球清洗裝置收球率的各種因素 964次閱讀
- 使用開源硬件的烹飪過程 1313次閱讀
- 尋找開源硬件成功的觸發(fā)器 636次閱讀
- 如何自制一個(gè)魔術(shù)燈 3503次閱讀
- dfrobotDFRobot Bluno M3控制器簡介 1823次閱讀
- 源創(chuàng)通信BPI-M1+ 開源硬件開發(fā)板介紹 2648次閱讀
- 源創(chuàng)通信開源智能路由器 MTK 7623N 介紹 2897次閱讀
- 浮球液位計(jì)的工作原理_浮球液位計(jì)的特點(diǎn) 1.2w次閱讀
- 關(guān)于FPGA在開源方面的探索淺析 3706次閱讀
- 基于Altium Designer的OSHw開源項(xiàng)目 3609次閱讀
- 三大主流開源硬件對比:Arduino vs BeagleBone vs Raspberry Pi 6363次閱讀
- 開源硬件究竟有多“Open”?看完這個(gè)你就清楚了 6939次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多