\r\n\r\n
この楽しいプロジェクトでは、Arduino **buzzワイヤーゲームの使い方を学びます。必要なパーツの多くはスターターキットの中に入っています(スターターキットの中身は?)家の周りこのプロジェクトではArduinoを使用していますが、身近にあるほとんどのマイクロコントローラを使用できます(5ドルのマイクロコントローラの比較をチェックすると、そこから何らかのヒントが得られるでしょう)。
音楽も再生できるようになりました。
このプロジェクトを完成させるために必要なコアコンポーネントは以下の通りです。
Elenco TL-6 ワニ口リード 10本セット(14インチ) AMAZONで今すぐ購入
強化ビルドのオプションパーツは以下の通りです。
Arduinoのピン数が十分であれば、ほぼ全てのArduinoが動作可能です。
一見複雑そうに見えますが、実はかなりシンプルなプロジェクトです。まずは基本的なゲームから始めて、他の部品を追加して複雑さを増していく予定です。用意された部品次第で、いくらでも「選べる」のです。
コア機構は、ワイヤー形状とハンドル部のループで構成されています。プレイヤーは、2回のタッチをせずにループを誘導する必要があります。2回タッチすると回路が完成し、ブザーが鳴ります。もちろん、マイコンを使わないでこの回路を作ることも可能ですが、そんなことをして何が楽しいのでしょうか(モンティ・パイソンのフライング・サーカスのテーマ曲なんて聴けるわけがない)?
これは、プレイヤーが循環を指示しなければならない形です。ゲーム全体の基本ですから、ちゃんとやってくださいよ。私は、小さなドロップと大きなクライミングを選びました。金属製のハンガーを必要な形に曲げます。銅線でも銅管でも同じように使えますが、ハンガーが一番安上がりでしょう。
手袋をして、ペンチやハンマーを使わないと、完璧にできないかもしれません。余分な部分をボルトカッターで切り落とします。縦方向の支柱を2本残して、ベースを押し通す。念のため、カットした部分をヤスリで削っておくと安心です。最後に、熱収縮チューブ2本をカットし、以下のように端に配置します。
また、熱収縮チューブがない場合は、テープやストローでもかまいません。
ここで、コースの一端にケーブルを接続します。ここで、ハンダ付けするか、クロコダイルクリップを使うかの2択になります。クロコダイルクリップは簡単ですが、ハンダ付けはより確実で長期的に使用できる方法です。必ず最初にハンガーの表面をサンドペーパーで「バフ」して、フラックスをたっぷりと使ってください。(ハンダ付けをしたことがない方使い方はこちら)
次のステップでベースに開ける穴の大きさによっては、先にケーブルを取り付け穴に通しておく必要があります。
そのためには、エクササイズを使うのがとても効果的です。
そろそろベース作りが必要です。これは、ピッチを直立させるとともに、電子を固定する場所を提供するのに役立つ。私は松の木の縁取りを使いましたが、家にあるものなら何でもいいんですよ、段ボール箱でも。
3枚を「の」の字にカットする。3つのパーツをネジで固定するだけ。サイドピースが割れないように、先に下穴を開けておくのを忘れないようにしましょう。ネジに皿穴を開けるとよいでしょう(特に充填してから塗装する場合)。皿穴用ドリルビットを強くお勧めします。皿バサミやドリルがない場合は、径の大きなドリルで対応します。
コースの最後に座ることができるように、十分な間隔で2つの穴を開けます。下側に頭を埋め、接着の準備をします。
さて、いよいよ**ループ/コントローラの出番です。ハンガーの片方の端にある小さなパーツをねじって、小さな金属製のハンドルでループを作ります。切り口はヤスリで平らにし、必要に応じてテープや発泡スチロールで覆ってください。
このループがルートに触れると、回路が完成します(スイッチのようなもの)。この下にもう1本、前回のコースと全く同じようにハンダ付け(またはクロコダイルクリップを使用)してください。
実際のハンドル用に、ピンの小さな部分をカットします。このメタルリングは、***このハンドルになります。ピンがない場合は、コルクの四角い部分をサンディングベルトやサンダーで丸めます(サンドペーパーでも可能ですが、時間がかかります)。
このハンドルに穴を開け、金属製のリングとワイヤーを通すのに十分な大きさにする必要があります。
これは、厄介ですが、柱の運動として可能です。旋盤で完璧にできます。
はい、金属製の旋盤であることは十分承知しています(興味のある方は、1930年代のボーリュの時計用旋盤をご覧ください)。3Cだと思うのですが、詳しい方、ぜひ教えてください)。
また、ビロの中心で取り除くこともできます。
最後に、ケーブルとコイルをホットグルーでハンドルに固定します。ホットグルーは強力な(しかし永久的ではない)クランプになるので、これで完璧です。
ワイヤーレイヤー**をベースの穴に入れる。最初にループ/コントローラを追加することを忘れないでください。以下のようにベースの皿穴を埋めて、再度ホットボンドでベースを固定します。
回路図の完成形です。問題を複雑にする必要はありません。各パーツを分解して読んでみましょう。
まず,2つの圧電素子をデジタルピン10と11に接続する。極性は重要ではない。
圧電素子を2つ使う必要はありません。私がそうしているのは、配線が接触したときのブザー音が大きくなるからです。一端をデジタル端子に、もう一端をグランドに接続してください。
現在** 金属の層とハンドル。
繰り返しになりますが、この2本の線はどちらを巻いてもかまいません。この部分は、まさにボタンやスイッチのようなもので、ループがピッチに触れるとプレーヤーは回路を完成させることができます。抵抗が2本入っていることを確認してください。
抵抗で回路を接地し(プルダウン抵抗といいます)、回路が「浮かない」ようにします(これにより、Arduinoは回路の変化を検知することができるのです)。もう1つの抵抗でArduinoを保護し、2つの部品が接触するとデジタル端子に+5Vが流れます。この抵抗がない場合、デッドショートになります。運が良ければ、コンピュータが過大な電流を流し、USBソケットが切断されるかもしれません。
信号線(図の紫)をデジタルピン9に接続します。
次に、ボタンをデジタル端子2に接続します。
最後に、7セグメントLEDディスプレイを接続する。
このモデルはSeeed社のもので、TM1637を使用して4つのディスプレイを駆動するため、必要なデジタルピンは2つだけです。GNDをArduinoのグランドに、VCCをArduinoの+5Vに接続します。 D10をArduinoのデジタルピン13に、CLKをデジタルピン12に接続します。
このプロジェクトが正しく動作するためには、他に2つのファイルが必要です。
pitches.h.このファイルは、コメント名とそのピエゾ値を単純に対応させたものです。これにより、例えば「31」ではなく「NOTE_uc3」と簡単に表記できるようになり、曲の作成が非常に楽になりました。これはパブリックドメインであり、Arduinoのホームページで公開されています。というファイルを、指示に従って作成してください。
pitches.h(または、既存のスクリプトにコードを貼り付けてください)。
次に、ピエゾで音符やメロディーを演奏する方法が必要です。GithubのAnthonyDigirolamoによるこの記事には、必要なコードが含まれています。voidbuzz "と"}}"の間をすべてコピーして、メインファイルに貼り付けます。参考までに。
void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transiti*** //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i < numCycles; i++){ // for the calculated length of time... digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm delayMicroseconds(delayValue); // wait for the calculated delay value digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm delayMicroseconds(delayValue); // wait again for the calculated delay value }}最後のライブラリは7セグメント表示を制御するもので、使用しない場合はスキップすることができます。このライブラリはTM1637と呼ばれ、ドライバボードを作ったSeeed社が作成したものです。
Arduino IDEで、Sketch> Include Library> Manage Librariesに進みます。そうすれば、図書館の管理者の注意を引くことができます。数秒間アップデートするのを待ち、右上の検索ボックスで「TM1637」と検索してください。TM1637Display "ではなく、"TM1637 "が必要です。それらを選択し、「インストール」をクリックします。
このライブラリーの最後の仕事、それはまだ終わっていません。現在、ライブラリで表示できるのは、0~9の数字とA~Fの文字だけです。表示したいものがすべて網羅されている場合は、このステップは省略できます。そうでない場合は、コードの修正が必要です。無理しないでね。これは、Arduino IDEを使ってコードを書くことができれば、それほど難しいことではなく、実行可能です。
まず、Libraryフォルダを開きます。これはArduinoのフォルダの中にあります。
/Users/Joe/Documents/Arduino/LibrariesTM1637というフォルダーを編集する必要があります。
TM1637.cpp--という名前の別の拡張子は無視しても大丈夫です。
.h.このファイルをお気に入りのテキストエディタ(私の場合はSublime text 3)、メモ帳、またはArduino IDEで開いてください。
コードの3行目を次のように修正します。
static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,Fそれを受けて
static int8_t TubeTab[] = {/* defaults */0x3f, // 0 0x06, // 10x5b, // 20x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f, // 90x77, // A -- 100x7c, // b -- 110x39, // C -- 120x5e, // d -- 130x79, // E -- 140x71, // F -- 15/* additional */0x174, // h -- 16 0x176, // H -- 17 0x138, // L -- 18 0x15, // M -- 19 0x137, // n -- 20 0x73, // P -- 21 0x67, // q -- 22 0x131, // r -- 23 0x78, // t -- 24 0x240 // - 25};各要素の後に、これがどのような文字であるかを記述するコメントがあります。コメントの次の部分は、要素のインデックスです。
いよいよ実際のコードを書き始める。まず、先ほどの2つのライブラリをインクルードする。
#include <TM1637.h>#include <pitches.h>次に、表示オブジェクトを作成します。
TM1637 *_display = new TM1637(12, 13);この行は、Arduinoのピン12と13に7セグメントディスプレイを接続し、適切に設定するよう指示しています。
曲の保存先は
melodyと
tempo.音楽のすべての音符と音価を含んでいる。音楽を変えたい場合は、これらの配列を修正します(音価を貼り付けるような単純なものではありませんが、タイミングは音楽にとって非常に重要な部分です)。この
songStateこれにより、メロディーが一貫して演奏されるようになり、不規則に前後することがなくなります。
int songState = 0; int melody[] = { NOTE_F4,...}int tempo[] = { 8,...}配列の中身を削除したことに注意してください。以下のコードの全文をご覧ください。
このコードはノンブロッキングです。つまり、Arduinoは同時に複数のタスクを実行することができます。詳しくは、こちらのノートをご覧ください。タイマーはこのように設定されています。
unsigned long previousMillis1 = 0;c***t long interval1 = 1500;変数
previousMillis1これは後日更新され、現在時刻が格納されます。
interval1この変数には、コード実行間の待ち時間(この場合は1.5秒)が格納され、次のように定義されます。
c***tこれは、Arduinoがコードをさらに最適化できるように、一定で決して変化しないことを意味します。
内部
setup()まず、入力と出力を設定します。これは、Arduinoが各ピンに何が接続されているかを知るために行う必要があります。
pinMode(9, INPUT); // setup circuitpinMode(10, OUTPUT); // setup buzzer 1pinMode(11, OUTPUT); // setup buzzer 2pinMode(2, INPUT); // setup button次に、モニターの設定が必要です。
_display->set(5); // set brightness_display->point(false); // remove colon_display->init(); // start displayメソッド
set,
pointそして
init全てに含まれる
_displayオブジェクトを作成します。これらのアクセスにはドットではなくポインタ("->")を使用します。繰り返しになりますが、構文は気にしないでください(もっと学びたい方は、C++のポインターを調べてみてください)。
メインループには、チャレンジとフリープレイの2つのモードがあります。フリープレイは回数無制限でプレイできます。
showCountdownこのボタンを使ってタイマーをスタートさせたりストップさせたりします。現在、ゲームモードを変更するには、このボタン名を手動で編集するしかありません。
modeこのアクションを実行するために別のボタンを追加できるかどうかを確認し、コードを適切に修正してください。
この
buzzが付けた注釈と同じです。
sing.シングメソッドでは、1音1音を調べて演奏します。このメソッドは定期的に呼び出されますが、最後に演奏されてから十分な時間が経過した後に次の音を演奏します。曲が終わると、バース1(songState=14)にリセットされます。これをゼロにすると、曲が始まると同時に演奏が始まりますが、これを行う理由はイントロを飛ばすためです。イントロはArduinoの電源投入後に一度だけ流れ、それ以降は流れません。
この
showFreeと
showPlay方法は、ディスプレイに「FrEE」「PLAY」と書き込むだけ。なお、freeの "r "は小文字で、それ以外はすべて大文字である。これは、7セグメントディスプレイの限界のひとつです。アルファベットのすべての文字を表示することはできず、表示できる文字の中には大文字と小文字が混在しているものもある。
この
toggleFreePlayこの場合も、ノンブロッキングで行われます。
もう一つの便利な方法は
showNumberこれにより、次のようにディスプレイの中央2文字に数字が書き込まれます。
ディスプレイは賢いわけではありませんから、明示的に指示を出さないと、多数の桁を表示することはできません。この方法は、簡単なロジックで各文字に適切な数字を表示させるものです。
最終的に使用した方法は
showCountdown値が0の場合は、ビープ音が3回鳴り、時間が経過したことを知らせます。
以下、全コードを紹介します。
#include <TM1637.h> // include display library#include <pitches.h> // include pitchesTM1637 *_display = new TM1637(12, 13); // create display object, 12 = CLK (clock), 13 = D10 (data)// musicint songState = 0;int melody[] = { NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4, NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3, NOTE_AS3, NOTE_C4, NOTE_D4, 0, NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3, NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_AS3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4, NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, 0, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4, NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0};int tempo[] = { 8, 16, 8, 16, 8, 16, 8, 16, 16, 16, 16, 8, 16, 8, 3, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 16, 12, 17, 17, 17, 8, 12, 17, 17, 17, 8, 16, 8, 16, 8, 16, 8, 1 };// non blocking setup// free playunsigned long previousMillis1 = 0; // time words last changedc***t long interval1 = 1500; // interval between changing// musicunsigned long previousMillis2 = 0; // time last changedc***t long interval2 = 100; // interval between notesint displayStatus = 0; // keep track of what's displayedint mode = 0; // keep track of game mode -- change to 0 or 1 for different modesbool countdown = false;unsigned long previousMillis3 = 0; // time last changedc***t long interval3 = 1000; // interval between countdownint count = 20; // challenge mode timervoid setup() { // put your setup code here, to run once: pinMode(9, INPUT); // setup circuit pinMode(10, OUTPUT); // setup buzzer 1 pinMode(11, OUTPUT); // setup buzzer 2 pinMode(2, INPUT); // setup button _display->set(5); // set brightness _display->point(false); // remove colon _display->init(); // start display}void loop() { // put your main code here, to run repeatedly: if(mode == 0) { // challenge mode if(digitalRead(2) == HIGH) { delay(25); if(digitalRead(2) == HIGH) { countdown = true; // stop the countdown } else { countdown = false; // stop the countdown } } if(countdown) { showCountdown(); // advance countdown } } else { // free play toggleFreePlay(); } if(digitalRead(10) == HIGH) { delay(25); if(digitalRead(10) == HIGH) { while(digitalRead(10) == HIGH) { buzz(11, NOTE_B0, 1000/24); } } } else sing();}void showCountdown() { // countdown the time remaining unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis3 >= interval3) { previousMillis3 = currentMillis; --count; showNumber(count); if(count == 0) { // game over countdown = false; count = 20; // reset countdown // buzz 3 times buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); } }}void showNumber(int number) { // show numbers (maximum 99) on display _display->display(0, 25); // write - to segment 1 _display->display(3, 25); // write - to segment 4 // write number to middle of displayif(number == 10){ _display->display(1,1); _display->display(2,0);}else if(number > 9){ _display->display(1,1); int newVal = number - 10; _display->display(2, newVal);}else{ _display->display(1,0); _display->display(2,number);}}void toggleFreePlay() { // scroll between words without blocking unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis1 >= interval1) { previousMillis1 = currentMillis; if(displayStatus == 1) showPlay(); else showFree(); }}void showPlay() { // write "PLAY" to the display _display->display(0, 21); // write P to segment 1 _display->display(1, 18); // write L to segment 2 _display->display(2, 10); // write A to segment 3 _display->display(3, 4); // write Y to segment 4 displayStatus = 2;}void showFree() { // write "Free" to the display _display->display(0, 15); // write F to segment 1 _display->display(1, 23); // write r to segment 2 _display->display(2, 14); // write E to segment 3 _display->display(3, 14); // write E to segment 4 displayStatus = 1;}void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transiti*** //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i < numCycles; i++){ // for the calculated length of time... digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm delayMicroseconds(delayValue); // wait for the calculated delay value digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm delayMicroseconds(delayValue); // wait again for the calculated delay value }}void sing() { // play the song in a non blocking way unsigned long currentMillis = millis(); if (currentMillis - previousMillis2 >= interval2) { previousMillis2 = currentMillis; int noteDuration = 1000 / tempo[songState]; buzz(10, melody[songState], noteDuration); int pauseBetweenNotes = noteDuration; delay(pauseBetweenNotes); // stop the tone playing: buzz(10, 0, noteDuration); ++songState; // start song again if finished if(songState > 79) { songState = 14; // skip intro } }}このファイルを「buzzwire」という名前で保存し(ファイル gt; 名前を付けて保存)、自分の掲示板にアップロードします(ファイル > アップロード)。Arduinoのアップロードの仕方がよくわからない、コードが難しそうという方は、Arduinoビギナーズガイドをご覧ください。これであなたも、話題のゲームソフトを手に入れることができるはずです。
この記事を読んで、何かクールなものを作ったなら、ぜひ見てみたいですね。下のコメント欄で教えてください