본문 바로가기
애완동물을 위한 DIY

3D 인쇄 물고기 피더 RC 보트 컨트롤러

by 굿뜨클랑 2024. 9. 3.
728x90

3D 인쇄 물고기 피더 RC 보트: 혁신적인 낚시 도구

프로젝트 개요

원래 이 프로젝트는 재미있는 원격 조정(RC) 패들 보트를 만드는 것이었습니다. 하지만 개발 과정에서 물고기 모이통을 추가하는 아이디어가 떠올랐습니다. 이 보트는 단순히 호수를 항해하는 것에 그치지 않고, 낚시를 위한 미끼 보드로도 활용될 수 있습니다. 특히 맹그로브와 같은 접근하기 어려운 지역에 물고기가 필요로 하는 펠릿 크기의 음식과 의약품을 배달할 수 있는 기능을 갖추게 됩니다.

기능 및 장점

  1. 이중 기능: 이 RC 보트는 낚시를 위한 미끼를 운반할 수 있는 기능을 갖추고 있어, 낚시 애호가들에게 매우 유용합니다. 보트가 물속에서 미끼를 배출하면, 낚시를 더욱 효과적으로 할 수 있습니다.
  2. 접근성 향상: 맹그로브와 같은 접근이 어려운 지역에서도 쉽게 사용할 수 있습니다. 보트는 사용자가 손쉽게 미끼를 배달할 수 있도록 설계되었습니다.
  3. 3D 인쇄 기술: 프로젝트는 3D 인쇄 기술을 활용하여 보트와 모이통을 제작합니다. 이를 통해 사용자 맞춤형 디자인과 기능을 손쉽게 구현할 수 있습니다.

설계 및 제작 과정

  1. 디자인: 보트의 기본 구조와 모이통의 디자인을 3D 모델링 소프트웨어를 사용하여 설계합니다. 물고기 피더의 크기와 형태는 펠릿이 쉽게 배출될 수 있도록 최적화해야 합니다.
  2. 3D 인쇄: 설계가 완료되면, 3D 프린터를 사용하여 보트와 모이통을 인쇄합니다. 이 과정에서 내수성 재료를 사용하는 것이 중요합니다.
  3. 조립: 인쇄된 부품을 조립하여 RC 보트를 완성합니다. 모터와 배터리, 원격 조정 장치를 설치하여 작동 확인을 합니다.
  4. 테스트: 보트가 호수에서 잘 작동하는지, 미끼를 제대로 배출하는지 테스트합니다. 필요에 따라 조정 및 개선을 진행합니다.

이 프로젝트의 원래 계획은 재미있는 RC 패들 보트를 만드는 것이었습니다. 그러나 프로젝트 중에 물고기 모이통을 추가하는 아이디어가 떠올랐습니다. 즉, 보트는 호수 주변을 타는 것 외에도 낚시를 위한 미끼 보드로도 사용할 수 있으며 맹그로브와 같이 접근하기 어려운 지역에 물고기가 필요로 하는 펠릿 크기의 음식과 의약품을 배달할 수 있습니다.

RC 컨트롤러와 보트는 ESP-NOW 프로토콜을 사용하여 통신하므로 별도의 무선 컨트롤러 회로가 필요하지 않고 구성의 복잡성과 비용이 절감됩니다. 내 테스트에서 약 200m(시선)의 범위를 달성할 수 있었습니다. 또한 보트는 두 개의 물병의 도움으로 떠 있습니다.

나는 또한 이것을 위해 RC 컨트롤러를 만든다. 단일 조이스틱을 사용하여 보트의 움직임을 제어할 수 있으며 조이스틱 상단의 푸시 버튼을 눌러 페이로드를 떨어뜨릴 수 있습니다. RX 및 TX에 대한 페어링이 필요하지 않으며 자동으로 수행됩니다. 측면에 있는 푸시 버튼을 눌러 TX를 켤 수 있습니다. 상단에서 배터리 표시기도 볼 수 있습니다. TX는 USBC를 통해 충전할 수 있습니다.

 

공급

수신기 부품

  1. 8*M3 x 10 밀리미터
  2. 4*M3 x15mm
  3. 12* M3 너트
  4. 4*M4 x10mm 
  5. 4*M4 x 너트
  6. 2*18650 배터리 2500mah
  7. 2 * 핀 JST XH 커넥터 남성 및 여성 (2.54MM 피치)
  8. MT3608 전압 부스터
  9. BMS 5v 부스터
  10. 360도 서보
  11. 4*M4 6mm 널링 나사산 인서트
  12. DRV8833 모터 드라이버
  13. Seeed 스튜디오 샤오 ESP32C3
  14. 2*300 RPM L자형 BO 모터(국제 배송을 찾을 수 없음)
  15. 2.4GHz 안테나
  16. 2 * 물병
  17. 열수축 튜브 키트

 

송신기 부품

  1. 18650 배터리 2500mah
  2. 푸시 버튼
  3. Seeed 스튜디오 샤오 ESP32C3
  4. BMS 5v 부스터
  5. 2.4GHz 안테나
  6. 4축 조이스틱

우리는 이 프로젝트를 위해 일반 서보 모터를 사용하지 않습니다. 이 빌드에는 360도 서보가 필요합니다. 현재 저는 수정된 90° 서보를 사용하고 있습니다. 이 비디오는 수정 방법을 배우는 데 도움이 되었습니다. 그러나 360도 서보를 수정할 필요는 없습니다. 시장에서 사용할 수 있습니다. 부품 목록에 링크를 첨부했습니다.

이 프로젝트에서는 직경이 3인치인 1L 물병을 사용했습니다. 이와 같은 것을 찾을 수 없으면 양쪽 끝이 닫힌 PVC 파이프를 사용할 수도 있습니다. 플로터 홀더를 간단히 재설계하면 이 빌드를 비슷한 모양의 다른 크기의 물병에 적용할 수 있습니다.

 

1단계: Fusion 360에서 설계

수신

텍사스

이 프로젝트는 물병을 중심으로 구축되었습니다. 디자인은 쉬운 3D 프린팅을 위해 여러 수준으로 나뉩니다.

2단계: 3D 프린팅

복잡한 특성으로 인해 물체를 부분적으로 설계했기 때문에 3D 프린팅 후에 조립해야 합니다. 나는 주황색 PLA와 회색 PLA를 사용했습니다. 내 anycubic 프린터에서 모든 모델을 3D 인쇄했습니다. 0.2mm 층 높이 및 30% 충전재

또한 여러 STL 파일을 여러 번 인쇄해야 했습니다

  1. 플로터 클램프 X4
  2. 플로터 엔드 캡 X4
  3. 모터 클램프 X2
  4. 모터 홀더 X2
  5.  X2

remote+ct+v6.step
6.92MB
wheel+v1.stl
1.52MB
screw+holder.stl
0.37MB
payload+cap.stl
0.19MB
motor+holder.stl
0.57MB
motor+clamp.stl
0.26MB
main+boady+cap.stl
0.42MB
holder.stl
2.22MB
frame.stl
0.49MB
floater+end+cap.stl
5.76MB
floater+clamp.stl
0.60MB
battery+cap.stl
0.50MB
battery+holder+.stl
0.77MB

3 단계 : XIAO ESP32C3의 MAC 주소 찾기

송신기(TX)와 수신기(RX) 간의 통신을 위해 ESP-NOW 프로토콜을 사용하고 있습니다. 이를 위해 송신기(TX)는 RX ESP32의 고유한 MAC 주소를 알아야 합니다. MAC 주소를 찾으려면 ESP32C3 수신기(XIAO)에서 다음 코드를 실행해야 합니다. 이 프로그램을 실행하면 MAC 주소가 직렬 모니터에 표시됩니다.

내 MAC 주소는 64:E8:33:8A:22:54입니다.

 

MAC 주소를 찾기 위한 코드

 

#include 
#include 
void readMacAddress(){
uint8_t baseMac[6];
esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, baseMac);
if (ret == ESP_OK) {
    Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
                  baseMac[0], baseMac[1], baseMac[2],
                  baseMac[3], baseMac[4], baseMac[5]);
  } else {
    Serial.println("Failed to read MAC address");
  }
}
void setup(){
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.STA.begin();
  Serial.print("[DEFAULT] ESP32 Board MAC Address: ");
  readMacAddress();
}
void loop(){
}

4 단계 : 플래싱 코드 프로그래밍

코드를 업로드하기 전에 수신기의 MAC 주소인 64:E8:33:8A:22:54를 입력해야 합니다.

그러면 0x64,0xE8,0x33,0x8A,0x22,0x54이 됩니다.

코드의이 줄에 넣으십시오.

 

수신기의 MAC 주소

uint8_t receiverAddress[] = {0x64, 0xE8, 0x33, 0x8A, 0x22, 0x54};

다음은 TX의 전체 코드입니다.

#include<Arduino.h>
#include<esp_now.h>
#include<WiFi.h>


// Define pins for Xiao ESP32C3
#define JOYSTICK_X_PIN 0 // ADC1 channel 1 (GPIO 0)
#define JOYSTICK_Y_PIN 1 // ADC1 channel 2 (GPIO 1)
#define SERVO_BUTTON_PIN 2


// Thresholds for joystick movement
#define JOYSTICK_THRESHOLD 100


// Structure to hold the message data
typedefstructstruct_message {
int xAxis;
int yAxis;
bool servo;
} struct_message;


struct_message message;


// MAC address of the receiver
uint8_t receiverAddress[] = {0x64, 0xE8, 0x33, 0x8A, 0x22, 0x54};


voidsetup(){
    Serial.begin(115200);


// Initialize pins
pinMode(JOYSTICK_X_PIN, INPUT);
pinMode(JOYSTICK_Y_PIN, INPUT);
pinMode(SERVO_BUTTON_PIN, INPUT_PULLUP);


// Initialize WiFi in station mode
    WiFi.mode(WIFI_STA);


// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
        Serial.println("Error initializing ESP-NOW");
return;
    }


// Register peer
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, receiverAddress, 6);
    peerInfo.channel = 0;
    peerInfo.encrypt = false;


// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
        Serial.println("Failed to add peer");
return;
    }
}


voidloop(){
// Read joystick values
int xValue = analogRead(JOYSTICK_X_PIN);
int yValue = analogRead(JOYSTICK_Y_PIN);


// Check for significant movement
    message.xAxis = (abs(xValue - 2048) > JOYSTICK_THRESHOLD) ? xValue : 2048;
    message.yAxis = (abs(yValue - 2048) > JOYSTICK_THRESHOLD) ? yValue : 2048;


// Read button state
    message.servo = !digitalRead(SERVO_BUTTON_PIN);


// Send message via ESP-NOW
esp_now_send(receiverAddress, (uint8_t *)&message, sizeof(message));


// Short delay
delay(100);
}

 

RX 코드

#include<Arduino.h>
#include<esp_now.h>
#include<WiFi.h>
#include<ESP32Servo.h>


// Motor driver pins
#define MOTOR_A1 2
#define MOTOR_A2 3
#define MOTOR_B1 4
#define MOTOR_B2 5


// Servo pin
#define SERVO_PIN 6


Servo myServo;


// Structure to hold the message data
typedefstructstruct_message {
int xAxis;
int yAxis;
bool servo;
} struct_message;


struct_message message;


voidmoveForward(){
digitalWrite(MOTOR_A1, HIGH);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, HIGH);
digitalWrite(MOTOR_B2, LOW);
}


voidmoveBackward(){
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, HIGH);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, HIGH);
}


voidturnLeft(){
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, HIGH);
digitalWrite(MOTOR_B1, HIGH);
digitalWrite(MOTOR_B2, LOW);
}


voidturnRight(){
digitalWrite(MOTOR_A1, HIGH);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, HIGH);
}


voidstopMoving(){
digitalWrite(MOTOR_A1, LOW);
digitalWrite(MOTOR_A2, LOW);
digitalWrite(MOTOR_B1, LOW);
digitalWrite(MOTOR_B2, LOW);
}


// Callback function to receive data
voidOnDataRecv(constesp_now_recv_info_t *recv_info, constuint8_t *incomingData, int len){
memcpy(&message, incomingData, sizeof(message));
}


voidsetup(){
    Serial.begin(115200);


// Initialize motor driver pins
pinMode(MOTOR_A1, OUTPUT);
pinMode(MOTOR_A2, OUTPUT);
pinMode(MOTOR_B1, OUTPUT);
pinMode(MOTOR_B2, OUTPUT);


// Initialize servo
    myServo.attach(SERVO_PIN);


// Initialize WiFi in station mode
    WiFi.mode(WIFI_STA);


// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
        Serial.println("Error initializing ESP-NOW");
return;
    }


// Register receive callback
esp_now_register_recv_cb(OnDataRecv);
}


voidloop(){
// Handle movement based on joystick values
if (message.yAxis < 1500) {
moveForward();
    } elseif (message.yAxis > 2500) {
moveBackward();
    } elseif (message.xAxis < 1500) {
turnLeft();
    } elseif (message.xAxis > 2500) {
turnRight();
    } else {
stopMoving();
    }


// Handle servo activation
if (message.servo) {
        myServo.write(90); // Move servo to 90 degrees
    } else {
        myServo.write(0); // Move servo back to 0 degrees
    }
}

5단계: 송신기와 로버의 배선도

TX의 배선도

 

 

RX의 배선도

 

6단계: MT3608에서 전압 설정

조립하기 전에 MT3608에서 전압을 미리 설정해야 하며, 새 모듈을 구입하는 경우 전위차계를 시계 반대 방향으로 약 20회 이상 돌려야 하며 출력에서 조정된 전압을 얻으면 모듈을 사용할 수 있습니다. 배터리를 VIN+ 및 VIN-에 연결하고 볼륨을 설정합니다.tage는 5v입니다. 멀티미터를 사용하여 OUT+와 OUT-에서 측정한 후 배터리 입력을 제거합니다.

7단계: 로버 조립

7.1 

암 JST 커넥터를 MT3608의 입력에 연결합니다. 길이가 5CM 이상이어야 하는 경우 JST의 왼쪽이 VIN+이고 오른쪽이 VIN-인지 확인하십시오.

7.2

XIAO, 모터 드라이버 및 MT3608을 본체에 붙입니다.

7.3

XIAO, 모터 드라이버 및 MT3608 사이의 모든 와이어를 납땜하고 연결합니다.

7.4

서보를 3D 인쇄 슬롯에 삽입하고 와이어를 Xiao에 납땜합니다.

7.5

안테나 포트를 XIAO에 연결하고 다른 커넥터를 측벽의 구멍에 연결합니다. 허벅지를 코 펜치를 사용하여

7.6

나사를 서보 샤프트에 연결하고 나사 홀더로 고정합니다. 초강력 접착제를 사용하여 나사 홀더를 부착합니다.

7.7

납땜 인두를 사용하여 M4 너트 인서트를 3D 프린터 구멍에 설치합니다.

3가지 위치 모두에서 동일한 작업을 수행합니다.

7.8

홀더를 상단 캡에 붙입니다.

7.9

두 개의 링을 병에 삽입하고 나중에 이동할 수 있어야 하므로 M3 X 10mm 나사로 부분적으로 조입니다.

7.10 

M3 x 15mm 볼트와 너트를 사용하여 본체, 프레임 및 오른쪽을 나사로 고정합니다.

반대쪽에서도 같은 작업을 수행합니다

육각 렌치를 사용하여 링을 조일 수 있습니다.

7.11

BO 모터를 모터 홀더에 삽입하고 두 개의 M3X10mm 볼트와 너트로 고정합니다.

다른 쪽에서도 같은 작업을 수행합니다.

7.12

두 개의 케이블을 함께 꼬아 모터에 납땜한 다음 와이어를 측면 구멍을 통해 배선합니다. 뜨거운 접착제로 구멍을 밀봉하십시오.

다른 쪽에서도 동일한 작업을 수행하여 다음을 수행합니다.

우리는 방금 탐사선의 주 회로 조립을 완료했습니다.

8단계: 배터리 팩

아시다시피 로버의 배선을 완료했지만 이제 전원을 공급해야 합니다. 이를 위해 우리는 배터리 팩을 만들 것입니다. 1S 2p 팩입니다

8.1 

납땜 2 개의 배터리는 전선과 병렬로 연결되어 있습니다.

8.2

수 JST 커넥터를 배터리 캡에 연결합니다.

8.3

이 JST 와이어를 절단하여 배터리 백 +ve 및 -ve에 납땜합니다.

8.4

배터리 팩을 배터리 홀더에 삽입하고 캡을 닫은 다음 배터리 캡을 붙입니다.

JST 커넥터를 납땜하기만 하면 1S BMS를 사용하여 이 배터리 팩을 충전할 수 있습니다

또한 이 JST 커넥터를 사용하여 배터리 팩을 로버에 연결할 수 있습니다

9단계: 최종 로버 조립

9.1

바퀴를 모터 샤프트에 설치합니다. BO 모터와 함께 제공되는 나사를 사용했습니다.

9.2

M4 볼트로 상단 캡을 설치하고 배터리를 제거하여 접근할 수 있습니다.

9.3

수신기 안테나 연결

9.4

3D 프린팅 컵을 병에 설치

9.5

페이로드 캡을 사용하여 페이로드 홀더를 채운 후 닫을 수 있습니다

10단계: 송신기 조립

10.1

조이스틱을 송신기 본체에 설치합니다.

조이스틱 방향이 이 이미지와 비슷한지 확인합니다

10.1

푸시 버튼의 단자 2개를 잘라3D 프린팅 슬롯에 넣고 붙입니다.

10.2

2개의 와이어를 18650 배터리에 납땜

10.3

슬롯에 배터리를 붙이고 배선도에 따라 배선을 완료합니다. BMS 모듈과 XIAO는 접착제를 사용하여 설치됩니다.

또한 조이스틱의 푸시 버튼에 2개의 노란색 전선을 사용할 수 있으며 나머지 전선은 필요하지 않습니다

10.4

Xiao에 TX 안테나를 연결합니다.

상단 구멍에 안테나 포트를 설치합니다.

10.5

후면 캡을 사용하여 TX 인클로저를 닫습니다. 약간의 접착제로 백 캡을 고정합니다.

우리는 방금 TX의 조립을 완료했습니다.

 

11단계: 테스트

 

빌드를 완료했으므로 이제 테스트할 차례입니다. 펠릿 크기의 식품이나 의약품을 페이로드 홀더에 적재하고 상단 캡으로 닫을 수 있습니다. 초기 테스트에서 물에 넣었을 때 균형이 맞지 않는다는 것을 알았습니다. 따라서 플로터 cl을 풀어야 합니다.amp 전체적인 균형을 유지하기 위해 두 물 안정기를 모두 조정해야 합니다.

728x90

댓글