
이 프로젝트의 목표는 로켓의 낙하산 베이에 들어가는 캡슐을 제작하는 것입니다. 이 캡슐은 로켓 발사의 정점에서 방출된 후 독립적으로 지상으로 낙하하며, 영상 SD 카드가 손상되지 않아 영상을 회수할 수 있어야 합니다. 또한 낙하 중 한 축의 회전을 제어하여 안정화하고 주변을 패닝할 수 있어야 합니다.
STEP 1. 준비물
- ESP-32 CAM
- Featherweight Tracker 및 지상국 Madcow Rocketry의 완전한 GPS 시스템
- 14500 배터리 4개
- 18650 배터리
- Teensy 보드
- Adafruit IMU
- 낙하산용 립스톱 나일론
- Pololu 5V Step-Up/Step-Down Voltage Regulator S7V7F5
- PETG 3D 프린팅 소재 10kg 묶음
- SMA 수 커넥터-암 커넥터 앵글형 2개
- 기타 여분의 패스너
- Micro USB-피복 제거 전선 커넥터
- 사이트 글라스
- M3 고무 와셔
- M3 x 90mm
- Rebound 55A - 고속 반발 3D 프린팅 레진 Blu Lava - PC와 유사한 강도의 Tough Resin 및 Roamr TPU Air HR 80A Filament - US
- 드론 모터
- ESC
도구:
- FDM 3D 프린터
- 레진 3D 프린터
- 선반
총비용: 약 $2,233.84
경고: 저렴한 프로젝트가 아닙니다. 전자공학 및 소프트웨어에 대한 기본적인 지식과 경험이 필요합니다.
이 프로젝트는 MoonDAO의 후원을 받았습니다 - https://www.moondao.com/
STEP 2. 시스템 제약 조건 및 기능 요구 사항
요구 사항:
- 약 250g 미만일 것(발사 제공업체의 제약 조건)
- ESP-Cam과 Teensy의 SD 카드 및 트래커를 회수할 수 있도록 할 것(그 외에는 아무것도 중요하지 않으며 소모품으로 취급함)
- 사막과 지구가 제대로 보이고 지구의 곡률을 확인할 수 있는 방향으로 영상을 촬영할 것
- 반응 휠을 사용해 한 축을 안정화할 것. 이상적으로는 낙하 중 제어된 ‘패닝’ 회전을 보여줄 수 있어야 함
다르게 말하면: ((안전하게) 페이로드를 내던지고, SD 카드와 트래커를 보호하며, 그 외에는 아무것도 중요하지 않음
왜 필요한가? -- 로켓과 위성은 제3자 시점의 외부 영상을 촬영하는 경우가 드뭅니다. 그러나 시각적 이미지는 우주 임무가 만들어 내는 가장 강력한 결과물 중 하나입니다. 인상적인 영상은 대중의 상상력을 자극하고 미래의 엔지니어들에게 영감을 주며, 전 세계 사람들이 우주 탐사를 실감할 수 있게 합니다. 인류가 영구적인 달 거주를 향해 나아감에 따라, 가볍고 전개 가능한 영상 시스템은 달, 달-지구 권역 및 그 너머에서의 임무를 기록하는 데 점점 더 중요해질 것입니다. MoonDAO의 사명은 달 정착을 가능하게 하는 데 그치지 않고, 또한 그 미래를 대중이 볼 수 있고 정서적으로 공감할 수 있도록 만드는 것.
STEP 3. 임무 계획
STEP 4. 낙하산 재봉


프로토타입 제작에서는 일자 박음질을 한 번 했고, 더 완성도 높은 디자인에는 젤리롤을 사용했습니다.
STEP 5. 낙하산 테스트

낙하산 테스트의 목적은 계산된 충돌 속도를 실제로 예상할 수 있는지 실험적으로 확인하는 것입니다.
이를 성공적으로 수행하려면 탑재체가 착지할 때까지 종단 속도에 도달할 수 있을 만큼 높은 건물이 필요합니다.
우리의 경우 종단 속도의 99%에 도달하는 데 대략 4.2 s
약 30m 이상의 건물이면 충분하며, 상업용 건물로는 약 7~8층 정도입니다.
우리는 6층짜리 주차장을 찾았고, 높이는 약 20~25m일 것으로 보입니다.
다음은 몇 가지 낙하 테스트와 그 결과입니다:
STEP 6. 전자 장치

이제 비디오 탑재체가 어떻게 작동할지 전기 회로도를 계획할 수 있습니다.
배터리는 서로 분리된 두 그룹으로 구성됩니다. 왼쪽의 7.4V 배터리는 ESC(전자식 속도 제어기)와 BLDC 모터에 전력을 공급하며, 이 모터가 황동 반작용 휠을 회전시킵니다. 오른쪽 배터리는 5V로 강압되어 Teensy와 IMU에 전력을 공급합니다. 파란색 상자는 다음과 같은 승압/강압 컨버터를 나타냅니다: Pololu 5V Step-Up/Step-Down Voltage Regulator S7V7F5 또는 이 제품.
배터리가 최소 4시간 동안(로켓이 발사대에서 대기하는 동안부터 발사, 귀환까지) 작동하려면 어떤 배터리가 필요한지 산정하기 위해 각 부품의 소비 전류를 측정했습니다. 멀티미터에 연결한 뒤 각 부품을 최대 부하로 작동시키고(예: ESP-32 CAM이 사진을 촬영할 때) 표시되는 전류 수치를 확인했습니다.
ESP-32 CAM의 피크 전류는 0.194 Milliamps, 평균 전류는 0.165였습니다.
P=V×I - 5V×0.165A = 0.825W
ESP32-CAM의 평균 소비 전류가 165 mA이고 5V에서 작동하므로 소비 전력은 약 0.8W입니다.
트래커: 80 Milliamps, 0.3 Watts; Teensy: 0.5 Watts
4개의 14500 배터리는 2개씩 병렬 연결한 별도의 배터리 팩 2개로 구성했습니다.
총 4800 mAh이며, 모터에 2400, 트래커·Teensy·카메라에 2400을 할당했습니다.
STEP 7. CAD 설계

다음 CAD를 확인하고 HERE에서 복제하여 Onshape에서 편집하세요.
외부 케이스는 PLA로 출력했습니다.
내부 구조는 Siraya Tech Blu Lava로 출력했습니다.
STEP 8. 프로토타입 제작: 황동 반작용 휠

맞춤형 반작용 휠은 선반을 사용해 황동을 가공하여 크기를 맞춘 뒤, BLDC 드론 모터의 고정자에 접착해 제작했습니다. 이미 드론 모터가 있다면 다양한 종류의 드론 모터를 사용할 수 있습니다.
여러 가지 크기와 무게를 시험해 보았으며, 이는 움직임을 얼마나 세밀하게 제어할 수 있는지에 영향을 줍니다. 반작용 휠의 질량이 제어하려는 대상에 비해 너무 크면 움직임이 매우 끊기고 거칠어집니다.
STEP 9. 프로토타입 제작: 조립

그다음 내부 구조는 Siraya Tech Blu Lava로, 외부는 PLA로 출력했습니다. 외부를 TPU처럼 더 말랑한 소재로 만들어야 하지 않을까 생각할 수도 있지만, 목표는 외부 구조를 깨뜨려 착지 에너지를 흡수하는 것이므로 먼저 깨질 만큼 충분히 단단해야 합니다.
이 프로토타입을 제작할 때는 Teensy에 SD 카드를 연결할 어댑터가 없었다는 것도 알 수 있습니다. 그래서 각 핀을 조심스럽게 납땜해 직접 어댑터를 만들었습니다. 더 나은 방법도 있습니다. 어댑터를 구매하면 됩니다.
STEP 10. 소프트웨어 및 테스트

STEP 11. ESP-32 녹화
ESP-32는 녹화 품질에 한계가 있습니다. 너무 높은 부하를 주면 과열되어 꺼지거나 프레임을 누락하기 시작합니다. 안전을 위해서는 프레임을 한 장씩 SD 카드에 저장하는 것이 훨씬 좋습니다. 그러면 발사 또는 하강 중 문제가 발생하더라도 문제가 생기기 전까지의 모든 프레임이 저장되어 있습니다.
확인한 결과:
1600 x 1200이 최대 해상도이지만 초당 2프레임만 촬영할 수 있고 모션 블러와 심한 롤링 셔터 효과가 발생합니다.
20 fps에서는 800 x 600을 적절한 절충안으로 선택했습니다:
#include "esp_camera.h"
#include "FS.h"
#include "SD_MMC.h"
#include "esp_wifi.h"
#include "esp_bt.h"
#include <WiFi.h>
// AI Thinker ESP32-CAM pin config
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
uint32_t photo_count = 0;
char path[100];
char directory[50];
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting photo capture mode...");
// Disable WiFi + Bluetooth
WiFi.mode(WIFI_OFF);
esp_wifi_stop();
btStop();
delay(100);
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sccb_sda = SIOD_GPIO_NUM;
config.pin_sccb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
// ⚡ Faster pipeline
config.frame_size = FRAMESIZE_SVGA; // 800x600 (faster than XGA)
config.jpeg_quality = 14; // smaller files → faster writes
config.fb_count = 2; // smoother capture
if (esp_camera_init(&config) != ESP_OK) {
Serial.println("Camera init failed");
return;
}
Serial.println("Camera init success");
// =========================
// 📸 AUTO EXPOSURE + FAST SHUTTER BIAS
// =========================
sensor_t * s = esp_camera_sensor_get();
// Auto exposure ON
s->set_exposure_ctrl(s, 1);
// 🔥 Faster exposure behavior (less blur)
s->set_aec2(s, 1);
// Slightly darker → shorter exposure
s->set_ae_level(s, -2);
// Controlled gain
s->set_gain_ctrl(s, 1);
s->set_agc_gain(s, 8);
s->set_gainceiling(s, (gainceiling_t)2);
// Color tuning
s->set_whitebal(s, 1);
s->set_awb_gain(s, 1);
s->set_wb_mode(s, 1); // sunny
// Image tuning
s->set_saturation(s, 2);
s->set_contrast(s, 2);
s->set_sharpness(s, 1);
s->set_denoise(s, 1);
// =========================
if (!SD_MMC.begin("/sdcard", true)) {
Serial.println("SD failed");
return;
}
Serial.println("SD card ready");
}
void loop() {
camera_fb_t * fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Capture failed");
delay(50);
return;
}
// Directory batching
snprintf(directory, 45, "/%05u", photo_count++ / 1000);
if (!SD_MMC.exists(directory)) {
SD_MMC.mkdir(directory);
}
snprintf(path, 95, "%s/%08u.jpg", directory, millis());
File file = SD_MMC.open(path, FILE_WRITE);
if (file) {
file.write(fb->buf, fb->len);
file.close();
} else {
Serial.println("File write failed");
}
esp_camera_fb_return(fb);
// 🎬 Faster capture (~15–25 FPS depending on SD)
delay(50);
}
원문: https://www.instructables.com/Deployable-Video-Payload-From-Rocket/