호경

OpenCV를 이용한 차선 감지 자율 주행차 - 아두이노 편 본문

공부/아두이노

OpenCV를 이용한 차선 감지 자율 주행차 - 아두이노 편

rlaghrud1234 2022. 2. 26. 02:57

OpenCV를 이용한 차선 감지 자율 주행 자동차 - 아두이노 편

 

시작에 앞서...

라즈베리파이와 아두이노를 이용하여 차선 감지 자율 주행차를 만드는 프로젝트를 시작했다.

기존에는 딥러닝 모델을 선정하고, 왕복 2차선 도로, 횡단보도, 신호등, 보행자 등을 만들어 학습을 시키려고 했지만,

시간 관계상으로도 부족했고, 딥러닝을 위한 표본도 구하기가 힘들어서,

우선은 빠르게 openCV를 통한 차선 감지 자율 주행 자동차를 만들기로 했다.

 

오늘 포스팅 내용은 내가 담당했던 부분인 제품 구성과 제어(아두이노) 부분이다.

아두이노의 코드는 기존에 딥러닝 시키기 도로에서 수동 조작할 수 있는 제어 코드이다.

 

라즈베리파이와 Serial 통신을 하는 아두이노 제어 코드는 해당 실험이 끝난 뒤 게재하려고 한다.

그리고 완성된 작품은 따로 게재할 예정이다.

 

현재 아래 작성한 부품은 실험을 위해 했던 부품으로 완성된 부품 목록의 경우는 따로 정리해서 올릴 예정이다.

 


목차

- 부품 구성

- 부품의 세부사항

- 아두이노 코드

 


부품 구성

<Board>

Raspberry PI 4

Arduino

 

<else>

RS-380SH 모터

BTS7960 모터 드라이버

아두이노 조이스틱

MG-996R 서보 모터

9V 알칼리 배터리 2개

빵판

 


부품의 세부사항

 

Raspberry PI 4 : 영상을 받아주고, 실시간 영상 처리를 할 수 있는 보드로 선정했다.

Arduino UNO : 일반적인 제어로 사용할 수 있는 보드로 선정했으며, Raspberry PI 4와 Serial 통신으로 제어할 예정이다.

BTS7960 : 차체를 선정할 때 조금은 가격이 있는 차체로 선정을 해 성능이 조금 뛰어난 모터를 골라서, 해당 모터를 제어할 수 있는

             모터 드라이버로 선정했다.

             허용 전류, 구동시킬 수 있는 전압이 높아 큰 모터에도 사용할 수 있으며, 역방향 제어까지 가능하다.

 

BTS7960 모터 드라이버

모터와 모터 드라이버 선정 과정은 다른 글로 올릴 것이다. 이 과정에서 아주 약간의 전자적인 지식이 필요했기에 조금 고생했다.

 

9V 알칼리 배터리 X2 : 9V하나로 모터를 제어하려고 했더니 전압 강하로 인해 모터가 제대로 작동하지 않음을 확인해서, 직렬 연결을

                             하여 18V로 해당 모터 드라이버를 작동 시켰다.

서보모터, 모터 : 자동차 키트에 같이 오는 제품으로 차체와 합쳐서 약 9만원 정도였다.

 


 

아두이노 제어 코드

 

#include <Servo.h>

Servo myservo;

int pushButton = 4;
int L_EN = 7;
int R_EN = 8;
int LPWM = 6;
int RPWM = 5;

int Speed = 200;

void setup()
{
  Serial.begin(9600);
  
  pinMode(L_EN, OUTPUT);
  pinMode(R_EN, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(RPWM, OUTPUT);
  pinMode(pushButton, INPUT);

  myservo.attach(13);
  myservo.write(0);
}


void loop()
{
  int push = digitalRead(pushButton);

  if(push == 1)
  {
    digitalWrite(R_EN, LOW);
    digitalWrite(L_EN, LOW);

    int pos = analogRead(A0);
    pos = map(pos, 0, 500, 140, 100);
    myservo.write(pos);

    delay(15);
  }
  
  else
  {
    digitalWrite(R_EN, HIGH);
    digitalWrite(L_EN, HIGH);
    analogWrite(LPWM, 0);
    analogWrite(RPWM, 150);
    
    int pos = analogRead(A0);
    pos = map(pos, 0, 500, 140, 100);
    myservo.write(pos);
    
    delay(15);
  }
}

Comments