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

トーキングポータル2タレットガン

コンポーネントと消耗品

>
Arduino Nano R3
× 1

必要なツールとマシン

>
3Dプリンター(汎用)

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

ストーリー

今年のクリスマス、私はゲーム Portal 2 から機能するPortalタレットガンを設計および構築することにしました。 。私にとって、これは何かを構築する前に、まずFusion360でアセンブリ全体を適切にモデリングする演習でした。このデザインでは、Arduino Nano、MP3プレーヤーチップ、距離センサー、サーボ、LED、3Dプリントパーツを使用しています。

ここでの目標は、ゲームからの音声と発射をシミュレートするLEDを使用して、3つの「軸」で移動させることでした。

  • 前に誰かを感知した場合は、「翼」を開きます。理由だけで、スライダー付きのクランク機構を使用してください。
  • 開いた後も人がまだそこにいる場合は、落下するまで発射します。 LEDと機関銃の音。
  • その人がもういない場合は、スキャン検索ルーチンを少し実行します。
  • クローズアップして、誰かが来るまで寝ます。
  • ゲームのポータルタレットの音と声を使用します。

私はデザインにいくつかの自由を取り入れ、ゲームで見られるものとかなり同じになるように試みましたが、機能的で印刷可能です。オンラインで見つけたいくつかの基本的なスケッチを使って、モデリングと計画を始めました...

サウンドはmicroSDカードに保存されます。microSDカードには背面からアクセスできるため、後でサウンドを更新または変更できます。それは黒いインフィルストリップと一列に並んでおり、一度取り付けられると本質的に見えなくなります。このゴーラウンドで使用される18の個別の表現と音。

LIDARセンサー(飛行時間)は、長方形のプロファイルを持つチップ上にあります。このセンサーは、組み立てると正面からはほとんど見えなくなります。

ステップ1:Fusion360モデリング

デザインはオンラインで見つけたスケッチから始まりました。これらの画像をキャンバスとして使用して、3つのビューの輪郭をスケッチし始めました。次に、それらを3Dに押し出し、一般的な形状をシェル化してカットします。すべての電子機器は、私が理にかなっていると思った場所に挿入および配置されたコンポーネントとしてFusionに組み込まれていました。運転パラメータは次のとおりです。

  • Arduino Nanoは、完全に組み立てられたら更新するためにコネクタにアクセスできる必要がありました
  • MicroSDカードは同じ方法でアクセスできる必要があり、インストールすると理想的には見えなくなります
  • 飛行時間センサーも非表示にする必要があります
  • 背面の電源用の2.1mm電気コネクタ
  • 印刷されたパーツはできるだけ大きくします(小さなピースは多くありません)
  • サポートなしで印刷

基本形状に部品(ナノ、その他のチップ、サーボ)を追加した後、必要に応じて移動・配置し、シェル内で支持構造を構築しました。

翼開放機構はクランクとスライド機構でした。どうして?クランク機構を使いたかったので、そういうわけで!これはいくつかの複雑さを追加しましたが、それはまた利点がありました。ジオメトリが決定されると、操作の再現性が確保され、最小および最大の制限がほぼ保証されます。

モデル全体が構築され、それが機能し、構築(印刷)および組み立てが可能であると確信したら、先に進んでパーツを印刷し、プロトタイプを作成しました。それがうまくいったら、私はモデルに戻り、外観と組み立て性を改善するためにいくつかの調整を行いました(それは言葉ですか?)。このモデルは、これらの変更から生まれたものです。

箱型の形は実際には多くないので、これはかなり負担がかかりました。また、一度まとめると微調整するための実際のアクセスがなく、かなりしっかりと閉じます。他のコンポーネント内に埋め込まれたコンポーネントを使用するなど、このプロジェクトについてかなりのことを学びました。これにより、サブアセンブリの操作と維持がリンクされ、すばやくアクセスできるようになりました。結局、努力する価値がありました!

ステップ2:3Dプリントパーツ

<図>

ポータルタレットv4.zipが更新され、最新のタレットを構築するために必要なすべての印刷パーツが含まれている必要があります。

---新しい「リアテストレッグ」。オリジナルには当てはまりませんが、背面にあり、まっすぐなミニUSBコネクタをまっすぐに使用できます。 ---

これらは、すべてのパーツにPLAを使用して、PrusaMk2に印刷されました。印刷の向きはかなりはっきりしているはずです。本体はサポートなしで垂直位置に印刷されました。ブリッジしなければならない側面には大きなギャップがありますが、バンプを除いて、かなり標準的な設定で大きな問題は実際にはありませんでした。良好なフィラメントといくつかの良好な印刷設定により、前面と背面の隆起を実質的に取り除くことができます。 0.2mmがスライサーでうまく機能し、まともな結果が得られることがわかりました。インフィルストリップの近くのボディに、より大きな開口部が現れ始めました。

チャネルと突起の設計は45度の面取りで行われたため、「空間にぶら下がる」要素は最小限に抑えられます。

アセンブリを組み立てるために行う必要のあるクリーンアップはほとんどありませんでした。チャネルにスライドするインフィルストリップは、幅が狭くなり、厚みが一定になり、非常に簡単になりました。これらの印刷物(端に印刷)を使用する代わりに、細くて黒い素材を短冊状にカットすることもできると思います。

フィネスが必要な領域の1つは、ピッチフレームのスライダーピンです。 1/8 "のドリルビットと一部の潤滑油で追跡されたボアホールのまっすぐなピン(釘)は大いに役立ちます。

Lens%2Bv3b.stl Body-RHS%2Bv4.stl 本文-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl wings%2Bv6.zip Arduino%2BBase%2Bw%2BRadio.stl Portal%2BTurret%2Bv4.zip

ステップ3:コンポーネント

V4(赤い砲塔)はブリッジが小さいため、v4ウィングとピッチフレームが必要です。

v6 あります an オプション それ 許可 異なる カラー「銃」。 私は個人的にこのようなものを作ったわけではありませんが、うまくいくはずです。

モデルが完成し、プロトタイプに満足したら、図のようにプラスチックコンポーネントを使用してrev2を印刷しました。ここにあるものはすべてPLAで、黒とデザインカラー(この場合は青)、中央の「レンズ」またはレーザーアイ用の半透明のPLAが少しあります。

この写真は、配線を除いて、コンポーネントをかなりよく捉えています。

ステップ4:電子機器

ビルドは次のコンポーネントを使用します:

  • Arduino Nano(1)
  • DFPlayer Mini MP3プレーヤー(またはMP3-TF-16P)(1)
  • VL53L0X飛行時間測定センサー(1)
  • 汎用SG90マイクロサーボ(3)
  • 5mm赤色LED(5)
  • LED用220オーム抵抗器(5)
  • 1kOhm抵抗(1)
  • 4cmスピーカー、4オーム、3ワット(1)
  • 2.1mm電源コネクタ(1)
  • 3 "長いフレーミング釘(4)
  • M2 x 6ネジ(8)
  • M2.5 x 8ネジ(2)
  • M3 x 8ネジ(4)
  • M3 x 12ネジ(4)
  • M3 x 16ネジ(2)
  • シュリンクラップ
  • 小さなタイラップ

すべてのコンポーネントは、Arduino、Amazon、Banggoodなどのソースから簡単に入手できます。

ネジは品揃えキットから供給されました。それ以外の方法でそれらを取得するのはお尻の痛みです...

ステップ5:機械的組み立て

<図> <図> <図> <図> <図> <図>

機械的な組み立てのほとんどは合理的です。印刷されたパーツは、必要に応じて大きな穴をタップして印刷されるため、最終的な組み立ての前にネジですばやく追跡すると、ネジ部品の組み立てが非常に簡単になります。

ArduinoとMP3チップは、ハードウェアなしでクレードルにスナップします。 VL53LOXは、留め具なしでフロントシェルに滑り込みます。最初に試着し、配線したら取り外して取り付けます。

スライダーアセンブリは、スライダーレールとして4つのフレーミングネイルを使用します。直径は約1/8 "で、ヘッドはクリップされています。これらは、電動フレーミング釘打機で使用されるDeWaltフレーミング釘のストリップから取られました。言うまでもなく、滑らかな釘は必須です。

図のようにサーボが取り付けられます。オリエンテーションは重要です。ピッチサーボとピボットサーボは、それらの部品に取り付けるときに「中心」になります。クランクは、開位置で正面から見て反時計回りに回転して閉じるように取り付けられています。開位置はロッドとクランクを一直線に並べ、ロックするまでさらに10度回転させます。

レッグアセンブリは最も簡単な部品です。 2〜2.5 mmのネジ、各脚の肘にレッグキャップがはめ込まれています。レッグプレートの上部からはみ出さないように留め具を使用してください。そうすれば、回転範囲を微調整しても、ピボットボディはバインドされません。

印刷部品へのすべてのサーボ接続は、サーボに付属している短い白いクランクを使用して行われます。これらのクランクは、印刷された部品に押し込むだけです。各サーボに接続されている部分にスプライン穴を印刷してみましたが、限られた再現性のある成功でした。サーボに付属のクランクを使用すると、はるかに簡単になります。

クランクアセンブリは、より長い2.5mmネジを使用します。クランクロッドは、クランクの半分の間で圧迫されるべきではありません。実際、Crank2パーツなしで短いネジを使用してみることができます。それもうまくいくはずです(翼が自由にスライドする場合、ここでは感知できるほどのトルクがないことを願っています)。

スピーカーは、スピーカーをキャプチャするサーボマウント(2個)によってキャプチャされます。これらの「脚」の間にスピーカーを配置し、ピッチサーボに固定して所定の位置に保持します。次に、このサーボをピッチ(スライダー)アセンブリに接続し、続いてロッド付きのクランクアセンブリに接続しました。これらはすべて、4本の小さなネジでLHS本体に取り付ける前に組み立てられます。

ArduinoとMP3プレーヤーを一時的に配置してメインガットをインストールすると、楽しみが始まります-配線!

ステップ6:配線

<図> <図> <図>

V5-ラジオオプション(赤い砲塔の写真)。これには、nRF24L01無線チップが含まれます。すべての接続に対応するために、Arduinoのピン配線を完全に変更します。詳細は後日...

最終的なパッケージはタイトなので、ここでワイヤーの長さを計算するのに時間を費やす価値は十分にあります。私が最終的に得たほとんどの相互接続ワイヤは、3 "-4"の間でした。

LEDは、220オームの抵抗器で直接配線され、その後、シュリンクラップ、配線のねじれが続き、テスト後に脇に置きます。ここでは、いくつかの横になっているライトゲージ配線(CAT5タイプの通信配線)を使用し、目に見える配線が邪魔にならないようにしました。

メカニカルビットはシェルにモックフィットされ、ワイヤールーティングが計算され、次にワイヤーの切断と準備が行われます。

何かを台無しにしてギアを外した場合にサーボを接続して交換できるように、サーボコネクタを作成しました。これは、私の最初のプロトタイプで混乱した後、間違いなく役に立ちました。

配線の大部分に満足したら、LEDは最後にはんだ付けされました。次に、ワイヤードアセンブリをシェルの半分に慎重に詰め込みます。最後のステップは、電源コネクタがすべて内部に入ったら、電源コネクタを電源線にはんだ付けすることです。

-重要な注意:Nanoの後ろに詰められた配線がリセットボタンを押していないことを確認してください!!これは明らかに問題を引き起こし、ユニットが正しく動作するのを妨げます。 -

この時点ですべての配線は完了ですが、最終的な組み立ての前に、コードをNanoにアップロードして電源を入れ、LED、サーボ、MP3プレーヤーがすべて設計どおりに機能することを確認することが重要です。その後、残りのメカニカルビットをまとめます。

<図> <図>

ステップ7:Arduinoコード

更新されたコード!それをクリーンアップし、いくつかの調整を行いました。

添付ファイルは、ビデオに示されているように、ユニットを駆動するために私が思いついたものです。タレットのキャラクターと動作を変更するために微調整を続けます。ここにはたくさんのオプションがあります。

必要に応じて呼び出すサブルーチンを使用してコードを構造化しました。それは本体をきれいに保ち、私がさまざまな特性で遊んでいたときにかなり役に立ちました。さまざまな動作のためにコードを操作するのに役立ちました。

また、事前に多くの変数を使用して、駐車位置や最小範囲と最大範囲などを微調整して調整するのに役立ちました。

コードでDFMiniMP3ライブラリを使用しました。 DFRobotのような他のライブラリを試しましたが、問題があったので、このライブラリに戻りました。それは私がそれを機能させるために「静的なボイド」部分を維持しなければならなかったことを意味しました。これらは操作には必要ありませんが、私はマスターコーダーではありません。 VL53LOXライブラリと同じくらいシンプルできちんとした別のライブラリについて聞いてみたいと思います。これを行うためのより良い方法を見つけたら、私に知らせてください!

サウンドに関しては、SDカードに「mp3」という名前のフォルダをファイル名0001.mp3、0002.mp3などで配置することで、実装を簡単に行うことができます。最初の4桁はこの形式である必要があります。ただし、特定のサウンドを識別するために、その後に任意のサフィックスを追加できます。例については、https://www.dfrobot.com/blog-277.htmlを参照してください。フォルダで使用されているファイル名の写真を含めました。番号は、コード内の呼び出しに対応しています。

ポータルタレットのウィキペディアページから取得したサウンドファイルが鳴ります。コードは、物事が古くなるのを防ぐために、ランダムなサウンドファイル(2つのうちの1つ、または3つのサウンド)を示しています。

ステップ8:最終的なボディアセンブリ

この部分は、黒いインフィルストリップがあるため、少し注意が必要です。最終的なアセンブリのスケールは、ストリップと受け溝が小さいように十分に小さいです。これには、反対側を置く前に、ストリップがほとんど抵抗なくフィットすることを確認するために、ポインターまたは他の小さな削り取り器具でチャネルを追跡する必要がありました。

ワイヤーをきちんと結び、必要に応じてタイラッピングすると、これがはるかに簡単になります。

私は今、これらのいくつかをまとめましたが、最初に2つの半分を組み合わせてから、インフィルストリップを挿入する方が簡単です。インフィルストリップが落ちないようにする「棚」で片側を半分に挿入し、軽くこじ開けて静かに押し込みます。今はそれほど悪くはありません。

これは難しい部分の1つでした。いつかこのアセンブリを再考するかもしれませんが、完成したときの外観は気に入っており、かなり堅牢です。

ステップ9:ウィングアセンブリ

<図> <図> <図> <図>

ボディが一緒になり、翼のLEDが突き出たので、翼を準備して組み立てます。

スライダーの穴を1/8 "のドリルビットで追いかけ、掃除する必要があります。ボルトカッター、バイスグリップ、弓のこ、またはお気に入りの釘切削工具を使用して、頭を釘から切り取ります。スライダーピン(切り取った釘) )は、各ウィングピースに圧入することでウィングに取り付けられます。この作業を行うには、真っ直ぐでバリのない滑らかな釘が重要です。クランクロッドを接続して実行する前に、ウィングのスライダーと穴に注油してテストする必要があります。グラファイト、または他のPLAに適した潤滑剤をお勧めします。個人用潤滑剤の小さなチューブが非常にうまく機能し、安価であることがわかりました。それは本当に滑らかです。また、パートナーまたは親が入ってきて正確に何を尋ねるときに、いくつかの「splainin」が必要です。あなたはそれをワークベンチで必要とします!!

まず、どの翼の部分がどこに行くのかを理解し、最初にその部分をスライドさせてみてください。次に、ピンを取り付けたら上半分と下半分を合わせ、潤滑剤を塗布し(これには綿棒が適しています)、翼がしっかりとスライドすることを確認します。これは難しい場合がありますが、翼が楽にスライドすることを確認せずに、バインドせずに、イライラする時間になります。私を信じて...

翼がうまくいったら、翼を所定の位置にスライドさせ、コネクティングロッドを翼の穴の上に配置し、1本のネジで組み立てるだけです。次に、LEDが銃の穴に挿入され、ワイヤーが翼に押し込まれ、準備が整います。すべてがテストされたら、ホットグルーを使用して所定の位置に固定することもできます。

ステップ10:友達を怖がらせてショックを与える!!

この設計の最後の小さな注意点は、角度の付いたプラグは、旋回時に後脚に干渉しないため、優れたアイデアであるということです。改訂されたリアレッグ(v3)は、もう少し余裕を持たせるために引き伸ばされています。

構築して接続すると(5VまたはNanoに適しています)、プログラムされた距離内で誰かが検出されるまで静かに座り、その後、生き返り、そのドメインに入る人を殺します!!

1つ(または複数)を構築し、新しい機能や概念を思いついた場合はお知らせください!

コード

  • ポータルタレットwラジオ(RED)
ポータルタレットwラジオ(赤) C / C ++
タレットに使用されるコード。これには、別のページで紹介されているマスタータレットコントロールによる制御を可能にするコードが含まれます。
さまざまなフレーバーを微調整する必要があります。
 /// *ポータルタレット-ラジオ付きオプション!! * ChrisNowak- 2019年2月* https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 **これコードには、Cara Mia Operaを実行するために必要なすべての機能が含まれています。*チャット時間と手動モードは、Maseter Turret Control(MTC)によって制御されます。 * MTCは、別のビルドで機能する別個のコントローラーです。タレット*は、MTCなしでこのコードを使用して自律的に動作します。 * *コードは3つのタレットで動作するように構築されていますが、それぞれが独立して動作します。 *多くのデバッグコードが残っています。必要に応じて使用またはクリーンアップしてください。ほとんどがデバッグされていますが、*完全ではありません。あなたが支払った価格を考えると、私はそれで大丈夫だと思います!;)* =================RED ====================* /#include  #include  #include "Arduino.h" #include  #include  #include  #include  #include # include  class Mp3Notify {public:static void OnError(uint8_t errorCode){// Serial.println();を意味するコードについてはDfMp3_Errorを参照してください。 Serial.print( "Comエラー"); Serial.println(errorCode); } static void OnPlayFinished(uint8_t globalTrack){Serial.println(); Serial.print( "#の再生が終了しました"); Serial.println(globalTrack); } static void OnCardOnline(uint8_t code){Serial.println(); Serial.print( "カードオンライン"); Serial.println(コード); } static void OnCardInserted(uint8_t code){Serial.println(); Serial.print( "カードが挿入されました"); Serial.println(コード); } static void OnCardRemoved(uint8_t code){Serial.println(); Serial.print( "カードが取り外されました"); Serial.println(コード); }};サーボservo_pivot;サーボservo_wings;サーボservo_pitch; VL53L0Xセンサー; //サウンドカードのセットアップSoftwareSerialsecondarySerial(4、2); // RX、TXDFMiniMp3  mp3(secondarySerial); // radioRF24 radio(10、9);のセットアップ// nRF24L01(CE、CSN)RF24Network network(radio); //ネットワークに無線を含めますconstuint64_t this_node =01; //このタレット-赤-オクタル形式(04,031など)const uint64_t WHT =02; //タレット02-Whiteconstuint64_t BLU =03; //タレット03-Blueconstuint64_t MTC =00; //マスタータレットコントロールunsignedlong previousMillis1 =0; unsigned long previousMillis2 =0; unsigned long previousMillis3 =0; byte LED_LH_up =A1; byte LED_LH_down =A2; byte LED_CENTRE =A3; byte LED_RH_up =7; byte LED_RH_down =8; byte PIVOT =6; //ホワイトバイトWINGS =3; // yellowbyte PITCH =5; // bluebyte parkPIVOT =96; //小さい数値はトップバイトから見たCWを回転しますposPIVOT =96; byte maxPIVOT =116; byte minPIVOT =76; byte WINGclose =165; byte WINGopen =10; byte WINGpos =160; byte parkPITCH =86; byte posPITCH =86;バイトmaxPITCH =96;バイトminPITCH =75;バイトpos =90;バイトパルス=20;バイトpitchCW =1;バイトpivotCW =1;バイトrandomWake;バイトrandomOpen;バイトrandomFalse;バイトrandomStart;バイトrandomDisengage; int triggerDistance =300;バイトbuttonStatus;バイトbusyRed =1;バイトrestModeWhite;バイトgoState; int x; inty;バイトpb1State; // Firebyte pb2State; //ランダムコメントと言うbytepb3State; byte randomPic; //マスタータレットコントロール(MTC)からのペイロード// intペイロード[] ={0、1、2、3、4、5}; // intペイロード[] ={x 、y、pb1State、pb2State、pb3State、goState}; intペイロード[6]; / *これは「チャット時間」の「会話」マップです。 * 0-99 =レッドタレットのことわざ* 100-199 =ホワイトタレットのことわざ* 200-299 =ブルータレットのことわざ*すべてのSDカードのファイルは0-100として保存されます。 *ここのファイル番号に白の場合は100、青の場合は200を追加します。 *ファイル204はBLUEタレット、ファイル番号0004になります。* / int chatSayings [] ={0、// i =0で一時停止を開始し、その後に「ラウンド」が続きます... 204、164、25、// 1 205、 127、76、// 2 208、162、65、// 3 143、230、23、// 4 130、41、225、// 5 153、31、133、// 6 234、49、155、/ / 7 229、175、74、// 8 231、58、226、// 9 161、223、59、// 10 227、68、236、// 11 136、50、224、// 12 34、160 、78、// 13 222、42 //終了}; / *これは赤と白の砲塔のタイミングマップです。彼らはことわざを共有しています。 *これらのタイミングは、ミリ秒単位で*個々のことわざを再生するために必要な時間に対応します。 *必要に応じて上記のことわざを変更しますが、これらのタイミングは変更しないでください。 *たとえば、i =2は、chatSayings [2]ファイルを再生するのに0.8秒かかります(NormalTimings [2])*。 * / int NormalTimings [] ={1000、// i =0で一時停止を開始し、続いて「ラウンド」... 2600、800、2800、900、1700、1600、1300、2500、1400、1900、// 1 --101600、2300、800、3000、300、100、200、0、0、300、// 11-20298000、1300、2600、1300、1400、2100、1900、1600、800、1700、// 21-3011100 、1000、1000、2100、1500、1300、1100、800、1200、1000、// 31-402200、1700、1300、1400、1500、1000、2000、500、2700、9000、// 41-501100、1200 、900、2400、1200、1100、2100、2000、2500、1700、// 51-601100、1000、1100、500、1900、0、1300、2100、1700、900、// 61-701100、800、1100 、1700、1100、1100、1500、1500、500、900、// 71-802100 // 81}; / *これはBLUEタレットのタイミングマップです。 *これらのタイミングは、*個々のことわざを再生するのに必要な時間(秒単位)に対応しています。 *たとえば、i =2は、chatSayings [2]ファイルを再生するのに0.9秒かかります(DefectiveTimings [2])*。 * / int DefectiveTimings [] ={1000、// i =0で一時停止を開始し、続いて「ラウンド」... 1700、900、2000、600、1100、1800、1900、3000、1500、800、// 1 --102100、800、1900、900、3200、2700、0、0、0、2000、// 11 --204400、800、3200、900、1400、2000、2100、1200、1300、1000、// 21-301100 、1400、2100、1000、1600、1000、1200 // 31-40}; /////////////////////////////// //////////////////////////////////// // =======================セットアップ=================================///// ////////////////////////////////////////////////// ////////////// void setup(){secondarySerial.begin(9600); // Serial.begin(9600); // mp3.begin(); mp3.setVolume(22); Wire.begin(); SPI.begin(); //無線設定radio.begin(); radio.setPALevel(RF24_PA_LOW); //無線を低電力に設定します。すべて互いに近くにありますradio.setDataRate(RF24_2MBPS); //これは複数の無線で最適に機能することがわかりましたnetwork.begin(70、this_node); //(チャネル、ノードアドレス)sensor_read(); pinMode(LED_LH_up、OUTPUT); pinMode(LED_LH_down、OUTPUT); pinMode(LED_CENTRE、OUTPUT); pinMode(LED_RH_up、OUTPUT); pinMode(LED_RH_down、OUTPUT); digitalWrite(LED_CENTRE、HIGH); activate_servos(); Servo_wings.write(WINGopen); //翼を開きますservo_pivot.write(parkPIVOT); //ピボットをパークservo_pitch.write(parkPITCH); //パークピッチrandomWake =random(1、3); mp3.playMp3FolderTrack(1); //ウェイクアップコメントdelay(2000);を再生しますServo_wings.write(WINGclose); //翼を閉じるdelay(1500); digitalWrite(LED_CENTRE、LOW); turn_off_servos(); busyRed =0;} ///////////////////////////////////////////// //////////////////////// =======================メインループ=============================////////////////////// /////////////////////////////////////////////// void loop( ){while(sensor.readRangeSingleMillimeters()> triggerDistance){//センサーの前には何もありません。ReadNet();は何もしません。 WriteNet(); output_sensor(); if(payload [5] ==1){// MTCで使用される条件。タレットはMTC遅延なしで自動的に動作します(500)。 WriteNet(); Cara_Mia(); //オペラタイム!! } else if(payload [5] ==2){delay(500); WriteNet(); Chatty_time(); //おしゃべりな時間!!} ReadNet(); } else if(payload [5] ==3){delay(500); WriteNet();手動制御 (); //手動制御}} if(sensor.readRangeSingleMillimeters() triggerDistance){//開いて人がfalseActivate(); //「どこに行きましたか?」と言いますコメントとクローズアップの遅延(2000); scanArea(); //エリアのスキャンを実行します} else {//誰かが間違いなくそこにいます-直火!!従事();遅延(2400); for(int j =0; j <=2; j ++){if(sensor.readRangeSingleMillimeters() =maxPIVOT)pivotCW =0; if(posPIVOT <=minPIVOT)pivotCW =1; if(posPITCH> =maxPITCH)pitchCW =0; if(posPITCH <=minPITCH)pitchCW =1;} ////////////////////////////////////// /////////////////////////////// =======================アクティブ化==============================/////////////// ////////////////////////////////////////////////// //// void activate(){//翼を開いて、何か忙しいことを言うRed =1; ReadNet(); WriteNet(); output_sensor(); digitalWrite(LED_CENTRE、HIGH); // randomOpenのLEDアイ=random(3、6); //ランダムなオープニングコメントを選択mp3.playMp3FolderTrack(randomOpen); //ランダムに「Iseeyou」コメントを再生servo_wings.write(WINGopen); // open wings output_sensor(); delay (3400);}/////////////////////////////////////////////////////////////////////====================FALSE ACTIVATE ============================/////////////////////////////////////////////////////////////////////void falseActivate(){ // busyRed =1; ReadNet(); WriteNet(); output_sensor(); randomFalse =random(6, 9);// pick random opening comment mp3.playMp3FolderTrack(randomFalse); // play random "where'd you go?" comment delay (1800);}/////////////////////////////////////////////////////////////////////=======================SCAN AREA =============================/////////////////////////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int i =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage();戻る; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println(); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print (" "); previousMillis3 =millis(); i++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); unsigned long currentMillis =millis(); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

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

Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

回路図

Schematic that I made for building the turret.

製造プロセス

  1. アンバー
  2. ギロチン
  3. 墓石
  4. 水着
  5. ケイ素
  6. スケートボード
  7. ウォッカ
  8. カルーセル
  9. ソファー
  10. エンドワーキングタレットがサイクルタイムを短縮