Arduinoメトロノーム - ボタンプレスの拍子記号を変更する

/**************************************/
const int lowestPin = 1;//the lowest one attach to
const int speaker = 13;
int ts = 4;//how many beats you want
int count = 1;
const int keyPin = 12;
int buttonState = 0;
int bpm = 120;
/**************************************/
void setup()
{
  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {
    pinMode(thisPin, OUTPUT); //initialize thisPin as an output
    pinMode(6, INPUT);


  }
  pinMode(keyPin, INPUT);
}

/****************************************/
void loop()
{

  //iterate over the pins
  //turn the led on from lowest to the highest



  if (digitalRead(keyPin) == HIGH && ts == 2) {
    ts = 3;
    delay(2000);
  }

  else if (digitalRead(keyPin) == HIGH && ts == 3) {
    ts = 4;
    delay(2000);
  }

  else if (digitalRead(keyPin) == HIGH && ts == 4)
  {
    ts = 2;
    delay(2000);
  }

  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {

    bpm = pulseIn(6, HIGH);

    pinMode(13, OUTPUT);
    if (ts > 4)
    {
      if (count > 3)
        for (int a = 4; a <= ts; a++) {
          digitalWrite(a - 3, HIGH);
        }

    }
    else
      digitalWrite(thisPin, HIGH);

    if (count == 1)
      tone(13, 1500, 100);
    else
      tone(13, 1000, 100);

    delay(bpm - 52);
    pinMode(13, INPUT);
    digitalWrite(thisPin, LOW);


    count++;
    if (count > ts)
      count = 1;


  }

}

私はArduino Unoを使ってメトロノームを作ろうとしています.4個のLEDで、それぞれのLEDはビートです。私は拍子を押すたびに拍子を変更したいので、拍子ごとに異なる拍数がありますが、ボタンを押すと、1小節につき2拍と3拍のコードが1回実行された後に戻ります1小節あたり4拍です。

ボタンを押すことなくランダムに変更されることもあります。私は10の代わりに220オームの抵抗を使用していますが、220は220よりはるかにランダムに開始されます。

Metronome project picture

1
これらのLEDには抵抗はありません
追加された 著者 Joshua,
これらのLEDと直列に抵抗器がありますか?
追加された 著者 Nick Gammon,

1 答え

LEDと直列の抵抗が必要です。 LEDの手入れと給餌を参照してください。あなたの状況では、各LEDと直列の330オームがほぼ正しいでしょう。

抵抗がないと、出力ピンから電流をあまりにも多く引き出しています。これにより電圧が低下し、プロセッサがリセットされます。したがって、1小節あたり4ビートのデフォルトに戻ります。

また、プロセッサーとLEDの両方に損傷を与えます。

プロセッサがリセットされたかどうかは、 setup に余分なコードを入れて確認できます。例えば、ピンを出力に設定した後:

 for (int i = 0; i < 10; i++)
    {
    digitalWrite (3, HIGH);
    delay (200);
    digitalWrite (3, LOW);
    delay (200);
    }

ピン3が10回点滅している場合は、プロセッサがリセットされていることがわかります。


私は今あなたの問題は、スイッチのフローティング入力があることだと思います。あなたのスケッチを試してみましたが、いくつかの修正を加えるとうまくいきました。

私のコード:

/**************************************/
const int lowestPin = 1;//the lowest one attach to
const int speaker = 13;
int ts = 4;//how many beats you want
int count = 1;
const int keyPin = 12;
int buttonState = 0;
int bpm = 120;
/**************************************/
void setup()
{
  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {
    pinMode(thisPin, OUTPUT); //initialize thisPin as an output
    pinMode(6, INPUT);
  }
  pinMode(keyPin, INPUT_PULLUP);
}

/****************************************/
void loop()
{

  //iterate over the pins
  //turn the led on from lowest to the highest

  if (digitalRead(keyPin) == LOW && ts == 2) {
    ts = 3;
    delay(2000);
  }

  else if (digitalRead(keyPin) == LOW && ts == 3) {
    ts = 4;
    delay(2000);
  }

  else if (digitalRead(keyPin) == LOW && ts == 4)
  {
    ts = 2;
    delay(2000);
  }

  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {

    bpm = pulseIn(6, HIGH);
    //bpm = 1000;

    pinMode(speaker, OUTPUT);
    if (ts > 4)
    {
      if (count > 3)
        for (int a = 4; a <= ts; a++) {
          digitalWrite(a - 3, HIGH);
        }
    }
    else
      digitalWrite(thisPin, HIGH);

    if (count == 1)
      tone(speaker, 1500, 100);
    else
      tone(speaker, 1000, 100);

    unsigned long now = millis ();
    while (millis() - now < (bpm - 52))
      {
     //quit delay if switch pressed
      if (digitalRead(keyPin) == LOW)
        break;
      }

    pinMode(speaker, INPUT);
    digitalWrite(thisPin, LOW);

    count++;
    if (count > ts)
      count = 1;

  }//end of for each pin

}//end of loop

スイッチからの入力がINPUT_PULLUPになり、内部抵抗によってHIGHになることに注意してください。したがって、テストは == HIGH ではなく == LOW になりました。

また、メトロノームのタイミングを遅らせる代わりに、 millis()をテストし、時間がかかっているかどうかを調べるように変更しました。それ以外の場合は、サイクルが繰り返されるたびにスイッチを押し続ける必要があります。

1
追加された
私は抵抗器を持っているので、ボタンはまだ拍子記号(ts)を変更しません。これをどうやって配線したり、コードを変更したりできますか?
追加された 著者 Joshua,
修正された返信を参照してください。
追加された 著者 Nick Gammon,