Bluetooth Nerf Turret
コンポーネントと消耗品
> | | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 3 | |
| | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 30 | |
| | × | 4 | |
| | × | 15 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
アプリとオンラインサービス
> | | |
このプロジェクトについて
Bluetoothで制御されるNerfタレットプロジェクトを確認していただきありがとうございます。ここで説明することはあまりないと思います。これは、AndroidデバイスまたはPCからBluetooth経由で制御されるNerfタレットです。
.................... https://www.littlefrenchkev.com/bluetooth-nerf-turret..............。 .....
それはどのように機能しますか?
非常に複雑なものはありません。チルトとパンの動きは、ArduinoNanoによって駆動される2つのサーボによって処理されます。
ダーツは、2つの小さなDCモーターで回転する2つのローラーを使用して撃たれます。発射命令が送信されると、サーボがダーツをローラーに押し込みます。マガジンは7本のダーツを保持できます。
上記のように、AndroidデバイスまたはPCからBluetooth経由で制御されます。
それを構築する方法は?
組み立て:
三脚とマガジンには2つの異なるバージョンがあります。 1つはMG-90sサーボ用に設計され、もう1つはMG996rサーボ用に設計されています。 MG996rサーボは電力を大量に消費する可能性があります。それらを使用することにした場合は、電源が適切に機能することを確認してください。
三脚:
雑誌:
配線:
ソフトウェアとテスト!!!
なぜそうでないのかという理由でいくつかの余分な写真!!!
コード
Arduinoコード Arduino
arduinoにアップロードするコード。 androidアプリまたはPCを介してタレットを制御することを選択しても、コードは同じままです。 #include // -----サーボと変数を宣言しますServorecoil_servo; Servo pan_servo; Servo tile_servo; constバイトpan_limit_1 =0; constバイトpan_limit_2 =180; constバイトtilt_limit_1 =65; constバイトtilt_limit_2 =180; constバイトrecoil_rest =180; // restconstバイトでのサーボの角度recoil_pushed =125; //ダーツをプッシュするためにサーボが到達する必要のある角度// -----シリアルデータ処理に関連する変数bytebyte_from_app; const byte buffSize =30; byte inputBuffer [buffSize]; const byte startMarker =255; const byte endMarker =254; byte bytesRecvd =0; boolean data_received =false; // -----モーターのタイミングと起動に関連する変数boolis_firing =false; bool can_fire =false; bool recoiling =false; unsigned long fireing_start_time =0; unsigned long fireing_current_time =0; const long fireing_time =150; unsigned long recoil_start_time =0; unsigned long recoil_current_time =0; const long recoil_time =2 * fireing_time; const byte motor_pin =12; boolean motors_ON =false; // 8 ===========================Dvoid setup(){// -----モーターピンモードを定義pinMode(motor_pin、OUTPUT); digitalWrite(motor_pin、LOW); // -----サーボをピンに接続しますrecoil_servo.attach(9); pan_servo.attach(10); tile_servo.attach(11); // -----開始シーケンスrecoil_servo.write(recoil_rest); pan_servo.write(90); delay(1000); tile_servo.write(105); Serial.begin(9600); //シリアル通信を開始します} // 8 ===========================Dvoid loop(){getDataFromPC(); set_motor(); if(data_received){move_servo(); set_recoil(); set_motor(); } fire();} // 8 ===========================Dvoid getDataFromPC(){//データの予想される構造[開始バイト、パン量、チルト量、モーターオン、起動ボタンが押された、終了バイト] //開始バイト=255 //パン量=0から253までのバイト//傾斜量=0から253までのバイト//モーターオン=0 forオフ-1オン//起動ボタンが押された場合=0押されていない場合-1押された場合//終了バイト=254 if(Serial.available()){//シリアルで利用可能なデータの場合byte_from_app =Serial.read(); //使用可能な次の文字を読み取りますif(byte_from_app ==255){//開始バイトが見つかった場合はそれを探します:bytesRecvd =0; //受信したバイトを0にリセットします(最初からinputBufferの入力を開始します)data_received =false; } else if(byte_from_app ==254){//終了バイトが見つかった場合はそれを探します:data_received =true; // data_receivedをtrueに設定して、データを使用できるようにします} else {//受信したバイトをバッファに追加しますinputBuffer [bytesRecvd] =byte_from_app; //入力バッファに文字を追加bytesRecvd ++; //受信したバイトをインクリメントします(これはインデックスとして機能します)if(bytesRecvd ==buffSize){// inputBufferがいっぱいになった場合のセキュリティ(発生しないはずです)bytesRecvd =buffSize-1; // bytesReceived>バッファサイズの場合bytesReceivedがバッファサイズよりも小さい}}}} // 8 ===========================Dvoid move_servo( ){byte pan_servo_position =map(inputBuffer [0]、0、253、pan_limit_2、pan_limit_1); // inputbuffer値をサーボ位置値に変換pan_servo.write(pan_servo_position); //パンサーボ位置を設定バイトtilt_servo_position =map(inputBuffer [1]、0、253、tilt_limit_2、tilt_limit_1); //入力バッファ値をサーボ位置値に変換しますtilt_servo.write(tilt_servo_position); //パンサーボ位置を設定} // 8 ===========================Dvoid set_recoil(){if(inputBuffer [3] ==1){//発射ボタンが押された場合if(!is_firing &&!recoiling){//まだ発射または反動していないcan_fire =true; // can fireをtrueに設定します(void fire()の効果を参照)}} else {//起動ボタンが押されていない場合can_fire =false; // setはfalseに起動できます(void fire()の効果を参照)}} // 8 ===========================Dvoid set_motor (){// ----- MOSFETトランジスタを使用してモーターを始動および停止します。 if(inputBuffer [2] ==1){//画面がdigitalWrite(motor_pin、HIGH);に触れた場合//モーターをオンにしますmotors_ON =true; } else {//画面がタッチされていない場合digitalWrite(motor_pin、LOW); //モーターをオフにしますmotors_ON =false; }} // 8 ===========================Dvoid fire(){//モーターバイトがオンの場合、モーターをオンにして、オンになっている時間if(can_fire &&!is_firing &&motors_ON){// if(can_fire &&!is_firing){fireing_start_time =millis(); recoil_start_time =millis(); is_firing =true; } fireing_current_time =millis(); recoil_current_time =millis(); if(is_firing &&fireing_current_time --fireing_start_time recoil_time){is_firing =false; }}
pythonファイル
実行可能ファイルとAndroidアプリはここにあります:https://www.littlefrenchkev.com/bluetooth-nerf-turrethttps://github.com/LittleFrenchKev/Bluetooth_Nerf_turret 回路図
これが主な配線図です。
配線は、デュポンコネクタを使用して互いにリンクされた小さなセクションに分割されています。これは組み立てを容易にするためです。 これがHC-05Bluetooth配線です。
この配線には、Arduinoから出てくる5VをHC-05レシーバーピン用に約3.3Vに降圧できるようにする分圧器が含まれています。