電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>魔術(shù)8球靈感答案盒開源硬件

魔術(shù)8球靈感答案盒開源硬件

2023-01-05 | zip | 0.11 MB | 次下載 | 免費(fèi)

資料介紹

描述

靈感

我對這個(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)備好開始編寫草圖了

?
poYBAGO06aGAOysYAAuezeESD1Y261.jpg
?
1 / 7 ?基礎(chǔ)部件和我對它們的測試
?

讓按鈕工作

定義按鈕及其 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ì)走向偉大!

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)