WALTER-Arduino Photovore Insect
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 3 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 5 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
|
このプロジェクトについて
[英語を失礼します]
2つのサーボarduino昆虫の人気のあるセットアップが本当に好きです ユーチューブで。私がそれを見たとき、そのセットアップがお気に入りになるずっと前に、BEAMロボットの男たちが何をしたかをいつも覚えています。アナログロボットの狂信者であるこれらの人々は、2つのモーター(マイクロコア/バイコアウォーカー)間の角度が優れているため、歩行がうまくいきました。 など)。
しかし、私の意見では、前に述べたもののどれも VBug1.5 より生き生きと見えません (ウォークマンとも呼ばれます)ビームロボットの創設者、マークティルデンによって作成されました。 5つのモーターを使用しているため、操作性が向上します。
単純なBEAMロボットを作成することは難しくありませんが、VBug1.5のような複雑なものを作成することは、私のような電子初心者にとっては苦痛かもしれません。そのため、Tildenのバグのようなものを作成することにしたとき、エンジニア以外の人(または、恥ずかしいことに、エンジニア志望者)にとって最も簡単な選択肢であるarduinoプラットフォームで解決しなければなりませんでした。
その結果、ウォルターを作りました 、5つのサーボを備えた4本足のarduinoロボット。生き生きとしたバグロボットを作りたいのなら、なぜ代わりに8または12サーボを使わなかったのか不思議に思うかもしれません。さて、私は私が持つことができるほとんどの機動性を得るために私ができる最も簡単な何かを考えていました。フレームを作る代わりにたくさんの接着剤を使うことについて話している。
動作
他の多くのarduinoロボットと同様に、WalterはHC-SR04超音波センサーを使用して障害物を回避できます。キャラクターをバグとして追加するために、ウォルターはフォトボアでもあり、彼が光に惹かれていることを意味します。フォトダイオードは、光を検出するために使用されます。 arduinoスケッチにはランダムな値が生成され、ウォルターが休憩をとるタイミングを決定し、歩行速度(3速度)をランダムに変更します。
私が始めたとき、私はウォルターの各足の下にタクトボタンを配置して、彼が表面センサーを持っているようにするつもりでした。しかし、バッテリー(スマートフォン用のポータブルパワーバンク)はサーボにかなりの重量がかかります。タクトボタンの重さは、重量を追加する心配はほとんどありませんが、皮肉なことに、ロボットの重量は、逆さまのボタンを押すのに十分ではありません。
より大きなサーボを備えたWalterバージョン2を作成することを計画し、これらのボタンを表面センサーとして含めました。
詳細 strong>
コード
- WALTER.ino
WALTER.ino Arduino
/ * WALTER-4本足の写真このArduinoスケッチは、「WALTER」という名前の5サーボ四足(4本足)ロボットを構築するための私の試みです。このスケッチを使用するには、便利な値または独自のハードウェア設定に合わせて調整します。これらのマークを見つけて(Ctrl + F)、変更が必要な値を簡単に検索します。-****:これらのマークは、サーボの中心位置であり、キャリブレーションが必要であることを意味します(ロボットアイドル時の脚のポッティング)。 -***:これらのマークは、arduinoピンの割り当て(arduinoへのセンサーとサーボの接続)を意味します。ロボットを組み立てるときは、これを参照してください。 -**:これらのマークは、オプションで値を好みに応じて変更できることを意味します(脚のステップ幅、光/障害物を感知するときの回転量など)。自分が何をしていたのかわからない場合は、そのままにしておきます。このスケッチは自己責任で使用できます。また、そのまま提供されます。ええと、人々が使用する著作権に関するものは何ですか。公開されているソースコードで書く??重要なのは、このコードを使用しているときに何か悪いことが起こった場合、私は責任を負いたくないということです。楽しんでください!Yohanes Martedi-2015 * /#include// ** **サーボの中心角を調整します(「xx.writeMicroseconds();」コマンドを使用するため、マイクロ秒単位で)。 1500.const int ANGLE_mid_Shaft =1520; const int ANGLE_mid_FLeft =1550; const int ANGLE_mid_FRight =1570; const int ANGLE_mid_BLeft =1450; const int ANGLE_mid_BRight =1450; const int ANGLE_sweep =// **この値(マイクロ秒単位)を設定して、サーボがスイープする幅(脚のステップ幅)を決定します。値が大きいほど、掃引角度が広くなります。constintANGLE_res =10; // **サーボの移動分解能(マイクロ秒単位)を、少なくともサーボのデフォルトの不感帯幅(最高の解像度)以上(低い解像度)に設定します。例:SG90サーボデッドバンド幅は10マイクロ秒です。intsweepSPEED; //サーボがスイープする速度を決定する変数。intsweepSPEED_Rand[3] ={4、6、8}; // **サーボ速度(歩行速度)は3つのモードでランダムに変化します。各モードの速度(ミリ秒単位)を設定します。値が小さいほど高速です。constintANGLE_turnMAX=ANGLE_sweep * 1.5; // **この値を設定して、ボットが光に向かって最大回転する量を決定します。値が大きいほど、turn.const int ANGLE_turnNARROW =ANGLE_sweep * 0.25;が大きくなります。 // **この値を設定して、ボットが狭いスペースの側面にあるオブジェクトを避けて回転する最大値を決定します。値が大きいほど、turn.const int SONAR_sum =3が大きくなります。 //使用されたソナーの量.constint PHOTO_sum =4; //使用されたフォトダイオードの量.intPIN_trig [SONAR_sum] ={13、11、8}; // ***超音波センサーのトリガーピンに接続されたarduinoピンを設定します。 {正面、左、右} .int PIN_ec [SONAR_sum] ={12、10、7}; // ***超音波センサーのエコーピンに接続されたarduinoピンを設定します。 {正面、左、右} .int PIN_PHOTO [PHOTO_sum] ={2、3、1、0}; // ***フォトダイオードに接続されたarduinoアナログ入力ピンを設定します。 {前左、前右、後左、後右} .const int distRotate =25; // **ロボットが回転して回避する前に、ロボットと障害物の間の最小距離(cm)を構成します。constintdistRetreat =10; // **ロボットが後退して回避する前に、ロボットと障害物の間の最小距離(cm単位)を構成します。constintdistTurn =20; // **ロボットが回転して回避する前に、ロボットと障害物の間の最小距離(cm単位)を構成します。constintcounter_gait_max=8; // **障害物を回避するためにロボットが実行するステップ数を構成します(回転または後退する場合)。//**ボットの休止と実行の時間を構成します(ミリ秒単位)。constintRUN_time=25000; const int REST_time =3000; //ソナーのID:int SONAR_id; const int FRONT =0; const int LEFT =1; const int RIGHT =2; //フォトダイオードのID:const int FRONT_LEFT =0; const int FRONT_RIGHT =1; const int BACK_LEFT =2; const int BACK_RIGHT =3; //フォトダイオードの読み取り値の変数:intPHOTO_Front_Left; int PHOTO_Front_Right; int PHOTO_Back_Left; int PHOTO_Back_Right; const int SONAR_TrigSig =10; //超音波音を生成するために必要なセンサーのトリガー信号の持続時間(S)(すでに製品で指定されているため、この値は変更しないでください)。constunsignedlong SONAR_MaxEc =50000; //センサーによって与えられるエコー信号の最大持続時間(S)(製品によってすでに指定されています。この値は変更しないでください)。constfloatSOUND_speed=0.034; //空気中の音速(S / cm)(scieneによってすでに指定されています。この値を変更する場合は、空気を曲げるにはアバターAangが必要です)。intdistance[SONAR_sum]; //距離の計算結果//サーボの宣言:ServoSERVO_shaft; Servo SERVO_front_left; Servo SERVO_front_right; Servo SERVO_back_left; Servo SERVO_back_right; //各サーボの角度の変数:intANGLE_shaft =ANGLE_mid_Shaft; int ANGLE_ ANGLE_front_right =ANGLE_mid_FRight; int ANGLE_back_left =ANGLE_mid_BLeft; int ANGLE_back_right =ANGLE_mid_BRight; //ミドルサーボ(シャフト)の角度操作const int ANGLE_max_Shaft =ANGLE_mid_Shaft + ANGLE_sweep; const int_各サーボの角度:intANGLE_shaft_record; int ANGLE_front_left_record; int ANGLE_front_right_record; int ANGLE_back_left_record; int ANGLE_back_right_record; //光検出によるサーボ角度補正の変数:intLIGHT_left; int LIGHT_right; //ソナーによるサーボ角度補正の変数int SONAR_left; int SONAR_right; //そのこと旗、カウンター、レコードなど、説明の仕方がいつもわからない。 :( int ANGLE_prev; int flag_shaft_reverse; int flag_transition_rotate; int flag_transition_start =1; int flag_rest =0; int flag_RUN_time =0; int rotate_random; int counter_gait; void setup(){// Serial.begin(9600); //シリアル。 。ご存知のとおり、チェックとデバッグ.. SERVO_shaft.attach(2); // *** arduinoに水平(シャフト)サーボの信号ピンを設定します。SERVO_front_left.attach(4); // ***フロント左を設定しますarduinoのサーボの信号ピン。SERVO_front_right.attach(3); // *** arduinoのフロント右サーボの信号ピンを設定します。SERVO_back_left.attach(6); // ***左後部のサーボの信号ピンを設定します。 arduino。SERVO_back_right.attach(5); // *** arduinoにバックライトサーボの信号ピンを設定します。//サーボを中間角度で準備します。SERVO_shaft.writeMicroseconds(ANGLE_mid_Shaft); SERVO_front_left.writeMicroseconds(ANGLE_mid_FLeft); SERVO_front_right.writeMicroseconds(ANGLE_mid_FRight); SERVO_back_left.writeMicroseconds(ANGLE_mid_BLeft); SERVO_back_right.writeMicroseconds(ANGLE_mid_BRight); //ピンを設定■ソナーの場合、pinModeとvalueの両方。 for(SONAR_id =0; SONAR_id distRotate){flag_RUN_time =0; while(flag_RUN_time ==0){FORWARD(); }} while(distance [FRONT]> distRetreat &&distance [FRONT] <=distRotate){while(distance [LEFT]> distance [RIGHT]){ROTATE_LEFT_AVOID();壊す; } while(distance [LEFT] =ANGLE_max_Shaft){ANGLE_prev =ANGLE_shaft; ANGLE_shaft- =ANGLE_res; } else if(ANGLE_prev> ANGLE_shaft &&ANGLE_shaft> ANGLE_min_Shaft){ANGLE_prev =ANGLE_shaft; ANGLE_shaft- =ANGLE_res; } else if(ANGLE_shaft <=ANGLE_min_Shaft){ANGLE_prev =ANGLE_shaft; ANGLE_shaft + =ANGLE_res; } SERVO_shaft.writeMicroseconds(ANGLE_shaft);} void SHAFT_REVERSE(){if(ANGLE_prev ANGLE_shaft){ANGLE_prev =ANGLE_shaft-1; }} / * ================================シャフトの動きの終わり================================* // * =====================================トランジション=====================================* / void TRANSITION_GAIT(){ANGLE_front_left_record =ANGLE_front_left; ANGLE_front_right_record =ANGLE_front_right; ANGLE_back_left_record =ANGLE_back_left; ANGLE_back_right_record =ANGLE_back_right; ANGLE_shaft_record =ANGLE_shaft; intフラグ=HIGH; intカウンター=0; while(flag ==HIGH){SHAFT(); LIGHT_left =0; LIGHT_right =0;カウンター++; ANGLE_front_left =map(counter、1、((ANGLE_sweep * 2)/ ANGLE_res)、ANGLE_front_left_record、ANGLE_mid_FLeft); ANGLE_front_right =map(counter、1、((ANGLE_sweep * 2)/ ANGLE_res)、ANGLE_front_right_record、ANGLE_mid_FRight); ANGLE_back_left =map(counter、1、((ANGLE_sweep * 2)/ ANGLE_res)、ANGLE_back_left_record、ANGLE_mid_BLeft); ANGLE_back_right =map(counter、1、((ANGLE_sweep * 2)/ ANGLE_res)、ANGLE_back_right_record、ANGLE_mid_BRight); SERVO_shaft.writeMicroseconds(ANGLE_shaft); SERVO_front_left.writeMicroseconds(ANGLE_front_left); SERVO_front_right.writeMicroseconds(ANGLE_front_right); SERVO_back_left.writeMicroseconds(ANGLE_back_left); SERVO_back_right.writeMicroseconds(ANGLE_back_right); if(counter ==((ANGLE_sweep * 2)/ ANGLE_res)){フラグ=LOW;始める(); flag_transition_rotate =0; }}} void TRANSITION_START(){if(ANGLE_shaft ==ANGLE_mid_Shaft ||(ANGLE_shaft> ANGLE_mid_Shaft &&ANGLE_shaft> ANGLE_prev)||(ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft){ANGLE_front_left =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_FLeft、((ANGLE_mid_FLeft + ANGLE_sweep)); ANGLE_front_right =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_FRight、((ANGLE_mid_FRight + ANGLE_sweep_val)+ LIGHT_right + SONAR_right)); ANGLE_back_left =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_BLeft、((ANGLE_mid_BLeft-ANGLE_sweep_val)+ LIGHT_left + SONAR_left)); ANGLE_back_right =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_BRight、((ANGLE_mid_BRight-ANGLE_sweep_val)-LIGHT_right-SONAR_right)); } else if(ANGLE_shaft ANGLE_shaft){ANGLE_front_left =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、((ANGLE_mid_FLeft + ANGLE_sweep_val)-LIGHT_left_ SONAR); ANGLE_front_right =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、((ANGLE_mid_FRight + ANGLE_sweep_val)+ LIGHT_right + SONAR_right)、ANGLE_mid_FRight); ANGLE_back_left =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、((ANGLE_mid_BLeft-ANGLE_sweep_val)+ LIGHT_left + SONAR_left)、ANGLE_mid_BLeft); ANGLE_back_right =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、((ANGLE_mid_BRight-ANGLE_sweep_val)-LIGHT_right-SONAR_right)、ANGLE_mid_BRight); } else if(ANGLE_shaft =ANGLE_mid_Shaft &&ANGLE_prev =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft){ANGLE_front_left =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_FLeft、(ANGLE_mid_FLeft-ANGLE_sweep_val); ANGLE_front_right =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_FRight、(ANGLE_mid_FRight + ANGLE_sweep_val)); ANGLE_back_left =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_BLeft、(ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =map(ANGLE_shaft、ANGLE_max_Shaft、ANGLE_mid_Shaft、ANGLE_mid_BRight、(ANGLE_mid_BRight-ANGLE_sweep_val)); } else if(ANGLE_shaft ANGLE_shaft){ANGLE_front_left =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、(ANGLE_mid_FLeft --ANGLE_sweep_val)、ANGLE_mid_FLeft); ANGLE_front_right =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、(ANGLE_mid_FRight + ANGLE_sweep_val)、ANGLE_mid_FRight); ANGLE_back_left =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、(ANGLE_mid_BLeft + ANGLE_sweep_val)、ANGLE_mid_BLeft); ANGLE_back_right =map(ANGLE_shaft、ANGLE_mid_Shaft、ANGLE_min_Shaft、(ANGLE_mid_BRight-ANGLE_sweep_val)、ANGLE_mid_BRight); } else if(ANGLE_shaft 0.0){SONAR_distance =SONAR_EcInterval *(SOUND_speed / 2.0);壊す; } while(SONAR_EcInterval ==0.0){SONAR_distance =501.0;壊す; } return SONAR_distance;} / * =============================超音波読み取りの終了=============================* // * ====================================LIGHT DETECT ====================================* / void LIGHT_COMPARE_EXECUTE(){// PHOTO_FLeft_RAW =analogRead(PIN_PHOTO [FRONT_LEFT]); // PHOTO_FRight_RAW =analogRead(PIN_PHOTO [FRONT_RIGHT]); PHOTO_Front_Left =analogRead(PIN_PHOTO [FRONT_LEFT]); PHOTO_Front_Right =analogRead(PIN_PHOTO [FRONT_RIGHT]); PHOTO_Back_Left =analogRead(PIN_PHOTO [BACK_LEFT]); PHOTO_Back_Right =analogRead(PIN_PHOTO [BACK_RIGHT]); if((PHOTO_Front_Left + PHOTO_Front_Right)> =(PHOTO_Back_Left + PHOTO_Back_Right)){int LIGHT_Sensitivity =50; if(LIGHT_COMPARE()> LIGHT_Sensitivity){LIGHT_left =LIGHT_COMPARE(); LIGHT_right =0; } else if(LIGHT_COMPARE()<-LIGHT_Sensitivity){LIGHT_left =0; LIGHT_right =LIGHT_COMPARE(); } else {LIGHT_left =0; LIGHT_right =0; }} else {if(PHOTO_Back_Left> PHOTO_Back_Right){LIGHT_right =0; LIGHT_left =ANGLE_turnMAX; } else if(PHOTO_Back_Left PHOTO_Front_Right){LIGHT_rate =PHOTO_Front_Left; } else if(PHOTO_Front_Right> PHOTO_Front_Left){LIGHT_rate =PHOTO_Front_Right; } else {//これらの変数の一方を使用し、もう一方をコメントします// LIGHT_rate =PHOTO_Front_Left; LIGHT_rate =PHOTO_Front_Right; } int LIGHT_compareRAW =PHOTO_Front_Left-PHOTO_Front_Right; LIGHT_compareRAW =map(LIGHT_compareRAW、-LIGHT_rate、LIGHT_rate、-ANGLE_turnMAX、ANGLE_turnMAX);; return LIGHT_compareRAW;} / * =================================END OF LIGHT DETECT =================================* // * ======================================動作======================================* / void RETREAT_AVOID(){counter_gait =0; while(counter_gait <=counter_gait_max){RETREAT(); }} void ROTATE_LEFT_AVOID(){counter_gait =0; rotate_random =2; while(counter_gait <=counter_gait_max){ROTATE_LEFT(); }} void ROTATE_RIGHT_AVOID(){counter_gait =0; rotate_random =2; while(counter_gait <=counter_gait_max){ROTATE_RIGHT(); }} void ROTATE_RANDOM_AVOID(){rotate_random =ROTATE_RANDOM(); while(rotate_random ==0){ROTATE_LEFT_AVOID(); } while(rotate_random ==1){ROTATE_RIGHT_AVOID(); }} void SIDE_AVOID(){if(distance [LEFT] <=distTurn &&distance [RIGHT]> distTurn){LIGHT_left =0; LIGHT_right =0; SONAR_left =0; SONAR_right =-(map(distance [LEFT]、0、distTurn、ANGLE_turnMAX、0)); } else if(distance [RIGHT] <=distTurn &&distance [LEFT]> distTurn){LIGHT_left =0; LIGHT_right =0; SONAR_right =0; SONAR_left =map(distance [RIGHT]、0、distTurn、ANGLE_turnMAX、0); } else if(distance [LEFT] <=distTurn &&distance [RIGHT] <=distTurn){LIGHT_left =0; LIGHT_right =0; if(distance [LEFT]
回路図
製造プロセス