April 25, 2018

디바이스마트 미디어:

[45호]영상인식을 통한 불법중국어선 탐지 도우미

45 ict 탐지도우미 (1)

2017 ICT 융합 프로젝트 공모전 입선작

영상인식을 통한 불법중국어선 탐지 도우미

글 | 부산대학교 손유선, 오은주, 제세은

1. 심사평
칩센 실제 현실에 적용이 필요할 수도 있을 듯한 주제로 보여 아이디어 부분에 높은 점수를 주었습니다. 기본적으로 기존 라인트레이서을 주로 다룬 것으로 보이고, 보고서를 통해 구현된 내용 또한 라인트레이서에 가깝습니다. 영상을 인지하여 특정한 경로의 주행을 반복하게 하자면 기본적으로 라인트레이서의 기능을 보유하여야 하겠으나, 보고서에 언급하였듯이 부표를 통해 경로를 탐색, 이동하게 하자면 바닥면 선을 따라가는 라인트레이서 보다는 부표와 같은 특정 점을 인지하여 주행하여야 하는 부분이 추가되어야 할 듯한데, 이 부분에 대한 고려가 부족해 보입니다. 또한 불법조업어선에 해당하는 영상 처리나 전달의 부분이 제대로 언급되지 않은듯 한 점이 아쉬움이 듭니다.

뉴티씨 전체적으로 완성도가 높지만, 작품의 개념을 설명하는 듯한 장비 구성입니다. 시간이 된다면 물에 띄워보는 것도 나쁘지 않을 것이라 생각됩니다.

위드로봇 template matching 방식은 대상체의 크기, 방향이 달라지면 인식률이 크게 떨어지는 단점이 있습니다. 이 부분을 극복할 수 있는 추가 연구가 있으면 좋겠습니다. 그리고 바다에서 위치 추정은 기존 GPS 또는 DGPS만으로도 충분하기에 이 분야의 활용을 검토하면 완성도를 높일 수 있을 것으로 보입니다.

2. 작품 개요
2.1. 프로젝트의 기획 및 내용
2.1.1. 프로젝트의 기획
Ⅰ. 프로젝트 도출배경

45 ict 탐지도우미 (1)

지난 10월, 중국 불법조업에 관한 문제가 연일 뉴스에 오르내렸다. 중국의 불법조업 어선문제는 어제, 오늘만의 일이 아니라 계속해서 있어왔던 문제이고, 우리나라뿐만 아니라 전 세계적인 문제이다. 중국 어선으로부터 영해를 지키기 위해 인명피해마저 발생하고 있다. 중국 어선들의 불법조업 장소와 수위가 민감해질수록 국민들의 감정도 악화되고 있다. 다른 나라의 폭침, 포격 등이 뉴스까지 소개되며 물리적 대응을 더 강하게 하라는 여론이 생기는 상황이다. 하지만 과연 이것이 더 나은 해결책이 될까?

45 ict 탐지도우미 (2)

현재 자율주행은 모든 분야에서 주목하는 제어 시스템이다. 자율주행 자동차만 생각하기 쉽지만 사실 무인 선박에도 많은 관심이 쏠리고 있다. 자연환경이 척박한 극지대나 해적들의 위험을 피할 수 있는 무인 상선, 군사용으로 활용 가능한 정찰선 등 활용도는 무궁무진하다. 날씨, 파도 등을 고려한 최적의 운항 항로 제시 기능을 통해 연료비 등을 아낄 수도 있다. 선박 내에 있는 자동화 장비를 실시간 모니터링 할 수 있는 시스템으로 선박의 고장 여부를 진단하고 필요한 조치를 취할 수 있다. 이처럼 무인선의 개발은 해양 기술의 발전에 크게 기여할 것이라는 것에 아이디어를 얻어 개발 방향을 잡게 되었다.

Ⅱ. 프로젝트 아이디어의 기획
여러 목적을 가진 무인선 중에서도 우리는 정찰에 초점을 맞췄다. 우리나라 영해를 제집 드나들 듯 하는 중국 불법 조업 어선들이 커다란 문제점으로 사회 이슈가 된 지 오래이다. 해경의 감시에도 불구하고 수십 척에서 2백 여척이 넘는 중국 어선들이 배타 수역을 넘어 수자원을 고갈시키고 있다. 러시아와 일본의 경우 불법 어선이 발견된 즉시 해군을 출동시켜 불법 어선을 압수하거나 진압한다고 한다. 여기에서 해경의 감시에는 부족함이 있다고 판단하여 우리나라 배타 수역을 지킬 무인선을 개발하기로 하였다. 이를 개발하기에 앞서 자율주행자동차를 구현하여 자율 주행 알고리즘을 개발한 후 무인선으로 발전시켜 나가도록 한다.
자율 주행을 구현하는 여러 방법들 중 라인트레이서를 선택하였는데 이는 우리가 정찰을 목표로 하고 있기에 일정한 경로를 주기적으로 돌아다니는 것이 중요하다고 생각했기 때문이다. 만약 무인선으로 발전시킨다면 적외선을 배의 좌측에 위치 시켜 일정 거리 마다 부표를 띄운 후 그 부표를 줄로 연결시켜 따라가도록 할 것이다.

2.1.2. 프로젝트 구현 내용
Ⅰ. 자율주행 – 라인트레이서
시중에 판매되고 있는 RC카를 분해하여 우리가 원하는 구동 부분만 남기도록 한다. 이 차체에 아두이노, 적외선 센서, 모터드라이버를 연결하여 라인트레이서를 구현하도록 한다. 아두이노는 전체의 연산을 담당하는 제어부이다. 아두이노는 적외선 센서의 출력 값이 입력으로 들어가고 이 값을 연산하여 아두이노는 그에 따른 출력 값을 모터드라이버로 내보내 준다. 모터드라이버는 차체의 모터 부분과 직접 납땜하여 자동차의 움직임을 제어한다.

Ⅱ. 영상 인식
차체에 부착된 라즈베리파이에 파이 카메라와 서보모터를 연결한다. 파이 카메라로 영상을 라즈베리파이로 보내주면 라즈베리파이에서 서버로 영상을 송출한다. 라즈베리파이에 연결한 서보모터는 카메라를 회전시켜주는 역할을 한다. 불법 중국어선을 탐지하는 것이 목적이므로 주위를 넓게 살피는 것이 중요하기 때문에 카메라를 회전시켜 시야를 확보하도록 한다. 영상을 라즈베리파이에, 연결된 IP 주소의 한 포트로 실시간 전송시키고, 그 주소를 소스 코드에 입력하여 노트북에서 영상을 분석한다. 우리가 구현하는 것은 정찰기이기 때문에 사람이 모니터로 불법어선의 침입을 감지해야한다고 생각하여 노트북에서 영상분석을 하도록 하고 영상 분석 결과를 노트북 화면에서 확인할 수 있도록 한다. 미리 중국어선의 이미지를 입력 값으로 두고 임계값을 넘을 경우 불법어선으로 간주, 화면에 빨간 네모로 표시한다.

3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 주요 동작
Ⅰ. 자율 주행
차의 앞머리에 부착된 적외선 센서 모듈을 이용하여 바닥에 깔린 라인을 인식한다. 이 모듈은 각각 4개의 발광부와 수광부로 이루어진 디지털 4ch이다. 좌측 2개(Sensor1, Sensor2), 우측 2개(Sensor3, Sensor4)의 센서로 이루어져 방향 뿐만 아니라 회전정도를 더 섬세하게 알 수 있다. 각 센서마다 달린 LED로 센서값의 변화를 육안으로 쉽게 값을 확인할 수 있다.

45 ict 탐지도우미 (3)

45 ict 탐지도우미 (4)

아두이노에서는 인식한 라인을 바탕으로 조향을 결정하고 모터의 동작을 제어한다. 직선 라인 부분에서는 속도와 방향을 일정하게 유지하고, 곡선부분에서는 라인에 맞춰, 속도와 방향을 바꾸어 좌회전 또는 우회전을 수행한다. RC카는 속도와 직진 또는 후진을 제어하는 뒷바퀴와 방향과 회전률을 제어하는 앞바퀴로 이루어져 있어, 이를 각각의 모터드라이버 채널에 연결하여 동시에 제어하도록 한다.

Ⅱ. 영상 인식
차에 부착된 라즈베리파이에서 서버로 영상 정보를 계속 전송한다. 파이카메라를 라즈베리에 연결하여 외부의 영상정보를 파이카메라가 실시간으로 받도록 한다. 파이카메라에는 서보모터를 부착하여 카메라의 시야를 넓히도록 한다. 이때, 라즈베리파이에 연결한 파이카메라는 라즈베리파이용으로 나온 카메라 모듈이다. 파이카메라는 고화질 비디오뿐만 아니라 스틸 사진을 찍는데 사용할 수 있으며, 초보자가 사용하기 쉽게 만들어 놓은 카메라 모듈이다.

45 ict 탐지도우미 (5)

라즈베리파이 카메라 모듈은 사용자 정의 설계된 추가 기능 라즈베리 파이이다. 카메라에 연결되어 있는 케이블에 따라 데이터가 전송이 되고 높은 데이터 전송률을 가진다.
라즈베리파이 내에서는 외부의 영상정보를 받아와 전송시키는 역할을 한다. 이후 전송된 영상은 노트북에 visual studio에서 c++로 opencv 헤더를 참조하는 코드를 구성하여 처리한다. 영상을 처리하는 것을 보드 내부에서 할 수도 있겠으나, 보드의 RAM이 1GB인 점을 생각할 때 영상 처리 속도가 매우 느릴 것으로 생각되어 PC에서 처리하는 것으로 결정한다.

3.1.2. 기능별 상세 기술
Ⅰ. 영상전송

45 ict 탐지도우미 (6)

라즈베리파이에 파이카메라를 연결하여 배의 전방을 촬영한다. 이 영상을 웹으로 전송하면 디바이스에 관계없이 웹 브라우저에만 접속할 수 있으면 볼 수 있다는 이점이 있어 촬영한 영상을 웹으로 전송하도록 한다. 파이카메라에서 웹으로 영상을 전송하는 데에 사용한 기술은 mjpg-streamer이다. mjpg-streamer는 jpg 촬영을 연속으로 수행해서 마치 영상처럼 보이도록 해준다. 설치한 후 특정 port로 접근할 수 있는 HTTP Server 역할을 해준다. 이 페이지를 통해 MJPG 영상을 볼 수 있기 때문에 브라우저로 접속해서 볼 수 있고 소스 코드에서 URL을 불러 영상처리 작업을 진행 할 수도 있다.

Ⅱ. 적외선 센서 AM-IRS4D

45 ict 탐지도우미 (7)

라인을 따라 주행하는 자동차를 만들기 위해 적외선 센서 모듈을 사용하였다. 이 모듈은 4개의 센서로 구성되어 있고, 각 센서에는 발광부와 수광부, 가변저항, LED로 구성되어 있다. 발광부는 적외선을 내보내고, 바닥에 반사된 적외선은 수광부에서 감지된다. 흰색은 빛을 반사하고 검은색은 빛을 흡수하는 성질을 이용하여, 바닥에 반사된 적외선의 양으로 라인을 감지한다. LED는 적외선 센서 값의 변화를 나타낸다.

45 ict 탐지도우미 (8)

적외선 센서의 출력은 그림9의 상단 그림과 같이 아날로그 신호이다. 이것을 비교기에서 적당한 값으로 잘라 0, 1로 구분 할 수 있다. 0, 1신호는 디지털 신호이기 때문에 AD 변환기없이 마이크로컨트롤러에서 입력 받아 사용할 수 있다. 0, 1로 자르는 기준은 가변저항으로 변경할 수 있다. 우리는 흰 바탕의 검은색 선을 트래킹하도록 설정해주었다. 라인을 감지해보면 검정색 라인 위에서는 LED가 꺼지고 흰색 바탕 위에서는 LED가 켜진다. (라인 감지 시 0 입력)

Ⅲ. OpenCV

45 ict 탐지도우미 (9)

OpenCV(Open Source Computer Vision)는 오픈 소스 컴퓨터 비전 C 라이브러리이다. 원래는 인텔이 개발했고, 윈도, 리눅스 등의 여러 플랫폼에서 사용할 수 있다. 실시간 이미지 프로세싱에 중점을 둔 라이브러리이다. 인텔 CPU에서 사용되는 경우 속도의 향상을 볼 수 있는 Intel Performance Primitives (IPP)를 지원한다.
우리는 이 기술을 이용하여 중국어선을 탐지하도록 한다. OpenCV에서 제공하는 Template matching을 이용하여 입력으로 넣은 이미지 파일과 유사한 부분이 영상에 포착될 경우 영상에 빨간색 Rectangle로 표시하도록 한다.

Ⅳ. 모터동작제어

45 ict 탐지도우미 (2)

45 ict 탐지도우미 (10)

모터의 동작 제어는 모터드라이버 L298N을 사용하여 제어하였다. 모터드라이버란 DC 모터의 방향, 속도를 제어하기 위해 사용하는 모듈이다. 아두이노 회로만으로는 DC 모터에 충분한 전류의 양을 공급할 수 없고, 전류의 제어가 어렵고 복잡하다. 모터드라이버를 사용하면 DC모터를 쉽게 제어할 수 있다. 하나의 모터 드라이버는 2개의 모터를 제어할 수 있다. 따라서 우리의 경우, 모터 A의 위치에는 조향 제어(앞바퀴)를, 모터 B에는 속도 제어(뒷바퀴)를 연결하였다. 모터 드라이버에는 모터를 제어하기 위한 H-bridge라는 칩이 있다. 이 칩은 발열이 심하여 검은색 방열판을 달아 전류가 많이 흘러도 화재가 발생하지 않도록 설계되어 있다. 3개의 단자를 통해 외부전원의 (+)(-)극, 라즈베리파이의 (+)(-)극을 연결한다. 아두이노가 줄 수 있는 전류는 40mA 정도지만 DC모터를 제어하기 위해서는 적어도 150mA 정도의 전류가 필요하다. 특히나 우리 자율주행 자동차의 경우 차체와 각종 보드 및 모듈의 무게가 함께 실려 속도를 내기 위해서 더 많은 전류를 필요로 했다. 이는 배터리 여러 개를 병렬로 연결함으로서 해결하였다. 대용량 모터용으로는 2A까지 제어가 가능하다.
모터드라이버(L298N)를 사용하는 데에는 9V 배터리 하나를 연결하여 구동하였지만 모터드라이버가 제공하는 힘에 비해 차체가 너무 무거워 굴러가지 않았다. 결국 문제는 전압이 아니라 전류였고, 9V 550mAh 3개와, 7.2V 3000mAh를 병렬로 연결하여 모터드라이버에 연결하였다. 모터드라이버를 통해 전압은 5V로 감압한 뒤 인가된다. 앞바퀴와 뒷바퀴 모두 원활하게 전원 공급이 가능하다. 속도 또한 모터드라이버와 아두이노를 사용해 속도를 제어할 수 있다.

Ⅴ. 자율주행 – 조향제어

45 ict 탐지도우미 (11)

45 ict 탐지도우미 (12)

위의 L298N 모터 드라이버에서 IN1, IN2에 아두이노의 디지털 핀에 연결하여 신호를 받아 ENA 부분에 핀을 연결하여 PWM 제어를 해주어 아래의 기판에 모터 부분 +, – 단자에 출력하여 속도를 조절한다. 그리고 모터 드라이버의 IN3, IN4를 아두이노의 디지털 핀에 연결하고 ENB 부분에 디지털 핀을 연결하여 ENB 부분을 조절하여 각도를 조절하고 아래의 기판에 조향 제어 부분의 +, – 단자로 출력을 하여 IN3에 HIGH 신호를 IN4에 LOW 신호를 주면 좌측으로 회전하고 반대로 LOW, HIGH 신호를 주면 우측으로 회전하게 된다.

Ⅵ. 카메라 서보모터 제어

45 ict 탐지도우미 (13)

비용절감을 위해 회전식 카메라를 사용하기보다 서보모터에 파이카메라를 부착하는 방법을 선택하였다. 서보모터(SG-90)는 0~180도 회전 가능하며 아두이노 5v 전압, GND, 출력 핀을 필요로 한다.

3.2. 전체 시스템 구성
3.2.1. 전체 구성도

45 ict 탐지도우미 (14)

정찰기의 전체 구성을 위와 같이 크게 3개로 나눌 수 있다. 조향부의 경우, 모터를 제어하는 부분이다. 제어부 중 모터에 관여하는 것은 아두이노이다. 아두이노와 조향부에 속해있는 모터드라이버, 적외선 센서를 연결하여 아두이노에서 제어 명령을 내린다. 영상부에는 서보모터와 파이카메라가 있다. 파이카메라는 제어부의 라즈베리파이에, 서보모터는 아두이노에 연결한다. 아두이노는 서보모터를 돌리면서 조향부를 계속 제어해야하므로 인터럽트를 사용하여 처리하도록 한다. 라즈베리파이는 파이카메라에서 받아온 영상을 서버로 전송하는 역할을 한다. 라즈베리파이3는 와이파이가 내장되어 있어 따로 와이파이 모듈을 연결할 필요 없이 서버로 영상을 전송할 수 있다.

3.2.2. H/W
Ⅰ. 센서부(경로 감지)
주행방향의 전면을 향하는 위치에 센서를 배치하여 앞으로 가야하는 경로를 판단하며 주행할 수 있도록 하였다.

45 ict 탐지도우미 (3)

Ⅱ. 구동부

45 ict 탐지도우미 (15)

모터보드는 시중의 RC카의 차체를 사용하여, 내장되어있는 모터를 이용해 구동하였다. 총 사용한 모터는 2개로써, 전면(앞바퀴)과 후면(뒷바퀴)에 배치하였다. 전면(앞바퀴)에 사용한 모터는 조향을 제어하고, 후면(뒷바퀴)에 있는 모터는 직진과 전진을 제어한다. 이 모터를 제어하는 데에는 L298N의 모터 드라이버를 사용하였다.

45 ict 탐지도우미 (16)

파이캠을 회전시키기 위해 서보모터 SG90을 사용하였다. 서보모터와 아두이노와 연결하여 0 ~ 180도까지 움직이도록 한다. 서보모터는 타이머 인터럽트 MStimer2 라이브러리를 이용하여 여러 가지 일을 동시에 할 수 있도록 하였다.

3.2.3. S/W

45 ict 탐지도우미 (17)

소프트웨어의 경우 위와 같은 기능이 필요하다. 라즈베리파이에서는 nano 명령어를 통해 shell script로 mjpg-streamer를 구동시켜 라즈베리파이에서 받아온 영상 정보를 서버로 보낸다.

45 ict 탐지도우미 (18)

위는 라즈베리파이에서 받아온 영상을 처리하는 코드 중 일부이다. 이 코드에서는 실시간으로 받아온 영상 정보를 계속 처리하는 과정이다. 서버 URL을 입력하여 받아온 영상을 cap에 넣고 그 영상을 origin에 넣는다. origin은 원본 영상을 의미한다. 불법 중국어선 사진을 mat 타입의 boat라는 변수에 저장해두고 template matching을 사용하여 일치 여부를 알아낸다. 이때 일치할 경우 그 주위에 사각형을 그려준다. 원본 영상에서 불법 어선이라 생각되는 곳에 사각형을 그린 영상을 img_display라는 mat 타입의 변수에 저장한다. 이 영상을 imshow로 user에게 보여주면 사용자는 실시간으로 불법 중국 어선이 탐지될 경우 사각형으로 표시되는 영상을 볼 수 있다. 위의 코드에서는 원본 영상과 사각형으로 표시한 후의 영상 둘 다 보여주도록 하였다.

45 ict 탐지도우미 (19)

위의 라즈베리파이에서 실행시킬 파일 내용이다. mjpg-streamer라는 기술을 이용하여 라즈베리파이가 파이카메라로부터 받아온 영상을 라즈베리파이가 연결된 wifi의 8222 port를 열어 전송시키는 것이다. 이 기술을 사용하기 위해서는 라즈베리파이에 mjpg-streamer를 설치하고 설치한 곳의 link를 위와 같이 library path로 설정해 주어야한다. 만약 이후에 보드 내부에서 영상을 처리해야하는 순간이 온다면 파이카메라로부터 받아온 영상을 라즈베리파이 내부에 사진파일로 저장하고 이 사진파일을 opencv에서 받아와 처리한 다음 처리한 사진을 아까와 같은 이름, 경로로 저장시킨다. 이렇게 할 경우 받아온 즉시 opencv로 처리하므로 실시간 처리라 할 수 있다. 실시간 처리가 된 사진을 mjpg-streamer 기술을 이용하여 위와 같이 일정 포트로 전송시키면 우리는 영상처리가 완료된 영상을 서버로 받아볼 수 있을 것이다. 아래부터는 아두이노에서 실행시킬 코드이다.

#include<Servo.h>
#include <MsTimer2.h>
Servo servo;

int left_1 = 4; //라인트레이서 센서1
int left_2 = 3; //라인트레이서 센서2
int right_3 = 6; //라인트레이서 센서3
int right_4 = 7; //라인트레이서 센서4

int servoPin = 5; //카메라 서보모터
int angle = 0 ; //카메라 서보모터 각도

int IN1 = 8; //DC모터1
int IN2 = 9; //DC모터2
int ENA1 = 10; //DC모터 속도
int ENA2 = 11; //서브모터 속도
int IN3 = 12; //서브모터1
int IN4 = 13; //서브모터2

그림 24 아두이노 핀 설정

void setup(){
Serial.begin(9600);
pinMode(left_1,INPUT);
pinMode(left_2,INPUT);
pinMode(right_3,INPUT);
pinMode(right_4,INPUT);
MsTimer2::set(500, curl);
MsTimer2::start();
servo.attach(servoPin);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(ENA1,OUTPUT);
pinMode(ENA2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
}

그림 25 아두이노 핀 모드 설정

아두이노의 핀 중 3, 4, 6, 7번은 적외선센서 모듈에 연결하고 5번 핀은 파이카메라와 연결할 서보모터에 연결한다. 핀 8~13번은 모터 드라이버의 ENA, ENB, IN1,2,3,4에 연결한다. 적외선센서와 연결된 핀은 INPUT으로 설정하고 모터드라이버에 연결된 핀은 OUTPUT으로 설정한다. 서보모터에 연결된 핀도 설정해준다.
카메라를 부착시킬 서보모터는 메인 루프문과 병렬적으로 실행되어야 한다. 그렇지 않으면 서보모터가 동작하는 동안 차체는 아무 동작도 할 수 없기 때문이다. 따라서 MsTimer2라는 라이브러리를 추가하여 병렬 실행을 가능하게 한다.

45 ict 탐지도우미 (20)

45 ict 탐지도우미 (21)

 

void curl(){
int servoPin = 5;
int angle = 0;
for(angle = 0; angle <180; angle++)
{
servo.write(angle);
delay(20);
}
for(angle = 180; angle > 0 ; angle –)
{
servo.write(angle);
delay(20);
}
}

그림 28 파이카메라 서보모터 동작 코드

파이카메라를 부착할 서보모터는 주기적으로 180도를 회전하며 카메라가 다양한 각도를 촬영하도록 한다. curl() 함수는 메인 루프문과 별개로 500ms마다 타이머 인터럽트로 인해 호출되기 때문에 어떤 delay로 없이 서보모터를 동작시킬 수 있다.

void forward(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA1,150);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
analogWrite(ENA2,255);
}
void Stop(){
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
analogWrite(ENA1,0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
}

그림 29 아두이노 조향 제어1

void turn_left(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA1,180);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(ENA2,255);
}
void turn_right(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(ENA1,180);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(ENA2,255);
}

그림 30 아두이노 조향 제어2

그림 33, 그림 34는 자동차의 모터 제어를 위한 부분이다. IN1이 HIGH, IN2가 LOW이면 정방향으로 주행을 하고 0~255까지 PWM 제어를 통해 속도를 조절할 수 있다. 그리고 IN3, IN4에 HIGH, LOW를 주게 되면 좌회전, LOW,HIGH를 주게 되면 우회전을 하게 되고 이 때 ENA2에 255 값을 주게 되면 45도 회전하게 된다.

45 ict 탐지도우미 (22)

적외선 센서의 값은 검은색 라인을 인식하면 0이고, 흰색 바탕을 인식하면 1이다. 흰색 바탕을 인식하거나 센서 값이 적절하지 않은 경우(예를 들면 1-0-0-1) 라인을 인식하지 못했으므로 정지하도록 한다. 센서 값에 따른 방향을 정리하면 위의 표와 같이 나타난다. 이를 이용하여 방향을 판단하는 함수를 작성하면 다음과 같다.

char DIRECTION(){
char Direction=’S';
if(digitalRead(left_1)==0 && digitalRead(left_2)==0 && digitalRead(right_3)==0 && digitalRead(right_4)==0) Direction = ‘G’;
else if(digitalRead(left_1)==1 && digitalRead(left_2)==0 && digitalRead(right_3)==0 && digitalRead(right_4)==0) Direction = ‘R’;
else if(digitalRead(left_1)==1 && digitalRead(left_2)==1 && digitalRead(right_3)==0 && digitalRead(right_4)==0) Direction = ‘R’;
else if(digitalRead(left_1)==1 && digitalRead(left_2)==1 && digitalRead(right_3)==1 && digitalRead(right_4)==0) Direction = ‘R’;
else if(digitalRead(left_1)==0 && digitalRead(left_2)==0 && digitalRead(right_3)==0 && digitalRead(right_4)==1) Direction = ‘L’;
else if(digitalRead(left_1)==0 && digitalRead(left_2)==0 && digitalRead(right_3)==1 && digitalRead(right_4)==1) Direction = ‘L’;
else if(digitalRead(left_1)==0 && digitalRead(left_2)==1 && digitalRead(right_3)==1 && digitalRead(right_4)==1) Direction = ‘L’;
else Direction = ‘S’;
return Direction;
}

그림 31 센서 값으로 방향을 판단하는 함수

char Direction = DIRECTION();
switch(Direction){
case ‘S’:
Stop();
Serial.println(Direction);
break;
case ‘L’:
turn_left();
Serial.println(Direction);
break;
case ‘R’:
turn_right();
Serial.println(Direction);
break;
case ‘G’:
forward();
Serial.println(Direction);
break;
defalt:
break;
}
delay(50);

그림 32 방향에 따른 모터 제어

방향을 판단하는 함수 DIRECTION() 값에 따라 모터를 제어하는 메인 코드이다. 직진으로 판단한 경우 변수 Direction은 ‘G’이므로 forward() 함수가 실행된다. Direction은 좌회전으로 판단한 경우 ’L’로 우회전으로 판단한 경우는 ‘R로 나타나며 각각 turn_left() 함수와 turn _right() 함수를 실행한다.

3.3. 개발 환경
3.3.1. 하드웨어
라즈베리파이3, L298N 모터 드라이버, SG-90 서보 모터, 적외선 센서 AM-IRS4D, 아두이노(UNO) 등

3.3.2. 운영체제
Window 10, raspbian-jessie

3.3.3. 개발 언어
C, C++, 쉘 스크립트(Shell Script)

4. 단계별 제작 과정
4.1. 아두이노

45 ict 탐지도우미 (23)

45 ict 탐지도우미 (24)
4.2. 라즈베리파이

45 ict 탐지도우미 (25)

45 ict 탐지도우미 (26)

4.3. 적외선센서

45 ict 탐지도우미 (27)

4.4. 주행

45 ict 탐지도우미 (4)

45 ict 탐지도우미 (5)

 

 

 

 

 

 

Leave A Comment

*