이 튜토리얼에서는 이전 영상에서 만든 메카넘 휠 로봇 플랫폼과 3D 프린팅 로봇 팔(이전 아두이노 프로젝트)을 연동해 자동으로 작동하게 만드는 방법을 보여드립니다.
다음 영상을 시청하거나 아래 작성된 튜토리얼을 읽어보세요.
개요
메카넘 휠 로봇은 이전 영상에서 설명한 것과 같은 커스텀 안드로이드 앱으로 제어합니다. 여기에 로봇 팔 제어 버튼이 추가됐습니다.
원래 로봇 팔 제어 앱은 슬라이더로 관절을 제어했는데, 팔 안정성에 문제가 있었습니다. 이번 방식이 훨씬 잘 작동하므로, 업데이트된 로봇 팔 제어 앱과 아두이노 코드를 원래 로봇 팔 프로젝트에도 제공하겠습니다.
이 로봇의 가장 멋진 기능은 움직임을 저장했다가 자동으로 반복 실행하는 기능입니다.
Save 버튼으로 각 단계의 모터 위치를 저장합니다. Run 버튼을 누르면 저장된 움직임을 반복 실행합니다.
아두이노 로봇 제작
메카넘 휠 플랫폼은 이미 조립된 상태입니다(자세한 내용은 이전 영상 참고).
3D 프린팅된 로봇 팔 부품과 서보 모터가 준비됐으니 조립해보겠습니다. 이 프로젝트의 3D 모델입니다.
Thangs에서 3D 모델을 찾아 다운로드하거나 브라우저에서 탐색할 수 있습니다.
Thangs에서 3D 모델 다운로드.
STL 파일(3D 프린팅용):
로봇 팔의 첫 번째 서보(요 축)는 메카넘 휠 플랫폼의 상단 커버에 직접 장착합니다.
위치를 표시하고 10mm 드릴로 여러 구멍을 뚫었습니다.
줄로 구멍을 뚫고 서보 장착용 개구부를 다듬었습니다. M3 볼트와 너트 4개로 서보를 상단 플레이트에 고정했습니다.
이 서보의 출력 샤프트에 서보 액세서리로 제공되는 원형 혼을 이용해 로봇 팔의 허리(waist) 파트를 연결합니다. 그런데 이대로면 파트가 플레이트에서 약 8mm 위에 떠 있게 됩니다. 그래서 8mm MDF 보드 두 조각을 대 허리 파트가 그 위를 슬라이드하며 관절이 더 안정되게 했습니다.
원형 혼은 서보와 함께 제공되는 탭핑 나사로 허리 파트에 고정하고, 서보 샤프트에는 제공되는 볼트로 고정합니다.
다음은 어깨(shoulder) 서보입니다. 제자리에 놓고 3D 프린팅 파트에 탭핑 나사로 고정합니다.
원형 혼을 다음 파트에 끼우고, 두 파트를 서보 출력 샤프트의 볼트로 서로 고정합니다.
파트 고정 전에 서보가 전체 동작 범위를 가질 수 있는지 확인해야 합니다. 여기에 고무줄을 추가해 어깨 관절을 보조했습니다. 이 서보가 나머지 팔과 페이로드 무게를 지탱해야 하기 때문입니다.
비슷한 방식으로 나머지 로봇 팔을 조립합니다.
그리퍼(gripper) 메커니즘을 조립합니다. SG90 서보 모터로 제어하며, 먼저 커스텀 설계된 기어 링크를 서보에 장착합니다. 반대쪽에 또 다른 기어 링크를 짝지어 M4 볼트와 너트로 고정합니다. 사실 모든 링크는 M4 볼트와 너트로 연결됩니다.
그리퍼 3D 모델의 구멍이 원래 3mm인데 M3 볼트가 부족해 4mm 드릴로 확장해 M4 볼트를 사용했습니다.
그리퍼 메커니즘 조립 완료 후 마지막 서보에 고정하면 로봇 팔 완성입니다.
케이블 정리를 했습니다. 서보 선들을 로봇 팔의 전용 홀들을 통과시켰습니다. 상단 플레이트에 10mm 드릴로 구멍을 뚫어 선들이 통과하게 했습니다.
케이블 타이로 모든 선을 묶고, 이제 아두이노 보드에 연결만 하면 됩니다.
아두이노 로봇 회로도
이 프로젝트의 회로도와 연결 방법입니다.
필요한 부품:
스테퍼 모터 – NEMA 17
DRV8825 스테퍼 드라이버
MG996R 서보 모터
SG90 마이크로 서보 모터
HC-05 블루투스 모듈
리튬폴리머 배터리
아두이노 메가 보드
이전 튜토리얼에서 메카넘 휠 로봇 부분의 작동 원리와 커스텀 PCB 제작 과정을 설명했습니다.
이 PCB에 5V 전압 레귤레이터(LM350, 최대 3A)를 포함시켰습니다. 서보 모터가 5V로 동작하므로 이를 위해 추가했습니다. 로봇 팔의 6개 서보가 2~3A 전류를 소모할 수 있는데, 레귤레이터가 감당은 하지만 매우 뜨거워집니다.
그래서 방열판을 달고, 방열판만으로는 부족해 소형 12V DC 팬으로 강제 냉각했습니다.
서보 신호선은 아두이노 디지털 핀 5~10번에 연결하고, 전원은 PCB의 5V 핀 헤더에서 공급했습니다. 모든 선을 플랫폼 내부로 밀어 넣고 상단 플레이트를 너트 두 개로 고정했습니다.
이제 프로젝트 조립이 완료됐습니다.
아두이노 코드
아두이노 코드와 안드로이드 앱 작동 원리를 살펴보겠습니다. 코드가 길어 이해를 돕기 위해 섹션별로 나누어 설명하고, 마지막에 전체 소스 코드를 제공합니다.
먼저 6개 서보, 4개 스테퍼 모터, 블루투스 통신을 정의하고 프로그램에 필요한 변수들을 선언합니다. setup에서 스테퍼 최대 속도 설정, 서보 연결 핀 정의, 블루투스 통신 시작, 로봇 팔 초기 위치 설정 등을 합니다.
초기 설정 코드
#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Servo.h>
Servo servo01; Servo servo02; Servo servo03;
Servo servo04; Servo servo05; Servo servo06;
SoftwareSerial Bluetooth(A8, 38); // 아두이노(RX, TX) - HC-05 블루투스(TX, RX)
// 스테퍼 모터 및 핀 정의
AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2
AccelStepper RightBackWheel(1, 44, 45); // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4
#define led 14
int wheelSpeed = 1500;
int lbw[50], lfw[50], rbw[50], rfw[50]; // 위치/스텝 저장용 배열
int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // 현재 위치
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // 이전 위치
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // 저장용
int speedDelay = 20;
int index = 0;
int dataIn;
int m = 0;
void setup() {
// 스테퍼 초기 최대 속도 설정
LeftFrontWheel.setMaxSpeed(3000);
LeftBackWheel.setMaxSpeed(3000);
RightFrontWheel.setMaxSpeed(3000);
RightBackWheel.setMaxSpeed(3000);
pinMode(led, OUTPUT);
servo01.attach(5); servo02.attach(6); servo03.attach(7);
servo04.attach(8); servo05.attach(9); servo06.attach(10);
Bluetooth.begin(38400); // 블루투스 모듈 기본 보드레이트
Bluetooth.setTimeout(5);
delay(20);
Serial.begin(38400);
// 로봇 팔 초기 위치로 이동
servo1PPos = 90; servo01.write(servo1PPos);
servo2PPos = 100; servo02.write(servo2PPos);
servo3PPos = 120; servo03.write(servo3PPos);
servo4PPos = 95; servo04.write(servo4PPos);
servo5PPos = 60; servo05.write(servo5PPos);
servo6PPos = 110; servo06.write(servo6PPos);
}
loop 섹션에서는 수신 데이터가 있는지 확인하는 것으로 시작합니다.
// 수신 데이터 확인
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.read(); // 데이터 읽기
이 데이터는 스마트폰/안드로이드 앱에서 옵니다. 앱이 어떤 데이터를 보내는지 봅시다. 안드로이드 앱은 MIT App Inventor로 만들었습니다. 적절한 이미지를 배경으로 한 단순 버튼들로 구성됩니다.
앱 블록을 보면 버튼 클릭 시 1바이트 숫자를 전송하는 것만 합니다.
클릭된 버튼에 따라 아두이노에 무엇을 할지 지시합니다. 예를 들어 '2'를 수신하면 moveForward() 커스텀 함수를 호출해 메카넘 휠 플랫폼을 전진시킵니다.
if (dataIn == 2) { m = 2; }
if (m == 2) { moveForward(); }