로봇의 중심을 잡아라! 균형 로봇 만들기 도전기 > 초보자를 위한 로봇 프로젝트

본문 바로가기
사이트 내 전체검색

초보자를 위한 로봇 프로젝트

로봇의 중심을 잡아라! 균형 로봇 만들기 도전기

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 315회 작성일 25-11-20 13:12

본문

로봇의 중심을 잡아라! 균형 로봇 만들기 도전기

균형 로봇은 주로 **두 바퀴 자율 균형 로봇(Self-Balancing Robot)**이나 **두 발 보행 로봇(Bipedal Robot)**을 의미합니다. 초보자를 위해 여기서는 두 바퀴 자율 균형 로봇을 목표로 설명해 드릴게요. 이 로봇은 휠 위에 선 채로 넘어지지 않고 균형을 잡는 것이 핵심입니다.


1단계: 균형 로봇의 '원리' 이해하기

두 바퀴 자율 균형 로봇의 원리는 인간이 널빤지 위에서 균형을 잡는 것과 유사합니다.


인지 (IMU 센서): 로봇에 달린 IMU(관성 측정 장치) 센서가 로봇의 현재 '기울기 각도'와 '기울기 각속도'를 실시간으로 측정합니다. (로봇이 얼마나 기울어져 있는지, 얼마나 빨리 기울어지고 있는지)

판단 (컨트롤러/PID 제어):

아두이노(컨트롤러)는 IMU 센서로부터 받은 각도 정보를 바탕으로 **'현재 기울어진 정도'**와 '원하는 목표 기울기(0도)' 사이의 오차를 계산합니다.

이 오차를 줄이는 방향으로 PID 제어(Proportional-Integral-Derivative Control) 알고리즘이 모터에 가해야 할 적절한 힘(토크)을 계산합니다.

넘어지려는 방향의 반대쪽으로 바퀴를 움직여 로봇을 다시 세우는 힘을 가합니다. (예: 로봇이 앞으로 넘어지려 하면 바퀴를 앞으로 빠르게 돌려 로봇을 뒤로 밀어냄. 뒤로 넘어지려 하면 바퀴를 뒤로 돌려 로봇을 앞으로 밀어냄.)

행동 (모터): 아두이노의 판단에 따라 모터 드라이버가 로봇의 바퀴 모터를 제어하여 로봇을 다시 똑바로 세웁니다.

이 '기울기 측정 - 모터 제어'의 피드백 루프가 아주 빠르게 반복되어야 로봇이 넘어지지 않고 균형을 잡을 수 있습니다.


2단계: 필수 준비물 확인 및 구매

컨트롤러:

아두이노 나노 (Arduino Nano) 또는 우노 (Uno): 1개 (나노가 작아서 공간 활용에 유리)

액추에이터:

DC 기어드 모터 (엔코더 내장 권장): 2개 (작지만 토크가 충분한 모터 - 100~300RPM 정도)

엔코더: 모터의 회전 각도나 속도를 정밀하게 측정하여 로봇의 위치나 속도를 파악하는 데 사용됩니다. (선택 사항이나 정밀 제어에 필수)

모터 드라이버 (L298N 또는 TB6612FNG): 1개 (TB6612FNG가 L298N보다 작고 효율적이며 균형 로봇에 선호됨)

센서 (핵심 부품!):

IMU 센서 모듈 (MPU-6050 또는 MPU-9250): 1개

MPU-6050: 3축 가속도계 + 3축 자이로스코프. 기울기 각도 측정에 필수.

MPU-9250: MPU-6050에 3축 지자기 센서 추가. 더 정확한 자세 추정(오차 보정) 가능.

로봇 프레임/바디:

아크릴 판, ABS 판 또는 3D 프린팅으로 제작된 전용 2륜 균형 로봇 프레임: 1개

팁: 모터 2개를 로봇의 바닥에 부착하고, 그 위에 IMU 센서와 아두이노를 올려 로봇이 일직선으로 설 수 있는 형태로 설계해야 합니다.

바퀴: 2개 (모터에 맞는 크기)

전원:

Li-ion (18650) 배터리 팩 또는 Li-Po 배터리: 1개 (모터 구동에 충분한 전력을 공급하고, 로봇 몸체의 무게추 역할도 함)

배터리 홀더 또는 충전기: 배터리 종류에 맞는 것

연결 재료:

브레드보드: 1개 (선택 사항)

점퍼 케이블 (수-수, 수-암): 넉넉하게

공구:

드라이버 세트, 니퍼, 글루건 또는 양면테이프.

3단계: 로봇의 '몸' 조립하기 (기계적 조립)

로봇 프레임 조립: 2륜 균형 로봇 전용 프레임은 보통 모터를 바닥에 부착하고, 그 위에 컨트롤러와 센서 등을 수직으로 세울 수 있도록 디자인되어 있습니다. 설명서를 따라 조립합니다.

모터 및 바퀴 고정: 프레임의 바닥에 모터 2개를 고정하고, 각 모터 축에 바퀴를 연결합니다.

컨트롤러 보드/모터 드라이버/IMU 센서 고정:

아두이노, 모터 드라이버, 그리고 IMU 센서를 로봇 프레임의 수직 중앙 부분에 고정합니다.

중요: IMU 센서는 로봇의 정확한 기울기를 측정해야 하므로, 로봇 몸체의 가능한 한 수직 중앙에 수평하게 고정하는 것이 매우 중요합니다.

배터리 고정: 배터리를 로봇의 가장 아래쪽(모터 사이 등)에 고정하여 무게 중심을 낮추고 안정성을 확보합니다.

4단계: 로봇의 '신경망' 연결하기 (전기 배선)

4.1. 모터와 모터 드라이버 연결 (TB6612FNG 드라이버 기준)

TB6612FNG AO1, AO2 → 왼쪽 모터

TB6612FNG BO1, BO2 → 오른쪽 모터

TB6612FNG VM (모터 전원) → 배터리 +

TB6612FNG VCC (로직 전원) → 아두이노 5V (또는 배터리 전원 +)

TB6612FNG GND → 배터 - 와 아두이노 GND (모든 GND 연결)

4.2. 모터 드라이버와 아두이노 연결

TB6612FNG AIN1 → 아두이노 핀 7

TB6612FNG AIN2 → 아두이노 핀 8

TB6612FNG BIN1 → 아두이노 핀 9

TB6612FNG BIN2 → 아두이노 핀 10

TB6612FNG PWM_A → 아두이노 핀 5 (왼쪽 모터 속도)

TB6612FNG PWM_B → 아두이노 핀 6 (오른쪽 모터 속도)

TB6612FNG STBY (스탠바이) → 아두이노 핀 4 (High 시 활성화)

4.3. IMU 센서 (MPU-6050)와 아두이노 연결 (I2C 통신)

MPU-6050 VCC → 아두이노 5V

MPU-6050 GND → 아두이노 GND

MPU-6050 SDA → 아두이노 A4 핀 (I2C 데이터)

MPU-6050 SCL → 아두이노 A5 핀 (I2C 클럭)

4.4. 전원부 연결

Li-ion 배터리 + → TB6612FNG VM (모터 전원)

Li-ion 배터리 - → TB6612FNG GND 및 아두이노 GND

아두이노 전원: USB 케이블 또는 9V 배터리 (IMU와 로직 전원)

배선 시 주의사항: Li-ion/Li-Po 배터리는 강력한 에너지를 가지므로 단락(쇼트)에 각별히 주의해야 합니다. 모든 배선이 정확한지 확인 후 마지막에 배터리를 연결하세요.


5단계: 로봇의 '명령' 프로그래밍하기 (아두이노 코딩 - PID 제어의 핵심)

균형 로봇의 코딩은 일반적인 로봇보다 복잡하며, PID 제어의 이해가 필수적입니다.


5.1. 아두이노 IDE 설정 (이전 프로젝트와 동일)

5.2. 필요한 라이브러리 설치

MPU-6050 라이브러리: MPU-6050 센서 데이터를 읽기 위한 라이브러리. (예: MPU6050 by Joop Brokking, Adafruit MPU6050)

PID 라이브러리: PID 제어를 쉽게 구현하기 위한 라이브러리. (예: PID_v1 by Brett Beauregard)

TB6612FNG 라이브러리: TB6612FNG 모터 드라이버 제어용.

5.3. 균형 로봇 기본 코드 (예시 - 핵심 아이디어)

코드 전체는 상당히 길어질 수 있으므로, 여기서는 핵심 아이디어를 설명합니다.


cpp



#include <Wire.h> // I2C 통신

#include <MPU6050.h> // MPU6050 라이브러리

#include <PID_v1.h> // PID 라이브러리


// (TB6612FNG 모터 드라이버 라이브러리나 직접 구현한 모터 제어 함수 포함)


// === IMU 설정 ===

MPU6050 mpu;

float angle_pitch; // 기울기 각도 (피치)


// === PID 설정 ===

double Kp=15, Ki=0, Kd=1; // PID 이득 값 (조절이 가장 중요!)

double Setpoint = 0;      // 목표 기울기 각도 (로봇을 똑바로 세울 각도)

double Input, Output;     // PID 입력, 출력 변수


PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); // PID 컨트롤러 생성


// === 모터 속도 제어 함수 (이전 프로젝트들과 유사하게 구현) ===

void setMotorSpeeds(int left_speed, int right_speed) {

  // TB6612FNG 라이브러리 또는 직접 구현한 함수로 모터 제어

}


void setup() {

  Serial.begin(9600);

  Wire.begin(); // I2C 통신 시작


  // MPU6050 초기화 및 캘리브레이션

  while (!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) {

    Serial.println("Could not find MPU-6050, retrying...");

    delay(500);

  }

  mpu.calibrateGyro(); // 자이로 캘리브레이션


  // PID 초기화

  Input = angle_pitch; // 현재 피치 각도를 PID 입력으로 설정

  myPID.SetMode(AUTOMATIC); // 자동 모드

  myPID.SetOutputLimits(-255, 255); // 모터 속도 출력 범위 설정


  // (모터 제어 핀들 OUTPUT 설정, STBY 핀 HIGH 설정 등)

}


void loop() {

  // === 1. IMU 센서 데이터 읽기 ===

  Vector rawGyro = mpu.readRawGyro();

  Vector normAccel = mpu.readNormalizeAccel();


  // (자이로 데이터와 가속도 데이터 융합하여 정밀한 '기울기 각도' 계산 - 상보 필터/칼만 필터)

  // 여기서는 간단히 가속도 데이터로만 피치 각도 추정 (더 정확한 구현은 복잡)

  angle_pitch = -(atan2(normAccel.XAxis, sqrt(normAccel.YAxis*normAccel.YAxis + normAccel.ZAxis*normAccel.ZAxis))*180.0)/M_PI;

  

  // === 2. PID 제어 입력 설정 ===

  Input = angle_pitch; // 현재 로봇의 기울어진 각도를 PID 입력으로


  // === 3. PID 제어 계산 ===

  myPID.Compute(); // PID 알고리즘으로 모터에 가해야 할 출력 값 (Output) 계산


  // === 4. 모터 제어 ===

  int motor_output = Output; // PID 출력 값을 모터 속도로 사용

  

  // (로봇의 중심을 잡으려면 양쪽 바퀴가 동일하게 움직여야 함)

  // (모터 드라이버 라이브러리 또는 직접 구현한 함수로 모터 제어)

  // setMotorSpeeds(motor_output, motor_output);

  // 예를 들어, motor_output이 양수면 전진, 음수면 후진으로 바퀴 제어


  Serial.print("Pitch: "); Serial.print(angle_pitch);

  Serial.print(" / PID Output: "); Serial.println(Output);


  // (이 코드는 개념 설명용이며, 실제 구동을 위해서는 훨씬 복잡한 융합 필터와 PID 튜닝 필요)

}

5.4. 코드 업로드 및 PID 이득 값 튜닝

코드 업로드: 위 코드를 아두이노 IDE에 복사하고, 필요한 라이브러리를 설치한 후, 코드를 아두이노 보드에 업로드합니다.

IMU 캘리브레이션: 로봇을 평평한 바닥에 놓은 후, IMU 센서가 대략 0도에 가까운 피치 각도를 출력하는지 확인합니다.

PID 튜닝 (가장 어려운 부분!):

로봇이 균형을 잡지 못하고 진동하거나 넘어질 것입니다. Kp, Ki, Kd 이득 값은 로봇이 안정적으로 균형을 잡는 데 매우 중요합니다.

튜닝 방법:

Kd = 0, Ki = 0으로 시작. Kp 값만 아주 작은 값부터 천천히(예: 5, 10, 15...) 증가시킵니다.

로봇이 진동하기 시작하는 지점을 찾습니다. (이때 로봇을 손으로 잡고 넘어지지 않도록 돕습니다.)

진동이 너무 심하지 않게 Kp를 조금 줄입니다.

그다음 Kd 값을 천천히 증가시킵니다. Kd는 진동을 줄이고 안정화시키는 역할을 합니다.

마지막으로 Ki 값을 아주 천천히 증가시킵니다. Ki는 장기적인 오차를 줄여 로봇이 목표 각도(0도)에 더 정확하게 유지되도록 돕습니다.

수많은 시행착오가 필요합니다. 이 과정에서 로봇이 넘어지면서 부품이 파손될 수 있으니, 충격에 대비하여 로봇을 끈으로 묶어두거나, 항상 손으로 잡고 보조하면서 튜닝하세요.

6단계: 로봇 테스트 및 최적화

안전 테스트: 로봇이 넘어지더라도 부품이나 주변 사물에 피해가 없도록 안전한 공간에서 테스트합니다.

지속적인 튜닝: PID 값은 로봇의 무게, 모터의 힘, 바퀴 크기 등에 따라 달라지므로, 계속해서 테스트하며 최적의 값을 찾아야 합니다.

고급화:

센서 퓨전: 가속도계와 자이로스코프 데이터를 상보 필터(Complementary Filter) 또는 칼만 필터(Kalman Filter)로 융합하여 더욱 정확하고 안정적인 기울기 각도를 추정합니다.

방향 제어: 모터 속도를 조절하여 균형을 잡는 동시에 로봇이 좌우로 이동할 수 있도록 만들 수도 있습니다.

블루투스 제어: 스마트폰이나 조이스틱으로 로봇의 이동 방향과 속도를 제어하면서도 균형을 잡도록 합니다.

축하합니다! 로봇의 중심을 잡는 가장 큰 도전에 발을 들였습니다!


균형 로봇은 로봇 제어의 정수를 경험할 수 있는 매우 보람 있는 프로젝트입니다. 로봇이 위태롭게 흔들리면서도 중심을 잡고 똑바로 서는 모습은 마치 살아있는 듯한 경이로움을 선사할 것입니다. 이 프로젝트를 통해 로봇 공학의 '균형'과 '제어'의 신비로운 세계를 깊이 탐험해 보시길 바랍니다!

[이 게시물은 관리자님에 의해 2025-11-22 10:15:07 초보자를 위한 로봇 프로젝트에서 이동 됨]
[이 게시물은 관리자님에 의해 2025-11-29 13:01:12 18에서 이동 됨]

댓글목록

등록된 댓글이 없습니다.


회사소개 개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

작크와콩나무
대표:이강복 등록번호:129-30-34337 개인정보관리책임자:이경영

Copyright © https://roboman.co.kr/ All rights reserved.