블루투스 제어 너프 터렛 제작: 부품 및 조립 가이드
부품 및 소모품
| 부품 | 수량 |
| 아두이노 Nano R3 | 1 |
| HC-05 블루투스 모듈 | 1 |
| LM2596 벅 컨버터 | 1 |
| MG-90s 서보 | 3 |
| 타입 130 DC 모터 | 2 |
| FR207 정류 다이오드 | 1 |
| RFP30N06LE MOSFET | 1 |
| 2.1x5.5mm 잭 플러그 | 1 |
| 저항 10kΩ | 1 |
| 저항 330Ω | 1 |
| 저항 680Ω | 1 |
| M2x10 태핑 나사 | 30 |
| M5x20 카운터싱크 나사 | 4 |
| 듀폰 커넥터 | 15 |
| 1.5mm 금속 봉 | 1 |
| 전선 | 1 |
| 열수축 튜브 | 1 |
| 20mm 고무줄 | 1 |
| 9V 파워 서플라이 (최소 2.5A) | 1 |
필요한 도구 및 장비
- 드라이버
- 와이어 스트리퍼
- 플라이어
- 납땜 인두
- 멀티미터
- 크림핑 툴
- 3D 프린터
앱 및 온라인 서비스
프로젝트 소개
블루투스로 제어되는 너프 터렛 프로젝트를 확인해 주셔서 감사합니다. 안드로이드 기기나 PC에서 블루투스로 제어되는 너프 터렛입니다.
자세한 내용: https://www.littlefrenchkev.com/bluetooth-nerf-turret
작동 원리
복잡하지 않습니다. 틸트와 팬 움직임은 아두이노 Nano로 구동되는 2개의 서보가 담당합니다.
다트는 2개의 작은 DC 모터로 회전하는 2개의 롤러로 발사됩니다. 발사 명령이 내려지면 서보가 다트를 롤러로 밀어 넣습니다. 탄창에는 7발의 다트를 장전할 수 있습니다.
위에서 언급한 대로 안드로이드 기기나 PC에서 블루투스로 제어됩니다.
제작 방법
조립
삼각대와 탄창은 MG-90s 서보용과 MG996r 서보용 두 가지 버전으로 제공됩니다. MG996r 서보는 전력 소모가 클 수 있으니, 이를 사용할 경우 파워 서플라이가 감당할 수 있는지 확인하세요.
삼각대
탄창
배선
소프트웨어 및 테스트!
추가 사진들
코드
아두이노 코드
아두이노에 업로드할 코드입니다. 안드로이드 앱으로 제어하든 PC로 제어하든 코드는 동일합니다.
#include <Servo.h> //-----서보 및 변수 선언
Servo recoil_servo;
Servo pan_servo;
Servo tilt_servo;
const byte pan_limit_1 = 0;
const byte pan_limit_2 = 180;
const byte tilt_limit_1 = 65;
const byte tilt_limit_2 = 180;
const byte recoil_rest = 180; // 정지 시 서보 각도
const byte recoil_pushed = 125; // 다트를 밀기 위해 도달해야 할 서보 각도
//-----시리얼 데이터 처리 관련 변수
byte byte_from_app;
const byte buffSize = 30;
byte inputBuffer[buffSize];
const byte startMarker = 255;
const byte endMarker = 254;
byte bytesRecvd = 0;
boolean data_received = false;
//-----모터 타이밍 및 발사 관련 변수
bool is_firing = false;
bool can_fire = false;
bool recoiling = false;
unsigned long firing_start_time = 0;
unsigned long firing_current_time = 0;
const long firing_time = 150;
unsigned long recoil_start_time = 0;
unsigned long recoil_current_time = 0;
const long recoil_time = 2 * firing_time;
const byte motor_pin = 12;
boolean motors_ON = false;
void setup() {
pinMode(motor_pin, OUTPUT);
digitalWrite(motor_pin, LOW);
recoil_servo.attach(9);
pan_servo.attach(10);
tilt_servo.attach(11);
recoil_servo.write(recoil_rest);
pan_servo.write(90);
delay(1000);
tilt_servo.write(105);
Serial.begin(9600);
}
void loop() {
getDataFromPC();
set_motor();
if (data_received) {
move_servo();
set_recoil();
set_motor();
}
fire();
}
void getDataFromPC() {
// 예상 데이터 구조: [시작 바이트, 팬 양, 틸트 양, 모터 켜기, 발사 버튼 눌림, 끝 바이트]
if (Serial.available()) {
byte_from_app = Serial.read();
if (byte_from_app == 255) {
bytesRecvd = 0;
data_received = false;
} else if (byte_from_app == 254) {
data_received = true;
} else {
inputBuffer[bytesRecvd] = byte_from_app;
bytesRecvd++;
if (bytesRecvd == buffSize) {
bytesRecvd = buffSize - 1;
}
}
}
}
void move_servo() {
byte pan_servo_position = map(inputBuffer[0], 0, 253, pan_limit_2, pan_limit_1);
pan_servo.write(pan_servo_position);
byte tilt_servo_position = map(inputBuffer[1], 0, 253, tilt_limit_2, tilt_limit_1);
tilt_servo.write(tilt_servo_position);
}
void set_recoil() {
if (inputBuffer[3] == 1) {
if (!is_firing && !recoiling) {
can_fire = true;
}
} else {
can_fire = false;
}
}
void set_motor() {
if (inputBuffer[2] == 1) {
digitalWrite(motor_pin, HIGH);
motors_ON = true;
} else {
digitalWrite(motor_pin, LOW);
motors_ON = false;
}
}
void fire() {
if (can_fire && !is_firing && motors_ON) {
firing_start_time = millis();
recoil_start_time = millis();
is_firing = true;
}
firing_current_time = millis();
recoil_current_time = millis();
if (is_firing && firing_current_time - firing_start_time < firing_time) {
recoil_servo.write(recoil_pushed);
} else if (is_firing && recoil_current_time - recoil_start_time < recoil_time) {
recoil_servo.write(recoil_rest);
} else if (is_firing && recoil_current_time - recoil_start_time > recoil_time) {
is_firing = false;
}
}
파이썬 파일
실행 파일과 안드로이드 앱은 여기서 다운로드 가능:
회로도
메인 배선도입니다. 배선은 듀폰 커넥터로 연결된 작은 섹션들로 나뉘어 있어 조립이 쉽습니다.
HC-05 블루투스 배선입니다. 아두이노에서 나오는 5V를 HC-05 수신 핀용으로 약 3.3V로 낮추는 전압 분할 회로가 포함되어 있습니다.