휴대용 거리 감지기: HC-SR04, 18650 배터리, 3D 프린트 케이스의 아두이노 나노 DIY 키트
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 나노 R3 |
1 |
| 초음파 센서 HC-SR04 |
1 |
| 18650 리튬이온 배터리 |
1 |
| TP4056 리튬이온 충전 모듈 |
1 |
| DC-DC 5V 부스트 컨버터 |
1 |
| 부저 |
1 |
| 로터리 포텐셔미터 |
1 |
| 슬라이드 스위치 |
1 |
| LED (일반) |
4 |
빨강 2, 초록 1, 파랑 1 |
| 저항 330Ω |
2 |
| M3 캡 헤드 볼트 10mm |
4 |
| 전선 (18 AWG) |
1 |
| 3D 프린트 부품 (인클로저 3파츠) |
1 |
| 나사 어댑터 (삼각대 마운트용) |
1 |
필요한 도구 및 장비
- 3D 프린터 (아넷 A8 사용)
- 납땜 인두
- 핫글루 건
- 드레멜 또는 로터리 툴
앱 및 온라인 서비스
- 아두이노 IDE (NewPing 라이브러리 필요)
- Simplify3D 또는 원하는 슬라이서
프로젝트 개요
소개
레만 대학 운동과학과에서 웨이트 트레이닝 연구 중 가동 범위(ROM) 불일치로 데이터 왜곡 문제가 발생했습니다. 머신이나 대형 웨이트 운동 시 완전한 가동 범위를 감지하는 장치 제작 의뢰를 받았습니다.
장치 요구 조건:
- 감지 거리 조절 가능
- 머신에 영구 고정하지 않음
- 삼각대 호환
- 무선 (배터리 구동)
코드
NewPing 라이브러리 필요 (하단 코드 참조).
부저 주파수와 상/하한 거리는 전역 변수로 수정 가능. 상/하한은 센서가 읽는 최소/최대 거리로, 포텐셔미터 아날로그 값[0,5]V에 매핑됩니다.
int frequency = 700; // Hz
int lower_bound = 60; // mm
int upper_bound = 200; // mm
부팅 시 부저 3회 울림으로 정상 부팅 알림(setup()). loop()에서 초음파 센서 데이터를 지속 요청해 포텐셔미터로 설정한 임계값과 비교.
3D 프린팅
파일은 씽기버스에 업로드됨(하단에 통합 파일도 있음). CAD 사용법은 생략. 3D 프린팅 한계 고려해 설계: 45° 챔퍼로 오버행 최소화, 서포트 재료 절감. 넉넉한 클리어런스로 다양한 프린터 보정에서도 결합 가능.
출력 시간 (참고):
- 상단 파츠: 2시간 40분
- 하단 파츠: 2시간 20분
- 노브: 20분
조립
회로도는 페이지 하단 참조. 배선 전 부품끼리 끼워 맞춰 핏 확인.
구형 IDE 케이블 전선 재활용. 전선 그룹을 묶은 채로 벗겨내 배선 정리에 도움.
대부분 전자부품이 출력 파츠 한쪽에 장착되므로 배선 라우팅과 관리에 신경 써야 합니다.
TP4056 보드의 SMD 표시 LED를 떼어내고 연장선과 3mm 관통형 LED로 교체 (보드 내장 전류제한 저항 활용).
아두이노 나노 GND 패드 2개뿐이라 스트립보드로 GND 확장. 5V 라인도 동일하게 확장.
스트립보드 구리 패턴을 끊어(빨간 X 표시) 5V와 GND 단락 방지. 보드 전체를 자를 필요 없고 위쪽 구리만 끊으면 됨.
케이스 밖에서 배선하며 틈틈이 케이스에 넣어 전선 길이/간섭 확인.
포텐셔미터 축 6mm 절단해 돌출 최소화.
18650 직납은 잘못된 관행(과열 시 손상/화재 위험). 스폿 용접으로 알루미늄 스트립 연결이 정석.
핫글루로 전자부품 고정(부끄럽지만 프로토타입이라 용인). 정식 제품은 기계적 체결 필수.
요약 및 개선점
- 초음파 대신 IR 센서 선호 (좁은 FOV, 단 최대 거리 ~90cm로 짧음). 초음파 실험 후 알게 된 사실.
- 2차 버전: 18650 대신 리포 배터리, 큰 너트 어댑터 대신 일반 1/4" 삼각대 너트, 커스텀 PCB로 부피 절반 축소.
- 컨셉부터 인계까지 2주 만에 만든 프로토타입치곤 만족.
프로젝트 향후 계획
초음파 센서 실험 중 한계 발견: FOV 약 ±15°(총 30°)로 객체가 센서 정위치 전에 감지돼 오차 발생. 객체 면이 음파와 수직이 아니면 반파 수신 실패.
초기엔 장치를 바닥에 두고 바벨 플레이트가 임계값 아래로 내려올 때 감지하려 했으나(고정 센서, 이동 트리거), 동료가 시스템 반전 제안: 센서를 이동하는 바에 장착해 바닥을 향하게 하면 바닥이 트리거가 되어 FOV 문제 해결.
이 제안은 구현도 쉽고 훌륭한 해결책. 주문한 1/4" 삼각대 너트 어댑터에 1/4"→3/8" 어댑터와 3/8"→1/4" 어댑터가 모두 들어있어 후자가 활용 가능.
드레멜 없이 3D 모델링 시작해 삼각대 어댑터 전체를 고려하다 18650과 합쳐 무거워짐. 2번째 어댑터 잘라낸 뒤 마운트 재설계 예정. 일주일 후 이어서 진행하겠습니다. 그때까지는 현재 버전도 작동합니다!
코드
RangeDetectionDevice.ino Arduino
/** Viktor Silivanov 3/22/2018 Portable distance detection device using the HC-SR04 Ultrasonic sensor with distance adjustment for triggering the buzzer. **/
//******************** Libraries ****************************************************************************************************************************************************************************************************************
#include <NewPing.h>
//******************** Pins ********************************************************************************************************************************************************************************************************************
//Analog Pins
#define wiper A5
//Digital Pins
#define echo 2
#define trig 3
#define ON_LED 7
#define buzzer 8
#define buzzer_LED 9
//******************** Global Variables **********************************************************************************************************************************************************************************************************
//User Modification Allowed
int frequency = 700; //Frequency in Hz
int lower_bound = 60; //Distance in mm
int upper_bound = 200; //Distance in mm
//Do Not Modify
int buzz_time = 250;
int buzz_delay = 280;
int max_distance = 400;
int i = 0;
int distance;
int threshold;
NewPing sonar(trig, echo, max_distance);
//******************** Setup ********************************************************************************************************************************************************************************************************************
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(buzzer_LED, OUTPUT);
pinMode(ON_LED, OUTPUT);
digitalWrite(ON_LED, HIGH);
while(i < 3){
digitalWrite(buzzer_LED, HIGH);
tone(buzzer, frequency, buzz_time);
delay(buzz_delay);
i++;
}
digitalWrite(buzzer_LED, LOW);
}
//******************** Runs Endlessly ************************************************************************************************************************************************************************************************************
void loop() {
distance = sonar.ping_cm();
threshold = analogRead(wiper);
threshold = map(threshold, 0, 1023, lower_bound, upper_bound);
if(distance != 0 && distance < threshold){
tone(buzzer, frequency);
digitalWrite(buzzer_LED, HIGH);
} else{
noTone(buzzer);
digitalWrite(buzzer_LED, LOW);
}
//serial_test(); // 시리얼 모니터 디버깅용 주석 해제
}
//******************** Test Function ************************************************************************************************************************************************************************************************************
void serial_test(){
Serial.print("Ping: ");
Serial.print(distance);
Serial.println("cm");
Serial.print("Range: [");
Serial.print(lower_bound);
Serial.print(", ");
Serial.print(upper_bound);
Serial.println("] cm");
Serial.print("Threshold: ");
Serial.print(threshold);
Serial.println("cm");
delay(100);
}
커스텀 파트 및 인클로저
3개 파츠 통합 파일로 저장됨
회로도