Arduinoで電子ピアノ

Arduinoで電子ピアノを作ってみました。

配線汚くて見づらいですが上から見た画像です。

今回はほぼ2オクターブの電子ピアノを作りました。少し見にくいですが、右端の緑の大きめのボタンを押すと周波数を変化させるようにして、1オクターブ音階をあげています。

動画

コード

boolean hightone = false;

void setup()
{
    for(int i=2; i<=9; i=i+1) {
        pinMode(i, INPUT);
        digitalWrite(i, HIGH);
    }
}

void loop()
{
 int t=0;

 if(digitalRead(2)==LOW) {
  if(hightone){
   t=1046;
  }else{
   t=523;
  }
 }
 if(digitalRead(3) == LOW) {
  if(hightone){
    t=1174;
  }else{
    t=587;
  }
 }
 if(digitalRead(4) == LOW) {
  if(hightone){
    t=1318;
  }else{
    t=659;
    } 
 }
 if(digitalRead(5) == LOW) {
  if(hightone){
    t=1396;
  }else{
    t=698;
  }
 }
 if(digitalRead(6) == LOW) {
  if(hightone){
    t=1567;
  }else{
    t=784;
  }
 }
 if(digitalRead(7) == LOW) {
  if(hightone){
    t=1760;
  }else{
    t=880;
  }
 }
 if(digitalRead(8) == LOW) {
  if(hightone){
   t=1975;
  }else{
    t=988;
  }
 }
 if(digitalRead(9) == LOW) {
  if(hightone){
    hightone = false;
  }else{
    hightone = true;
  }
  delay(100);
 }

 if (t!=0) {
  tone(10, t);
 } else {
  noTone(10);
 }
}

かるーく解説

実際に音を出しているのは最後のif分の中のtone関数です。

tone関数はtone(出力するピン, 音の高さ)を引数に持ちます詳しはリファレンスを読んでください

Arduino 日本語リファレンス

あとは各ボタンが押された際に音の高さである変数tの数値を変更しています。あとは、緑色のボタンが押された時にhightoneのフラグを立てて音のピッチを変更しています。音の高さについては

if(digitalRead(9) == LOW) {
  if(hightone){
    hightone = false;
  }else{
    hightone = true;
  }
  delay(100);
 }

if分の最後にあるdelay(100);ですが、こいつを入れておかないとボタンを押した際にものすごい早いスピードでtrueとfalseが切り替わってしまうためボタンを押したのにピッチが変更されない(falseの状態から何回も切り替わって結局falseに…)状態になるので入れています。