스마트폰 앱으로 제어하는 유압 크레인: 아두이노 우노와 블루투스 HC-05
부품 및 준비물
| 부품 | 수량 |
| 아두이노 우노 | 1 |
| HC-05 블루투스 모듈 | 1 |
| 브레드보드 | 1 |
| 300 RPM 기어드 DC 모터 | 8 |
| 10ml 주사기 (유압 실린더용) | 8 |
| 아쿠아리움/수액 호스 | 1 |
| 두꺼운 골판지 | 1 |
| 너트와 볼트 | 1세트 |
| 6mm 합판 | 2 |
| 기어드 모터용 바퀴 | 4 |
| 양모 바늘 (주사기 피스톤 연결용) | 2 |
| L298N 듀얼 H-브리지 드라이버 | 1 |
필요 도구
- 납땜 인두
- 드릴 머신
- 정밀 칼
- M-실 (에폭시 퍼티)
사용 앱 및 서비스
- MIT App Inventor 2 (제공된 .apk 파일 사용)
프로젝트 개요
기존에는 수동 유압 로봇팔 또는 앱 제어 로봇팔만 있었는데, 이 프로젝트는 유압 구동과 앱 제어를 결합한 하이브리드 방식입니다.
사전 지식
아두이노 기초 코딩 지식이 필요합니다.
HC-05 블루투스 모듈 연결
L298N 모터 드라이버 핀맵
- 1번 드라이버: [ENA, IN1, IN2 = 모터 A (베이스)], [ENB, IN3, IN4 = 모터 B (숄더)]
- 2번 드라이버: [ENA, IN1, IN2 = 모터 A (엘보)], [ENB, IN3, IN4 = 모터 B (그리퍼)]
- 3번 드라이버: [IN1, IN2 = 오른쪽 바퀴], [IN3, IN4 = 왼쪽 바퀴] (로코모션용)
- ENA/ENB는 속도 제어용 (본 프로젝트에서는 HIGH/LOW로만 제어)
전원 투자 전 모든 부품의 그라운드가 공통으로 연결되었는지 반드시 확인하세요.
소스 코드 (hydraulic.ino)
// 1번 드라이버: 베이스(2,3), 숄더(4,5) - 코드상 핀 번호 확인 필요
int m1IN1 = 2, m1IN2 = 3, m1IN3 = 4, m1IN4 = 5;
int m1ENA = 6, m1ENB = 7;
// 2번 드라이버: 엘보(8,9), 그리퍼(10,11)
int m2IN1 = 8, m2IN2 = 9, m2IN3 = 10, m2IN4 = 11;
int m2ENA = 12, m2ENB = 13;
// 3번 드라이버: 로코모션 (아날로그 핀 사용)
int m3IN1 = 14, m3IN2 = 15, m3IN3 = 16, m3IN4 = 17; // A0~A3
int m3ENA = 18, m3ENB = 19; // A4, A5 (PWM 속도 제어 가능)
void setup() {
// 모든 핀 출력 모드 설정
for (int p = 2; p <= 19; p++) pinMode(p, OUTPUT);
Serial.begin(9600);
}
void loop() {
char cmd = '0';
while (Serial.available() > 0) {
cmd = Serial.read();
delay(10);
}
switch (cmd) {
case '6': // 숄더 업
digitalWrite(m1IN3, HIGH); digitalWrite(m1IN4, LOW);
digitalWrite(m1ENA, HIGH); digitalWrite(m1ENB, HIGH);
break;
case '5': // 숄더 다운
digitalWrite(m1IN3, LOW); digitalWrite(m1IN4, HIGH);
digitalWrite(m1ENA, HIGH); digitalWrite(m1ENB, HIGH);
break;
case '1': // 엘보 업
digitalWrite(m2IN3, HIGH); digitalWrite(m2IN4, LOW);
digitalWrite(m2ENA, HIGH); digitalWrite(m2ENB, HIGH);
break;
case '2': // 엘보 다운
digitalWrite(m2IN3, LOW); digitalWrite(m2IN4, HIGH);
digitalWrite(m2ENA, HIGH); digitalWrite(m2ENB, HIGH);
break;
case '8': // 그리퍼 닫기
digitalWrite(m2IN1, HIGH); digitalWrite(m2IN2, LOW);
digitalWrite(m2ENA, HIGH); digitalWrite(m2ENB, HIGH);
break;
case '7': // 그리퍼 열기
digitalWrite(m2IN1, LOW); digitalWrite(m2IN2, HIGH);
digitalWrite(m2ENA, HIGH); digitalWrite(m2ENB, HIGH);
break;
case '3': // 베이스 시계방향
digitalWrite(m1IN1, HIGH); digitalWrite(m1IN2, LOW);
digitalWrite(m1ENA, HIGH); digitalWrite(m1ENB, HIGH);
break;
case '4': // 베이스 반시계방향
digitalWrite(m1IN1, LOW); digitalWrite(m1IN2, HIGH);
digitalWrite(m1ENA, HIGH); digitalWrite(m1ENB, HIGH);
break;
case '9': // 전체 정지
for (int p = 2; p <= 19; p++) digitalWrite(p, LOW);
break;
case 'A': // 전진
digitalWrite(m3IN1, HIGH); digitalWrite(m3IN2, LOW);
digitalWrite(m3IN3, HIGH); digitalWrite(m3IN4, LOW);
digitalWrite(m3ENA, HIGH); digitalWrite(m3ENB, HIGH);
break;
case 'D': // 후진
digitalWrite(m3IN1, LOW); digitalWrite(m3IN2, HIGH);
digitalWrite(m3IN3, LOW); digitalWrite(m3IN4, HIGH);
digitalWrite(m3ENA, HIGH); digitalWrite(m3ENB, HIGH);
break;
case 'B': // 우회전
digitalWrite(m3IN1, LOW); digitalWrite(m3IN2, HIGH);
digitalWrite(m3IN3, HIGH); digitalWrite(m3IN4, LOW);
digitalWrite(m3ENA, HIGH); digitalWrite(m3ENB, HIGH);
break;
case 'C': // 좌회전
digitalWrite(m3IN1, HIGH); digitalWrite(m3IN2, LOW);
digitalWrite(m3IN3, LOW); digitalWrite(m3IN4, HIGH);
digitalWrite(m3ENA, HIGH); digitalWrite(m3ENB, HIGH);
break;
}
}
제작 팁 (Custom Parts)
- M-실로 모터 샤프트와 너트 고정
- 주사기 피스톤에 너트를 M-실로 고정하여 모터 회전 ↔ 피스톤 직진 운동 변환
- 모터 정회전 시 피스톤 밀어냄, 역회전 시 당김
- 유압 호스로 주사기들 연결 (공기 방울 제거 필수)
동작 영상: YouTube 링크