Arduino鋼琴(求救) 一次只能輸出一個狀態?

4月29日 01:03
各位大大好,我正在做一台Arduino鋼琴。 事情是這樣的,由於我在網路上看過很多Arduino鋼琴的製作, 但我發現大家的鋼琴一次都只能談一個聲音出來, 所以我覺得這種鋼琴不夠好, 我所認為的鋼琴應該是每當我隨意按下一個鋼琴鍵時, 他都要馬上發出該鋼琴鍵自己的聲音才是, 但本人我在製作完後,發現不管怎麼樣, 我似乎一次就只能偵測到一個按鈕是on,當我按下其他鋼琴鍵(按鈕)時, 儘管他理論上是變成on狀態,應該會令Arduino的digitalRead所偵測到,但Arduino就是只會繼續發出第一個被按下的按鍵是on的那個聲音,其他的不管我怎麼按都不會令其他揚聲器發出聲音, 除非我將第一個按鍵放開變成off,其他被按下的按鍵的on才會被偵測到,才會發出聲音, 這到底是怎麼回事...? 程式碼如下: int Do, Re, Mi; int piezo[3] = {2, 3, 4}; int i; const int c = 523; const int d = 587; const int e = 659; int frequency[3] = {c, d, e}; void setup(){ for(i=0; i<3; i++){ pinMode(12-i, INPUT); } for(i=1; i<=3; i++){ pinMode(piezo[i-1], OUTPUT); } } void loop(){ for(int Run = 0; Run < 3; Run++){ if(digitalRead(12-Run) == 1){ tone(piezo[Run], frequency[Run],10); }else{ noTone(piezo[Run]); } } } 電路圖如下:
5
回應 15
文章資訊
共 15 則留言
國立虎尾科技大學
不是人家想不到要像你那樣做, 而是Arduino做不到…
國立高雄科技大學
多執行緒,你想做的應該是eventlisten 吧
B2 evenlisten?! 我網路上查看看是什麼
南臺科技大學
你可以用虛擬多工技術去處理FreeRTos 不過Arduino本身時脈不快 但處理iO因該是夠用的. 希望對你有幫助. 備註 :虛擬多工 不是真的多核心在處理,如果你的中斷技術NVIC夠猛的話 不用用到這個
B4 感謝你的回覆,我會再找時間查看看關鍵字了解您所說的東西,謝謝。
匿名
這則留言已被刪除
4月30日 08:40
已經刪除的內容就像 Dcard 一樣,錯過是無法再相見的!
明志科技大學 電子工程系
試試看 有可能是tone函式卡住 int Do, Re, Mi; int piezo[3] = {2, 3, 4}; int i; const int c = 523; const int d = 587; const int e = 659; int frequency[3] = {c, d, e}; void setup(){ for(i=0; i<3; i++){ pinMode(12-i, INPUT); } for(i=1; i<=3; i++){ pinMode(piezo[i-1], OUTPUT); } } void loop(){ for(int Run = 0; Run < 3; Run++){ if(digitalRead(12-Run) == 1){ tone(piezo[Run], frequency[Run],10); delay(20); } } }
國立高雄科技大學
聲音訊號由Arduino產生,按鍵數一多timer counter也沒辦法提供那麼多頻率的訊號,tone的底層實作可能讓你無法達成預期的效果,建議聲音訊號另外拉出去做
B7 同學感謝你的回覆,這個我有試過,但好像不是這個問題。 B8 同學先謝謝你的回覆,請問關於您說的「沒辦法提供那麼多頻率」這個觀念是在哪學的嗎,怎麼判斷夠不夠,還有「聲音訊號拉出去」能夠描述詳細一點嗎,或者希望給我一些關鍵字好讓我去自行了解,感謝你。
國立虎尾科技大學 資訊工程系
用system tick的方式 寫成 task的方式去做 只有IO控制 根本不用掛RTOS、TIMER 、interrupt 簡單啦
國立聯合大學 機械工程學系
如果把按鍵接收跟聲音輸出個別獨立呢?就是每次loop的開始先讀取哪些按鍵被觸發,然後在按照觸發案件判斷要出現哪些頻率的聲音(這邊可以用while去寫,條件以按鍵!=1為準),若有成功的話回覆我一下謝謝~
國立虎尾科技大學
B11 Tone()函式同一時間只能控一支IO,所以這裏不管怎麼改善按鈕的讀取方法,都無法實現原Po要的功能
國立聯合大學 機械工程學系
B12 原來arduino一次只能輸出一種頻率呀!所以arduino就無法實現頻率疊加囉?那可以選擇波形疊加的方式嗎?就是類似function generator那樣的功能
國立虎尾科技大學
B13 只能輸出方波,想輸出其他波形要搭配DAC。 UNO板的MCU有3個Timer。 millis() 用Timer0,使用中斷(Arduino的核心功能,不能隨意更動) 剩下Timer1、Timer2,如果使用硬體PWM,可以輸出2種頻率,但不方便控制持續時間。 所以Tone() 用的是Timer2設定目標頻率兩倍的中斷去Toggle GPIO,用Toggle的次數計算經過的時間。 這裡不建議複製Tone的做法再去產生另一個頻率,會嚴重影響MCU的運行效率。
國立聯合大學 機械工程學系
B14 哇好專業,收益很多,謝啦~