Basys3(Artix-7 FPGA), 자이로센서(MPU6050)와 Encoder가 있는 Gear DC 모터(JGB37-520)를 활용하여 밸런싱 로봇 제작
- PID 제어 알고리즘 기반의 실시간 자세 추정 및 균형 유지 시스템 구현
- UART 및 블루투스 무선 통신을 활용한 원격 제어 파라미터 튜닝 기능
![]() |
![]() |
|---|---|
| AMD Vivado | VS code |
Project_5_Balancing-Robot/
├── Balacing_Robot.srcs/ # 핵심 하드웨어 설계 소스 및 제약 파일
│ ├── constrs_1/
│ │ └── imports/
│ │ └── fpga/
│ │ └── Basys-3-Master.xdc # Basys3 보드 핀 할당 및 물리 제약 파일
│ └── sources_1/
│ └── new/ # Verilog HDL 설계 소스 코드 (.v)
│ ├── top.v # 시스템을 통합하는 최상위 메인 제어 모듈
│ ├── pid.v # 로봇 균형 제어용 핵심 PID 알고리즘
│ ├── angle_calc.v # 원시 센서 데이터 기반 기울기 각도 산출
│ ├── mpu6050_ctrl.v # MPU6050 자이로 및 가속도 센서 제어기
│ ├── mpu6050_debug_uart.v # 10진수 변환 및 디버깅용 UART 출력 로직
│ ├── encoder.v # 홀 엔코더 신호 분석 및 바퀴 속도 측정
│ ├── TB6612FNG.v # DC 기어 모터 제어용 PWM 및 방향 신호 생성
│ ├── i2c_master.v # 센서 데이터 수집용 I2C 마스터 프로토콜
│ ├── uart_bluetooth.v # 조종기 블루투스 제어 명령 수신 및 디코더
│ └── clk_divider.v # 시스템 타이밍 동기화용 클럭 분주기
├── Balacing_Robot.tcl # Vivado 프로젝트 환경 자동 복원 스크립트
├── README.md # 프로젝트 전체 개요 및 빌드 가이드 문서
├── REPORT.md # 실험 과정, 트러블슈팅 및 결과 분석 보고서
└── .gitignore # Git 버전 관리 제외 항목 설정 파일
| 전면 (Front) | 상단 (Top) | 하단 (Bottom) |
|---|---|---|
![]() |
![]() |
![]() |
| 후면 (Back) | 가속도,자이로센서 (MPU6050) | 모터드라이버 (TB6612FNG) |
|---|---|---|
![]() |
![]() |
![]() |
이미지를 클릭하면 시연 영상(유튜브)로 이동합니다.
🔍 Issue (문제 상황)
- Vivado 합성 및 구현(Implementation) 과정에서 로그창에 Setup Time Violation 으로 인한 타이밍 에러 메시지가 발생
❓ Analysis (원인 분석)
- PID 제어기의 복잡한 곱셈 연산으로 인해 조합 논리(Combinational Logic) 의 임계 경로(Critical Path) 가 길어져 단일 클럭 사이클 내에 연산을 완료하지 못함
❗ Action (해결 방법)
- 단일 클럭에 집중된 연산 경로를 FSM 기반 파이프라인 단계로 분산
✅ Result (결과)
- 타이밍 위반 에러를 해결하고 Timing Closure 를 성공적으로 달성
🔍 Issue (문제 상황)
- 센서 값과 제어 파라미터를 모니터링할 때 16진수(Hexadecimal) 원시 데이터가 그대로 출력되어 직관적인 튜닝이 불가능
❓ Analysis (원인 분석)
- Verilog에는 C언어 같은 printf같은 함수가 없어서 UART로 보내는 ASCII 코드값을 변환시킬 수가 없음
❗ Action (해결 방법)
- Binary-to-BCD 변환기와 상태 머신 기반의 ASCII 디코더 회로를 설계
✅ Result (결과)
- 성공적으로 MPU6050센서의 출력값과 PID제어를 위한 입력값을 10진수로 제어함
🔍 Issue (문제 상황)
- 진동으로 인한 단순 PID 제어의 평형 유지에 한계가 발생
- 짧은 주기동안 과도한 변화로 모터드라이버 과열
❓ Analysis (원인 분석)
- 모든 각도에 걸친 PID 제어로 인한 지속적인 진동 발생
❗ Action (해결 방법)
- 로봇의 각도가 작으면 최대한 PWM을 줄이는 데드존 설정
- 오차 크기(소/중/대) 기반의 구간별 비선형 제어 도입
✅ Result (결과)
- 진동 감소 및 구간별 회복력 향상을 통한 안정적인 상태 달성












