본문 바로가기

Project/Robot Arm

[Robot Arm] 아두이노 + SG90/HS-5645MG 서보모터로 로봇팔 만들기 (TRARM02)

 

GO TO INDEX

 

1. 설명

아두이노와 SG90 서보모터2개, HS-5645MG 서보모터 3개를 이용한 로봇암 제작 및 제어 

 

2. 시스템

1) 시스템 구성

 

2) 모듈 구성

모듈 설명
TRUSERCON02 TRARM02 로봇팔 모듈 제어를 위한 사용자 컨트롤 모듈
- 가변저항 10kOhm 5EA 사용
TRMCU01 아두이노 제어모듈
- Arduino UNO r3
TRARM02 4축 + 로봇그립퍼 로봇팔 모듈
- SG90 RC 서보모터 2EA + HS-5645MG RC 서보모터 3EA 사용
- 로봇그립퍼는 TRGRIP01 사용

 

3. 하드웨어

1) 기구부품 디자인

(1) TRARM02 기구부품 디자인

TRARM02 기구부품 디자인 [1]

 

 

TRARM02_STL_v0.1.zip
0.77MB

 

2) 전자부품 와이어링

(1) 시스템 전자부품 와이어링

 

(2) TRARM02 전자부품 와이어링

TRARM02 전자부품 와이어링 [2][3]

(※ TRUSERCON02, TRMCU01 모듈의 상세 전자부품 와이어링은 "6. 참조" 의 링크 참조)

 

3) 구매부품 목록

부품명 수량 (EA) 설명
PCA9685 1 서보모터 드라이버
SG90 2 SG90 RC 서보모터
HS-5645MG 3 HS-5645MG RC 서보모터
볼트 M2x6 (접시머리)
너트 M2 
6
6
M2 볼트/너트
볼트 M3x6 (접시머리)
볼트 M3x12 (접시머리)
볼트 M3x6 (둥근머리)
4
8
8
M3 볼트/너트

(※ TRUSERCON02, TRMCU01 모듈 부품 포함 안됨)

 

4. 소프트웨어

1) 아두이노 소프트웨어

//--------------------------------------------------------------------------------
//  File        TRARM02_TRUSERCON02.ino
//
//  Version     v0.1  2025.12.02  Tony Kwon
//                  Initial revision
//--------------------------------------------------------------------------------

//--------------------------------------------------------------------------------
//  Configuration
//--------------------------------------------------------------------------------
int adc_min[5] = {336, 367, 341, 346, 710};
int adc_max[5] = {670, 702, 692, 687, 800};
int tick_init[5] = {402, 362, 402, 394, 357};
int tick_min[5] = {294, 262, 294, 292, 340};
int tick_max[5] = {510, 463, 510, 497, 446};
int angle_init[5] = {0, 0, 0, 0, 0};
int angle_min[5] = {-45, -45, -45, -45, -45};
int angle_max[5] = {45, 45, 45, 45, 45};

//--------------------------------------------------------------------------------
//  Serial communication
//--------------------------------------------------------------------------------
#define SERIAL_BAUD 115200

void setupSerial() {
  Serial.begin(SERIAL_BAUD);
  while (! Serial);
}

//--------------------------------------------------------------------------------
//  Servo motor driver for PCA9685
//--------------------------------------------------------------------------------
#include <Adafruit_PWMServoDriver.h>

#define MOTOR_PWM_FREQ  50  // 50[Hz] frequency = 20[ms] period
#define MOTOR_CH_MAX    16
 
Adafruit_PWMServoDriver motorServoDriver = Adafruit_PWMServoDriver(0x40);

void setupMotor() {
  motorServoDriver.begin();
  motorServoDriver.setPWMFreq(MOTOR_PWM_FREQ);
  for(int i = 0; i < 5; i++) {
    motorServoDriver.setPWM(i, 0, tick_init[5]);
  }  
}

//--------------------------------------------------------------------------------
//  Setup
//--------------------------------------------------------------------------------
void setup() {
  setupSerial();
  setupMotor();
}

//--------------------------------------------------------------------------------
//  Loop
//--------------------------------------------------------------------------------
void loop() {
  //----------------------------------------
  //  Read ADC
  //----------------------------------------
  int adc_raw[5];
  int adc[5];  
  
  adc_raw[0] = analogRead(A0); 
  adc_raw[1] = analogRead(A1);
  adc_raw[2] = analogRead(A2);
  adc_raw[3] = analogRead(A3);
  adc_raw[4] = analogRead(A4);

  for(int i = 0; i < 5; i++) {
    adc[i] = max(adc_min[i], min(adc_raw[i], adc_max[i]));
  } 

  //----------------------------------------
  //  Rotate TRARM02 motors
  //----------------------------------------
  int tick[5];
  for(int i = 0; i < 5; i++) {
    tick[i] = map(adc[i], adc_min[i], adc_max[i], tick_min[i], tick_max[i]);
  }
  tick[0] = (tick_max[0] - (tick[0] - tick_min[0]));
  tick[1] = (tick_max[1] - (tick[1] - tick_min[1]));
  tick[2] = (tick_max[2] - (tick[2] - tick_min[2]));

  for(int i = 0; i < 5; i++) {
    motorServoDriver.setPWM(i, 0, tick[i]);
  }

  delay(10);  
}

 

TRARM02_TRUSERCON02.zip
0.00MB

 

5. 테스트

1) 테스트 영상

https://www.youtube.com/watch?v=tJqS3V3ZpfE

 

6. 참조

[1] DSUB9 커넥터 3D 모델 출처

[2] Arduino UNO, PCA9685 이미지 출처

[3] DSUB9 커넥터 이미지 출처

 

[4] TRUSERCON02 - 가변저항 5개를 이용한 로봇팔 사용자 컨트롤 모듈

[5] TRMCU01 - Arduino UNO r3 마이크로컨트롤러 모듈

 

[6] YouTube (토니로보랩 TONYROBOLab)

[7] GitHub Repository (tonyrobolab/robotarm-trarm02)

 

GO TO INDEX