본문 바로가기
아두이노

8. 스마트 카 원격제어

by Beijing_KingGod 2019. 12. 18.

실험 목적:

- 1년 동안 배운 MicroprocessorTechnologyHardware/Software의 종합 구현 능력을 배양함

- Hardware를 통한 Software 분석 능력을 기름

 

실험 1부터 실험4 까지는 개인적으로 실험을 해본다.

->반드시 실험을 해볼 필요는 없음. 실험 5의 프로그램을 분석하기 위해서는 실험1부터 실험4까지를 해보면 많은 도움을 받을 수 있음

 

실험 목표:

- dc 모터와 l298n 모터 제어 드라이버를 사용하여 전///우 운행이 가능하다.

-초음파 센서를 활용한 거리 감지& 장애물 감지가 가능하다.

-라인 트랙 유도선 운행이 가능하다.

-블루투스 통신으로 스마트 앱을 통한 무선제어가 가능하다.

 

실험 구성품

 

 

아두이노 센서 쉴드 v4.0

(Arduino Sensor Shield V4.0)

 

-브레드 보드 없이 센서 및 부품을 plug & play 형식으로 연결 가능

-디지털 및 아날로그 핀 단자

-I2C/UART 인터페이스

- 점퍼를 사용해서 I2C, COM 선택

 

 

센서 쉴드 회로도

 

 

Dc 기어드모터

 

-사용 전압 : 3v~6v

-가동 전압 : 5v

-핀 형태 :2.54 피치 헤더

-드라이버 : L298N

 

Working voltage

Dc 3v

Dc 5v

Dc 6v

Working current

100mA

100mA

120mA

Reduced ratio

48:1

Non-load

100rpm

190rpm

240rpm

Wheel diameter

615 px

Non-speed

20m/min

39m/min

48m/min

Weight

50g

Size

70mm*22mm*18mm

Noise

<65db

 

 

l298n 모터 드라이버

프로세서는 작은 전류와 전압의 신호로 센서나 모터를 제어한다. 그렇기 때문에 다른 큰 전류로 작동하는 모터를 제어할 때는 모터드라이버를 사용해야 한다. , 프로세서의 작은 신호로 모터의 속도를 제어하고, 모터의 방향을 변환 시켜줄 수 있는 회로 장치를 통상 모터 드라이버라 한다.

 

우리가 쓸 모터드라이버모듈은 L298N 듀얼 H-브릿지 모듈이다.

 

-L298N 모터 드라이버 모듈-

 

L298N 드라이버 사양

– 드라이버 칩 : L298N 듀얼 H-브리지 드라이버 칩

– 드라이브 부분의 공급전압 VMS : +5 V ~ 35 V-

– 드라이브 부분의 최대전류 : 2A / bridge

– 로직 부분의 공급전압 VSS : 4.5-5 0.5 V

– 로직 부분의 작동 전류 범위 :0 ~ 36mA

– 입력제어신호 전압 범위 : H: 4.5~ 5.5V / L: 0V

– 최대 소비 전력 : 20W

– 보관 온도 : -25 ℃까지 130 ℃

– 드라이버 보드 크기 : 55mm * 60mm * 30mm

– 드라이버 보드 무게 : 33g

– 기타 기능 : 방향 제어 표시LED, 전원 표시 LED

 

 

-l298n 모터 드라이버 회로도

모터 드라이버 모듈의 작동법을 이해하기 위하여 l298n dual full-bridge driver에 대해 알아보자

-l0298n dual full-bridge driver-

 

-L298N block diagram-

L298 블록 다이아그램을 보면 두 개의 H-브릿지 회로가 구성 되어있는 것을 볼 수 있다.

 

H-브릿지 회로란,

모터의 회전 방향을 바꾸기 위해 트랜지스터를 npn pnp형의 조합으로 서로 대칭 되게 만들어 한 방향으로 만 전류가 흐르도록 만든 회로이다.

구조가 H 형이라서 H-브릿지 회로라 불린다.

 

L298n 드라이버에서는 input 핀과 enable 핀으로  트렌지스터를 제어 하고 있음을 알 수 있다.

이를 이용하여 l298n 모터 드라이버의 논리 표를 보자

 

 

Input enable 핀 논리 표

 

입력

기능

V(Enable) =H

IN1=H , IN2=L

정 회전

IN1=L , IN2=H

역 회전

IN1 = IN2

모터 정지

V(Enable)= L

IN1= X , IN2=X

모터 정지

이로써 두 개의 H-브릿지 회로가 어떻게 작동하여 모터의 회전 방향이 바뀌는지 알아보았다.

속도제어는 Enable 핀을 이용하여 제어를 하는데 이는 아두이노의 pwm(pulse width modulation:v펄스 폭 변조)핀을 이용하여 제어를 한다. PWM 기능 설명은 아날로그 단원에서 다루었음으로 생략하도록 한다.

 

 

논리표를 보면

V(Enable) H일 때 와 L일 때 의 기능을 볼 수 있다. 이런 반복적인 행위가 DUTY비에 따라 빠르게 진행되어서 모터의 회전수를 제어 할수있다.

, 모터에 인가되는 전압이 아주 짧은 일정 주기의 간격으로 인가되기 때문에 회전 속도가 변한것 처럼 보인다.

 

 

초음파 센서(HC-SR04)

 

위 그림처럼 초음파 센서는 초음파를 발생시키는 발생 시키는 송신부와 초음파를 받아드리는 수신부로 나누어져 있으며 Tigger 핀은 송신부 이며 Echo 핀은 수신부 역할을 한다.

 

초음파 센서 측정   거리: 2cm~5m(4m)

초음파 센서 측정   각도: 15

초음파 센서 측정 해상도: 3mm

 

 

핀번호

핀이름

설명

1

Vcc

전원(DC,5V)

2

Trigger

초음파 출력부

3

Echo

초음파 수신부

4

Gnd

접지

거리=(Echo time(μs)* (340m/s) /2

1μs=0.000001s

초음파의 속도 v= 331 +0.6t(t:섭씨온도)

V=(331+0.6*t)ms

/2=왕복거리

 

 

라인트레이서 모듈

특성

 

라인트레이서와같이라인()을인식하는용도로사용하는적외선송수신센서모듈.

 

OUT핀을 통해 아날로그 값과 디지털 값으로 출력가능하다. 이값을이용해흰색~검은색인지를감지할수있다. 센서감도는센서에부착된가변저항을이용해조정한다.

 

3(VCC / GND / OUT)

 

동작전압: 3.3 ~ 5V

 

인식거리: 12mm 내외

 

 

- 라인트레이서 모듈은 근접한 물체만 감지할 수 있으며, 가변 저항(Potentiometer)으로 감도를 조절할 수 있다.

물체가 감지되면 LOW, 감지되지 않으면 HIGH신호를 출력한다

 

- 물체는 고유의 빛을 반사하여 인체의 눈을 통해 그 색을 구분하는 것이 가능하다.

하지만, 검정색은 빛을 반사하지 않고 흡수하기 때문에 어두워 보이는것이다.

 라인트레이서는 이러한빛의 성질을 이용한 모듈이다.

 

- 적외선 송수신 원리를 이용하는 라인트레이서의 모듈의 발광부에서 적외선을 발사하여 물체에 부딪혀 반사되고 수광부로 들어가면 인식하게 된다.

 

- 하지만 검정색의 경우, 라인트레이서의 발광부에서 적외선을 방출하면 검정색에서 반사가 이뤄지지 않기 때문에수광부로 들어가는 적외선이 없다. 

 

이러한 라인트레이서 모듈의 특성을 이용하여 검정색 선을 따라 주행하는구동체를 제작할 수 있다.

 

 

hc-06 슬레이브 모듈

 

실험 1. 모터 실험

아두이노와 L298N 드라이버를 이용하여 모터의 속도와 방향을 제어해보자

 

L298N 핀 기능

 

 

 

핀 배치

 

Arduino pin

L298N driver pin

2

IN4

3

ENB

4

IN3

5

IN2

6

ENA

7

IN1

 

MOTOR PIN

L298N driver pin

Motor A (+)      

OUT1

Motor A (-)

OUT2

Motor B (+)

OUT3

Motor B (-)

OUT4

L298N vms

L298N GND

L298N 5V

6 AA전지 직렬(+)

6 AA전지 직렬 (-)

아두이노 GND 

 

 

 

회로구성

 

 

회로

 

회로 구성 사진

 

 

 

프로그램

 

 

프로그램 실행 결과

1 입력 시 (정방향 회전)

Led IN2/4 불이 들어 오는 것을 확인 할 수 있다.

 

시리얼 모니터

2 입력 시 ( 좌 회전)

Led IN1/4 번에 불이 들어 오는 것을 확인 할 수 있다.

 

시리얼 모니터

 

3 입력 시 (우 회전)

Led IN2/3 번 불이 들어 오는 것을 확인 할 수 있다.

 

시리얼 모니터

 

4 입력 시 (후진)

Led IN1/3 번 불이 들어 오는 것을 확인 할 수 있다.

 

시리얼 모니터

 

0 입력 시 (정지)

 

정지 하였지만 Led IN1/4 번 불은 들어 오는 것을 확인 할 수 있다. ENA/B LOW값이 입력 되어 모터가 회전 하지 않는 것이다.

 

 


실험 2 초음파 실험

아두이노 센서 쉴드 V4.0을 이용하여 초음파 센서 측정 거리 값 확인하기

아두이노 우노에 센서 쉴드를 적층한다.

 

핀 배치

초음파 센서 pin

아두이노 센서 쉴드 V4.0 pin

VCC

5V

GND

GND

Echo

D13

Trig

D12

 

 

초음파 센서의 각핀을  아두이노 센서 쉴드 핀에 연결한다.

 

프로그램

 

프로그램 22번 줄 설명

거리=(Echo time(μs)* (340m/s) /2

1μs=0.000001s

초음파의 속도 v= 331 +0.6t(t:섭씨온도)

V=(331+0.6*t)ms

/2=왕복거리

 

온도가 20도 일 때

초음파의 속도 v= 331+0.6*20

           V= 343m/s

Distance= (duration(us)*343m/s)/2

           = (duration(s)*343*(cm/s)*100*(0.000001))/2

           =(duration*343*0.0001)/2[cm]

           =duration*0.0343/2[cm]

           =duration/2/29.1 [cm]

 

프로그램 실행 결과

 

시리얼 모니터

 



실험 3 라인트레이서 모듈 실험

아두이노에 적층한 센서 쉴드 보드에 TCRT5000 모듈 3개를 각각 A0,A1,A2 포트에 연결하여 값을 확인하여라

 

 

아두이노 우노에 센서 쉴드 v4.0을 적층한다.

 

핀 배치

초음파 센서 pin

아두이노 센서 쉴드 V4.0 pin

VCC

5V

GND

GND

S(라인트레이서 모듈 1)

A0

S(라인트레이서 모듈 2)

A1

S(라인트레이서 모듈 3)

A2

 

 

 

TCRT5000 모듈 3개를 각각 A0,A1,A2 포트에 연결한다.

 

 

 

 

프로그램

프로그램 실행 결과

, 우리가 사용하는 라인트레이서 모듈에서는 물체가 감지되면 low 신호를 출력하고 감지되지 않으면 high 신호를 출력함으로, 검정색 면에서는 적외선 수신이 되지 않아 디지털 값이 1이 되고 흰색 면에서는 적외선 수신이 되어서 디지털 값이 0이된다.

 

시리얼 모니터

 

시리얼 모니터

 

 

-참고-

적외선 모듈이 감도가 낮다면 가변저항을 조절 한다.

 

 

 


실험 4 블루투스 통신 실험

 

안드로이드 앱과 블루투스 모듈(HC-06)을 이용하여 안드로이드와 아두이노 통신하기

(안드로이드 어플 중 BT CHAT 이라는 어플을 사용하겠다.) 

 

회로구성

( 아두이노 스마트카에서는 아두이노에 센서 쉴드를 적층 하였으므로 센서 쉴드를 적층한 상태에서 블루투스 모듈을 연결하겠다.)

 

 

아두이노 우노에 센서 쉴드를 적층한다.

 

핀 배치

블루투스 모듈 pin

아두이노 센서 쉴드 V4.0 pin

VCC

5V

GND

GND

RX pin

11

TX pin

10

 

 

 

 

프로그램

 

어플 다운로드 및 사용법

 

- 어플 사용에 앞서 위의 소스를 아두이노에 업로드 후 블루투스 통신을 할 수 있는 환경을 만들어 준다.

 

- HC-06 은 안드로이드 핸드폰에서만 블루투스 통신이 가능하다. 아이폰에서는 블루투스 통신 규정이 달라서 hc-06 블루투스 모듈과 통신이 불가능하다.

 

1. play 스토어에 bt chat 이라고 입력 후 어플을 다운 받는다

2. bt chat 어플을 실행 시켜 눈 모양 아이콘을 클릭한다.

 

 

3. hc-06 블루투스 모듈과 페어링 한다.

-자신의 HC-06 모듈의 이름을 다른 hc-06 모듈과 헷갈리지 않기 위해 앞서 배운 블루투스 통신 편을 참고하여 AT 명령어를 이용해 이름을 바꾸는 것을 추천한다.

 

 

4. 데이터를 입력하여 통신이 되는지 확인하여 본다.

안드로이드 폰으로 hi 를 입력하여 보자

 

시리얼 모니터에 hi가 입력이 되었을 것이다.

 

 

그럼 반대로 시리얼 모니터로 arduino 라 입력하여 보자

 

 

Bt chat 어플에 arduino 가 출력 되었을 것이다.


-실험-

■ <Challenge 1>

본 키트를 이용하여 실험 5와 같이 로봇을 조립한 후 프로그램을 다운로드하여 동작을 검사 받는다.

실험 5의 프로그램을 분석하여 프로그램을 설명하는 검사를 받는다.

 

■ <Golden Bell 1>

부품추가 없을 경우: 본 키트를 이용하여 다른 형태의 로봇을 만들어 프로그램을 작성한 후 동작과 프로그램을 검사 받는다.

 

부품추가 있을 경우: 본 키트를 이용하여 하드웨어적인 부품을 추가하여 어떠한 아이디어든지 구현하여 동작과 프로그램을 검사 받는다.

 

 

 

실험 5 로봇 제어 실험

 

A.  고정 틀을 기어드 dc모터의 리드선이 있는 부위 아래에 그림처럼 볼트/너트를 사용해서 고정한다.

 

 

[ 고정 틀을 기어드 dc 모터에 고정한 모습]

B. 지정된 위치에 볼트를 넣어 dc모터 고정 틀과 섀시를 연결시켜준다.

 

 

[ 하단 섀시와 dc 모터 고정 후 섀시 아래 부분 모습]
[ 하단 섀시와 dc모터 고정 후 섀시 위 부분 모습]

C. 기어드 dc 모터 와 바퀴를 조립 하고 모터의 리드선을 섀시 윗 부분으로 빼낸다.

 

[기어드 DC모터에 바퀴를 조립한 모습]
[모터의 리드선을 하단 섀시 윗부분으로 빼낸 모습]

 

[모터의 리드선을 하단 섀시 윗부분으로 빼낸 모습]

 

 

D. L298N 모터 드라이버를 하단 섀시에 조립한다.

 

 

[ 하단 섀시에 육각기둥을 고정한 모습]

 

[ 육각 기둥 위에 L298N 모터 드라이버 모듈을 볼트를 이용하여 고정한 모습]

 

 

E. L298N 모터 드라이버 모듈과 기어드 dc 모터를 연결한다.

    - 그림 중 검은 선 = 모터 + 선                     회색 선 = 모터 – 선
[모터와 L298N모터 드라이버 모듈을 연결한 후 모습]

 

F. 상단 섀시에 아두이노 우노를 조립한다.

육각 기둥을 너트를 이용하여 조립한다.

 

 

 

육각 기둥위에 아두이노를 올려 놓고 볼트를 이용하여 고정 시킨다.

[상단 섀시에 아두이노 우노를 조립한 모습]

 

G. 아두이노 우노에 센서 쉴드를 적층하고 dc 모터 전원 공급용 AA*6 베터리 홀더 박스를 상단 섀시에 조립한다.

[ 센서 쉴드를 아두이노에 적층한후 상단 섀시에 건전지 홀더를 조립한 모습]

H. 센서 쉴드를 적층한 아두이노 우노 와 건전지 홀더, L298N 모터 드라이버를 연결한다.

 

[ 센서 쉴드 / 건전지 홀더 / 모터 드라이버 를 연결한 모습]

I. 상단 섀시와 하단 섀시를 조립한다.

 

J. 모터 드라이버와 아두이노 우노를 연결한다. / 미니 브레드 보드 와 아두이노 전원 용 9V 건전지 홀더도 상단 섀시에 조립 해준다.

 

 

L298N 모터 드라이버 PIN

Arduino PIN

ENA

D6

IN1

D7

IN2

D3

IN3

D4

IN4

D2

ENB

D5

[모터 드라이버와 우노 pin 연결 모습]

 

K. 초음파 센서 모듈 연결

초음파 센서 모듈 PIN

센서 쉴드 PIN

VCC

VCC

GND

GND

TRIG

D12

ECHO

D13

L. 라인 트레이서 모듈 조립 및 연결

하단 섀시에 너트를 이용하여 육각기둥을 조립한 후 볼트를 이용하여 라인트레이서 모듈을 조립한다.

 

 

 

TCRT5000 PIN

아두이노 연결 PIN

왼쪽 TCRT5000

중앙 TCRT5000

오른쪽 TCRT5000

SIGNAL

S(Analog 0 port) = A0

S(Analog 1 port) = A1

S(Analog 2 port) = A2

VCC

VCC(Analog 0 port)

VCC(Analog 1 port)

VCC(Analog 2 port)

GND

GND(Analog 0 port)

GND(Analog 1 port)

GND(Analog 2 port)

 

N. 블루 투스 모듈 연결

 

[블루 투스 / 초음파센서/ 라인트레이서 모듈 연결 후 완성 된 스마트 카 사진]

 

프로그램

 

이제 프로그램을 아두이노 우노에 업로드 후 스마트폰의 블루투스 통신을 이용하여 스마트카를 조종하여 보자

스마트폰을 앱을 만드는데 있어서는 앱인벤터를 사용하도록 하겠다

 

앱인벤터 사용하여 안드로이드 app 만들기

 

안드로이드 app을 만들어 스마트카를 조종하여 보자

 

 

일반적으로 안드로이드 계열의 스마트 앱은 자바를 이용하여 개발한다

자바를 이용하는 방법은 어렵고 복잡한 사전지식을 필요로 함으로써

우리는 MIT 에서 개발한 스마트 폰 용 앱 개발도구인 앱인벤터를 사용하여 안드로이드용 앱 을 쉽고 간단하게 개발 하여 보겠다.

 

스마트 카 조종기 만들기

 

1.일단 앱인벤터 사이트인  http://appinventor.mit.edu/explore/ 로 들어간다.

그리고 오른쪽 상단의 create apps 버튼을 클릭 한다.

이때 앱인벤터를 사용하기 위해서는 google 계정이 필요하다

 

2. 이제 앱인벤터를 켰으니 본격적으로 앱을 만들어보자

 Start new project 버튼을 클릭하여 새로운 프로젝트를 만든다

Project name smartcar 로 하겠다. Ok 버튼을 눌러 프로젝트 작성 창을 띄어보자

 

4. OK 버튼을 누르면 프로젝트를 작성 할 수 있는 창이 나온다.  Screen 에서는 화면을 디자인 할 수 있다. 사용법은 palette에 있는 블록을 클릭하여 viewer 창에 끌어다 놓으면 된다.

Palette 칸에 구성요소가 무엇이 있는지 먼저 살펴보는 것을 추천한다

 

 

5. 이제 스마트카 조종기로 사용할 app 화면을 만들어 보자

   a) 레이아웃 설정

Layout 창에서 horizontalArrangement 버튼을 클릭하여 screen 창에 끌어다 놓는다.

horizontalArrangement 블록의 크키를 설정 하기 위해 왼쪽 properties 창으로 가서 width 아래 버튼 클릭한다. 

넓이를 화면에 맞추기 위해 Fill parent 에 체크 표시를 하고 OK 버튼을 누른다.

 

Pixels, percent 로 블록의 크기를 정할 수도 있는데 스마트 폰 마다 화면이 각자 다르므로 pixel 로 정하는 것보다 percent로 정하는 것이 편하다.

 

앞의 과정을 두번 반복하여 horizontalArrangement 블록을 두개 만들어 준다.

 

 

앞의 과정과 같이 TableArrangement 레이아웃을 screen 창에 끌어다 놓고

 

3 3열 의 칸을 만들어 준다.

 

 

첫번째 칸에는 블루투스 connect/disconnect 버튼을

   두번째 칸에는 아두이노에서 전송한 글자를 띄울 창을

   세번째 칸에는 스마트카 조종기 버튼을 만들 것이다.

 

 

 

 

b) 버튼과 listpicker 블록을 끌어다 놓는다.

Button 1 을 클릭하여 Rename 버튼을 눌러 이름을 변경 하여 준다.

 

이제 이름이 변경 된 DisconectButton 을 클릭하여 화면에 띄울 버튼 안에 text connect 로 지정하여 준다.

 

똑같은 방식으로 listpicker1 블록의 text Select Bluetooth Client 로 지정하여 준다.

 

 

화면에 알맞게 버튼의 크기를 수정하여 준다.

 

 

위와 같은 방식으로 화면 구성을 밑 사진과 같게 만들어준다..

 

 

사실상 디자인 부분은 개인의 취향대로 만들 되 프로그램의 역할에 맞춰서 필수 요소들이 꼭 있어야 한다.

 

bluetoothClient / clock / Activitystarter / Notifier  블록도 빠짐 없이 넣어야한다.

Select Bluetooth Client (listpicker) : 현재 연결 가능한 블루투스 기기를 보여준다.

Disconnect버튼 : 연결 된 후 연결을 끊을 때 사용

Received data : 아두이노에서 전송한 글자를 화면에 보여줍니다. (프로그램 상 높이를 자동으로 맞추면 들어오는 데이터로 화면이 꽉 차기 때문에  5 percent 로 높이를 정해 주었다.)

bluetoothClient : 아두이노를 블루투스로 연결하여 데이터를 주고 받는 기능을 한다.

Clock: 정기적으로 블루투스 연결이 되어 있는지, 아두이노에서 보내는 데이터가 있는지 확인한다.

Notifier: 문제가 발생할 때 화면에 경고 메시지를 보여준다.

AcitivityStater: 블루투스가 켜져있지 않을 때 블루투스가 켜지도록 요청한다

Slider: 스마트카의 모터 스피드 level 전송 ( 최소 값 1 // 최대값 3)

 

 

C) 이렇게 화면을 디자인을 구성한 후, 블록화면에서 코드를 작성한다.

 

앱이 실행될 때 에러가 발생할 경우 원인을 찾을 수 있도록 도와줄 수 있는 코드 작성.

처음 앱이 실행 될 때 블루투스가 켜져있지 않다면 메시지를 보여주어서 블루투스를 켜도록 알려주는 코드

Select Bluetooth Client를 클릭하면 현재 연결가능한 블루투스 목록을 보여주는 코드

원하는 블루투스 모듈을 선택하면 그 모듈과의 연결을 시도한다.

타이머가 정기적으로 돌면서 현재 블루투스가 연결되어 있는지 여부를 확인 한다.

그리고 리스트피커의 배경을 초록색으로 바꾸고 “Connected”로 변경한다.

또한, 외부에서 데이터가 들어오는 파악하여 만약 데이터가 있다면 Received data text label에 표시해 준다.

블루투스가 연결되지 않았다면, 리스트피커의 배경을 회색으로 바꾸고, “disconnected” 로 표시한다.

 

 

각 조종 버튼을 클릭 했을 때 text에 있는 글자가 전송된다.

스피드 값 변경 슬라이더

블루투스와 연결되어 있을 때

Label에 현재 슬라이터 커서 위치를 띄워주고

슬라이터 커서 위치에 따른 speed level 을 알려준다

 

 

전체 프로그램

 

 

 

 

이제 모두 작성을 했다면 build -> app(save.apk to my computer) 를 눌러 저장한다.

 

이제 apk 파일 만들어 졌다면, 스마트폰으로 옮겨서 다운을 받은 후 설치 한 후 스마트 카를  움직여 본다.

 

 

앱 실행 사진

< 페어링>
<high speed>

 

<middle speed>

 

<low speed>

 

 

https://youtu.be/5wO9HosplVo

 

'아두이노' 카테고리의 다른 글

arduino project  (0) 2019.12.19
9.1 4-digit 7segment  (0) 2019.12.18
7. 블루투스 통신  (0) 2019.12.18
6 인터럽트& 타이머  (0) 2019.12.18
5.2 서보모터 제어하기  (0) 2019.12.18

댓글