工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ボックス内のモンスター

コンポーネントと消耗品

木箱/箱
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
SainSmart4チャンネルリレーモジュール
× 1
ワイパーモーター
× 1
赤いLEDクリスマスライト(100)
× 1
スモークマシン
× 1
パワードアンプ/スピーカー
× 1

このプロジェクトについて

***バージョン4に更新***

最近、このプロジェクトのArduinoコードを書き直しました。変更の概要は次のとおりです。

  • メインループがステートマシンとして実装されるようになりました
  • すべてのタイミングは、イベント時間と現在の時間の評価に基づいています

-タイミングはフレームに依存しなくなりました

-メインループのdelay()の削除を許可しました

-ArduinoIDEに接続する際の「ポートビジー」の問題を解消します

  • 通常閉接続ではなく通常開接続を使用するようになったリレー ***リレー接続を更新します!!! ***
  • モーション検出LEDを追加
  • LEDをウェイクする準備ができました
  • を追加しました
  • 一時停止されたLEDを追加
  • アクショントリガースイッチを削除しました
  • Red Lights&Smokeに時間を追加する機能を追加しました

-これらの効果をリッドバウンサーよりも少し長く実行できるようにします

  • たくさんのコメントを追加しました

最新のコードはすべてここgithubにあります

ボックス内のモンスター

私はハロウィーンの小道具が大好きで、いくつかの素晴らしい箱の中のモンスターについて見て、読んだことがあります。 昨年ビルドし、自分でビルドすることにしました。アイデアは非常に単純です。ある種のコンテナが、逃げようとしている危険なモンスターを保持しているという錯覚を作り出します。錯覚は、動き、音、光、煙、そしてもちろん驚きの任意の組み合わせで作成できます。

箱の中身!?!?

大きくて怖いものを入れることができるように見えるほど大きな箱が必要です。また、箱が古く、よく磨耗していて、モンスターを寄せ付けないだけの強さであるように見える場合も、幻想を増します。最初はリサイクルショップやオンラインで何かを探しましたが、好きなものは決してなかったので、自分で作りました。それほど難しくはありませんでした。

Home Depotの6フィートのパインフェンスピケットを15個使用して、約3フィートx2.5フィートx2.5フィートのボックスを作成しました。私はすべてのボードをテーブルソーで長さにカットし、空気圧式18ゲージブラッド釘打機を使用してボックスを組み立てました。これはうまく機能しているように見えましたが、後で私は、それが行うすべての叩きと跳ね返りのために、ブラッドがボックスを一緒に保持するのに十分な強度がないことに気付きました。ボックスを強化するために、後で1インチの乾式壁ねじでねじ込みました(内側から外側に向かってねじ込みました)。

組み立てたら、紅茶、酢、スチールウールを使用したプロセスで木材を熟成させました。次に、オンラインで見つけた、および/または作成して印刷したステンシルとラベルで装飾しました。

<図>

Brainzzzzz !!!

小道具には、「睡眠」と「覚醒」の2つの動作状態があります。寝ている間、箱は比較的穏やかで、いびきをかいて軽いうなり声を出すだけです。トリックオアトリーターがモーションセンサーを作動させると、モンスターが目覚めます。モンスターが目覚めると、モンスターは咆哮し、煙を吸い、ふたを跳ね返し、箱の内側が赤く光ります。

この小道具の動作を調整するために、WaveShieldとリレーモジュールとともにArduinoUnoを使用しました。 WaveShieldには、眠っている音と轟音の小さなコレクションがロードされています。 PIRモーションセンサーがArduinoに入力を提供し、ボックスを「スリープ」モードと「アウェイク」モードの間で切り替えます。アウェイクモード中、Arduinoはリレーチャネルをアクティブにして、リッドモーター、赤いライト、煙発生器を実行します。 WaveShieldでサウンドを再生します。私が追加したもう1つの機能は、一時停止ボタンでした。これにより、年少の子供たちがやってくるときに、モンスターを一時的に沈黙させることができました。

<図>

それはAliiiiiiveです!

ふたリフターは、ふたをすばやく上下させて、モンスターが逃げようとしているように、ふたを強打したり跳ねたりさせる装置です。これを行うにはいくつかの方法がありますが、最も一般的なのは空気圧アクチュエータと回転カムのようです。電子制御の空気圧アクチュエータを使用すると、蓋の動きをはるかにランダムにすることができたと思いますが、回転カムを使用することにしました。これは、より簡単で最も安価なオプションのように思われたためです。

私は地元のスクラップヤードから中古の自動車用ワイパーモーターを15ドルで購入しました。ちょっと面白かったです。入ってモーターを頼んだ。カウンターの後ろの男は、私が「気にしない」と言ったとき、「何のメーカーとモデルの車か」と尋ねました。彼の頭は少し横に傾いていて、彼は私に少し横目を与えました。私が何をしているのかを説明した後、彼はそれを作りたかったのです:)

これらのモーターは、メーカー/モデルに関係なく、12ボルトで動作し、適度な速度で回転し、大きなトルクを持っています。完璧です。ノート。あなたがそれを手に入れるとき、それが古いワイヤーハーネスのいくつかを持っていることを確認してください、それはあなたがそれにあなたのワイヤーをつなぐことをはるかに簡単にするでしょう。また、クランクアームとオフセットポストがあることを確認してください。メインモーターポストが唯一の物理的な接続である場合、カムを操作する必要があります。

ボックス内のどこかにモーターを取り付けます。私は側壁の1つに私のものを置きました。それに接続された大きな回転カムがあることを忘れないでください、そしてそれはあなたが箱に入れるつもりであるすべてのアイテム、特にワイヤーから自由にそして離れて回転することができる必要があります。 YouTubeには、これらのモーターの操作に関する優れたチュートリアルがいくつかあります。

<図>

1/2合板から直径12インチのカムを切り取りました。まず、真円を切ります。私はそれをモーターに取り付け、これを使用してボックス内のモーターの必要な高さを決定しました。ふたを2インチほど持ち上げたかっただけです。このフィッティングを行った後、ジグソーを使用してカムに「歯」をランダムに切り込み、ランダムな幅と深さに保つように最善を尽くしました。

<図>

最後に、2つの金属製Lブラケット、1インチのナイロンスペーサー、およびキャリッジボルトを使用して、ふたの下側にローラーを取り付けました。ローラーはカムの真上に配置され、カムの歯に沿って移動します。

<図>

私はATX電源の12ボルトのレールを使用して、Arduinoによって制御されるリレーを介してモーターに電力を供給しました。はい、すべてを揃えるには、少し試行錯誤が必要です。ローラーを1〜2回再配置した後、3回OKです...すべてが整列し、計画どおりに蓋がバウンドし始めました!

ブレスオブファイア:煙と光

私は煙の効果のために安価な400ワットの煙発生器を使用しました。箱から出して、これは無線制御されました。 Arduinoで制御するために、レシーバーを開き、トリガーボタンパッドに2本のリード線をはんだ付けしました。これにより、Arduino制御のリレーチャネルに接続する回線が提供されました。それは私がいくつかのYouTubeビデオを見て学んだ単純なハックでした。また、ふたの真下から煙が出るように、古い掃除機のホースを追加しました。私は視覚効果が好きで、箱の中の電子機器の蒸気凝縮を減らすのに役立ちます。

ライトの場合、私は単純に軽量の延長コードを切断し、リレーチャネルを介して配線しました。これに接続された100個の赤いLEDライトのストリングは、Arduinoによってオンとオフを切り替えることができます。

<図> <図> <図>

外の声を使う

WaveShieldには、1/8インチのヘッドフォンジャックと出力があり、直接接続用の2つのI / Oピンもあります。 1/8インチのパッチコードを使用して、練習室から借りた30ワットのベースギターアンプに接続しました。 PCスピーカーを含め、任意の数の増幅スピーカーが機能します。しかし、しっかりとしたローエンドのものを使用することは間違いなくプラスです。

<図>

チェーンイットアップ

ハロウィーンの店でプラスチック製のチェーンを購入し、3Dプリントで南京錠をかけました。これらを木枠に巻き付けると、幻想の深みと感触が増します。

<図>

ハロウィーン!!!

木枠を庭に置き、モーションセンサーを近くの茂みに隠します。センサーを接続するために長いスピーカーワイヤーを使用して、誰かが木枠に近づいたときにモンスターが目を覚ますように配置を実験できるようにしました。

夕方が暗くなるにつれて、木枠の外側の細部がすべて見えにくくなっていることに気づきました。最終的に、私はそれをストロボ投光照明で照らし、その効果に非常に満足しました。

トリックオアトリーターが私道を歩いていると、うなる箱に気づきます。好奇心を持っている人もいれば、実際にそれを恐れている人もいます。彼らが近づき、怪物が生き返るにつれて、彼らは立ち上がって、拍手さえする人もいました。大ヒットでした。

機能強化

茂みの中にモーションセンサーを隠す方法を探すのに飽きたので、私道沿いまたは近くの茂みの下に配置できるプラスチック製のネズミの腹に人感センサーを熱接着しました。また、ボックスの背面にRJ11電話ジャックを取り付けて、50フィートの電話コードを使用してラットモーションセンサーを接続できるようにしました。これは、以前使用していた2本のスピーカーワイヤーよりもはるかに優れています。

<図> <図>

その新しいプレートにスイッチといくつかのインジケーターLEDも追加したことに気付くでしょう。スイッチは、電源を切らずにボックスのすべての機能を一時停止します。私の主なキルスイッチは内部の電源タップであり、アクセスするのが面倒です。さらに、これではこの外部スイッチの信号電圧(5v)のみを使用します。このスイッチは、ハロウィーンの夜に中を覗き見する若いトリックオアトリーターやその他の人のためにモンスターを止めるのに最適です。

ああ!私は効果のために箱の上にプラスチックのチェーンをドレープします、そしてそれらは時々扱いにくいことがあります。特に夕方に箱に入る必要がある場合。これを簡単にするために、私は結ばれた黒いスプリングカラビナをチェーンの端にジッパーで留めます。これにより、ボックスの下隅にねじ込んだアイレットの端をすばやく外す/引っ掛けることができます。あまりハイテクではありませんが、とても役に立ちます。

未来

将来追加したいことがいくつかあります。たぶんR / Cコントロールで、遠くからモンスターを一時停止したりトリガーしたりできます。また、リッドリフターに何らかのフィードバックを追加して、Arduinoがリッドが開いているか閉じているかを「知る」ことができるようにします。リフターはサイクルの高いポイントで数回停止し、次のウェイクサイクルまでボックスの「ガッツ」が見えるようになりました。最後に、外部照明/ストロボをArduinoに接続して、プログラムやR / Cフォブで制御できるようにする場合があります。

GitHubリポジトリ

最新のコードと配線図はGitHubにあります

コード

  • ボックススケッチのモンスター
  • MonsterSounds.h
  • MonsterSounds.ino
モンスターインボックススケッチ C / C ++
 / *使用中のウェーブシールドピン:2、3、4、5、10、11、12、13ピン13、12、11は常にSDカードによって使用されます(これらは高速SPIを備えた唯一のピンです)インターフェース)。次に、DACおよびSDカードとの通信に使用される他の5つのピンがありますが、それらは任意のarduinoピンに接続するように設定できます。ただし、デフォルトでは、ライブラリはピン10(SDカードの場合)とピン2、3、4、および5をDACに使用するように構成されています。これらのピンを変更するには、ライブラリを変更する必要があります。ピンは、arduinoピンではなく、「ハードウェア」ピン名(つまり、PORTDなど)によって参照されます。つまり、ピン6、7、8、9、および6つのアナログ入力ピン(デジタルI / Oピン14〜20とも呼ばれます)が使用可能です。https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino / faq * /#include "MonsterSounds.h" #define RESERVED_00 0 //シリアルRX用に予約済み#defineRESERVED_01 1 //シリアルTX用に予約済み#defineRESERVED_02 2 //ウェーブ用に予約済みShield#define RESERVED_03 3 // Wave Shield用に予約済み#defineRESERVED_04 4 // WaveShield用に予約済み#defineRESERVED_05 5 // WaveShield用に予約済み#defineFOG_MACHINE 6 // Arduinoのデジタルピンをリレーモジュールに接続#defineRED_LEDS 7 //デジタルピンをオンに接続Arduinoをリレーモジュールに接続#defineLID_BOUNCER 8 // Arduinoのデジタルピンをリレーモジュールに接続#defineRESERVED_09 9 // Arduinoのデジタルピンをリレーモジュールに接続#defineRESERVED_10 10 //ウェーブシールド用に予約済み#defineRESERVED_11 11 //用に予約済みWave Shield#define RESERVED_12 12 // Wave Shield#defineRESERVED_1用に予約済み3 13 //ウェーブシールド用に予約済み#definePIR_SENSOR A0 // PIR Input#define MOTION_LED A1 // LED:モーションが検出されると点灯(一時停止/スリープ/スリープ解除状態に関係なく)#define PAUSED_LED A2 // LED:システム時に点灯一時停止#defineREADY_LED A3 // LED:モンスターがREADY_TO_WAKE状態のときに点灯#define PAUSE_BUTTON A4 //一時停止スイッチ入力#defineDEBUG_BUTTON A5 //デバッグスイッチ入力//エフェクトタイマー設定-秒単位(編集)#define WAKE_DELAY 30 //「アウェイク」が発生するまでの最小時間(秒単位)#defineWAKE_DELAY_DEBUG 10 // DEGUBスイッチがオンになっているときのWAKE_DELAYオーバーライド#defineSLEEP_SOUND_DELAY 1 //次の「スリープ」サウンドの起動を試行するまでの待機秒数#define WAKE_MIN 3 //「アウェイク」時間の最小量(秒単位)#define WAKE_MAX 5 //「アウェイク」時間の最大量(秒単位)#define RED_LIGHT_EXTRA_TIME 1 //赤いライトを蓋より少し長く実行できるようにします。 ncer、必要に応じて#define SMOKE_EXTRA_TIME 2 //必要に応じて、煙をリッドバウンサーより少し長く実行できるようにします//エフェクトタイマー設定-ミリ秒単位(これらを編集しないでください)#define WAKE_DELAY_MILLIS WAKE_DELAY * 1000#define WAKE_DELAY_DEBUG_MILLIS WAKE_DE #1000は×1000の#1000#1000#はSMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds音を定義* RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIMEを定義* WAKE_MAX_MILLIS WAKE_MAXを定義SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000年の#define WAKE_MIN_MILLIS WAKE_MINを定義し、静的符号なしlong timeSinceLastSnore =0;静的符号なしlong wakeAllowedTimer =0;静的unsigned long型lidBounceTimer =0; static unsigned long lidBounceDuration =0; static unsigned long soapTimer =0; static unsigned long smokeDuration =0; static unsigned long redLightTimer =0; static unsigned long redLightDuration =0; enum States {STATE_INITIALIZE、//実行中のみsetup()および初めてloop()に入るSTATE_PAUSED、//すべてのサウンドとエフェクトをオフにするSTATE_SLEEPING、//エフェクトなし、スリープサウンド、アウェイクのトリガーを許可しないSTATE_READY_TO_WAKE、//エフェクトなし、スリープサウンド、アウェイクを許可するトリガーされるSTATE_AWAKE}; //エフェクトを起動し、モンスターを目覚めさせますsoundsStates state =STATE_INITIALIZE; void setup(){//シリアル通信を初期化します:Serial.begin(9600); //すべてのリレーピンを設定しますpinMode(LID_BOUNCER、OUTPUT); pinMode(RED_LEDS、OUTPUT); pinMode(FOG_MACHINE、OUTPUT); pinMode(PAUSED_LED、OUTPUT); pinMode(MOTION_LED、OUTPUT); pinMode(READY_LED、OUTPUT); //すべてのエフェクトを強制的にオフにしますstopAllEffects(); pinMode(PIR_SENSOR、INPUT); pinMode(PAUSE_BUTTON、INPUT_PULLUP); pinMode(DEBUG_BUTTON、INPUT_PULLUP); sound.initialize(); //モンスターサウンドsounds.playSystemReady(); delay(1000); Serial.println(); Serial.print( "*** System Ready ***"); Serial.println(); } / * *注:すべてのボタンはプルアップを使用しているため、LOWはボタンが押されていることを意味します*プルアップはスウィッチロジックが反転していることを意味することに注意してください。 ※開いているときはHIGH、押すとLOWになります。 * * PIRモーションセンサーはこのように動作しません。* // **メイン処理ループ*-モンスターのステートマシンを管理します* / void loop(){boolean pauseSwitchClosed =digitalRead(PAUSE_BUTTON)==LOW; boolean motionDetected =digitalRead(PIR_SENSOR)==HIGH; digitalWrite(MOTION_LED、digitalRead(PIR_SENSOR)); switch(state){case STATE_INITIALIZE:if(pauseSwitchClosed){goToPause(); } else {goToSleep(); } 壊す;ケースSTATE_PAUSED:if(!pauseSwitchClosed){goToSleep(); digitalWrite(PAUSED_LED、LOW); } else {digitalWrite(PAUSED_LED、HIGH); } 壊す; case STATE_SLEEPING:if(pauseSwitchClosed){goToPause(); } else if(isAllowedToWake()){goToReadyToWake(); } else {processSleeping(); } 壊す; case STATE_READY_TO_WAKE:if(pauseSwitchClosed){goToPause(); digitalWrite(READY_LED、LOW); } else if(motionDetected){goToAwake(); digitalWrite(READY_LED、LOW); } else {processSleeping(); } 壊す; case STATE_AWAKE:if(pauseSwitchClosed){goToPause(); } else if(processAwakeAnimation()){goToSleep(); } // processAwakeAnimation()は、すべてのアニメーションが完全に終了するとtrueを返します。デフォルト:Serial.println( "UNKNOWN STATE");壊す; //ここに到達することはありません}} / **一時停止状態への移行* / inline void goToPause(){Serial.println( "PAUSED");状態=STATE_PAUSED; stopAllEffects(); sound.stopAll();} / **スリープ状態への移行* / inline void goToSleep(){Serial.println( "GOING TO SLEEP");状態=STATE_SLEEPING; wakeAllowedTimer =millis();} / **覚醒準備完了状態への移行*これはスリープ状態の特殊なケースです* / inline void goToReadyToWake(){Serial.println( "READY TO WAKE");状態=STATE_READY_TO_WAKE; } / * *アウェイク状態への移行*-モンスターをウェイクアップし、エフェクトとサウンドを処理します* / inline void goToAwake(){Serial.println( "AWAKE");状態=STATE_AWAKE; wakeMonster();} / * * SLEEPアクティビティのサイクルを処理します*-スリープサウンドを実行します*-スリープタイマーを更新します* / inline void processSleeping(){if((millis()-timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS){sounds.playSnore( ); timeSinceLastSnore =millis(); }} / **この時点でモンスターが目を覚ますことができるかどうかを決定します。 *-デバッグスイッチを確認します。閉じている場合は、より短いWake Allowedタイマーを使用します*-モンスターは、覚醒する前に、事前定義された最小時間スリープする必要があります*-覚醒の準備ができたらLEDを点灯します* / inline boolean isAllowedToWake( ){boolean isDebug =digitalRead(DEBUG_BUTTON)==LOW; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if(isDebug){requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis()-wakeAllowedTimer)> requiredDelay; if(isAllowed){digitalWrite(READY_LED、HIGH); } return isAllowed;} / **ウェイクモンスター*アウェイクアニメーションを開始します*アウェイクサウンドを再生します**これを1回呼び出すと、AWAKE状態が開始されます。 * / void wakeMonster(){int activityDuration =random(WAKE_MIN_MILLIS、WAKE_MAX_MILLIS); //これは、モンスターがアクティブになる時間ですSerial.print( "wake duration:"); Serial.print(activityDuration); Serial.println( "ms"); bounceLid(activityDuration); flashRedLight(activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activateSmoke(activityDuration + SMOKE_EXTRA_TIME_MILLIS); sound.playRoar();} / * * AWAKEアニメーションの進行状況を管理します* AWAKE状態の間にこれをすべてのサイクルと呼びます。 *すべてのアニメーションが完了するとTRUEを返します* / boolean processAwakeAnimation(){printTimersToLog(); boolean done1 =false; boolean done2 =false; boolean done3 =false; if(millis()-lidBounceTimer> lidBounceDuration){bounceLid(0); done1 =true; } if(millis()-redLightTimer> redLightDuration){flashRedLight(0); done2 =true; } if(millis()-smokeTimer> smokeDuration){activateSmoke(0); done3 =true; } return done1 &&done2 &&done3;} / * *効果の管理:ボックスのふたをバウンスします* -dirationは、効果を実行するミリ秒数です* --duration 0は、効果を停止する必要があることを意味します* / inline void bounceLid(unsigned long duration){if(duration <=0){energizeRelay(LID_BOUNCER); lidBounceDuration =0; } else {//ふたのバウンスを開始de_energizeRelay(LID_BOUNCER); lidBounceTimer =millis(); lidBounceDuration =期間; }} / * *効果の管理:フラッシュレッドライト* -dirationは、エフェクトを実行するミリ秒数です* --duration 0は、エフェクトを停止する必要があることを意味します* / inline void flashRedLight(unsigned long duration){if(duration <=0){energizeRelay(RED_LEDS); redLightDuration =0; } else {//ライトの点滅を開始しますde_energizeRelay(RED_LEDS); redLightTimer =millis(); redLightDuration =期間; }} / * *効果の開始/停止:煙のアクティブ化* --dirationは、効果を実行する必要があるミリ秒数です* --duration 0は、効果を停止する必要があることを意味します* / inline void activateSmoke(unsigned long duration){// 'スモークボタンを押します//継続時間は、マシンがアクションに応答するのに必要な固定時間である必要があります//継続時間の後に停止するタイムアウトを設定しますif(duration <=0){energizeRelay(FOG_MACHINE); smokeDuration =0; } else {//ライトの点滅を開始しますde_energizeRelay(FOG_MACHINE); smokeTimer =millis(); smokeDuration =期間; }} / **すべてのエフェクトを停止します*-これによりモンスターが効果的にオフになります* / inline void stopAllEffects(){bounceLid(0); flashRedLight(0); activateSmoke(0);} / **アウェイクアニメーションタイマーを1秒に1回ログに出力します* / inline void printTimersToLog(){static unsigned long timeofLastTimerLog =0; if(millis()-timeofLastTimerLog> =1000){Serial.print( "lid:"); Serial.print((millis()-lidBounceTimer)> lidBounceDuration?0:(lidBounceDuration-(millis()-lidBounceTimer))); Serial.print( "ライト:"); Serial.print((millis()-redLightTimer)> redLightDuration?0:(redLightDuration-(millis()-redLightTimer))); Serial.print( "煙:"); Serial.println((millis()-smokeTimer)> smokeDuration?0:(smokeDuration-(millis()-smokeTimer))); timeofLastTimerLog =millis(); }} / * * Energize Relay *ノーマルオープン(NO)端子をOPENに設定します*ノーマルクローズはクローズになります* / inline void energizeRelay(int channel){digitalWrite(channel、HIGH); } / * *リレーの非通電*ノーマルオープン(NO)端子をクローズに設定します。 *通常はClosedはOPENになります* / inline void de_energizeRelay(int channel){digitalWrite(channel、LOW); } 
MonsterSounds.h C / C ++
モンスターサウンドライブラリのArduinoヘッダー
 / * ARDUINOピンに関する注意*ピン13、12、11は常にSDカードによって使用されます(これらは高速SPIインターフェイスを備えた唯一のピンです)。 *次に、DACおよびSDカードとの通信に使用される他の5つのピンがありますが、それらは任意のarduinoピンに接続するように設定できます。 *ただし、デフォルトでは、ライブラリはピン10(SDカードの場合)とピン2、3、4、および5をDACに使用するように構成されています。 *これらのピンを変更するには、ライブラリを変更する必要があります。ピンは、arduinoピンではなく、「ハードウェア」ピン名(つまり、PORTDなど)によって参照されます。 *つまり、ピン6、7、8、9、および6つのアナログ入力ピン(デジタルI / Oピン14〜20とも呼ばれます)が使用可能です。 * * / #include  #include  #include  #include  static const char roar0 [] ="ROAR0000.wav"; static const char roar1 [] ="ROAR0001.wav"; static const char roar2 [] ="ROAR0002.wav"; static const char * const roarSounds [] ={roar0、roar1、roar2}; static const char sleep0 [] ="SNORE000.wav"; static const char sleep1 [] ="SNORE001.wav"; static const char sleep2 [] ="SNORE002.wav"; static const char * const sleepSounds [] ={sleep0、sleep1、sleep2}; int previousRoarSound =-1;クラスMonsterSounds {プライベート:SdReaderカード; //このオブジェクトは、カードFatVolumevolの情報を保持します。 //これは、カードFatReaderルート上のパーティションの情報を保持します。 //これは、ボリュームのルートディレクトリFatReaderファイルの情報を保持します。 //このオブジェクトは、WaveHCウェーブというフレーズのWAVファイルを表します。 //単一のwaveオブジェクト-一度に1つのサウンドのみが再生されますvoidplayfile(char * name); public:void initialize(); void playSystemReady(); void playRoar(); void playSnore(); void stopAll();}; 
MonsterSounds.ino C / C ++
モンスターサウンドライブラリのArduinoコード
 / * ARDUINOピンに関する注意*ピン13、12、11は常にSDカードによって使用されます(これらは高速SPIインターフェイスを備えた唯一のピンです)。 *次に、DACおよびSDカードとの通信に使用される他の5つのピンがありますが、それらは任意のarduinoピンに接続するように設定できます。 *ただし、デフォルトでは、ライブラリはピン10(SDカードの場合)とピン2、3、4、および5をDACに使用するように構成されています。 *これらのピンを変更するには、ライブラリを変更する必要があります。ピンは、arduinoピンではなく、「ハードウェア」ピン名(つまり、PORTDなど)によって参照されます。 *つまり、ピン6、7、8、9、および6つのアナログ入力ピン(デジタルI / Oピン14〜20とも呼ばれます)が使用可能です。 * * / void MonsterSounds ::initialize(){Serial.println( "Initializing Sounds ..."); if(!card.init())Serial.println(F( "Cardinit。failed!")); if(!vol.init(card))Serial.println(F( "パーティションなし!")); if(!root.openRoot(vol))Serial.println(F( "ディレクトリを開けませんでした")); Serial.println(F( "ファイルが見つかりました:")); root.ls(); randomSeed(analogRead(0));} void MonsterSounds ::playSystemReady(){this-> playfile( "WELCOME0.WAV");} void MonsterSounds ::playRoar(){int index =random(3); // 0、1、2 while(index ==previousRoarSound){index =random(3); } previousRoarSound =インデックス; this-> playfile(roarSounds [index]);} void MonsterSounds ::playSnore(){if(!wave.isplaying)//いびきをかくことで既存のサウンドを中断しない{int index =random(3); // 0、1、2 this-> playfile(sleepSounds [index]); }} void MonsterSounds ::stopAll(){wave.stop(); //現在再生中のWAVを停止します} // --------------------------------------- ---------------------------- // playfile()// WAVファイルを開いて再生を開始します// ------ -------------------------------------------------- ----------- void MonsterSounds ::playfile(char * name){PgmPrint( "サウンドの再生:"); Serial.println(name); if(wave.isplaying){//すでに何かを再生しているので、やめてください! wave.stop(); //停止します} if(!file.open(root、name)){PgmPrintln( "ファイルが見つかりません");戻る; } if(!wave.create(file)){PgmPrintln( "無効なWAV");戻る; } //プレイする時間は大丈夫です! wave.play();} 

カスタムパーツとエンクロージャー

monstersounds_7vLZD3NU4t.zip

回路図


製造プロセス

  1. EEGマシン
  2. ジュースボックス
  3. 自動販売機
  4. 両替機
  5. ミシン
  6. パンスト
  7. 自宅でDIY宿題ライティングマシンを作る
  8. Giftduino-完璧なArduinoギフトボックス
  9. ARDUINOを使用した超音波浮揚機
  10. Arduino + ESPウェザーボックス
  11. 有限ステートマシンを使用したArduinoのデジタル時計