Robofun 機器人論壇

標題: 遇到了動作問題~新手求解^^ [打印本頁]

作者: dream87694    時間: 2012-9-27 04:21
標題: 遇到了動作問題~新手求解^^
這是電子琴的程式:int inputPinG = 7;
int inputPinF = 6;
int inputPinE = 5;
int inputPinD = 4;
int inputPinC = 3;
int inputPinB = 2;
int inputPinA = 1;
int BuzzerPin = 0;
void setup() {
  pinMode(inputPinG, INPUT);
  pinMode(inputPinF, INPUT);
  pinMode(inputPinE, INPUT);
  pinMode(inputPinD, INPUT);
  pinMode(inputPinC, INPUT);
  pinMode(inputPinB, INPUT);
  pinMode(inputPinA, INPUT);
  pinMode(BuzzerPin, OUTPUT);
}
void loop() {
int valG = digitalRead(inputPinG);
int valF = digitalRead(inputPinF);
int valE = digitalRead(inputPinE);
int valD = digitalRead(inputPinD);
int valC = digitalRead(inputPinC);
int valB = digitalRead(inputPinB);
int valA = digitalRead(inputPinA);
digitalWrite(BuzzerPin, LOW);
if (valG == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1915);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1915);
  }
else if (valF == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1700);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1700);
  }
else if (valE == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1519);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1519);
  }
else if (valD == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1432);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1432);
  }
else if (valC == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1275);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1275);
  }
else if (valB == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1136);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1136);
  }
  else if (valA == HIGH){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(990);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(990);
  }
else digitalWrite(BuzzerPin, LOW);  
}

最大的問題就是輸出接了蜂鳴器,就響個不停,完全不知道是怎麼回事= =
我連接腳都還沒接,光接喇叭就響個不停了,真的不知到問題出在哪= =
作者: vegewell    時間: 2012-9-27 21:53
回復 1# dream87694

你可以就照著以下網站的做:
Arduino實驗筆記(四) 按鍵開關控制蜂鳴器-簡易電子琴
http://g3mk.blog.163.com/blog/static/2002041302012141022992/
作者: Curtiss    時間: 2012-9-27 22:14
輸入腳位在沒有接任何電路時,而且也沒有設定 pullup,輸入值可能為 high 或 low。只要有一個腳位是 high,按照程式的邏輯,蜂鳴器就會叫了。
判斷條件若是 high,輸入腳位必須接上 pulldown 電阻到 ground,確保未按鍵時為 low。
判斷條件若是 low,輸入腳位必須接上 pullup 電阻到 +5V,確保未按鍵時為 high。
arduino 有內部的 pullup 功能,對輸入腳下一個 digitalWrite(pin, HIGH)即可。
作者: dream87694    時間: 2012-9-27 22:44
回復 2# vegewell


   我照他寫的,程式對,但就是喇叭會響不停!!
作者: dream87694    時間: 2012-9-27 22:47
回復 3# Curtiss


   所以程式要改過??^^
作者: vegewell    時間: 2012-9-27 23:46
回復 4# dream87694


    電路也是照接的嗎?
(他有個圖片多接一條線)
你也可以秀你的線路,
你也可以把所有接線拆掉,
然後先接一個按鍵開關,
試試,沒問題再接第二個,
看看哪個有問題,
作者: Curtiss    時間: 2012-9-28 00:57
回復  Curtiss


   所以程式要改過??^^
dream87694 發表於 2012-9-27 22:47



    電路要改。輸入腳必須有 pullup 或 pulldown 電路。如下圖:(參考自http://www.christec.co.nz/blog/archives/56)
   
    使用 pullup,未按 = HIGH,按下 = LOW
    使用 pulldown,未按 = LOW,按下 = HIGH
作者: dream87694    時間: 2012-9-28 07:59
回復 6# vegewell


   我的確是照著他接的!!^^
動作也都正確,不過就是會一直響= =
作者: dream87694    時間: 2012-9-28 21:21
回復 6# vegewell


   我把我接的拍成影片,用好了我會傳給您過目^^
作者: dream87694    時間: 2012-9-28 21:22
回復 7# Curtiss


   我把我接的拍成影片,用好了我會傳給您過目^^
作者: dream87694    時間: 2012-9-28 21:51
本帖最後由 dream87694 於 2012-9-28 22:03 編輯

回復 6# vegewell


    VIDEO0006.3gp (23.45 MB, 下載次數: 1424) 我輸出定義為0腳
然後1~7相對的7個音階
問題就在於輸出腳接喇叭就一直嚮
影片可能需要下載,請笑納^^
作者: dream87694    時間: 2012-9-28 22:04
回復 7# Curtiss


    VIDEO0006.3gp (23.45 MB, 下載次數: 1272) 然後1~7相對的7個音階
問題就在於輸出腳接喇叭就一直嚮
影片可能需要下載,請笑納^^
作者: Curtiss    時間: 2012-9-28 22:09
回復  vegewell


    我輸出定義為0腳
然後1~7相對的7個音階
問題就在於輸出腳接喇叭就一直嚮影片可 ...
dream87694 發表於 2012-9-28 21:51



    從影片可以明顯的看出輸入腳並沒有接到其他的電路,所以在未接觸鱷魚夾之間,均為浮接的狀態。
    最簡單的修改方式是使用 Arduino 的內建 pullup 功能。在 setup() 中,對每一個輸入腳位增加 digitalWrite( 腳位, HIGH) 指令即可。
    然後判斷式的" == HIGH" 改為 " == LOW"。鱷魚夾的另一端改為接地,而非 +5V。這樣就可以解決浮接的問題。
作者: dream87694    時間: 2012-9-28 22:48
回復 13# Curtiss


   謝謝你^^我試看看如何在跟你說!!
被者個問題搞到火燒屁股= =
作者: dream87694    時間: 2012-9-29 05:28
回復 13# Curtiss


  大大^^請問~我現在只有這七個音,想再多加6個音要怎麼辦??@口@
作者: Curtiss    時間: 2012-10-1 21:43
回復  Curtiss


  大大^^請問~我現在只有這七個音,想再多加6個音要怎麼辦??@口@
dream87694 發表於 2012-9-29 05:28



    1. 把所有腳位都用上,應該還夠用。不夠的話,換用 Arduino Mega。
    2. 去找介紹單晶片的書,查一查鍵盤掃瞄的作法,可以擴充出很多按鍵。
作者: dream87694    時間: 2012-10-2 12:11
回復 16# Curtiss


   謝謝大大呢^^超強的呢!!~幫助我很大!!
你有推薦arduino 的書嗎??
我去書店都沒找到!!
作者: Curtiss    時間: 2012-10-4 20:24
回復 17# dream87694


    實體書店通常不會放這一類的書,直接到網路書店找比較快。中文書應該還不多,我知道鯨魚大大有出一本。
作者: dream87694    時間: 2012-10-6 07:46
回復 18# Curtiss


   我又遇到一個問題是!!以下是LED明滅的程式:

void setup()                           

{

    pinMode(13, OUTPUT);   

}

void loop()                           

{

    digitalWrite(13, HIGH);      

    delay(500);                        

    digitalWrite(13, LOW);      

    delay(500);                        

}


我把他跟電子琴寫在一起,結果電子琴居然沒聲音= =

我不知道發生甚麼事="=??

程式互相干擾嗎??


作者: Curtiss    時間: 2012-10-6 11:46
問題在 delay(500) 。
程式碼執行到此處會停下來數時間,數完了才會執行下一行,因此就不會執行到發聲控制的程式碼。
原本電子琴的程式是仰賴 loop() { ... } 程序不斷的運行,才能快速的偵測按鍵動作與發出準確音調,delay指令破壞了此一條件。
可參考Arduino範例中的 BlinkWithoutDelay 的作法 ( File => Examples => 02.Digital )
作者: dream87694    時間: 2012-10-11 16:50
回復 20# Curtiss


   對了~大大~請問~如果我打算一個輸出可以經由切換可以發初更高的音要怎麼辦??我想說,如果12輸出,可以經由別的端子的HIGH或LOW轉號到不同音高的音,這樣子可行嗎??
這樣子,一樣12個輸出孔,也許就可以當24個因使用!!
作者: Curtiss    時間: 2012-10-13 06:57
這是很好的方法,就像鍵盤的 shift 一樣。
作者: dream87694    時間: 2012-10-13 10:25
回復 22# Curtiss


   我程式這樣寫步之行不行得通,情您過目^^!
int inputPinH = 8;
int inputPinG = 7;
int inputPinF = 6;
int inputPinE = 5;
int inputPinD = 4;
int inputPinC = 3;
int inputPinB = 2;
int inputPinA = 1;
int BuzzerPin = 0;
void setup() {
  pinMode(inputPinH, INPUT);
  pinMode(inputPinG, INPUT);
  pinMode(inputPinF, INPUT);
  pinMode(inputPinE, INPUT);
  pinMode(inputPinD, INPUT);
  pinMode(inputPinC, INPUT);
  pinMode(inputPinB, INPUT);
  pinMode(inputPinA, INPUT);
  pinMode(BuzzerPin, OUTPUT);
  digitalWrite( 8, HIGH);
  digitalWrite( 7, HIGH);
  digitalWrite( 6, HIGH);
  digitalWrite( 5, HIGH);
  digitalWrite( 4, HIGH);
  digitalWrite( 3, HIGH);
  digitalWrite( 2, HIGH);
  digitalWrite( 1, HIGH);
}
void loop() {
int valH = digitalRead(inputPinH);
int valG = digitalRead(inputPinG);
int valF = digitalRead(inputPinF);
int valE = digitalRead(inputPinE);
int valD = digitalRead(inputPinD);
int valC = digitalRead(inputPinC);
int valB = digitalRead(inputPinB);
int valA = digitalRead(inputPinA);
digitalWrite(BuzzerPin, LOW);
if (valA == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1908.397);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1908.397);
  }
else if (valB == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1700.68);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1700.68);
  }
else if (valC == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1515.152);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1515.152);
  }
else if (valD == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1432.665);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1432.665);
  }
else if (valE == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1275.51);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1275.51);
  }
else if (valF == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1136.364);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1136.364);
  }
else if (valG == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1012.146);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1012.146);
  }
else digitalWrite(BuzzerPin, LOW);  
  if (valH == LOW){
  if (valA == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(954.1985);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(954.1985);
  }
else if (valB == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(850.3401);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(850.3401);
  }
else if (valC == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(757.5758);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(757.5758);
  }
else if (valD == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(716.3324);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(716.3324);
  }
  }
}
作者: dream87694    時間: 2012-10-15 14:23
回復 22# Curtiss


   大大~救命呀!!  (~口~)川我發現程式照上述去寫!!
if (valA == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(1908.397);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(1908.397);
  }

所發出的音和~~~
if (valH == LOW){
  if (valA == LOW){
  digitalWrite(BuzzerPin, HIGH);
  delayMicroseconds(954.1985);
  digitalWrite(BuzzerPin, LOW);
  delayMicroseconds(954.1985);
  }

}
會重疊!!~請問我該怎麼半Q_Q
作者: Curtiss    時間: 2012-10-18 21:42
回復 24# dream87694


因為第一個判斷式只要 valA==LOW 條件就成立,不管 valH 是 HIGH 或 LOW。
改為以下寫法試試看:

if ( valH == LOW )
{
     if ( valA == LOW )
    {
        ..........
     }
    else if ..............
}
else        // valH == HIGH
{
     if ( valA == LOW )
    {
        ..........
     }
    else if..............
}
作者: dream87694    時間: 2012-10-21 10:16
回復 25# Curtiss


   大大,請問~~如果想要那八個音發出像鋼琴一樣的聲音要怎麼改??
作者: Curtiss    時間: 2012-10-25 01:27
回復 26# dream87694


    我沒有試過。感覺上要讓 Arduino 發出鋼琴的聲音,似乎有點困難。建議在網路上搜尋一些有關音樂與Arduino的作品,可能會有答案。




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2