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

Autonomous Nerf Sentry Turret

コンポーネントと消耗品

>
OpenBuilds NEMA17ステッピングモーター
× 1
ギアボックス付きDFRobotステッピングモーター
× 1
DFRobotステッピングモータードライバー
× 1
DFRobot Pixy 2 Cam
× 1
Arduino Mega 2560
× 1
超音波センサー-HC-SR04(汎用)
× 1
Nerf Nitron Gun
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
はんだごて(汎用)
CNCルーター

アプリとオンラインサービス

>
Arduino IDE
Autodesk Fusion 360

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

アイデア

数年前、私は、一度狙われたときに自力で発砲できる半自律砲塔を展示するプロジェクトを見ました。そのため、Pixy 2カメラを使用してターゲットを取得し、ナーフガンを自動的に照準を合わせるというアイデアが得られました。これにより、すべてが自動的にロックされて発射されます。

コンポーネント

このプロジェクトでは、銃に目が必要になるため、メインボードとのインターフェースが簡単なため、Pixy2を使用することにしました。それからマイクロコントローラーが必要だったので、ピンの数からArduino Mega2560を選びました。

ガンにはヨーとピッチの2つの軸が必要なため、2つのステッピングモーターが必要です。そのため、DFRobotからデュアルDRV8825モータードライバーボードが送られてきました。

CAD

まず、Fusion 360をロードし、付属のナーフガンのキャンバスを挿入しました。次に、そのキャンバスからソリッドボディを作成しました。銃が設計された後、私は銃が左から右に回転できるようにするいくつかのベアリングベースのサポートを備えたプラットフォームを作成しました。回転台の横にステッピングモーターを置いて駆動しました。

しかし、より大きな問題は、銃のピッチを上下させる方法です。そのためには、可動ブロックに1点、銃の後ろにもう1点を取り付けたリニアドライブシステムが必要でした。ロッドが2つのポイントを接続し、銃がその中心軸に沿って回転できるようにします。

部品の製造

私のデザインのほとんどすべてのパーツは3D印刷されることを意図しているので、2台のプリンターを使用してそれらを作成しました。次に、最初にFusion 360を使用してCNCルーターに必要なツールパスを生成し、次に合板のシートからディスクを切り取って、可動プラットフォームを作成しました。

組み立て

すべての部品が作成された後、それらを組み立てる時が来ました。ベアリングサポートを回転ディスクに接続することから始めました。次に、6mmのアルミニウムロッドとネジ付きロッドを部品に通して、リニアピッチアセンブリを組み立てました。

最後に、ナーフガン自体をスチールロッドとアルミニウム押し出し材で作られた2本の支柱で取り付けました。

プログラミング

次に、プロジェクトの最も難しい部分であるプログラミングについて説明します。発射体発射機は非常に複雑であり、その背後にある計算は混乱を招く可能性があります。まず、プログラムフローとロジックを段階的に記述し、各マシンの状態で何が起こるかを詳しく説明しました。さまざまな状態は次のようになります:

  • ターゲットを取得する
  • 銃の位置を決める
  • モーターを巻き上げる
  • 銃を撃ちます
  • モーターを巻き下げます

ターゲットを取得するには、最初に、ネオンピンクのオブジェクトをターゲットとして追跡するようにPixyを設定する必要があります。次に、ターゲットがPixyのビューの中央に来るまで銃が移動し、銃身からターゲットまでの距離が測定されます。この距離を使用することにより、いくつかの基本的な三角関数を使用して、水平距離と垂直距離を見つけることができます。私のコードにはget_angle()という関数があり、これら2つの距離を使用して、そのターゲットに当たるのに必要な角度を計算します。

次に、ガンはこの位置に移動し、MOSFETを介してモーターをオンにします。 5秒間巻き上げた後、サーボモーターを動かしてトリガーを引きます。次に、MOSFETがモーターをオフにし、ナーフガンがターゲットの検索に戻ります。

楽しんでください

銃の精度をテストするために、ネオンピンクのインデックスカードを壁に貼りました。私のプログラムが測定された距離の角度を調整して調整するので、それはうまくいきました。これが銃の動作を示すビデオです:

コード

  • 回路図
回路図 C / C ++
ArduinoMegaにアップロード
 #include  #include  #include "BasicStepperDriver.h" #include  #include  // Xはピッチ、Yはyawconst intpins [] ={6,7,8,5,4,12}; // MX STEP、DIR、EN、MY STEP、DIR、ENconst int limit_switch =26、laser_pin =11、spool_pin =10、servo_pin =13、distance_trig =29、distance_echo =30; double speed =21.336; double speed_squared =455.225; float current_angle =0.0; float hyp_distance; //銃からターゲットまでの距離(メートル単位)#defineX_MID 164#define Y_MID 150#define DEADZONE 15#define G 9.8#define STP_PER_DEG_YAW 3.333#define STP_PER_DEG_PITCH 184859#define MICROSTEPS 32#define RPM 120#define MOTOR_STEPS_Y 200#def /17.7777ステップ/ degreeBasicStepperDriverpitch_stepper(MOTOR_STEPS_X、pins [1]、pins [0]); BasicStepperDriver yaw_stepper(MOTOR_STEPS_X、pins [4]、pins [3]);サーボトリガー; Pixy2I2Cpixy; enum States {ACQUIRE、POSITION、SPOOL 、FIRE、WIND_DOWN、RETURN};状態state =ACQUIRE; void setup(){Serial.begin(115200); init_pins(); delay(1000); // home_pitch(); pixy.init(); Serial.println( "Ready ...");} void loop(){switch(state){case ACQUIRE:acquire_target();状態=POSITION; digitalWrite(laser_pin、HIGH);壊す;ケースPOSITION:Serial.println( "positioning"); position_gun();状態=SPOOL;壊す;ケースSPOOL:Serial.println( "spooling"); digitalWrite(spool_pin、HIGH); delay(5000);状態=FIRE;壊す;ケースFIRE:fire_gun();状態=WIND_DOWN;壊す;ケースWIND_DOWN:Serial.println( "winding down"); digitalWrite(spool_pin、LOW); delay(2000);状態=RETURN; digitalWrite(laser_pin、LOW);状態=取得;壊す; }} void fire_gun(){Serial.println( "Firing gun!"); trigger.write(108); delay(400); trigger.write(90); delay(2000);} void position_gun(){float x、y; hyp_distance =ping(); hyp_distance / =100; while(!hyp_distance){hyp_distance =ping(); hyp_distance / =100; } Serial.println(hyp_distance); x =cos(current_angle)* hyp_distance; y =sin(current_angle)* hyp_distance; float target_angle =get_angle(x、y); target_angle / =100; Serial.println(target_angle); move_pitch(target_angle --current_angle); current_angle =target_angle;} voidacquire_target(){int x =0、y =0;長いsteps_taken =0; bool lock =false; while(!lock){pixy.ccc.getBlocks(); if(pixy.ccc.numBlocks){x =pixy.ccc.blocks [0] .m_x; y =pixy.ccc.blocks [0] .m_y; Serial.print( "位置Xで見られるターゲット:"); Serial.print(x); Serial.print( "、Y:"); Serial.println(y); if(x <=(X_MID --DEADZONE)){//左が遠すぎる場合は、銃を左に移動しますmove_yaw(1); } else if(x> =(X_MID + DEADZONE)){move_yaw(-1); } else if(y <=(Y_MID --DEADZONE)){//上に移動しすぎたら、銃を上に移動します。pitch_stepper.move(33152); Steps_taken + =33152; } else if(y> =(Y_MID + DEADZONE)){pitch_stepper.move(33152); Steps_taken + =33152; } else {lock =true; Serial.print( "ターゲットが場所Xでロックされています:"); Serial.print(x); Serial.print( "、Y:"); Serial.println(y); Serial.print( "実行されたステップ:"); Serial.println(steps_taken); }}} current_angle =Steps_taken / STP_PER_DEG_PITCH; Serial.print( "現在の角度:"); Serial.println(current_angle);} void init_pins(){pinMode(pins [2]、OUTPUT); pinMode(pins [5]、OUTPUT); pinMode(limit_switch、INPUT_PULLUP); pinMode(laser_pin、OUTPUT); pinMode(spool_pin、OUTPUT); pinMode(distance_echo、INPUT); pinMode(distance_trig、OUTPUT); digitalWrite(pins [2]、LOW); digitalWrite(pins [5]、LOW); digitalWrite(laser_pin、LOW); digitalWrite(spool_pin、LOW); trigger.attach(servo_pin); tip_stepper.begin(RPM、MICROSTEPS); yaw_stepper.begin(5、MICROSTEPS); trigger.write(90);} void move_yaw(floatdegrees){yaw_stepper.move(degrees * STP_PER_DEG_YAW * 32);} void move_pitch(floatdegrees){current_angle + =度; tip_stepper.move(degrees * STP_PER_DEG_PITCH);} float get_angle(float distance、float height){float i =2 * height * 455.225; float j =G *距離*距離; i + =j; j =9.8 * i; i =sqrt(pow(velocity_squared、2)-j); return atan((velocity_squared-i)/(G * distance))*(180 / PI);} float ping(){Serial.println( "Getting distance ...");長期間; digitalWrite(distance_trig、LOW); delayMicroseconds(5); digitalWrite(distance_trig、HIGH); delayMicroseconds(10); digitalWrite(distance_trig、LOW);期間=pulseIn(distance_echo、HIGH);返品期間/ 2 / 29.1; //メートル単位の距離} voidhome_pitch(){Serial.println(digitalRead(limit_switch)); if(!digitalRead(limit_switch)){//スイッチがアクティブな場合pitch_stepper.rotate(720); } while(digitalRead(limit_switch)){// Serial.println(digitalRead(limit_switch));ピッチステッパー.move(-32); } tip_stepper.rotate(2880 * 2);} 

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

Thingiverseリポジトリ
thingsiverse.comのCADファイル

回路図


製造プロセス

  1. ステッピングモーター
  2. 統合されたドライバーがステッピングモーターの設計を容易にします
  3. Raspouletteプロトタイプ
  4. シンプルなパイロボット
  5. バイポーラステッピングモーターライブラリ
  6. スワイパー-自動TheTinder /バンブルスワイパー
  7. 自律型ホームアシスタントロボット
  8. SmartWay
  9. サーボモーターとステッピングモーターの間の灰色の領域
  10. リニアモーターとは
  11. サーボモータとは