Arduinoは、エレクトロニクスのバックグラウンドを持たない人々にとって、簡単にものを構築するための恩恵でした。これは素晴らしいプロトタイピングツールであるか、何かクールなものを試すためのものです。このプロジェクトでは、Arduinoを使用して小さくて楽しいピアノを作成します。このピアノは、8つのプッシュボタンとブザーだけでかなりプレーンです。Arduinoの tone() 関数を使用して、スピーカーにさまざまな種類のピアノの音を作成します。プロジェクトに録音機能を追加しました。これにより、曲を再生して録音し、必要に応じて繰り返し再生することができます。おもしろそうですね!では、構築しましょう。
必要な材料:
- Arduino Uno
- 16 * 2LCDディスプレイ
- ブザー
- トリマ10k
- SPDTスイッチ
- 押しボタン(8個)
- 抵抗器(10k、560R、1.5k、2.6k、3.9、5.6k、6.8k、8.2k、10k)
- ブレッドボード
- 接続線
回路図:
完全なArduinoピアノプロジェクトは、いくつかの接続ワイヤーを備えたブレッドボードの上に構築できます。プロジェクトのブレッドボードビューを示すフリッツを使用して作成された回路図を以下に示します。
回路図に従い、それに応じてワイヤを接続します。PCBモジュールで使用されるプッシュボタンとブザーですが、実際のハードウェアではスイッチとブザーのみを使用しています。同じタイプのピン配列があるため、それほど混乱することはありません。 。以下のハードウェアの画像を参照して接続することもできます。
左からの抵抗値は、10k、560R、1.5k、2.6k、3.9、5.6k、6.8k、8.2k、10kの順です。同じDPSTスイッチがない場合は、上の回路図に示されているような通常のトグルスイッチを使用できます。次に、プロジェクトの回路図を調べて、次の接続を行った理由を理解しましょう。
回路図と説明:
上に示した回路図の回路図を以下に示します。これもフリッツを使用して作成されました。
私たちが理解しなければならない主な接続の1つは、8つのプッシュボタンをアナログA0ピンを介してArduinoに接続した方法です。基本的に、8つの入力プッシュボタンに接続できる8つの入力ピンが必要ですが、このようなプロジェクトでは、後で使用するために必要になる可能性があるため、プッシュボタンだけにマイクロコントローラーの8ピンを使用することはできません。私たちの場合、インターフェースするLCDディスプレイがあります。
そのため、Arduinoのアナログピンを使用し、抵抗値を変化させて分圧器を形成して回路を完成させます。このように、各ボタンが押されると、異なるアナログ電圧がアナログピンに供給されます。2つの抵抗と2つの押しボタンのみのサンプル回路を以下に示します。
この場合、プッシュボタンが押されていないときにADCピンは+ 5Vを受け取ります。最初のボタンが押されると、分圧器は560R抵抗を介して完了し、2番目のボタンが押されると、分圧器は1.5を使用して競合します。 k抵抗。このように、ADCピンが受け取る電圧は分圧器の式に基づいて変化します。分圧器がどのように機能するか、およびADCピンが受け取る電圧の値を計算する方法について詳しく知りたい場合は、この分圧器計算機のページを使用できます。
これ以外のすべての接続は簡単で、LCDはピン8、9、10、11、12に接続されています。ブザーはピン7に接続され、SPDTスイッチはArduinoのピン6に接続されています。プロジェクト全体は、ラップトップのUSBポートから給電されます。DCジャックを介してArduinoを9Vまたは12V電源に接続することもでき、プロジェクトは引き続き同じように機能します。
を理解する
Arduinoには便利なtone()関数があり、ブザーを使用してさまざまな音を生成するために使用できるさまざまな周波数信号を生成するために使用できます。それでは、関数がどのように機能し、Arduinoでどのように使用できるかを理解しましょう。
その前に、ピエゾブザーがどのように機能するかを知っておく必要があります。私たちの学校でピエゾクリスタルについて学んだかもしれません。それは、機械的振動を電気に、またはその逆に変換するクリスタルに他なりません。ここでは、水晶が振動して音を出す可変電流(周波数)を適用します。したがって、ピエゾブザーにノイズを発生させるには、ピエゾ電気水晶を振動させる必要があります。ノイズのピッチとトーンは、水晶の振動速度によって異なります。したがって、トーンとピッチは、電流の周波数を変えることによって制御できます。
さて、Arduinoから可変周波数を取得するにはどうすればよいですか?これがトーン()機能の出番です。トーン()は特定のピンで特定の周波数を生成できます。必要に応じて、期間についても言及できます。トーン()の構文は次のとおりです。
構文tone(pin、frequency)tone(pin、frequency、duration)パラメーターpin:トーンを生成するピン周波数:ヘルツ単位のトーンの周波数– unsigned int duration:ミリ秒単位のトーンの持続時間(オプション1) – unsigned long
ピンの値は、任意のデジタルピンにすることができます。ここではピン番号8を使用しました。生成できる周波数は、Arduinoボードのタイマーのサイズによって異なります。UNOおよび他のほとんどの一般的なボードの場合、生成できる最小周波数は31Hzで、生成できる最大周波数は65535Hzです。しかし、私たち人間は2000Hzから5000Hzの間の周波数しか聞くことができません。
Arduinoでピアノの音を弾く:
さて、このトピックを始める前に、私は音符やピアノの初心者であることを明確にしておきます。この見出しの下に記載されていることが意味不明な場合はご容赦ください。
Arduinoのトーン機能を使用していくつかのサウンドを生成できることがわかりましたが、同じものを使用して特定のノートのトーンを再生するにはどうすればよいですか。私たちにとって幸運なことに、BrettHagmanによって書かれた「pitches.h」というライブラリがあります。このライブラリには、どの周波数がピアノのどの音符に相当するかに関するすべての情報が含まれています。このライブラリが実際に機能し、ピアノのほぼすべての音を演奏できることに驚きました。同じものを使用して、パイレーツオブカリビアン、クレイジーフロッグ、マリオ、さらにはタイタニックのピアノ音を演奏しました。おっと!ここでは少し話題から外れているので、それに興味がある場合は、Arduinoプロジェクトを使用してメロディーを演奏することを確認してください。また、そのプロジェクトの pitches.h ライブラリに関する詳細な説明もあります。
私たちのプロジェクトには8つのプッシュボタンしかないため、各ボタンで再生できる特定の音符は1つだけであり、合計で8つの音符しか再生できません。ピアノで最もよく使われる音符を選択しましたが、8つを選択したり、プッシュボタンを追加してプロジェクトを拡張したり、音符を追加したりすることもできます。
このプロジェクトで選択されたノートは、ボタン1〜8を使用して再生できるノートC4、D4、E4、F4、G4、A4、B4、およびC5です。
Arduinoのプログラミング:
十分な理論で、Arduinoのプログラミングの楽しい部分に取り掛かりましょう。完全なArduinoのプログラムは、あなたが熱心か、どのようにコードの動作を理解するために、さらに読めば、あなたがダウンしてジャンプすることができ、このページの末尾に与えられています。
Arduinoプログラムでは、ピンA0からアナログ電圧を読み取り、どのボタンが押されたかを予測して、そのボタンのそれぞれのトーンを再生する必要があります。これを行う際に、ユーザーがどのボタンを押したか、どのくらいの時間押したかを記録して、後でユーザーが再生したトーンを再現できるようにする必要があります。
ロジックパートに進む前に、どの8つのノートを演奏するかを宣言する必要があります。次に、音符のそれぞれの周波数が pitches.h ライブラリから取得され、次に示すように配列が形成されます。ここで、ノートC4を演奏する頻度は262などです。
int notes = {262、294、330、349、392、440、494、523}; // C4、D4、E4、F4、G4、A4、B4、の周波数を設定します
次に、LCDディスプレイがどのピンに接続されているかについて説明する必要があります。上記とまったく同じ回路図に従っている場合は、ここで何も変更する必要はありません。
const int rs = 8、en = 9、d4 = 10、d5 = 11、d6 = 12、d7 = 13; //ピンはLCDに接続されている 液晶LCD (RS、EN、D4、D5、D6、D7)を、
次に、 セットアップ 関数内で、デバッグ用にLCDモジュールとシリアルモニターを初期化します。また、物事が計画どおりに機能していることを確認するために、紹介メッセージを表示します。次に、 メイン ループ関数内に2つのwhileループがあります。
SPDTスイッチがより多くの録音に配置されている限り、1つのwhileループが実行されます。録音モードでは、ユーザーは必要なトーンを支払うことができ、同時に再生されているトーンも保存されます。したがって、whileループは次のようになります
while(digitalRead(6)== 0)//トグルスイッチが記録モードに設定されている場合{lcd.setCursor(0、0); lcd.print( "Recording.."); lcd.setCursor(0、1); Detect_button(); Play_tone(); }
お気づきかもしれませんが、whileループ内には2つの関数があります。最初の関数 Detect_button() は、ユーザーが押したボタンを見つけるために使用され、2番目の関数 Play_tone() は、それぞれのトーンを再生するために使用されます。この関数とは別に、 Detect_button() 関数はどのボタンが押されている かも 記録し、 Play_tone() 関数はボタンが押された時間を記録します。
Detect_button() 関数内で、ピンA0からアナログ電圧を読み取り、それをいくつかの事前定義された値と比較して、どのボタンが押されたかを調べます。値は、上記の分圧器計算機を使用するか、シリアルモニターを使用して、各ボタンで読み取られたアナログ値を確認することによって決定できます。
void Detect_button() { analogVal = analogRead(A0); //ピンA0のアナログ電圧 タグを読み取りますpev_button = button; //ユーザーが前に押したボタンを覚えている if(analogVal <550) button = 8; if(analogVal <500) ボタン= 7; if(analogVal <450) ボタン= 6; if(analogVal <400) ボタン= 5; if(analogVal <300) ボタン= 4; if(analogVal <250) ボタン= 3; if(analogVal <150) ボタン= 2; if(analogVal <100) ボタン= 1; if(analogVal> 1000) ボタン= 0; / **** Rcordで押されたボタン配列*** / if(button!= pev_button && pev_button!= 0) { recorded_button = pev_button; button_index ++; records_button = 0; button_index ++; } / **録画プログラムの終了** / }
前述のように、この関数内では、ボタンが押されたシーケンスも記録します。記録された値は、 recorded_button という名前の配列に格納さ れます。 最初に、新しいボタンが押されているかどうかを確認します。押されている場合は、ボタン0ではないかどうかも確認します。ボタン0は、ボタンが押されていないだけです。ifループ内では、変数button_indexで指定されたインデックスの場所に値を格納し、同じ場所に上書きされないように、このインデックス値も増やします。
/ **** Rcordに押圧ボタンアレイ*** / IF(!ボタン= pev_button && pev_button = 0) { recorded_button = pev_button。 button_index ++; records_button = 0; button_index ++; } / **録画プログラムの終了** /
Play_tone() 関数内で、複数の if 条件を使用して 、 押されたボタンのそれぞれのトーンを再生します。また、 recorded_time という名前の配列を使用します。この配列内で、ボタンが押された時間を保存します。操作は、 millis() 関数を使用して各ボタンが押された時間を決定し、変数のサイズを10で割るという点で、ボタンシーケンスの記録に似ています。ボタン0の場合、ユーザーは何かを押すと、同じ時間音が鳴りません。関数内の完全なコードを以下に示します。
void Play_tone() { / ****配列内の各ボタンが押される間の時間遅延を記録する*** / if(button!= pev_button) { lcd.clear(); //次にそれをクリーンアップします note_time =(millis()-start_time)/ 10; records_time = note_time; time_index ++; start_time = millis(); } / **録画プログラムの終了** / if(button == 0) { noTone(7); lcd.print( "0->一時停止.."); } if(button == 1) { tone(7、notes); lcd.print( "1-> NOTE_C4"); } if(button == 2) { tone(7、notes); lcd.print( "2-> NOTE_D4"); } if(button == 3) { トーン(7、ノート); lcd.print( "3-> NOTE_E4"); } if(button == 4) { tone(7、notes); lcd.print( "4-> NOTE_F4"); } if(button == 5) { tone(7、notes); lcd.print( "5-> NOTE_G4"); } if(button == 6) { tone(7、notes); lcd.print( "6-> NOTE_A4"); } if(button == 7) { tone(7、notes); lcd.print( "7-> NOTE_B4"); } if(button == 8) { tone(7、notes); lcd.print( "8-> NOTE_C5"); } }
最後に、録音後、ユーザーは録音されたトーンを再生するためにDPSTを他の方向に切り替える必要があります。これが行われると、プログラムは前の while ループから抜け出し、2番目のwhileループに入り、以前に録音された期間、押されたボタンのシーケンスでノートを演奏します。同じことを行うためのコードを以下に示します。
while(digitalRead(6)== 1)//トグルスイッチが再生モードに設定されている場合 { lcd.clear(); lcd.setCursor(0、0); lcd.print( "Now Playing.."); for(int i = 0; i <sizeof(recorded_button)/ 2; i ++) { delay((recorded_time)* 10); //次の曲を支払う前に待つ if(recorded_button == 0) noTone(7); //ユーザーのくぼみは、いずれかのボタンに触れ 、他の トーン(7、ノート- 1)]); //ユーザーがタッチしたボタンに対応するサウンドを再生します } } }
再生、録音、再生、繰り返し!:
示されている回路図に従ってハードウェアを作成し、コードをArduinoボードとその示されている時間にアップロードします。SPDTを録音モードに設定し、選択したトーンの再生を開始します。各ボタンを押すと、異なるトーンが生成されます。このモードでは、LCDに「 Recording…」 と表示され、2行目に、以下に示すように現在押されているノートの名前が表示されます。
トーンを再生したら、SPDTスイッチを反対側に切り替えると、LCDに「 NowPlaying..」 と表示され、再生したばかりのトーンの再生を開始します。トグルスイッチが下の写真のような位置にある限り、同じトーンが何度も再生されます。
プロジェクトの完全な動作は、以下のビデオで見つけることができます。あなたがプロジェクトを理解し、それを構築することを楽しんだことを願っています。この作成で問題が発生した場合は、コメントセクションに投稿するか、フォーラムを使用してプロジェクトの技術的なヘルプを入手してください。また、以下のデモビデオも忘れずにチェックしてください。