아두이노 메가와 블루투스로 제어하는 프로그래머블 3축 로봇 암 키트
프로젝트 개요
산업용 로봇의 기본 기능(티칭/재생)을 시뮬레이션하는 3~4축 로봇 암 제어 시스템을 아두이노 메가 2560으로 구현했습니다. 로컬(포텐셔미터)과 원격(안드로이드 앱, 블루투스) 두 가지 제어 모드를 지원하며, 위치를 기록(프로그래밍)하고 순차 실행(런)하는 기능을 제공합니다. LED, LCD, 부저로 상태 피드백을 주고, 원격에서 알람 트리거도 가능합니다.
사양 및 주요 특징
- 지원 암: 3축(SainSmart) 또는 4축(MeArm) 선택 가능, 파라미터 세트 별도 관리
- 제어 모드: LOCAL(포텐셔미터 4개) ↔ REMOTE(안드로이드 앱 슬라이더) 런타임 전환 가능
- 기본 기능:
- Program: 현재 위치를 단계(Step)로 기록 (최대 100스텝)
- Run: 기록된 스텝 순차 실행, ABORT로 중단
- 피드백: 컬러 LED 4개(빨강/파랑/초록/노랑), 16x2 RGB 백라이트 LCD, 부저
- 원격 앱: MIT App Inventor 2로 개발, 구글 플레이 'MJRoBot Arduino Robot Arm Control' 무료 배포
하드웨어 구성
| 부품 | 수량 | 비고 |
| 아두이노 메가 2560 | 1 | 다수 I/O 확보(우노 사용 시 포트 확장 필요) |
| SainSmart 3축 팔레타이징 로봇 암 키트 | 1 | 서보 3개 포함 (MG995 등 저가 서보 주의) |
| MeArm 4축 DIY 로봇 암 키트 | 1 | 선택 사항, 4축 지원 시 사용 |
| HC-06 블루투스 모듈 | 1 | 시리얼 통신(9600bps), 안드로이드와 연동 |
| 16x2 RGB 백라이트 LCD (아다프루트) | 1 | I2C 또는 병렬 인터페이스 |
| 로터리 포텐셔미터 10kΩ | 4 | 로컬 모드에서 각 축 위치 입력용 |
| 택트 스위치 12mm | 3 | Program, Run, Abort/Mode 전환용 |
| LED (적/청/녹/황) | 각 1 | 상태 표시용 |
| 안드로이드 디바이스 | 1 | 원격 제어 앱 실행용 |
| 서보용 외부 전원 (5~6V, 2A+), 470uF 커패시터 | - | 아두이노와 분리 필수, 그라운드 공통 연결 |
로봇 암 자유도(Degrees of Freedom) 정의
- Base (Waist): 좌우 회전 (0~180°)
- Shoulder: 상하 들어올림
- Elbow: 전후 뻗기/당기기
- Gripper (Claw): 집게 열기/닫기 (4축 모델만)
회로도

서보 전원은 별도 5~6V 공급, 아두이노와 그라운드 공통. 서보 노이즈 억제를 위해 VCC-GND 사이 470uF 전해 콘덴서 권장. 블루투스 HC-06은 메가 하드웨어 시리얼(Serial1~3 중 하나) 또는 소프트웨어 시리얼로 연결.
소프트웨어 구조 (모듈화된 4개 파일)
1. ArmDefine.h - 상수 및 파라미터 정의
// MeArm 4-DOF 파라미터 예시
#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60
#define maxGrip 45 #define maxBase 170 #define maxShou 180 #define maxElbw 150
#define midGrip 30 #define midBase 87 #define midShou 138 #define midElbw 100
/* SainSmart 3-DOF 파라미터 예시 (주석 처리)
#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0
#define maxGrip 125 #define maxBase 150 #define maxShou 155 #define maxElbw 0
#define midGrip 100 #define midBase 90 #define midShou 90 #define midElbw 0
*/
// 핀 할당, 디바운스 시간, LCD/LED/부저 핀 등 추가 정의
캘리브레이션 요령: 포텐셔미터를 중앙에 두고 PWM 기본값(0/126/255)으로 시작한 뒤, 각 포트를 돌리며 기계적 한계 없이 부드럽게 동작하는 최소/최대 각도를 찾아 위 상수에 반영하세요.
2. MJRoBot_Arm_Robot_Task_Prgm.ino - 메인 로직
// 위치 저장 배열 (최대 100 스텝)
int gripPosition[100], basePosition[100], shouPosition[100], elbwPosition[100];
int positionIndex = 0;
void loop() {
checkBTcmd(); // 블루투스 명령 수신 파싱
defineLocalRemote(); // LOCAL/REMOTE 모드 전환, 알람 처리
execTaskCmd = digitalRead(execTaskPin);
if (execTaskCmd == HIGH || command == "runon") {
RunProgram(); // 기록된 시퀀스 실행
} else {
recArmPosition(); // 위치 기록 모드 (포텐셔미터/슬라이더 읽기)
}
command = "";
}
void RunProgram() {
// LED/부저 준비 신호, ExecuteTask() 호출
}
void ExecuteTask() {
for (positionIndex = 0; positionIndex < totalSteps; positionIndex++) {
armPosition(gripPosition[positionIndex], basePosition[positionIndex],
shouPosition[positionIndex], elbwPosition[positionIndex]);
// 스텝 간 딜레이, 중단 버튼 체크 등
}
}
3. General_Functions.ino - 공통 유틸리티
checkBTcmd(): 블루투스 시리얼 버퍼에서 문자 단위 수신 → 문자열 조립 → command 변수에 저장
beep(pin, freq, ms): 부저 톤 생성
debounce(pin): 기계식 버튼 채터링 제거 (밀리초 단위 다중 확인)
4. Arm_Ctrl_and_Display.ino - 하드웨어 제어 및 표시
readPotenciometers(): 4개 포텐셔미터 아날로그 읽기 → 서보 각도 매핑 → armPosition() 호출
readSliders(): 블루투스 수신 슬라이더 값(0~180) 파싱 → armPosition() 호출
armPosition(grip, base, shoulder, elbow): 각 서보에 write()로 목표 각도 전송, 기계적 지연 고려한 딜레이 포함
- LCD/시리얼 모니터 상태 표시, LED/부저 알림 함수들
안드로이드 앱 (MIT App Inventor 2)
- 블루투스 클라이언트 컴포넌트로 HC-06과 페어링/통신
- UI: 4개 슬라이더(각 축), Program/Run/Abort 버튼, Local/Remote 토글, Alarm 버튼
- 프로토콜: 단순 텍스트 명령 전송 예:
"base:90", "runon", "remote", "alarm"
- 소스(.aia) 및 APK: GitHub 저장소 참고
전체 소스 코드 및 리소스
GitHub: Mjrovai/MJRoBot-Programmed-Arm
- 아두이노 스케치 4개 파일 (.ino, .h)
- 회로도 PNG (Arm Robot Diagram.png)
- 앱 인벤터 프로젝트 파일 (.aia)
- 조립 가이드 동영상 링크
제작 시 주의사항
- 서보 선택: 저가 MG995 등은 기어 마모/진동 심함 → 메탈 기어 서보(MG996R, DS3218 등) 권장
- 전원 분리: 서보 구동 전류가 크므로 아두이노 레귤레이터 과열 방지 위해 반드시 별도 전원 사용
- 디바운싱 필수: 16MHz 클럭에서 버튼 읽기 빈도 높음 → 소프트웨어 디바운싱(본 코드 적용) 또는 하드웨어 RC 필터 병행
- 아날로그/디지털 서보 구분: 표준
Servo.h는 50Hz(아날로그) 기준, 디지털 서보(300Hz) 사용 시 라이브러리 수정 필요
- EEPROM 저장 확장: 현재는 휘발성 배열 저장 → 전원 차단 시 프로그램 소멸. EEPROM 라이브러리로 영구 저장 구현 권장
결론
본 프로젝트는 로봇 암의 티칭/플레이백 기초를 저비용으로 체험할 수 있는 훌륭한 교육용 플랫폼입니다. 블루투스 원격 제어와 안드로이드 앱 개발 경험까지 덤으로 얻을 수 있습니다. 더 많은 프로젝트는 블로그 MJRoBot.org를 방문하세요.