Skip to content
/ RC_Car Public

임베디드 통신 과제(RC카, 조종기, 수신기 이용해서 제어) - 박소윤, 배경근

Notifications You must be signed in to change notification settings

psy1218/RC_Car

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚗 RC Car, R9DS, AT9을 이용한 수동/자동 주행 시스템 구현

▶️ 데모 영상 보기

아래 이미지를 클릭하면 유튜브 영상으로 이동합니다.

데모 영상 썸네일

팀 이름: 배경근
팀원: 201901973 배경근, 202201658 박소윤


📁 GitHub 디렉토리 구조

현재 레포 구조

폴더 설명

  • RCcar/
    → 최종 통합 버전. 수동/자동/긴급사출/LED 제어가 모두 포함됨.
    cpp/: 아두이노 제어 코드, python/: 라인트레이싱 영상처리 코드

  • auto_mode/
    → 자동 주행 실험용. ROI 영역 실험, 필터링 비교 등 테스트 중심

  • manual_mode/
    → 수동 조작 실험용. ESC 속도 감쇠 및 PWM LED 점등 테스트


과거 레포 구조

  • RCcar/: 수동제어와 LED 제어 코드
  • auto_detection/: 영상 기반 라인 인식 초기 실험
  • control/: 조향 및 속도 제어 실험, PlatformIO 기반


🔔 주의사항

  • 본 프로젝트는 처음에는 기존의 과제 레포에서 진행되었습니다.
  • 하지만 새로운 기능 및 문서화를 위해 별도의 새로운 레포를 생성하였고, 커밋 이력은 초기화되었습니다.
  • 기존 개발 히스토리와 구현 흐름이 궁금한 경우, 기존 레포지토리 링크(클릭!!)를 참고해 주세요.

🎬 실행 영상 - 이미지를 클릭해보세요!

프로젝트 시연 영상

📷 RC카 관련 이미지


🎯 RC Car 최종 기능 요약

  • 수동 모드 (manual_mode)
    → 조종기의 채널 2, 4를 통해 RC카의 속도 및 조향을 직접 제어
    → PWM 신호를 아두이노에서 감쇠·보정하여 모터로 전달

  • 자동 모드 (auto_mode)
    → Raspberry Pi + Picamera2를 통해 라인을 인식하고
    → 계산된 조향값을 시리얼로 아두이노에 전송하여 자동 주행 수행

  • 공통 기능
    → CH7을 통한 모드 전환, CH6을 통한 긴급 사출 기능
    → 조향/후진 방향에 따른 LED 시각 피드백
    → Flask 기반 웹 인터페이스로 실시간 영상 확인


⚙️ RC카 제어 시스템 구현 방식

● 시스템 구조

  • Raspberry Pi 5와 Arduino UNO 기반 이중 시스템
  • 수동/자동 모드 전환 및 긴급사출 기능 포함
  • 시각적 피드백을 위한 LED 장착

● 모드 전환 (CH7)

  • 조종기 CH7의 PWM 신호를 인터럽트로 감지하여 모드 전환
  • > 1500μs: 자동 모드
  • <= 1500μs: 수동 모드
  • 예시: 조종기 스위치를 위로 당기면 자동 모드, 아래로 내리면 수동 모드로 전환됨

● 자동 모드

  • 자동 모드 전체 흐름
    • 아두이노 : 라즈베리파이로부터 조향값(서보모터 각도)을 수신, 수신한 데이터를 바탕으로 각도변경,속도조절,led 제어
      • 지속적으로 시리얼 입력 확인, 개행문자('\n') 단위로 읽어 데이터 수신 및 정수형으로 변환
      • 데이터를 통해 -50(좌측) ~ 50(우측) 서보모터를 회전
      • 급격한 방향전환이 이루어지는 경우( 조향값이 -50 ~ -30 , 30 ~ 50) 속도를 낮춤
      • 방향전환이 있는경우 (조향값이 -50 ~ -43, 7~50) 각 led on/off
    • 라즈베리파이 : 카메라 제어, 로컬서버에서 실시간 화면출력, 라인 위치를 통해 계산된 조향값을 송신
      • picamera2로 카메라 객체를 생성해 라즈베리파이에 연결된 카메라 제어
      • Flask서버를 통해 원격으로 처리화면 송출
      • generate 함수에서 영상 캡쳐 및 라인 디텍션,조향값 계산을 실시하여 지속적으로 시리얼 통신, 비디오 스트리밍
  • 영상 처리: Picamera2 + OpenCV 사용
  • 카메라 설정:
    • size (640, 480)
    • framerate : 30
    • Brightness : -0.5 (밝기를 어둡게해 equalizeHist 처리를 극명하게 합니다.)
    • AeEnable: false : (밝기 설정을 위해 자동노출설정을 끕니다.)
  • ROI 설정:
    • x1영역 (510 ~ 570)
    • x2영역 (190 ~ 250)
  • 전처리 과정:
기본 카메라 세팅 히스토그램 평활화 모폴로지 Opening 연산 (30*10)
스크린샷 2025-06-11 오후 5 14 43 스크린샷 2025-06-11 오후 4 53 50 스크린샷 2025-06-11 오후 5 34 42 스크린샷 2025-06-11 오후 5 36 01
모폴로지 Opening 연산 (10*30) 가우시안 블러 이진화
스크린샷 2025-06-11 오후 5 36 41 스크린샷 2025-06-11 오후 5 39 54 스크린샷 2025-06-11 오후 5 40 41
  • equalizeHist: 히스토그램 평활화
  • morphologyEx: 노이즈 제거
  • GaussianBlur: 블러링
  • threshold: 밝기 기반 이진화
  • 라인 인식 및 각도 변환:
    image

image

  • 아두이노 제어:
    • 90 ± steer_val로 서보 모터 제어
    • 조향이 클 경우 저속 회전, 작을 경우 고속 직진
    • 방향에 따라 LED 점등 (Red: 좌, Blue: 우)

● 수동 모드

  • CH1, CH2의 PWM 입력을 pulseIn()으로 수신
  • 속도: 1500μs 기준으로 감쇠 비율(1/5) 적용
  • 조향: map()을 사용하여 서보 각도 40~140도로 변환
  • 후진(1450μs 이하) 시 Red/Blue LED 동시 점등
  • 좌/우 회전 시 각 방향에 맞는 LED 점등

● 긴급 사출 기능 (CH6)

  • CH6 신호를 인터럽트로 감지하여
  • > 1500μs: 서보를 180도로 회전시켜 구조물 사출
  • <= 1500μs: 0도로 복귀

● 시리얼 통신 (Raspberry Pi ↔ Arduino)

  • /dev/ttyACM* 포트를 자동 탐색 후 연결
  • 라즈베리파이에서 연산된 각도를 33.3333ms(30frame) 마다 9600 buad rate로 아두이노에 전송
  • -50~+50\n 형태의 문자열로 조향값 전송
  • 연결 예외 발생 시 자동 재시도

● 영상 스트리밍 (Flask 웹 서버)

  • /video_feed 경로를 통해 MJPEG 스트리밍 제공
  • 영상 프레임을 JPEG로 압축 후 실시간 전송
  • 자동 주행 상태를 웹에서 시각적으로 확인 가능

👤 팀원 역할 분담

이름 역할
배경근 자동 주행 영상 처리 및 각도변환, 시리얼 통신, 웹 스트리밍
박소윤 수동/자동 조작, 핀 구성, LED 제어, 긴급 사출 처리

🧩 핀 연결 표

연결 대상 수신기 CH 아두이노 핀 설명
속도 입력 CH2 A0 PWM 입력
조향 입력 CH4 A1 PWM 입력
모드 전환 CH7 D2 PCINT 인터럽트
긴급 사출 CH6 D4 PCINT 인터럽트
속도 출력 - D9 ESC 출력
조향 출력 - D6 서보모터 제어
사출 서보 - D10 구조물 작동
LED 좌회전 - D3 빨간불
LED 우회전 - D5 파란불
공통 전원 - 5V 서보/ESC 전원
공통 GND - GND 모든 회로 GND

🛠 사용 장비 및 도구

  • RC 카: 링크
  • 수신기 (R9DS): 링크
  • 조종기 (AT9): 링크
  • Raspberry Pi 5 + Picamera2 (IMX100)
  • Arduino UNO (C++)
  • Fusion 360 / Cura: 사출 장치 모델링 및 3D 출력


🌟 RC Car 프로젝트의 장점

  • 이중 모드: 수동/자동 모드 전환을 간단한 조종기 조작으로 구현
  • 직관적 조작: 수동 모드에서 조이스틱 조작만으로 직관적 주행 가능
  • AI 라인 추종: 자동 모드에서 실시간 영상 처리 기반으로 정밀한 라인 추적
  • 비주얼 피드백: 웹 인터페이스를 통한 현재 상황 실시간 확인 가능
  • 상태별 LED 피드백: 주행 방향에 따라 LED 피드백으로 안전성 강화
  • 긴급 사출: 긴급 상황 대비한 3D 프린팅 기반 물리적 구조물 구현
  • 일관성 유지: 시리얼 통신 기반의 라즈베리파이-아두이노 연동으로 하드웨어 제어 일관성 유지

👣 프로젝트 히스토리

1단계: 수동 주행 & 영상 스트리밍 시작

  • Raspberry Pi → Flask 웹서버로 카메라 영상 확인
  • Arduino → 수신기/조종기/RC카 PWM 연결로 수동 주행 구현

2단계: 자동 주행 프로토타입 개발

  • Python: Picamera2 기반 ROI 설정, PID 사용해서 line detection
  • C++: 시리얼 조향값 수신 → 속도 고정 주행

3단계: 기능 확장

  • C++: 수동 모드 조향 PWM 제어 추가
  • C++: 모든 모드에 LED 제어 구현
  • Python: 영상 하단 및 상단 분할, 가중치 기반 steering 연산

4단계: 인터럽트 기능 추가 & 필터 최적화

  • C++: PCINT로 모드 전환/긴급 사출 처리
  • Python: 그림자/빛 처리 강화
    (Picamera2 세팅, 전처리 파라미터 조정, 컨투어 필터링 강화)

5단계: 모든 기능 통합 및 시연

  • 모든 모드 및 기능 통합 완료
  • 안정성 개선 및 테스트 완료

⚠ 프로젝트 시행착오 & 배운 점

  1. PWM 함수 오용 → ESC 3대 고장

    PWM 제어 시 analogWrite()를 잘못 사용하여 RC카 ESC가 총 3대 고장남.
    analogWrite()는 서보/ESC용이 아닌 일반 PWM용 함수로, RC 제어에는 writeMicroseconds() 사용이 필수임을 깨달음.

  2. 조종기 배터리 장착 실수 → 폭발 사고 발생

    조종기 건전지 8개 중 1개를 반대로 끼워 배터리가 터지는 사고 발생.
    전원 연결 전 극성 확인의 중요성을 직접 체감함.

  3. 조종기 ↔ RC카 전원 순서 오류 → 주행 방향 반전

    조종기와 RC카의 전원 ON 순서에 따라 주행 방향이 반대로 설정되는 현상 발생.
    정확한 시퀀스에 따른 장비 초기화의 중요성을 학습함.

  4. 밝기/그림자 영향으로 라인 인식 불량 → 영상 처리 개선

    자동 주행 시 밝기 변화와 그림자에 따라 라인을 탐지하지 못하는 문제 발생.
    이를 해결하기 위해 카메라 설정(노출, 밝기 등)을 조정하고,
    equalizeHist, morphologyEx, GaussianBlur, threshold,
    컨투어 필터링 등 다양한 전처리 기법을 적용하여 극복함.


About

임베디드 통신 과제(RC카, 조종기, 수신기 이용해서 제어) - 박소윤, 배경근

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •