1. 개요
1.1. 목표
초음파 센서로 장애물을 검지하여 통로를 자율주행하는 RC카 구현

1.2. 사용 부품 및 역할

- 프레임에 초음파 센서를 3개를 부착하여 3방향의 초음파 센서 거리값 수집
- DC 모터 4개를 컨트롤하여 방향 및 이동 제어 가능
- 버튼을 통해 모드를 변경 가능
- 블루투스 모듈을 통해 컨트롤할 수 있으며, 주행 로그 수집
- OLED를 통해 현재 상태 표시
1.3. 사용 기술
- STM32
- FreeRTOS
- P제어
- I2C
- UART
- GPIO
- FSM 설계 방식
- PWM
1.4. FreeRTOS 개요
1.4.1. RTOS란?
정해진 시간 내에 작업 수행을 보장하는 경량의 운영체제
- 여러 개의 Task를 거의 동시에 실행
- 우선 순위가 높은 Task가 CPU 제어권을 획득(선점)하여 실행이 됨
1.4.2. 본 프로젝트에서 RTOS 사용 방식

Task를 3개로 분할
- Task1
- 초음파 센서 센싱 역할
- Task2
- 동작 모드에 따른 동작 모드 FSM 로직
- 수동 모드일 경우 manual_mode_run() 함수가 호출됨
- 자동 모드일 경우 auto_drive() 함수가 호출됨
- oled 출력 함수
- 동작 모드에 따른 동작 모드 FSM 로직
- Task3
- 모드 변경 체크(버튼, BlueTooth)
2. 설계
2.1. 블록 다이어그램

2.2. FSM(Finite State Machine)
2.2.1. 모드 변경 FSM

2.2.2. AutoMode(자율주행모드) FSM

- AutoMode 진입 시 Drive Forward 상태로 진입
- Drive Forward 상태
- 빠른 주행을 위해 Error 값에 따른 P제어 사용
- Error = Left 거리값 – Right 거리값 계산
- Error 값이 5 이하이면 그냥 전진 주행
- Error 값이 5 이상이면 오차 값을 보정하는 방향으로 DC 모터 보정
- Error = Left 거리값 – Right 거리값 계산
- Center 값이 20이하이고 Left 값이 15이하이고 Right 보다 작으면 Right Turn 상태로 천이
- Center 값이 20이하이고 Right 값이 15이하이고 Left 보다 작으면 Left Turn 상태로 천이
- 빠른 주행을 위해 Error 값에 따른 P제어 사용
- Right Turn 상태
- 너무 짧은 순간만큼만 턴 하지 않기 위해 t가 400 이상이고 Center 값이 35이하이면 Drive Forward로 천이
- Left Turn 상태
- 너무 짧은 순간만큼만 턴 하지 않기 위해 t가 400 이상이고 Center 값이 35이하이면 Drive Forward로 천이
- Drive Backward 상태
- 너무 짧은 순간만큼만 후진하지 않기 위해 t가 500 이상이고 Left Right 값에 따라서 Left Turn 또는 Right Turn 모드로 전환
2.3. OLED 이미지 구현 결과


3. 동작 동영상
해당 구간을 부딪히지 않고 최단 시간인 19초로 주파하여 교육원 해당 과정 중 공식 1등을 하였습니다. 하하
4. 발표 영상
검은 옷을 입은 사람이 저입니다.
5. 결론 및 느낀점
평소에 조금 약하다고 생각되는 부분들을 보완하였습니다.
- 동시 처리를 하면서도 유연하게 소스 코드를 개발할 수 있는 RTOS 방식을 채택하였습니다. 이로 인해, 버튼 입력과 센서 입력을 거의 실시간으로 받으면서 밀리지 않고 모터 출력도 문제 없이 할 수 있는 구조가 되었습니다.
- 코드를 FSM 방식으로 작성해보았습니다. Verilog에서 FSM으로 작성하는 것처럼 펌웨어에서도 FSM으로 자유자재로 짤 수 있어야 한다고 생각해서 FSM 방식으로 접근하였습니다. 처음에는 굳이 FSM으로 짤 필요가 있을까라는 생각이 들었지만, 설계를 진행하면 할수록 구조가 더욱 심플해지고 그 상태에 대한 것만 처리하면 되니 생각할 부분이 적어진다는 것을 알게 되었습니다.
- PID 제어 중 P제어를 활용하였습니다. P제어는 오차 값에 비례하는 성분을 출력하여 위치나 속도 값을 제어하는 방식인데, 현재 프로젝트에서는 초음파 센서로부터 얻어진 위치 오차 값으로 양쪽 바퀴의 DC모터 출력 속도 값을 제어하였고, 오차의 크기에 비례해서 조정량이 커지게 하였습니다.