2wd smart car 만들기 -...

77
WWW.FIRSTBOT.CO.KR (VER 1.0) 2016.11.20 ㈜퍼스트봇 SMART CAR 만들기 Step 1 : 2WD Smart CAR with Arduino UNO R3 www.firstbot.co.kr

Upload: votu

Post on 11-Aug-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

WWW.FIRSTBOT.CO.KR

(VER 1.0)

2016.11.20

㈜퍼스트봇

SMART CAR 만들기 

Step 1 : 2WD Smart CAR with Arduino UNO R3 

ww

w.fi

rstb

ot.c

o.kr

Page 2: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

1

SMART CAR 만들기  V

er  1.0 

SMART CAR 만들기 

Step 1 : 2WD Smart CAR with Arduino UNO R3 

아두이노 우노 R3(Arduino UNO R3)를 이용한 스마트카(Smart Car)를 만들어

보겠습니다. 우리가 만들고자 하는 스마트카는 L293D 라는 모터 드라이버 IC 를

이용하여 모터를 구동하고 적외선 장애물 감지 센서로 장애물을 감지하여 장애물을

피해가면서 주행 할 수 있도록 만들어 보겠습니다.

준비물은 아래와 같습니다.

- Arduino UNO R3 및 USB Cable

- L293D Motor driver IC 1 개

- 가변저항(Potentiometer) 1 개

- 수-수 듀퐁 케이블(Header Dupont cable) 및 미니 브레드(Bread)보드

- 아크릴 2WD 차체 및 지대대, 볼트류

- 5V DC Motor 및 바퀴 각각 2 개

- AA 건전지 4 개 및 건전지 홀더(Holder)

Arudino IDE 인 스케치의 설치 및 사용 방법과 기본적인 아두이노 문법 및 C 언어의

기초 문법은 별책으로 첨부 합니다. 기초부터 스터디가 필요하신 분은 Beginning

Ardino - Anyone can easily 를 먼저 스터디 하시기 바랍니다. ww

w.fi

rstb

ot.c

o.kr

Page 3: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

2

SMART CAR 만들기  V

er  1.0 

1. 아두이노 우노 R3(Arduino UNO R3)

2WD 스마트카를 만들기 위해 사용되는 아두이노 우노는 가장 많이 사용되는

기본적인 아두이노 보드이며. 이 보드의 핀 배열이 거의 표준과 같이 사용됩니다.

아두이노 기초 강좌, 예제 등의 자료는 거의 대부분이 아두이노 우노 보드에 맞춰줘

있기 때문에 초보자라면 아두이노 우노 보드를 선택하면 됩니다. 현재 R3 버전까지

출시되어 있습니다. 아두이노 우노 R3 의 사양(스펙, Specification)을 잠시 살펴

보겠습니다.

- Microcontroller ATmega328

- Operating Voltage 5V

- Input Voltage (recommended) 7-12V

- Input Voltage (limits) 6-20V

- Digital I/O Pins 14 (of which 6 provide PWM output)

- Analog Input Pins 6

- DC Current per I/O Pin 40 mA

- DC Current for 3.3V Pin 50 mA

- Flash Memory 32 KB (ATmega328) of which 0.5 KB-used by bootloader

- SRAM 2 KB (ATmega328)

- EEPROM 1 KB (ATmega328)

- Clock Speed 16 MHz

ww

w.fi

rstb

ot.c

o.kr

Page 4: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

3

SMART CAR 만들기  V

er  1.0 

아트멜(Atmel)사의 ATMEGA328 마이크로 컨트롤러가 CPU 의 역할을 합니다. 초당

16MHz 의 속도로 연산을 할 수 있으며 부트로더(boot loader)가 이미 플래시

메모리(Flash Memory) 내부에 내장 되어 있기 때문에 IDE(통합 개발 환경)인

스케치(sketch)에서 작성한 C 언어로 작성된 코드를 컴파일(compile)하여 시리얼

통신을 통한 업로드를 합니다. 간단한 C 언어만 습득하여 누구나 쉽게 개발 할 수

있는 환경을 제공하는 것입니다. 아두이노 우노는 6 개의 아날로그 입력 포트를,

14 개의 디지털 인풋/아웃풋(Input/Output) 포트를 가지며 이중 6 포트는 PWM

신호의 처리를 지원하고 아날로그 포트는 10 비트(10bit, 0~1023)를, 디지털 포트는

8 비트(8bit, 0~255)의 해상도를 가집니다. 이는 아두이노 우노의 내부 동작 전압이

5V 이므로 0~5V 전압의 범위를 0~255(8bit), 0~1024(10bit) 단계로 쪼개어서 제어

할 수 있음을 의미 합니다. 포트당 허용 전류는 40mA 이므로 40mA 이내의 소자나

부품들을 사용하여야 합니다. 내부동작 전압은 5V 이며 입력 전원으로는 6~20V 로

정전압 레귤레이터를 거쳐 안정적인 5V 를 공급하게 됩니다.

< 아두이노 우노 R3 >

ww

w.fi

rstb

ot.c

o.kr

Page 5: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

4

SMART CAR 만들기  V

er  1.0 

2. L293D Motor driver IC(모터 드라이버 IC 칩)

아두이노 우노 2WD 스마트카를 만들기

위해서는 5V 용 직류 모터(DC Motor) 2 개가

사용됩니다. 이는 모터의 회전 방향을 정방향

또는 역방향으로 바꾸어서 스마트카의 방향을

바꾸게 되는데 이를 제어하기 위한 칩(Chip)이

L293D Motor Driver 입니다.

L293D 는 H-Bridge 회로가 적용된 IC 로 아래 그림과 같이 모터에 +/- 또는 -/+로

전원의 방향을 바꾸어 정방향/역방향으로 모터의 회전 방향을 바꿀 수 있도록 하는

Motor driver IC 입니다. 이와 같은 H-Bridge 회로 2 개 내장되어 있어 동시에 2 개의

모터를 제어 할 수 있는 것입니다. 주의 할 점은 직류 모터에 별도의 극성(+/-)

표시가 없기 때문에 모터를 스마트카의 본체에 장착 한 후 모터의 회전 방향을

확인하고 결선하여야 합니다.

ww

w.fi

rstb

ot.c

o.kr

Page 6: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

5

SMART CAR 만들기  V

er  1.0 

그러면 L293D 의 사양(Spec, specification)을 잠시 보겠습니다. 클램프 다이오드를

사용하여 H-bridge 회로가 구성되었으며 채널당 600mA 의 허용전류와 연속적이지

않은 1.2A 의 최대 순간 전류를 공급할 수 있습니다. Enable 포트가 2 개가 있어

각각의 모터 출력을 제어 할 수 있습니다.

- 600mA OUTPUT CURRENT CAPABILITY PER CHANNEL

- 1.2A PEAK OUTPUT CURRENT (non repetitive) PER CHANNEL

- ENABLE FACILITY

- OVERTEMPERATURE PROTECTION

- LOGICAL "0" INPUT VOLTAGE UP TO 1.5 V (HIGH NOISE IMMUNITY)

- INTERNAL CLAMP DIODES

아래 그림과 표는 L293D 의 할당된 포트를 번호와 사용용도를 나타냅니다. IC 칩의

반점이 있는 부분이 상단으로 좌측 부분에서 아래서 포트 번호가 매겨집니다.

ww

w.fi

rstb

ot.c

o.kr

Page 7: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

6

SMART CAR 만들기  V

er  1.0 

Enable1 포트는 Motor1 의 사용여부, 즉 아날로그 입력 0~5V 입력시 모터의 출력을

결정합니다. 0V 일 때는 모터가 정지하고 5V 일 때는 VS 에 공급되는 전압 만큼의

최대 출력으로 모터를 회전 시킵니다.

Input1 이 High 일 때 Output1 도 High 가 됩니다 Input1 이 High 일 때는 Input2 는

Low 여야 Input1 은 +극성, Input2 는 –극성이 되어 모터가 회전합니다. 반대로

Input1 이 Low 일 때 Input2 는 High 로 하여 Input1 은 –극성, Input2 는 +극성으로

하여 모터를 반대 방향으로 돌릴 수 있으며 Enable1 의 값에 의해 모터의 출력이

결정됩니다. 모터의 회전방향은 아래 표를 참조하세요.

ww

w.fi

rstb

ot.c

o.kr

Page 8: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

7

SMART CAR 만들기  V

er  1.0 

참고로 2WD 스마트카에서 사용되는 직류 모터는 FA-130

모터로 동작 전압은 1.5V~5V 에서 동작하며 소비전류는

0.35A~0.4A(No load)이고 스탈 전류는 1.7A 입니다. 스탈

전류란 모터의 회전축이 회전하지 않는 상태에서 전원을 인가

했을 시 소요되는 전류를 말합니다.

3. 아두이노 우노 RC 와 L293D 와의 결선

아두이노 우노 2WD 스마트카를 만들기 위해서는 5V 용 직류 모터(DC Motor)와

L293D 및 Arduino UNO 와의 결선을 아래 표의 결선도와 같이 결선 합니다.

전원은 L293D 의 VS(8 번)에 입력하고 VS 에서 분기하여 VSS(15)와 아두이노의 5V 에

연결합니다. GND 는 L293D 의 GND(4,5,12,13 중에서)에 연결하고 아두이노의

GND 에도 연결하도록 합니다.

< 아두이노 우노, L293D 와의 결선표 > ww

w.fi

rstb

ot.c

o.kr

Page 9: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

8

SMART CAR 만들기  V

er  1.0 

< 아두이노 우노, L293D 와의 결선도 >

만약 5V 이상의 모터를 사용할 경우에는

LM7805 등의 정전압 레귤레이터(Regulator)를

사용하여 VS(8 번)에 모터인가용 전원(최대

35V)을 연결하고 LM7805 의 input 단자에도

연결합니다. LM7805 의 output 단자에 5V 로 ww

w.fi

rstb

ot.c

o.kr

Page 10: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

9

SMART CAR 만들기  V

er  1.0 

강압된 전원은 L293D 의 VSS(15 번)과 아두이노의 5V 핀에 연결합니다. 그러나

여기서 사용되는 모터는 5V 용 모터이기 때문에 사용을 하지 않습니다.

4. 속도 조절용 가변 저항과, 장애물 감지 적외선 센서

Arduino UNO R3 와 L293D 및 모터와의 결선이 끝났으면 모터의 속도를 조절하기

위한 가변저항(Potentiometer)와 장애물을 감지하기 위한 적외선 센서를 장착하고

아래 결선표와 결선도와 같이 듀퐁 케이블을 이용하여 결선합니다.

< 가변저항 및 적외선 센서의 결선 >

여기서 사용되는 적외선 센서는 감지 범위가 15cm 내외이고 OUTPUT, GND, VCC 의

3 핀으로 OUTPUT 핀과 아두이노 우노의 아날로그 핀에 연결합니다. 디지털 핀에

연결하였을 때에는 High/Low 상태로 입력되지만 아날로그 핀에 연결하여 입력으로

받기 때문에 0~1023 의 값으로 측정됩니다. 물체가 감지 되었을 경우에는 512 보다

작은 경우, 물체가 감지 되지 않았을 경우에는 512 보다 같거나 같은 경우로 봅니다. ww

w.fi

rstb

ot.c

o.kr

Page 11: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

10

SMART CAR 만들기  V

er  1.0 

2WD 스마트 카에서는 전방에 좌측, 중앙, 우측에 3 개의 적외선 센서가 사용되므로

3 개의 아날로그 핀이 필요하고 모터의 속도 조절을 위한 1 개의 가변저항이

필요합니다. 가변 저항 역시 VCC, SIG, GND 순으로 SIG 를 아두이노의 아날로그 핀에

듀퐁 케이블을 이용하여 연결합니다.

< 적외선 센서와 가변저항과의 결선 >

실제 적인 조립 및 결선은 아래 사진을 참조합니다.

ww

w.fi

rstb

ot.c

o.kr

Page 12: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

11

SMART CAR 만들기  V

er  1.0 

< 전체적인 조립 및 결선 모습 >

< 미니 브레드 보드에 L293D 및 가변 저항과 HC-06 이 장착. > ww

w.fi

rstb

ot.c

o.kr

Page 13: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

12

SMART CAR 만들기  V

er  1.0 

적외선 센서의 최적의 감지 거리를 조절하기 위해서는 적외선 센서의 가변 저항을

드라이버로 우측으로 돌려 2 개의 LED 가 점등 되도록 한 다음, 드라이버를 좌측으로

조금씩 돌립니다. 이때 우측 LED 가 꺼지는 지점에서 멈춥니다.

ww

w.fi

rstb

ot.c

o.kr

Page 14: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

13

SMART CAR 만들기  V

er  1.0 

5. 장애물 회피 아두이노 스케치 프로그래밍 하기.

조립 및 결선이 정확하게 완료 되었다면 아래와 같이 스케치로 코딩 한 후 아두이노

우노에 업로딩 합니다. 소스에 대한 설명은 주석으로 대부분 설명 하였습니다.

#define Debug 0 //디버그여부 선택

#define L293D_ENABLE1 3 //Enable pin - Motor1

#define L293D_ENABLE2 6 //Enable pin - Motor2

#define MR_INT1 2 //Control pin 1 - Motor1

#define MR_INT2 4 //Control pin 2 - Motor1

#define MR_INT3 5 //Control pin 1 - Motor2

#define MR_INT4 7 //Control pin 2 - Motor2

#define L_INFRA A0 //왼쪽 적외선 센서 입력핀

#define M_INFRA A1 //중앙 적외선 센서 입력핀

#define R_INFRA A2 //오른쪽 적외선 센서 입력핀

#define C_Speed A3 //속도 조절용 가변저항 입력핀

int L_Infra = 0; //왼쪽 적외선 센서 입력값 저장 변수

int M_Infra = 0; //중앙 적외선 센서 입력값 저장 변수

int R_Infra = 0; //오른쪽 적외선 센서 입력값 저장 변수

int Car_speed = 200; //초기 모터 출력 값(0~255)

int retry_count = 0; //탈출하기 위한 동작의 카운터 변수

bool reverse_dir = 0;

void setup() { ww

w.fi

rstb

ot.c

o.kr

Page 15: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

14

SMART CAR 만들기  V

er  1.0 

Serial.begin(9600); //9600bps 의 Buadrate 로 시리얼 포트 오픈

pinMode(L293D_ENABLE1, OUTPUT); //Digital 3 번 핀을 출력포트로 할당.

pinMode(L293D_ENABLE2, OUTPUT); //Digital 6 번 핀을 출력포트로 할당.

pinMode(MR_INT1, OUTPUT); //Digital 2 번 핀을 출력포트로 할당.

pinMode(MR_INT2, OUTPUT); //Digital 4 번 핀을 출력포트로 할당.

pinMode(MR_INT3, OUTPUT); //Digital 5 번 핀을 출력포트로 할당.

pinMode(MR_INT4, OUTPUT); //Digital 7 번 핀을 출력포트로 할당.

}

void loop() {

//각 방향의 적외선 센서값 입력 받는다.

L_Infra = analogRead(L_INFRA); delay(10);

M_Infra = analogRead(M_INFRA); delay(10);

R_Infra = analogRead(R_INFRA); delay(10);

//가변저항의 값을 입력 받는다.

Car_speed = analogRead(C_Speed); delay(10);

//가변저항의 아날로그 입력값(0~1023)을 map 함수를 이용하여

//아날로그 출력값(0~255)으로 변경한다.

Car_speed = map(Car_speed,0,1023,0,255);

ww

w.fi

rstb

ot.c

o.kr

Page 16: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

15

SMART CAR 만들기  V

er  1.0 

//만약 Car_speed 가 150 보다 같거나 작다면 모터 출력 정지

if ( Car_speed <= 150 ) {

Car_speed = 0;

}

//모터의 출력값으로 Car_speed 를 사용.

analogWrite(L293D_ENABLE1, Car_speed);

analogWrite(L293D_ENABLE2, Car_speed);

//적외선 장애물 감시 센서의 센싱 동작 상태를 체크하기 위한 디버깅.

if (Debug == 1) { //#define Debug 1 일 때 동작.

Serial.print(L_Infra); //왼쪾 센서값 표시

Serial.print(" : ");

Serial.print(M_Infra); //중앙 센서값 표시

Serial.print(" : ");

Serial.print(R_Infra); //오른쪽 센서값 표시

Serial.print(" : ");

Serial.print(Car_speed); //모터 출력값 표시

Serial.println(); //프린트 라인을 변경한다.

}

/*

적외선 장애물 감지 센서가 아날로그 핀에 연결 되어 있을시...

장애물이 없다면 512 보다 크고 1023 보다 작은 값이고

장애물이 있다면 512 보다 작고 0 보다는 큰 값이다.

만약, 디지털 핀에 연결 되어 있다면

장애물 감지시 센서의 값은 0, 장애물이 감지되지 않으면 센서의 값은 1 이다. ww

w.fi

rstb

ot.c

o.kr

Page 17: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

16

SMART CAR 만들기  V

er  1.0 

*/

if (M_Infra >= 512 ) { //forward, 장애물이 없다면 전진.

if ( (L_Infra >= 512)&&(R_Infra >= 512) ) {

car_forward(); //왼쪽 오른쪽 모두 장애물이 없다면 전진.

} else if ( (L_Infra >= 512)&&(R_Infra < 512) ) {

car_left(); delay(10); //오른쪽에 장애물이 있다면 왼쪽으로 회피.

} else if ( (L_Infra < 512)&&(R_Infra >= 512) ) {

car_right(); delay(20); /왼쪽에 장애물이 있다면 오른쪽으로 회피.

}

} else if (M_Infra < 512 ) { //Backward, 장애물이 있다면 일단은 후진.

car_backward(); delay(10); //일단은 후진 후에

car_right(); delay(10); //우측으로 약간 방향 전환

if ( (L_Infra >= 512)&&(R_Infra < 512) ) {

car_left(); delay(20); //오른쪽에 장애물이 있었다면 왼쪽으로 30ms 동안 방향 선회.

} else if ( (L_Infra < 512)&&(R_Infra >= 512) ) {

car_right(); delay(40); //왼쪽에 장애물이 있었다면 오른쪽으로 60ms 동안 방향 선회.

} else if ( (L_Infra < 512)&&(R_Infra < 512) ) {

//모든 센서에 장애물이 감지 되었다면 탈출 알고리즘을 만든다.

do{

//Step1. 우선 오른쪽으로 약간 방향 선회.

car_right(); delay(20);

//Step2. 센서의 장애물 감지 상태를 확인 한다.

L_Infra = analogRead(L_INFRA); delay(5);

M_Infra = analogRead(M_INFRA); delay(5);

R_Infra = analogRead(R_INFRA); delay(5);

//좌우 및 중앙 센서에 장애물이 없다면 전진한다.

if ( (L_Infra >= 512) && (M_Infra >= 512) && (R_Infra >= 512) ) { ww

w.fi

rstb

ot.c

o.kr

Page 18: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

17

SMART CAR 만들기  V

er  1.0 

car_forward(); delay(30); //장애물이 없다면 전진한다.

retry_count = 0; //반복 카운터를 초기화 한다.

break; //while 반복문을 빠져나간다.

} else {

car_right(); delay(20); //장애물이 있다면 오른쪽으로 방향을 튼다.

retry_count += 1; //반복 카운터를 증가 시킨다.

}

if ( retry_count >= 10 ) { //10 회 반복 하여도 탈출하지 못하면

break; //while 반복문을 빠져나간다.

}

} while(true);

}

} else {

car_stop();

}

delay(30);

}

void car_forward(){

digitalWrite(MR_INT1, HIGH);

digitalWrite(MR_INT2, LOW);

digitalWrite(MR_INT3, HIGH);

digitalWrite(MR_INT4, LOW);

}

void car_backward(){

digitalWrite(MR_INT1, LOW); ww

w.fi

rstb

ot.c

o.kr

Page 19: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

18

SMART CAR 만들기  V

er  1.0 

digitalWrite(MR_INT2, HIGH);

digitalWrite(MR_INT3, LOW);

digitalWrite(MR_INT4, HIGH);

}

void car_left(){

digitalWrite(MR_INT1, HIGH);

digitalWrite(MR_INT2, LOW);

digitalWrite(MR_INT3, LOW);

digitalWrite(MR_INT4, HIGH);

}

void car_right(){

digitalWrite(MR_INT1, LOW);

digitalWrite(MR_INT2, HIGH);

digitalWrite(MR_INT3, HIGH);

digitalWrite(MR_INT4, LOW);

}

void car_stop(){

analogWrite(L293D_ENABLE1, 0);

analogWrite(L293D_ENABLE2, 0);

}

< Step1. Obstacle_infrared.ino >

ww

w.fi

rstb

ot.c

o.kr

Page 20: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

19

SMART CAR 만들기  V

er  1.0 

5. HC-06 BlueTooth Module 을 이용한 무선조종.

앞장에서 적외선 장애물 감시 센서를 이용한 장애물 회피 기능을 구현하였습니다.

이번에는 무선 블루투스 시리얼 인터페이스 모듈인 HC-06 을 이용하여 무선 조종

기능을 추가합니다. 우선 HC-06 을 아래의 결선표 및 결선도를 참조하여 2WD

스마트카에 장착 및 결선 합니다.

< 아두이노 우노와 블루투스 모듈 HC-06 과의 결선표 >

ww

w.fi

rstb

ot.c

o.kr

Page 21: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

20

SMART CAR 만들기  V

er  1.0 

< 아두이노 우노와 블루투스 모듈 HC-06 과의 결선도 >

HC-06 은 무선 시리얼 블루투스 모듈로 슬레이브(Slave)로 동작합니다. 마스터

(Master)로 동작하는 장치와 시리얼로 통신하는데 아두이노 스케치에서 소프트웨어

시리얼 라이브러리(SoftwareSerial.h)를 이용(include)하여 코딩 합니다. 즉 하드웨어

시리얼 통신이 아닌 가상의 소프트웨어 시리얼 포트를 설정합니다. 여기서는 디지털

10 번 핀을 RX 로 하여 HC-06 의 TX 와, 디지털 11 번 핀을 TX 로 설정 하고 HC-06 의

RX 와 연결하고 아래와 같은 순서로 핸드폰에 앱을 설치 합니다.

ww

w.fi

rstb

ot.c

o.kr

Page 22: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

21

SMART CAR 만들기  V

er  1.0 

1. 스케치의 시리얼모니터 프로그램을 이용하여 HC-06 의 블루투스 이름(Bluetooth

name)을 “HC-06”에서 “2WDCAR”로 변경합니다. 아래 그림과 같이 HC-06 을 PC 와

연결하려면 FT232RL 과 같은 USB To TTL Serial Module 이 필요합니다. HC-06 과

FT232RL 을 RX-TX, TX-RX 로 상호 크로스 연결 한 후 USB 케이블을 이용하여 PC 와

연결합니다. 물론 FT232RL 과 같은 모듈을 이용하려면 PC Driver 가 미리 설치 되어

있어야 합니다.

< HC-06 과 FT232RL USB to TTL Serial Module 과의 결선 및 PC 연결 >

ww

w.fi

rstb

ot.c

o.kr

Page 23: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

22

SMART CAR 만들기  V

er  1.0 

“AT” Command 로 통신 가능 상태인지를 확인합니다. “OK” 응답이 온다면 통신이

가능한 상태입니다.

기본 Buad rate 는 9600bps 이나 좀 더 빠른 통신을 원한다면

“AT+BUADx” 문법으로 통신 속도를 변경 할 수 있습니다.

블루투스 이름을 변경하고 싶다면 “AT+NAMExxxx” 문법으로 변경하면 됩니다.

이외에도 PIN 번호를 변경할 수 있는 “AT+PINxxx”등 다양한 AT Command 가 제공

되고 있으므로 좀 더 자세한 사항은 HC-06 의 매뉴얼을 참조 하시기 바랍니다. ww

w.fi

rstb

ot.c

o.kr

Page 24: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

23

SMART CAR 만들기  V

er  1.0 

2. 블루투스 이름(AT+NAME2WDCAR)을 “HC-06”에서 “2WDCAR”로 변경 완료

하였다면 핸드폰에서 2WDCAR 를 찾아 페어링 합니다. 이때 핀 번호는 “0000” 또는

“1234” 입니다.

< 페어링 및 Pin 번호 입력 >

3. 마스터 장치로는 안드로이드 앱을 이용합니다. 안드로이드 “Play 스토어”에서

“Arduino bluetooth controller”를 찾아 설치합니다. 물론 다른 앱을 설치해도

상관없으나 본 매뉴얼에서는 “Arduino Bluetooth controller”와 상호 통신 문자를

통일하여 프로그램을 했기 때문입니다. 좀 더 디테일하고 다양한 기능을 구현 하고 ww

w.fi

rstb

ot.c

o.kr

Page 25: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

24

SMART CAR 만들기  V

er  1.0 

싶다면 다른 앱을 설치 하여 통신 명령을 상호 정의하고 스케치 프로그램에

반영하면 좀 더 개선된 스마트카를 만들 수 있습니다.

< Arduino bluetooth controller 를 설치 >

4. Arduino bluetooth controller 설치가 완료되어 실행하면 아래 사진과 같이

블루투스 디바이스 이름들이 나타납니다. 2WDCAR 를 선택하면 4 가지 선택 가능한

기능이 나타나는데 “Controller mdoe”를 선택합니다.

ww

w.fi

rstb

ot.c

o.kr

Page 26: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

25

SMART CAR 만들기  V

er  1.0 

5. 설정 버튼을 눌러 각 방향 키 및 기능 키들에 대해 명령(command)을

정의합니다. 즉, 좌측 버튼은 “left”, 전진버튼은 “forward”,… 식으로 기능 버튼 별

명령 문자열을 정의 합니다. 사각 버튼은 “remote”로 무선 조종을, 삼각형 버튼은

“obstacle” 장애물 회피 기능을 수행 하기 위해 정의합니다. ww

w.fi

rstb

ot.c

o.kr

Page 27: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

26

SMART CAR 만들기  V

er  1.0 

여기까지 무선 조종을 위한 HC-06 의 설치와 안드로이드 앱 설치 및 설정 방법에

대해 설명하였습니다. 그러면 위에서 정의된 명령에 따라 실제로 스케치 된

프로그램은 아래와 같습니다. Step1 Obstacle_infrared.ino 에서 HC-06 에 의한 무선

조종에 관한 코드가 추가 되었습니다.

#include <SoftwareSerial.h> //소프트웨어시리얼 헤더 선언

SoftwareSerial btSerial(10,11); //소프트웨어 RX,TX 핀 설정

#define Debug 0 //디버그여부

#define L293D_ENABLE1 3 //Enable pin - Motor1

#define L293D_ENABLE2 6 //Enable pin - Motor2 ww

w.fi

rstb

ot.c

o.kr

Page 28: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

27

SMART CAR 만들기  V

er  1.0 

#define MR_INT1 2 //Control pin 1 - Motor1

#define MR_INT2 4 //Control pin 2 - Motor1

#define MR_INT3 5 //Control pin 1 - Motor2

#define MR_INT4 7 //Control pin 2 - Motor2

#define L_INFRA A0 //왼쪽 적외선 센서 입력핀

#define M_INFRA A1 //중앙 적외선 센서 입력핀

#define R_INFRA A2 //오른쪽 적외선 센서 입력핀

#define C_Speed A3 //속도 조절용 가변저항 입력핀

int L_Infra = 0; //왼쪽 적외선 센서 입력값 저장 변수

int M_Infra = 0; //중앙 적외선 센서 입력값 저장 변수

int R_Infra = 0; //오른쪽 적외선 센서 입력값 저장 변수

int Car_speed = 200; //초기 모터 출력 값(0~255)

int retry_count = 0; //탈출하기 위한 동작의 카운터 변수

bool reverse_dir = 0;

String Rcv_Str; //HC-06 수신 문자열 저장 변수 선언.

String Mode_Str = "obstacle"; //동작모드 스트링 변수 선언

void setup() {

Serial.begin(9600); //9600bps 의 Buadrate 로 시리얼 포트 오픈

btSerial.begin(9600); //9600bps 의 Buadrate 로 소프트웨어시리얼 포트 오픈

pinMode(L293D_ENABLE1, OUTPUT); //Digital 3 번 핀을 출력포트로 할당.

pinMode(L293D_ENABLE2, OUTPUT); //Digital 6 번 핀을 출력포트로 할당. ww

w.fi

rstb

ot.c

o.kr

Page 29: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

28

SMART CAR 만들기  V

er  1.0 

pinMode(MR_INT1, OUTPUT); //Digital 2 번 핀을 출력포트로 할당.

pinMode(MR_INT2, OUTPUT); //Digital 4 번 핀을 출력포트로 할당.

pinMode(MR_INT3, OUTPUT); //Digital 5 번 핀을 출력포트로 할당.

pinMode(MR_INT4, OUTPUT); //Digital 7 번 핀을 출력포트로 할당.

}

void loop() {

//가변저항의 값을 입력 받는다.

Car_speed = analogRead(C_Speed); delay(10);

//가변저항의 아날로그 입력값(0~1023)을 map 함수를 이용하여

//아날로그 출력값(0~255)으로 변경한다.

Car_speed = map(Car_speed,0,1023,0,255);

//만약 Car_speed 가 150 보다 같거나 작다면 모터 출력 정지

if ( Car_speed <= 150 ) {

Car_speed = 0;

}

if( btSerial.available()){ //소프트웨어시리얼 통신이 가능하다면

btSerial.setTimeout(30); //Timeout 을 30ms 로 설정 및 수신을 대기.

Rcv_Str = btSerial.readString(); //수신된 문자열을 Rcv_Str 로 대입한다.

//Serial.println(Rcv_Str); //수신된 문자열의 디버깅

}

ww

w.fi

rstb

ot.c

o.kr

Page 30: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

29

SMART CAR 만들기  V

er  1.0 

if ( Rcv_Str == "obstacle" ) { //수신된 문자열이 obstacle 이라면

Mode_Str = "obstacle"; //obstacle 모드로 변경

} else if ( Rcv_Str == "remote" ) { //수신된 문자열이 remote 이라면

Mode_Str = "remote"; //remote 모드로 변경

} else if ( Rcv_Str == "stop" ) { //수신된 문자열이 stop 이라면

Car_speed = 0;

car_stop(); //모드와 상관없이 스마트카 정지

}

if ( Mode_Str == "obstacle" ) {

//각 방향의 적외선 센서값 입력 받는다.

L_Infra = analogRead(L_INFRA); delay(10);

M_Infra = analogRead(M_INFRA); delay(10);

R_Infra = analogRead(R_INFRA); delay(10);

//모터의 출력값으로 Car_speed 를 사용.

analogWrite(L293D_ENABLE1, Car_speed);

analogWrite(L293D_ENABLE2, Car_speed);

//적외선 장애물 감지 센서의 센싱 동작 상태를 체크하기 위한 디버깅.

if (Debug == 1) { //#define Debug 1 일 때 동작.

Serial.print(L_Infra); //왼쪽 센서값 표시

Serial.print(" : ");

Serial.print(M_Infra); //중앙 센서값 표시

Serial.print(" : "); ww

w.fi

rstb

ot.c

o.kr

Page 31: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

30

SMART CAR 만들기  V

er  1.0 

Serial.print(R_Infra); //오른쪽 센서값 표시

Serial.print(" : ");

Serial.print(Car_speed); //모터 출력값 표시

Serial.println(); //프린트 라인을 변경한다.

}

/*

적외선 장애물 감지 센서가 아날로그 핀에 연결 되어 있을시...

장애물이 없다면 512 보다 크고 1023 보다 작은 값이고

장애물이 있다면 512 보다 작고 0 보다는 큰 값이다.

만약, 디지털 핀에 연결 되어 있다면

장애물 감지시 센서의 값은 0, 장애물이 감지되지 않으면 센서의 값은 1 이다.

*/

if (M_Infra >= 512 ) { //forward, 장애물이 없다면 전진.

if ( (L_Infra >= 512)&&(R_Infra >= 512) ) {

car_forward(); //왼쪽 오른쪽 모두 장애물이 없다면 전진.

} else if ( (L_Infra >= 512)&&(R_Infra < 512) ) {

car_left(); delay(10); //오른쪽에 장애물이 있다면 왼쪽으로 회피.

} else if ( (L_Infra < 512)&&(R_Infra >= 512) ) {

car_right(); delay(20); //왼쪽에 장애물이 있다면 오른쪽으로 회피.

}

} else if (M_Infra < 512 ) { //Backward, 장애물이 있다면 일단은 후진.

car_backward(); delay(50); //일단은 후진 후에

//car_left(); delay(30); //왼쪽으로 약간 방향 전환

if ( (L_Infra >= 512)&&(R_Infra < 512) ) {

car_left(); delay(20); //오른쪽에 장애물이 있었다면 왼쪽으로 방향 선회.

} else if ( (L_Infra < 512)&&(R_Infra >= 512) ) { ww

w.fi

rstb

ot.c

o.kr

Page 32: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

31

SMART CAR 만들기  V

er  1.0 

car_right(); delay(40); //왼쪽에 장애물이 있었다면 오른쪽으로 방향 선회.

} else if ( (L_Infra < 512)&&(R_Infra < 512) ) {

//모든 센서에 장애물이 감지 되었다면 탈출 알고리즘을 만든다.

do{

//Step1. 우선 오른쪽으로 약간 방향 선회.

car_right(); delay(20);

//Step2. 센서의 장애물 감지 상태를 확인 한다.

L_Infra = analogRead(L_INFRA); delay(5);

M_Infra = analogRead(M_INFRA); delay(5);

R_Infra = analogRead(R_INFRA); delay(5);

//좌우 및 중앙 센서에 장애물이 없다면 전진한다.

if ( (L_Infra >= 512) && (M_Infra >= 512) && (R_Infra >= 512) ) {

car_forward(); delay(30); //장애물이 없다면 전진한다.

retry_count = 0; //반복 카운터를 초기화 한다.

break; //while 반복문을 빠져나간다.

} else {

car_right(); delay(20); //장애물이 있다면 오른쪽으로 방향을 튼다.

retry_count += 1; //반복 카운터를 증가 시킨다.

}

if ( retry_count >= 10 ) { //10 회 반복 하여도 탈출하지 못하면

break; //while 반복문을 빠져나간다.

}

} while(true);

}

} else {

} ww

w.fi

rstb

ot.c

o.kr

Page 33: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

32

SMART CAR 만들기  V

er  1.0 

} else if ( Mode_Str == "remote" ) { //remote 모드라면

if ( Rcv_Str == "forward" ) { //수신 문자열이 forward 라면

car_forward(); //스마트카 전진.

} else if ( Rcv_Str == "backward" ) { //수신 문자열이 backward 라면

car_backward(); //스마트카 후진.

} else if ( Rcv_Str == "left" ) { //수신 문자열이 left 라면

car_left(); //스마트카 좌측 선회.

} else if ( Rcv_Str == "right" ) { //수신 문자열이 right 라면

car_right(); //스마트카 우측 선회.

} else if ( Rcv_Str == "stop" ) { //수신 문자열이 stop 이면

car_stop(); //스마트카 정지

}

}

delay(30);

}

void car_forward(){

digitalWrite(MR_INT1, HIGH);

digitalWrite(MR_INT2, LOW);

digitalWrite(MR_INT3, HIGH);

digitalWrite(MR_INT4, LOW);

}

void car_backward(){

digitalWrite(MR_INT1, LOW);

digitalWrite(MR_INT2, HIGH); ww

w.fi

rstb

ot.c

o.kr

Page 34: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

33

SMART CAR 만들기  V

er  1.0 

digitalWrite(MR_INT3, LOW);

digitalWrite(MR_INT4, HIGH);

}

void car_left(){

digitalWrite(MR_INT1, LOW);

digitalWrite(MR_INT2, HIGH);

digitalWrite(MR_INT3, HIGH);

digitalWrite(MR_INT4, LOW);

}

void car_right(){

digitalWrite(MR_INT1, HIGH);

digitalWrite(MR_INT2, LOW);

digitalWrite(MR_INT3, LOW);

digitalWrite(MR_INT4, HIGH);

}

void car_stop(){

analogWrite(L293D_ENABLE1, 0);

analogWrite(L293D_ENABLE2, 0);

}

< Step2. Obstacle_infrared_bt.ino >

ww

w.fi

rstb

ot.c

o.kr

Page 35: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

34

SMART CAR 만들기  V

er  1.0 

Arudino IDE 인 스케치의 설치 및 사용 방법과 기본적인 아두이노 문법 및 C 언어의

기초 문법은 별책으로 첨부 합니다. 기초부터 스터디가 필요하신 분은 Beginning

Ardino - Anyone can easily 를 먼저 스터디 하시기 바랍니다.

ww

w.fi

rstb

ot.c

o.kr

Page 36: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino Anyone can easily..

( Ver 1.0 )

www.firstbot.co.kr

ww

w.fi

rstb

ot.c

o.kr

Page 37: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

2 | 페 이 지

( Ver 1.0 )

- 목 차 -

1장. 아두이노 (Arduino) 란 무엇인가 ?........7

2장. 아두이노 (Arduino) 의 종류와 특징........8

1. 아두이노 UNO........8

2. 아두이노 ATMega2560........9

3. 아두이노 ATMega2560ADK........9

4. 아두이노 MINI........10

5. 기타 아두이노 종류........10

3장. 아두이노 우노 R3 의 개요 및 기능 설명........11

1. 전원 연결........11

2. 디지털 입출력 핀 14 개 ( 0~13번 핀)........11

3. 아날로그 입력 핀 6 개 ( A0~A5)........12

4. 아날로그 출력 핀 6 개 ( 3,5,6,9,10,11번 핀 )........12

5. 인터럽트 ( 2,3번 핀 )........12

6. 그 외 기능들........12

4장. 아두이노 IDE 설치........13

STEP 1 ) 아두이노 홈페이지 방문, 아두이노 프로그램 다운로드 / 설치........13

STEP 2 ) 아두이노 와 PC 연결 ........15

STEP 3 ) 아두이노 프로그램 실행 하기........15

STEP 4 ) 프로그램 메뉴에서 보드와 포트 설정........16

ww

w.fi

rstb

ot.c

o.kr

Page 38: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

3 | 페 이 지

( Ver 1.0 )

5장. 아두이노 프로그램을 위한 기초 C 언어 문법........17

1. 아두이노 프로그램 기본 구조........17

1) setup()........17

2) Loop()........18

3) { } 괄호의 의미........21

4) 세미콜론 ( ; )........21

5) 주석........21

6) 변수........22

6-1. 지역변수 와 전역변수........23

6-2. 변수의 종류........24

7) 연산........25

7-1. “=” 의 의미........25

7-2. 기본 수학 연산........25

7-3. 비교........25

7-4. 논리........26

8) 상수........26

9) 참과거짓........26

10) HIGH / LOW........27

11) if 조건문........27

11-1. if 문........27

11-2 if, else 문........27

12) For 반복문........28

13) While 반복문........29

14) do, While 반복문........29

15) 아두이노 내부 함수들........30

15-1. pinMode(pin, mode)........30

15-2. digitalRead(핀)........30

15-3. digitalWrite(핀,값)........30

15-4. analogRead(핀)........31

15-5. analogWrite(핀,값)........31

15-6. delay........31

15-7. millis()........32

15-8. 디버깅........32

ww

w.fi

rstb

ot.c

o.kr

Page 39: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

4 | 페 이 지

( Ver 1.0 )

6장. 아두이노 프로그램 방법........33

1. 입력........33

2. 연산........33

3. 출력........33

7장. 아두이노 입출력........37

1. 디지털 및 아날로그 입출력........37

1) 디지털 입출력........37

2) 아날로그 입력........41

< 별첨 > 아두이노 Library(라이브러리) 추가/ 사용 하기........42

ww

w.fi

rstb

ot.c

o.kr

Page 40: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

5 | 페 이 지

( Ver 1.0 )

1장. 아두이노 (Arduino) 란 무엇인가 ?

아두이노(이탈리아어: Arduino 아르두이노)는 오픈 소스를 기반으로 한 단일 보드 마이크로컨트롤러로 완성 된

보드(상품)와 관련 개발 도구 및 환경을 말한다. 2005년 이탈리아의 IDII(Interaction Design Institutel vrea)에서

하드웨어에 익숙지 않은 학생들이 자신들의 디자인 작품을 손쉽게 제어할 수 있도록 하기 위해 고안된 아두이

노는 처음에 AVR을 기반으로 만들어졌으며, 아트멜 AVR 계열의 보드가 현재 가장 많이 판매되고 있다

아두이노는 간단히 설명하면 소형 컴퓨터라고 볼 수 있다. 요즘 대부분의 가전제품에는 아주 조그마한 컴퓨터

가 들어가 있다. 예를 들어 우리가 항상 마주하고 있는 텔레비전의 경우에도 그 안에 조그마한 컴퓨터가 들어

가 있어서 우리가 리모컨을 조작했을 때 동작을 인식하게 된다. 텔레비전 내부의 소형 컴퓨터처럼 회로기판 모

양의 하드웨어 제어장치를 아두이노라고 보면 된다.

아두이노 를 간단하게 정리하면

1. 저렴한 가격

아두이노 보드는 다른 마이크로컨트롤러 플랫폼에 비해 상대적으로 가격이 싸다. 아두이노 보드는 저렴한 가격으로

직접 조립할 수도 있으며 UNO R3 보드의 경우 국내 판매 사이트에서 몇만원 전후의 가격으로 구입 가능하다.

2. 다양한 운영체제 지원

대부분의 마이크로컨트롤러 시스템이 윈도우즈만을 지원하는데 반 해 개발 환경은 윈도우즈, 매킨토시 OSX, 리눅스

를 지원한다.

3. 쉽고 간단한 프로그래밍 환경

아두이노 프로그래밍 환경은 하드웨어나 프로그래밍에 경험이 적은 초보자들도 쉽게 접근할 수 있도록 쉽고 간단하

게 만들어져 있으며 고급 기능을 원하는 고급 사용자들을 위한 유연성 역시 제공하고 있어 마이크로컨트롤러에 쉽

게 입문해 서 고성능 칩 활용을 위한 시작점으로서의 역할을 할 수 있다.

4. USB 지원

기존에 마이크로프로세서를 위해 많이 사용하던 직렬 또는 병렬 포트가 아닌 범용적인 USB를 기본으로 사용한다.

현재 AVR과 ARM도 직렬이나 병렬포트 이외에도 USB 연결을 지원한다.

5. 오픈소스 소프트웨어

아두이노 개발 소프트웨어는 오픈 소스를 바탕으로 하고 있어 기 능 확장을 원하는 고급 사용자들이 확장할 수 있

도록 하고 있다. 아두이노 개발 언어는 C++을 기반으로 하고 있으므로 라이브러리를 통해 그 기능을 확장할 수 있

음은 물론이거 니와 아두이노가 기반하고 있는 AVR용 C 언어를 아두이노 프로그램에 직접 사용할 수도 있다.

4. 오픈 소스 하드웨어

아두이노 보드는 Atmel 사의 마이크로컨트롤러를 기반으로 하고 있 으며 하드웨어 스펙은 Creative Commons 라이

선스로 공개되어 있다. 따라서 확장 보드 를 쉽게 만들어낼 수 있으며 실제 다양한 확장 보드들이 출시되어 있다.

또한 아두이노 보 드는 그 구조가 간단하여 어렵지 않게 브레드 보드 상에 직접 구현할 수도 있다.

ww

w.fi

rstb

ot.c

o.kr

Page 41: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

6 | 페 이 지

( Ver 1.0 )

2장. 아두이노 (Arduino) 의 종류와 특징

1. 아두이노 UNO

아두이노 우노는 가장 많이 사용되는 기본적인 아두이노 보드이다.

이 보드의 핀 배열이 거의 표준과 같이 사용된다. 아두이노 기초 강좌, 예제 등의 자료는 거의

대부분이 아두이노 우노 보드에 맞춰줘 있기 때문에 초보자라면 아두이노 우노 보드를 선택하면 된다.

현재 R3 버전까지 출시되어 있다.

앞으로 설명 될 아두이노 관련 내용은 아두이노 우노를 기준으로 진행 된다.

-Microcontroller ATmega328

-Operating Voltage 5V

-Input Voltage (recommended) 7-12V

-Input Voltage (limits) 6-20V

-Digital I/O Pins 14 (of which 6 provide PWM output)

-Analog Input Pins 6

-DC Current per I/O Pin 40 mA

-DC Current for 3.3V Pin 50 mA

-Flash Memory 32 KB (ATmega328) of which 0.5 KB-used by bootloader

-SRAM 2 KB (ATmega328)

-EEPROM 1 KB (ATmega328)

-Clock Speed 16 MHz

ww

w.fi

rstb

ot.c

o.kr

Page 42: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

7 | 페 이 지

( Ver 1.0 )

2. 아두이노 ATMega2560

아두이노 UNO의 고사양버전으로 UNO에 사용되는 ATmega328칩을 ATmega2560

으로 교체하였고, 플래시 메모리가 UNO의 8배인 256kb로 증가하였다.

하드웨어로 지원되는 시리얼포트가 4개로 증가하였고 입출력핀 또한 UNO에는

아날로그, 디지털 핀을 합쳐 20개 였다면 ATmega2560에는 아날로그, 디지털 핀

을 합쳐 70개가 존재한다. 전에는 UNO와 Mega시리즈의 하드웨어 핀 배열의 불

일치로 호환성 면에서 문제가 있었지만 새 버전에서는 호환이 가능하게 하였다.

입출력 핀이 많아 다수의 디바이스 제어에 적합하다.

-Microcontroller ATmega2560 (R3)

-Operating Voltage 5V

-Input Voltage (recommended) 7-12V

-Input Voltage (limits) 6-20V

-Digital I/O Pins 54 (of which 14 provide PWM output)

-Analog Input Pins 16

-DC Current per I/O Pin 40 mA

-DC Current for 3.3V Pin 50 mA

-Flash Memory 256 KB (8 KB 부트로더 사용)

-SRAM 8 KB

-EEPROM 4 KB

-Clock Speed 16 MHz

3. 아두이노 ATMega2560ADK

ATmega2560ADK는 ATmega2560에 googleADK(안드로이드)기능을 추가한 것으

로 USB host controller가 추가되어있다. 아두이노와 안드로이드의 연동이 필요할

경우 필요한 보드이다.

-ATmega2560 Microcontroller

-Operating Voltage 5V

-Input Voltage (recommended) 7-12V

-Input Voltage (limits) 6-20V

-Digital I/O Pins 54 (of which 14 provide PWM output)

-Analog Input Pins 16-DC Current per I/O Pin 40 mA

-DC Current for 3.3V Pin 50 mA

-Flash Memory 256 KB of which 8 KB used by bootloader

-SRAM 8 KB

-EEPROM 4 KB

-Clock Speed 16 MHz ww

w.fi

rstb

ot.c

o.kr

Page 43: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

8 | 페 이 지

( Ver 1.0 )

4. 아두이노 MINI

아두이노Mini는 브레드보드에 꼽아서 사용하는데 적합하게 만들어진 보드이다. 크기가

작고 ATmega328을 사용한다.

-Microcontroller ATmega328

-Operating Voltage 5V

-Input Voltage 7-9 V

-Digital I/O Pins 14 (of which 6 provide PWM output)

-Analog Input Pins 8 (of which 4 are broken out onto pins)

-DC Current per I/O Pin 40 mA

-Flash Memory 32 KB (of which 2 KB used by bootloader)

-SRAM 2 KB

-EEPROM 1 KB

-Clock Speed 16 MHz

5. 기타 아두이노 종류

각 아두이노 종류 및 제품별 상세 스펙은 아두이노 홈페이지를 참고하면 된다.

ww

w.fi

rstb

ot.c

o.kr

Page 44: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

9 | 페 이 지

( Ver 1.0 )

3장. 아두이노 우노 R3 의 개요 및 기능 설명

아두이노 우노 R3 는 ATmega328P 라는 AVR 8-bit 마이크로콘트롤러를 사용한다. PC 와 USB 로

연결할 수 있으며 이것으로 프로그램 다운로드 및 시리얼 통신에 사용된다.

1. 전원 연결

아두이노 우노보드는 내부적으로 5V 로 동작한다. 전원은 다음과 같이 두 가지 방법 중 한 가지로

인가하면 된다.

1) USB 로부터 5V 전원을 공급받아서 동작할 수 있다. 따라서 이 보드를 PC 와 USB 로 연결하면 일단

기본적인 하드웨어 세팅은 끝난 것이다.

2) 외부 전원을 연결하는 단자가 있는데 이것으로 7~12V 사이의 전원을 인가하면 되며 9V 가 권장

전압이다. 일반적인 AA 혹은 AAA 사이즈의 1.5V 건전지를 6 개를 직렬 연결하거나 1.2V 충전지를

사용해도 된다. 물론 AC 어댑터도 전압 범위가 맞으면 사용 가능하다.

만약 USB 와 전원 소켓에 둘 다 연결되어 있다면 소켓에서 공급되는 전원을 자동으로 사용하게 된다.

2. 디지털 입출력 핀 14 개 ( 0~13번 핀)

디지털(digital) 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다.

이진 신호란 on/off 와 같이 상태값이 두 가지만을 가지는 신호라는 의미이다. 이 디지털 핀을 이용해서

LED를 켜고/끄거나 외부의 스위치가 눌려져 있는지 아닌지 등을 검출 할 수 있다. 구체적으로 0V 와 5V

두 전압중 하나의 값을 가지며 이것은 프로그램으로 제어할 수 있다. ww

w.fi

rstb

ot.c

o.kr

Page 45: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

10 | 페 이 지

( Ver 1.0 )

디지털 입출력으로 사용되면서 또한 부가적인 기능을 가지는 핀들은 다음과 같다.

- 0 번과 1 번 핀은 시리얼 통신에 사용된다. USB 로 PC 와 통신을 할 수 있다.

- 2 번과 3 번 핀은 인터럽트 기능을 갖는다.

- 3, 5, 6, 9, 10, 11 번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내 낼 수 있다.

3. 아날로그 입력 핀 6 개 ( A0~A5)

아날로그 입력 핀이란 외부의 아날로그 입력값을 읽어들이는 핀으로서 주로 센서(sensor)와 연결하여

사용된다. 아날로그(analog)신호는 디지털 신호와는 달리 연속값을 의미하며 예를 들어서 온도, 빛의 세기

등이 있다. 이러한 물리량을 센서가 전기 신호로 변환하며 이것을 이 아날로그 핀으로 읽어들일 수 있다.

센서를 통해 읽은 전압값은 0 에서 1023 사이의 숫자로 변환된다. 기준 전압은 5V 이지만 1.1V 의 내부

전압이 사용될 수 있으며 AREF 핀으로 기준 전압을 직접 인가할 수도 있다.

그리고 아날로그 핀은 디지털 입/출력 핀으로도 사용할 수 있다.

4. 아날로그 출력 핀 6 개 ( 3,5,6,9,10,11번 핀 )

디지털 출력핀이 0V/5V 두 가지 값만을 가질수 있는데 비해서 아날로그 출력핀은 0V~5V사이의 전압 값

(256단계)을 가질 수 있다. 엄밀히 얘기하면 PWM방식으로 동작하므로 순수 아날로그 방식은 아니다.

5. 인터럽트 ( 2,3번 핀 )

2번핀과 3번핀은 인터럽트(interrupt) 기능을 가진다. 인터럽트 처리(interrupt handling)라는 것은 이벤트를

처리하는 데 사용되는 기능으로서 특정한 신호가 발생했을 때 정해진 동작을 수행하여야 하는 경우

사용되는 방식이다. 예를 들어서 버튼이 눌려진 시점에서 (또는 떼어진 시점에서) 어떤 작업을 수행해야

하는 경우다.

6. 그 외 기능들

아두이노 우노 보드는 3.3V 의 전압도 공급할 수 있다. 이는 USB 만 연결한 경우도 마찬가지이다.

AREF 핀은 아날로그 핀의 기준 전압을 설정하는 용도로 사용된다.

다른 기기와의 통신 기능은 다음과 같다.

- 시리얼 통신 : 0 번, 1 번 핀

- SPI 통신 : ICSP 헤더핀

- TWI (I2C) 통신 : A0, A1 핀

시리얼 통신 방식 외에는 일반적으로 사용 빈도가 낮지만 기기간 통신이나 일대 다 통신을 하는 경우 SPI,

TWI 통신이 널리 사용된다.

ww

w.fi

rstb

ot.c

o.kr

Page 46: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

11 | 페 이 지

( Ver 1.0 )

4장. 아두이노 IDE 설치

아두이노 기능을 제어하는데 여러 컴퓨터 명령어들이 있는데 이러한 명령어들을 조합한 소스 코드를 스케치

(Sketch)라고 한다. 이 용어는 아두이노에서 프로그램 코드를 칭하는데 사용한다.

아두이노 소프트웨어 다운로드 사이트에서 아두이노 통합 개발 환경을 다운받을 수 있다. 이 통합 개발 환경은

소스 코드를 쓰고 편집 기능을 제공하고 아두이노 하드웨어가 이해할 수 있는 명령어로 컴파일을 지원하며

아두이노 보드에 이 명령어들(실행코드)을 업로드하는 기능을 제공하고 있다.

기본적으로 프로그램 하기 위해서는 프로그램툴을 설치해야 한다. 아두이노 공식 홈페이지로 가서 다운받은 후

설치를 진행 하면 된다.

STEP 1 ) 아두이노 홈페이지 방문, 아두이노 프로그램 다운로드 / 설치

홈페이지 주소 : http://www.arduino.cc/

다운 받을 프로그램 : https://www.arduino.cc/en/Main/Software

ww

w.fi

rstb

ot.c

o.kr

Page 47: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

12 | 페 이 지

( Ver 1.0 )

( DownLoad 받은 아두이노 설치 실행파일 )

< 아두이노 IDE 설치 과정 >

설치가 완료되면 바탕화면에 Arduino 바로가기가 생성된다.

※ 설치 중 Arduino USB Driver 설치 유무 팝업이 뜨면 설치를 진행 해도 되며

프로그램 설치 이후에도 별도로 Arduino USB Driver 를 설치 할 수 있다. ww

w.fi

rstb

ot.c

o.kr

Page 48: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

13 | 페 이 지

( Ver 1.0 )

STEP 2 ) 아두이노 와 PC 연결

< 아두이노 우노 & PC 연결 >

상기와 같이 USB Cable ( B-TYPE ) 을 이용하여 PC 와 아두이노를 연결한다.

STEP 3 ) 아두이노 프로그램 실행 하기

바탕화면에 생성된 아두이노 프로그램 실행 아이콘을 클릭하면 아두이노 IDE 가 실행된다.

< 아두이노 프로그램 Main 화면 > ww

w.fi

rstb

ot.c

o.kr

Page 49: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

14 | 페 이 지

( Ver 1.0 )

STEP 4 ) 프로그램 메뉴에서 보드와 포트 설정

아두이노 우노를 가지고 있다면 다음과 같이 Arduino/Genuino Uno 를 선택한다.

일반적으로 아두이노 IDE 를 설치할 때 아두이노 드라이버가 설치된다.

그래서 자동으로 이 부분에서 아두이노 포트가 보여진다.

지금까지 아두이노 프로그램을 설치하는 방법과 PC 와 아두이노를 연결하여 프로그램 에서 보드와 포트설정

까지 진행을 해 보았다. 가장 기본적인 셋팅이 끝났으니 기초적인 아두이노 프로그램의 C 언어 문법에

대해 알아본다. ww

w.fi

rstb

ot.c

o.kr

Page 50: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

15 | 페 이 지

( Ver 1.0 )

5장. 아두이노 프로그램을 위한 기초 C 언어 문법

1. 아두이노 프로그램 기본 구조

아두이노 프로그램의 기본 구조는 2개의 몸통으로 구분된다. 첫번째 구조는 실제 일을 하기 전 준비를

하는 단계이다. setup() 이라고 하는 이름이다. 두번째 구조는 실제 일을 하는 단계이다.

loop() 라는 이름이다.

1) setup()

setup() 함수는 아두이노가 시작되는 처음단계에서 한번만 실행된다. 다음처럼 어떤 핀을 출력으로

사용한다면 먼저 그 핀을 출력으로 쓴다고 알려주는 역할로 사용된다.

ww

w.fi

rstb

ot.c

o.kr

Page 51: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

16 | 페 이 지

( Ver 1.0 )

첫째 줄은 setup() 함수를 시작한다는 뜻이고, 둘째 줄의 { 기호는 여기서부터 시작이라는 뜻이다. 마지막

줄에 있는 } 를 만날 때까지 모든 것이 setup() 의 내용이 된다.

pinMode(13, OUTPUT);

pinMode() 함수는 아두이노의 핀을 입력으로 사용할 것인지 출력으로 사용할 것인지 선택하게 해준다.

OUTPUT 은 출력으로 쓰겠다는 뜻이다.

아두이노의 13번 핀은 전류를 흘려서 바깥으로 내보낼 수 있다.

이 전류로 LED 를 켜서 전기가 흐르는지 안흐르는 지를 확인 할 수 있다.

참고로 pinMode() 를 통해서 13번 핀을 출력으로 선택했다는 것이 13번 핀에 전류가 흐른다는 뜻은

아니다. 출력으로 정의 됐고, 그 출력은 5V가 될 수도 있고, 0V 가 될 수도 있다.

setup() 은 처음부터 끝까지 한번만 실행하고 끝이 난다.

※ 주의 : 아두이노 함수는 대소문자를 구별하므로 타이핑할 때 대소문자 구분을 꼭 확인하여야 한다.

항상 명령의 끝은 ; 로 마무리 한다. 즉, ; 를 만나기 전까지는 프로그램은 아직 끝이 나지

않았다고 판단한다.

2) Loop()

준비운동으로 13번 핀을 출력으로 설정했다. 13번 핀에 전기가 흐르게 해본다.

13번 핀에 LED 를 연결하고 전기를 흐르게 해서 불이 켜지게 해본다.

이것은 Loop() 에서 한다.

ww

w.fi

rstb

ot.c

o.kr

Page 52: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

17 | 페 이 지

( Ver 1.0 )

setup() 에서 13번 핀을 출력으로 쓰겠다고 정의했고 loop() 에서는 그 13번 핀을 사용해서 전기를 흐르게

하든지 혹은 흐르지 않게 하든지 하면 된다. 아두이노의 13번 핀에 LED 의 한쪽 발은 연결하고,

다른 한쪽발은 0V에 연결한다. 전기는 높은 곳에서 낮은 곳으로 흐른다.

LED 의 한쪽 발이 5V 에 연결되어있고, 다른 한쪽 발이 0V에 연결되어 있다면 5V에서 0V로 전기가 흐른다.

< 구성 방법은 아두이노 프로그램 설명 이후 자세히 설명.. >

참고로 저항을 하나 연결해 준다. 아두이노에서 나오는 전류가 약해서 LED 가 손상되지는 않으나,

아두이노에 직접 연결하는 경우가 아니라면 LED 에 너무 많은 전류가 흐르게 되면 LED 가 고장이 날 수

있고 보드에 손상을 줄 수 있다.

200 ohm 에서 500 ohm 사이의 저항을 하나 연결해 주면 된다. 13번 핀과 LED 사이에 연결하거나

혹은 GND 와 LED 사이에 해도 된다.

( LED 의 +, - 극성에 주의 한다, 보통 다리가 두개인 LED 는 긴다리가 + 이다 )

digitalWrite() 함수는 ()안에 2개의 내용이 들어간다. digitalWrite() 안에 들어가는 2개의 내용은

첫째, 어떤 핀을 사용 할 까와 둘째 그 핀에 전기를 흐르게 할까 말까이다.

13번 핀에 전기를 흐르게 하겠다(5V)면 13 과 HIGH 를 넣어주면 된다.

반대로 흐르지 않게 하겠다(0V)면 LOW 를 넣어주면 된다.

loop() 는 처음부터 끝까지 실행한 다음 다시 처음으로 돌아간다. 이것을 끝없이 반복한다.

아두이노에 전기가 공급되는 한 계속된다.

그래서 위의 loop() 는 그냥 계속 13번에 연결된 LED 가 불이 켜진 채로 그대로 있다.

불이 켜졌다 꺼졌다를 하기 위해 다음과 같이 바꿔본다.

ww

w.fi

rstb

ot.c

o.kr

Page 53: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

18 | 페 이 지

( Ver 1.0 )

digitalWrite(13, LOW)

digitalWrite(13, LOW) 라는 것을 추가했다. loop() 는 처음부터 끝까지 실행한 후 다시 처음으로 돌아

간다고 했으니까 13번 핀에 전기를 흘렀다(HIGH)가 그 다음에는 전기가 흐르지 않았다(LOW)를 계속

반복하게 된다. 그러나 LED 가 깜빡이지 않고 그냥 켜져 있다.

이유는 전기가 흐르고 흐르지 않고를 반복하는 시간이 너무 짧기 때문에 눈에는 그냥 커져있는 것으로

보인다. 그러면 깜박이게 하려면 어떻게 하면 될까? 켜지고 꺼지는 사이에 충분히 눈으로 깜박거리는

것을 확인 할수 있도록 시간을 넣으면 된다. 아두이노 에서는 기본적으로 delay() 라는 함수를 지원한다.

delay() 라는 함수는 ()안에 mili second 인 1/1000 초의 배수를 넣게 된다. 즉, () 안에 1000 을 넣으면 1초

동안 아무것도 하지 않고 잠시 멈춰있게 된다. delay(“시간”) 는 주어진 “시간”동안 아무것도 하지 말고 정

지해 있으라고 하는 명령이다.

Delay(1000)

Delay(1000) 이라는 함수를 넣었다.

하지만 실제로 실행해보면 깜박이지 않는다. 계속 켜져 있다.

ww

w.fi

rstb

ot.c

o.kr

Page 54: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

19 | 페 이 지

( Ver 1.0 )

내용을 보면 처음 LED 를 켜고 1초를 기다리다가 LED 를 끄지만, 끄자마자 바로 LED 를 켜기 때문에

끄고 켜는 사이 시간이 매우 짧으므로 계속 켜져 있는 것으로 보인다.

그래서 아래와 같이 delay(1000) 을 추가로 넣어줘야 한다.

이렇게 하면 처음 LED 를 켜고 1초 기다리다가 LED 를 끄고 1초를 기다리다가 다시 LED 를 켜기

때문에 LED 가 깜빡 거리는 것을 눈으로 확인 할 수가 있다.

3) { } 괄호의 의미

c 언어 문법에서 { } 괄호는 문단을 의미한다. "{" 바로 다음이 시작이 되고, "}" 의 바로 앞이 끝이 된다.

{ } 로 둘러싸인 문단은 의미상 하나로 처리된다.

함수의 내용은 시작하는 { 과 끝나는 } 사이에 들어간다.

4) 세미콜론 ( ; )

세미콜론 (;) 은 반드시 명령의 끝에 붙어야만 한다. 한 줄에 명령을 하나만 써야 한다는 제약은 없다.

여러 명령을 한 줄에 써도 되지만, 각 명령의 끝에 ; 를 붙여야 한다.

5) 주석

프로그램을 하다보면 설명을 넣고 싶은 곳이 있다. 설명은 나중에 다시 이 프로그램을 살펴볼 때 예전에

했던 일을 왜 이렇게 했는지 기록하는 것이다.

전체 주석은 /* 이렇게 시작하고 */ 이렇게 끝난다. /* 과 */ 사이에 있는 모든 것은 눈에는 보이지만

프로그램에서는 없는 것으로 간주한다.

ww

w.fi

rstb

ot.c

o.kr

Page 55: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

20 | 페 이 지

( Ver 1.0 )

간단하게 한 줄 짜리 설명을 붙이고 싶을 때 설명의 앞에 // 를 넣으면 // 이후에 줄의 끝까지 나오는

모든 것은 주석이 된다. /* */ 과는 달리 줄의 끝 부분이나 혹은 한 줄로 설명할 수 있는 간단한 주석을

달 때 사용된다.

즉, 주석은 프로그램과 아무런 상관이 없다. 오직 주석은 나중에

소스를 보는 사람을 위한 설명이다. 한달 후에 혹은 일년 후에 내가 만들었던 소스를 다시 수정하거나

비슷한 다른 프로그램을 만들려고 할 때 내가 만들었지만 생소한 기분을 느낀다.

그럴 때 적어둔 설명(주석)을 보면서 내가 이 부분을 왜 이렇게 만들었는지 다시 알게 해 주는 기능이다.

6) 변수

변수라는 것은 "변할 수 있는 수"로 어떤 값을 저장할 수 있는 공간을 의미한다. 이를테면 빈 박스와 같다.

이 박스에는 양파도 담을 수 있고, 당근도 담을 수 있다. 어떤 박스는 크기가 작아서 계란 하나만 담을 수

있고 또 어떤 박스는 플라스틱 용기로 되어 있어서 물을 담을 수 있다.

변수는 컴퓨터 메모리에 차지하는 공간을 의미한다. 거기에 작은 숫자만 저장할 수 있는 변수도 있고, 큰

숫자를 저장할 수 있는 변수도 있다.

변수를 쓰기 위해서는 먼저 변수를 쓰겠다고 알려야 한다. 이걸 '선언' 이라고 한다.

ww

w.fi

rstb

ot.c

o.kr

Page 56: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

21 | 페 이 지

( Ver 1.0 )

value 라는 변수를 쓰겠다고 알리는 것이 사용하는 것보다 먼저 있어야 한다.

value 라는 상자에 13 이라는 값이 담겨있다.

변수의 종류는 byte, char, int, long, float 외에도 몇 가지가 더 있다. char 은 문자를 다룰 때, int 는 정수형

숫자를 다룰 때, long 은 정수형 숫자로 큰 수를 다룰 때, byte 는 작은 숫자로 양수만 다룰 때, float 은

실수형 숫자를 다룰 때 사용한다.

6-1. 지역변수 와 전역변수

위에서 선언된 변수는 어디에 있느냐에 따라 전역변수 또는 지역변수로 다시 분류된다.

함수 안에서 만들어졌으며 지역변수라고 불리고 그 함수 안에서만 사용이 된다.

지역변수는 함수 안에서만 사용되므로 같은 이름이 다른 함수 안에서 새롭게 만들어지고, 사용될 수 있다.

전역변수는 사용에 주의해야 한다.

전역변수와 지역변수가 사용되는 곳을 알아보자. ( 소위 말하는 지역구, 전국구…)

ww

w.fi

rstb

ot.c

o.kr

Page 57: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

22 | 페 이 지

( Ver 1.0 )

전역변수의 arealvalue 는 어디서나 사용할 수 있다. 지역변수인 a 는 for 문 안에서만 사용할 수 있다.

또 다른 지역변수인 b 는 loop() 안에서만 사용할 수 있다.

6-2. 변수의 종류

6-2.1. byte

0 부터 255 까지의 정수 숫자를 저장할 수 있다.

byte sample = 125;

6-2.2. char

키보드에 나와있는 문자나 숫자 하나를 저장할 수 있다. 단 한글을 저장할 수는 없다.

문자나 숫자를 저장할 때 '' 를 사용한다.

char sample = 'A'; char sample = '2';

6-2.3. int

-32,768 부터 32765 까지의 정수 숫자를 저장할 수 있다.

int sample = 10000;

6-2.4. long

-2,147,483,648 부터 2,147,483,647 까지의 정수 숫자를 저장할 수 있다.

int sample = 214748364; int sample = 21474 * 9876;

6-2.5. float

-3.4028235E+38 부터 3.4028235E+38 까지의 실수 숫자를 저장할 수 있다.

단, 아두이노에서 실수 연산은 속도가 많이 느려지게 된다. 그리고 실수연산은 정확도가 많이

떨어진다.

가능하면 float 같은 실수 변수를 사용하지 않는 것이 좋다.

float sample = 3.1415;

6-2.6. String

엄밀하게는 변수는 아니지만 아두이노에서 String 은 마치 문자열을 저장하고 읽는 일을 하는

변수처럼 사용된다.

String sample = "Remember0416"; ww

w.fi

rstb

ot.c

o.kr

Page 58: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

23 | 페 이 지

( Ver 1.0 )

7) 연산

7-1. “=” 의 의미

수학에서 "="은 보통 좌변과 우변이 같다는 것을 의미한다. 하지만 프로그램에서 "=" 는 오른쪽에 있는

값을 왼쪽으로 넣으라는 명령이다.

x = x + 10;

x 에 10 을 더한 다음 그 값을 x 에 저장한다. 이것을 더 쉽게 이렇게 쓸 수 있다.

x += 10;

자주 사용하는 1 을 더하는 것과 1 을 빼는 것은 ++, -- 를 사용한다.

x = x + 1; x++; x = x-1; x--;

위의 x = x+1; 과 x++; 는 같은 내용, x = x-1; 과 x--; 는 같은 내용 이다..

7-2. 기본 수학 연산

+, -, *, /, % 이렇게 다섯 가지 기본 수학연산이 가능하다.

+ : 더하기

- : 빼기

* : 곱하기

/ : 나누기

% : 나머지

7-3. 비교

크거나 작거나 같거나를 가지고 참과 거짓을 판별한다.

x == y // x 가 y 와 같다.

만약 x 와 y 가 같은 값이라면 이 결과는 "진실"이 되고, x 와 y 가 다른 값이라면 이 결과는 "거짓"이

된다. 이 외에 다음과 같은 비교가 가능하다.

x > y // x 가 y 보다 크다.

x >= y // x 가 y 보다 크거나 같다.

x < y // x 가 y 보다 작다.

x <= y // x 가 y 보다 작거나 같다.

x != y // x 와 y 가 다르다.

ww

w.fi

rstb

ot.c

o.kr

Page 59: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

24 | 페 이 지

( Ver 1.0 )

7-4. 논리

비교와 함께 자주 사용된다.

if ( (x > 0) && (x < 10) ) // x 가 0 보다 크다 그리고 x 가 10 보다 작다

&& : 논리곱, 오른쪽과 왼쪽이 모두 참일 때 결과는 참이 된다.

|| : 논리합, 오른쪽 또는 왼쪽, 둘중 하나라도 참이면 결과는 참이다.

! : 부정, 참이면 거짓이, 거짓이면 참이 된다.

( x>0 && x<5 ) // x 가 0 와 5 사이일 때 참

( x>10 || x <5 ) // x 가 10보다 크거나 5보다 작을 때 참

( !x ) // x 가 참이면 거짓이, 거짓이면 참

8) 상수

변수와 달리 상수는 항상 그대로 있는 수를 말한다. 보통 변해서는 안되는 수를 미리 지정해두는 식으로

사용된다. ( 상수는 지정해두면 변하지 않는다 )

#define SIZE 1024

프로그램의 가장 앞부분에서 이렇게 사용할 수 있다. 또는

const int SIZE 1024;

이렇게 const 를 붙여서 만들 수도 있다. 보통 상수는 변수와 다르다는 것을 나타내기 위해 전체를

대문자로 쓴다.

9) 참과거짓

(a == 12) 는 a 의 값을 읽어와서 그것이 12 인지를 비교해 본다.

12라면 참을 12가 아니라면 거짓을 보낸다. 참은 1 이되고, 거짓은 0 이 된다.

if ( a == 12 ) { 할일 ; }

a 가 12 일때 (a==12) 는 참(1)이 되고, 그래서 "할일"을 하게 된다.

ww

w.fi

rstb

ot.c

o.kr

Page 60: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

25 | 페 이 지

( Ver 1.0 )

10) HIGH / LOW

아두이노에서 HIGH 는 1 을 의미하고 이는 ON 또는 5V 나 3.3V 의 전원이 들어가는 것을 의미한다.

반대로 LOW 는 0 을 의미하고, OFF 나 0V 즉, GND 에 연결되었다는 것을 뜻한다.

digitalWrite(13, HIGH); // 13번 핀에서 5V(또는 3.3V) 를 내보낸다.

digitalWrite(13, LOW); // 13번 핀이 GND(0V) 에 연결된다.

11) if 조건문

11-1. if 문

if 조건문은 조건이 참일때만 실행된다.

if (a==13) // 조건부분

{

// 조건이 참이면 { } 안의 내용을 실행한다.

}

11-2 if, else 문

if 문과 함께 조건이 거짓일 때만 실행되는 else 도 있다.

if (조건)

{

// 조건이 참일때 실행

}

else

{

// 조건이 거짓일때 실행

}

예제)

if (inputvalue <=200) // 입력으로 들어온 값이 200 이하일때

{

digitalWrite(13,HIGHT); // 13번 PIN 에 LED 켜짐

}

else // 200 이하가 아닐때는

{

digitalWrite(13,LOW); // LED 꺼짐

} ww

w.fi

rstb

ot.c

o.kr

Page 61: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

26 | 페 이 지

( Ver 1.0 )

if 와 else if 를 사용해서 [만약 ~ 이면] ... [그렇지 않고 만약 ~ 이면]... 의 구문을 만들 수 있다.

if (inputvalue <=200)

{

// 첫번째 조건을 만족할 때 할일들

}

else if (inputvalue > 500)

{

// 두번째 조건을 만족할 때 할일들

}

else

{

// 첫번째, 두번째 조건을 모두 만족시키지 못할 때 할일들

}

12) For 반복문

다음과 같은 구문으로 일정횟수만큼 명령을 반복한다.

for ( 초기화; 조건; 증감표현)

{

반복할 일들

}

초기화는 변수를 만들어서 초기화 시킬 수도 있고, 외부에서 만들어진 변수를 사용할 수도 있다.

조건은 변수를 사용해서 조건에 맞을 때만 아래 { } 안에 있는 내용을 실행한다.

증감표현은 { } 안의 내용을 끝까지 실행시킨 다음 실행된다.

예제)

for (int i=0; i<20; i++)

{

digitalWrite(13, HIGHT);

delay(500);

digitalWrite(13. LOW);

delay(500);

}

ww

w.fi

rstb

ot.c

o.kr

Page 62: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

27 | 페 이 지

( Ver 1.0 )

13) While 반복문

while 반복문은 조건이 만족되는 한 무한히 반복된다.

while ( i>3 )

{

명령문1

명령문2

명령문3

}

변수 i 가 3 보다 크면 { } 내부의 명령문 1,2,3 이 반복적으로 실행된다.

명령문3 이 실행된 다음 ( i > 3 ) 의 조건을 만족하는지 판단 한 후 만족하면 다시 명령문1 부터

실행된다. ( i > 3 ) 이 거짓이라면 while 문 블럭을 벗어난다.

14) do, While 반복문

while 문은 조건이 거짓이면 블록 내부의 명령문을 한번도 실행하지 않는다.

명령문을 최소한 한번 실행 시키기 위해서는 조건을 뒤로 보내는 do.. while 이 있다.

do

{

명령문

} while (조건)

예제) 아날로그 센서의 값을 읽은 뒤 x 가 100 보다 작으면 계속해서 센서를 읽게 한다.

do

{

x=readSensors(); // 센서값을 읽어서 x 에 저장

delay(50); // 50ms 동안 대기

} while( x<100 ); // x 가 100 보다 작으면 반복

ww

w.fi

rstb

ot.c

o.kr

Page 63: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

28 | 페 이 지

( Ver 1.0 )

15) 아두이노 내부 함수들

15-1. pinMode(pin, mode)

void setup() 안에서 특정 핀의 입력과 출력을 지정하기 위해 사용된다.

pinMode(13, OUTPUT); // 13번 핀을 출력으로 지정한다

pinMode(12, INPUT); // 12번 핀을 입력으로 지정한다

pinMode(11, INPUT PULLUP); // 11번 핀을 입력으로 지정한다. 풀업된다.

여기서 풀업, INPUT_PULLUP 의 의미는 내부적으로 20kΩ 저항이 핀과 VCC (5V) 사이에 들어간다는

것을 의미한다. OUTPUT 으로 지정해서 출력으로 만들었을 때 핀은 최대 40mA 까지 전류를 흘려보낼

수 있다. 이 전류는 LED 를 밝게하기에는 충분하지만 릴레이나 모터 등을 작동시키기에는 부족하다.

외부 장치와 출력핀이 바로 연결된 때 과도한 전류가 흐르게 되면 아두이노의 ATMEGA MCU가 손상될

수 있다. OUTPUT 으로 지정된 핀에는 일반적으로 360 Ω 에서 1 kΩ 정도의 저항을 직렬로 연결해 주는

것이 좋다.

15-2. digitalRead(핀)

아두이노 입력으로 설정된 핀의 디지털값을 읽는다. 일반적으로 핀에 걸린 전압이 VCC 이면 1 을,

GND 이면 0 을 반환한다.

value = digitalRead(12); // 12 번 핀을 읽어서 value 변수에 저장

15-3. digitalWrite(핀,값)

아두이노 출력핀에 정해진 값을 출력한다. 값은 0 과 1 둘 중의 하나이다.

digitalWrite(11,1); // 11번 핀에 1 (+5V) 을 출력한다.

digitalWrite(11, HIGH); // HIGH 는 1 과 같고 LOW 는 0 과 같다

두줄은 같은 내용이다.

ww

w.fi

rstb

ot.c

o.kr

Page 64: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

29 | 페 이 지

( Ver 1.0 )

15-4. analogRead(핀)

아두이노에서 아날로그 값을 읽는 것은 0V 에서 5V 사이의 어떤 전압값을 읽는 것이다. 아두이노는

10 개의 비트로 값을 분해한다. 10개의 비트는 2 의 10 승을 의미하고 이는 총 1024 가 된다. 즉,

최소값을 0 이고 최대값은 1023 이 된다. 아두이노 아날로그 입력을 받을 때 주의할 것은 아날로그

입력핀에 들어오는 전압이 0V에서 5V 사이가 되어야 한다. 이 값을 벗어난 전압이 들어올 경우

아두이노 내부 회로가 망가질 수 있다.

value=analogRead(A0); // 핀 A0 에 연결된 값을 읽어온다.

// value 값에 저장되는 값은 최소 0 에서 최대 1023 사이 정수이다.

15-5. analogWrite(핀,값)

핀에 아날로그 값을 쓴다. 이때 핀은 pwm 출력이 가능한 핀만 가능하다.

pwm 은 보드에서 번호 옆에 ~ 표시가 있는 핀만 사용할 수 있다.

UNO 의 경우 3,5,6,9,10,11 핀이 pwm 이 가능하고, analogWrite() 로 값을 쓸 수 있다.

analogWrite(3,127); // 아날로그 출력핀 3 번에 127 의 값인 2.5V를 출력

쓸 수 있는 값은 0 부터 255 까지로 분해능이 8 비트이다. 최대 256 단계까지 가능하다.

pwm 은 2ms 의 시간 안에서 256 단계로 나누어 일부는 1 을, 나머지는 0 을 출력하는 방식이다.

이것을 2ms 의 주기로 반복한다.

pwm 이란 (puls width modulation) 의 약자로 펄스의 폭을 조절 하는 것이다.

아두이노에서는 2ms 즉, 0.002 초 안에서 ON 과 OFF 를 나눠서 나가는 출력을 조절한다.

그래서 엄밀하게는 Digital Analog Converter 가 아니지만 모터를 제어하거나 온도를 제어하거나

LED 빛의 세기를 제어 할 때는 pwm 을 DAC(DIGITAL TO ANALOG CONVERTER) 로 사용 할 수 있다.

아두이노 보드에 있는 핀 번호 옆에 물결 (~) 표시가 있는 핀이 pwm 출력이 가능한 핀이다.

15-6. delay

delay 는 주어진 시간만큼 아무것도 하지 않고 기다린다.

시간의 단위는 ms 이고, 1000ms 는 1초가 된다.

delay(1000); // 1000ms 즉, 1초 동안 기다림

delay() 함수를 쓸 경우 주의할 점은 함수 실행 중인 시간동안 다른 작업을 하지 못한다는 것이다.

ww

w.fi

rstb

ot.c

o.kr

Page 65: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

30 | 페 이 지

( Ver 1.0 )

만약 스위치입력을 받아야 한다면 delay() 함수의 사용을 잘 고려해서 써야 한다.

delay() 되는 시간에 스위치 작동을 시키면 아두이노에서는 스위치 입력을 인식하지 못할 수도 있다.

15-7. millis()

현재 시간을 반환한다. 현재 시간은 아두이노에 전원이 들어온 뒤로 흐른 시간을 의미한다.

시간의 단위는 ms이다. milis() 함수를 사용해서 시간을 저장할 때는 unsigned long 타입의 변수를

사용한다.

unsigned long value;

value = milis();

milis() 함수를 사용해서 아두이노가 중간에 정지하지 않는 delay()을 만들 수 있다.

15-8. 디버깅

Serial.begin(rate) : setup() 함수의 내부에 시리얼통신 속도를 설정한다.

Serial.print(data) : 데이터를 시리얼포트로 전송한다. 일반적으로 아두이노 보드에 있는 어떤 값(문자열)

을 PC 쪽으로 보낼때 사용한다.

Serial.println() 은 Serial.print() 를 보낸 후 마지막에 줄바꿈 신호를 덧불인다.

즉, Serial.println() 을 쓰면 문자를 시리얼통신 창에 쓴 다음 줄을 바꾸고 새줄의 첫번째 칸으로 커서가

이동한다.

void setup()

{

Serial.begin(9600); // 속도는 9600

}

void loop()

{

Serial.print(analogValue); // analogValue 에 있는 값을 시리얼 통신 전송 // 줄바꿈 없는 출력

Serial.println(“전송문자”); // 문자열을 시리얼 통신으로 전송 // 줄바꿈 있는 출력

}

ww

w.fi

rstb

ot.c

o.kr

Page 66: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

31 | 페 이 지

( Ver 1.0 )

6장. 아두이노 프로그램 방법

아두이노 프로그램을 처음 접할 때 아래 방법을 익혀 둔다.

단계 1. [ 입력 ] 센서를 통한 입력값을 받는다.

단계 2. [ 연산 ] 받은 값을 사용해서 필요한 정보를 연산한다.

단계 3. [ 출력 ] 최종 연산 결과를 출력한다.

단계1 에서는 주로 아두이노와 연결된 센서의 값을 읽어들인다. 아두이노에서 사용하는 디지털 센서는

0과 1의 조합으로 된 값이 나오고, 아날로그 센서는 0V에서 5V 사이의 전압값이 나온다.

이 값의 범위를 벗어나면 이 범위에 맞도록 값을 수정해 줘야 한다.

단계2 에서는 들어온 값을 가지고 필요한 계산을 수행한다. 예를들면 온도센서의 값으로 0V에서 5V사이의 값

을 가져왔다면 그 값을 실제 우리가 확인 할 수 있는 섭씨나 화씨 온도로 변환시킨다. 계산식은 센서에서 나오

는 값과 우리가 얻고자 하는 값사이의 관계식을 만들어서 쓴다. 보통 센서를 제조하는 회사에서 이러한 내용을

문서를 만들어서 제공하고 이런 기술문서도 데이터시트에 포함된다.

단계3 에서는 들어온 값으로 계산이 끝난 값을 가지고 출력을 결정한다. 출력은 다양한 방법이 사용된다.

간단하게는 LED 의 불빛을 켜고 끄는 것도 가능하고, PC와 시리얼통신으로 연결해서 PC 모니터 상에 값을

보여줄 수도 있다. 별도로 마련된 LCD 모니터에 값을 보여줄 수도 있고, 따로 연결된 모터를 작동시키거나

릴레이를 작동시켜서 집의 전등을 켜고 끌 수도 있다. 이러한 모든 것이 출력이 된다.

1. 입력

아두이노에서 주로 사용되는 입력은 digitalRead() 와 analogRead()이다. 입력에 사용되는 함수를 쓰기 위해

서 먼저 pinMode() 함수로 어떤 핀을 어떤 입력으로 쓸 것인지 결정해 주어야 한다.

2. 연산

입력된 값을 가지고 원하는 결과를 얻을 수 있도록 다양한 연산을 수행한다.

이 과정에서 다양한 수학함수들과 문자열함수들, 그리고 for, if 문 등이 사용된다.

3. 출력

아두이노에서 주로 사용되는 출력은 Serial.print(), Serial.println(), digitalWrite(), analogWrite() 함수이다.

물론 이 외에도 SD 카드에 저장하거나 LCD 창에 글자나 그림을 쓰는 등의 출력도 가능하다.

하지만 이런 다양한 출력들도 내부를 잘 살펴보면 위의 4가지 함수를 조합해서 사용하는 경우가

대부분이다. ww

w.fi

rstb

ot.c

o.kr

Page 67: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

32 | 페 이 지

( Ver 1.0 )

간단한 프로그램을 가지고 입력 , 연산, 출력에 대한 이해를 해 본다.

예제) 아두이노의 2번핀에 스위치를 연결하고 스위치를 ON 상태로 했을 때 13번핀에

연결된 LED 가 켜지고 스위치를 OFF 했을때 LED 가 꺼지게 된다.

이 예제 내용에서 입력, 연산, 출력 으로 나누어 보면 다음과 같다.

[ 입력 ] : 스위치 입력값을 PIN 2 로 받음

[ 연산 ] : PIN2 의 값을 ButtonState 에 저장

Button State 값을 반점 시킴

[ 출력 ] : Button State 의 값을 PIN 13 LED 로 출력

입력, 연산, 출력 관련 주요 함수를 순서대로 넣어준다.

먼저 [ 입력 ] 함수를 쓴다.

digitalRead(2)

그런데 이 문장을 사용하려면 먼저 이 함수를 사용할 수 있도록 2번 핀을 디지털입력으로 설정해 주어야

한다. 그리고 설정은 한번만 하면 된다. 한번만 하면 되는 것은 setup() 에 넣어준다.

그리고 digitalRead(2) 는 계속 하는 것이니까 loop()에 넣어 준다.

주요 함수 필요한 설정

[ 입력 ] pinMode( 2, INPUT_PULLUP);

digitalRead(2)

[ 연산 ] Delay(1);

ButtonState =! digitalRead(2)

[ 출력 ] pinMode( 13, OUTPUT )

digitalWrite( 13, ButtonState )

ww

w.fi

rstb

ot.c

o.kr

Page 68: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

33 | 페 이 지

( Ver 1.0 )

입력 부분이 끝났으니 [ 연산 ] 부분으로 넘어간다. 연산에서는 읽는 값을 반전시켜

ButtonState 에 저장한다.

digitalRead (2) 를 반전시켜서 저장한다.

ButtonState =! ( digitalRead (2) );

그리고 loop() 함수를 한번씩 실행할 때 마다 1ms 씩 멈추게 한다.

delay(1);

여기까지 한 것을 모아 보면 다음과 같다.

void setup()

{

pinMode( 2, INPUT_PULLUP );

}

void loop()

{

ButtonState =! ( digitalRead(2) );

delay(1);

}

void setup()

{

pinMode( 2, INPUT_PULLUP );

}

void loop()

{

digitalRead(2)

}

ww

w.fi

rstb

ot.c

o.kr

Page 69: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

34 | 페 이 지

( Ver 1.0 )

이제 마지막으로 [ 출력 ] 부분을 프로그램 한다. 출력은 ButtonState 의 값을 13번 핀으로 그대로

내보낸다.

digitalWrite( 13, ButtonState );

13번 핀을 출력으로 사용하려면 먼저 13번 핀을 출력으로 쓰겠다고 아두이노에 알려줘야 한다.

pinMode( 13, OUTPUT );

전체 프로그램은 아래와 같다.

int ButtonState;

void setup()

{

pinMode( 2, INPUT_PULLUP );

pinMode( 13, OUTPUT );

}

void loop()

{

ButtonState =! ( digitalRead(2) );

digitalWrite( 13, ButtonState );

delay(1);

}

ww

w.fi

rstb

ot.c

o.kr

Page 70: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

35 | 페 이 지

( Ver 1.0 )

7장. 아두이노 입출력

1. 디지털 및 아날로그 입출력

아두이노에는 주변 장치와 데이터를 주고받을 수 있는 디지털 및 아날로그 핀들이 준비되어 있다. 디지털 입

출력을 위해서는 디지털 0번부터 13번까지 14개의 입출력 핀을, 아날로그 입력을 위해서는 A0부터 A5까지

6개의 아날로그 입력핀을 사용한다. 디지털 입출력의 경우 14개의 핀 중 ‘~’ 표시가 있는 3, 5, 6, 9, 10, 11번

6개 핀이 PWM 신호 출력을 지원한다. 아날로그 입력의 경우 마이크로컨트롤러 에서 처리할 수 있도록

ADC(Analog Digital Converter)를 거쳐 디지털로 변환되어 입력된다.

< 아두이노 UNO 입출력 핀 >

1) 디지털 입출력

아두이노의 디지털 핀은 입력 또는 출력으로 설정할 수 있으며 대부분의 아날로그 핀 역시 동일한 방식으로

설정하여 사용할 수 있다. 아두이노의 핀은 디폴트값으로 입력 상태를 가진다. 따라서 입력으로 사용하기 위

해서는 명시 적으로 pinMode() 함수를 사용하여 입출력 상태를 설정하지 않아도 입력으로 사용이 가능하다.

입력 상태로 설정된 핀은 하이 임피던스 상태(high impedance state)에 있다고 말해진다. 디지털 논리 회로에

서는 일반적으로 5V(Vcc)는 1로 0V(Ground, GND)는 0으로 간주된다.

하이 임피던스 상태는 단어 의미 그대로 아주 큰 저항이 연결된 상태로 생각할 수 있으며 따라서 아주 적은

전류가 흐르는 상태를 말한다. 하이 임피던스 상태에 있는 핀은 1이나 0의 상태가 아닌 제 3의 상태로 플로

팅(floating)되어 있어 외부 잡음이나 이웃한 핀의 상태에 따 라 의미 없는 값을 반환할 수 있다. 이처럼 핀에

외부 회로가 연결되지 않은 경우 하이 임피 던스 상태를 방지하기 위해 (Vcc로) 풀업 저항 또는 (GND로) 풀

다운 저항을 연결하여 1이나 0의 상태로 설정하는 경우가 있다. 풀업이나 풀다운 저항은 10㏀이 많이 사용

된다. 그림 2는 풀업 저항을 연결한 예를 보인 것이다. 그림 (a)의 경우 스위치가 눌러지면 0V 입력이 가해 ww

w.fi

rstb

ot.c

o.kr

Page 71: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

36 | 페 이 지

( Ver 1.0 )

지지만 스위치가 눌러지지 않은 경우 하이 임피던스 상태가 되어 그 값을 예측할 수 없다. 그 림 (b)와 같이

풀업 저항을 연결하면 스위치가 눌러지면 0V 입력이 가해지는 것은 동일하지만 스위치가 눌러지지 않은 경

우에는 Vcc가 입력되어 논리 1이 보장된다.

아래 그림은 풀업의 경우와 달리 스위치가 눌러진 경우 Vcc 입력이 가해지므로 스위치가 눌러지지 않은 경

우 0V 입력을 위해 저항을 사용한 경우이다.

ww

w.fi

rstb

ot.c

o.kr

Page 72: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

37 | 페 이 지

( Ver 1.0 )

ATmega 마이크로컨트롤러 내에도 소프트웨어적으로 제어 가능한 20㏀ 풀업 저항이 포함되어 있다. 풀업 저

항의 설정 방법은 다음과 같이 먼저 핀의 상태를 입력 상태로 둔 상태에서 핀으로 HIGH 값을 출력하면 된

다.

pinMode(pin, INPUT); // 핀을 입력 상태로 설정

digitalWrite(pin, HIGH); // 풀업저항 연결

ATmega 마이크로컨트롤러의 디지털 입출력 핀에는 입력과 출력을 위한 별도의 레지스터가 준비되어 있어

입력이나 출력으로 설정된 경우 전용 레지스터를 사용한다. 핀이 입력 모드인 경우 출력을 위한 레지스터는

출력 목적이 아닌 풀업 저항 설정을 위한 용도로 바뀌어 사용된다. 따라서 풀업 저항을 연결하도록 설정한

입력 핀이 출력 상태로 바뀔 경우 HIGH의 출력을 가지게 됨에 유의하여야 한다. 아두이노의 13번 디지털 입

출력 핀을 디지털 입력으로 사용하기 위해서는 주의가 필요하다. 아두이노 보드 상에는 LED와 LED를 위한

저항이 13번 핀에 연결되어 있기 때문에 13번 핀 의 20㏀의 내부 풀업 저항을 사용하도록 설정하면 LED를

위한 저항도 함께 사용되어 HIGH 입력에서도 전압이 약 1.7V로 낮아져서 항상 LOW 상태가 된다. 따라서

13번 핀을 입력으로 사용하기 위해서는 내부 풀업 저항이 아닌 외부 풀업 저항을 사용하여야만 한다. 출력

상태로 설정된 핀은 로 임피던스 상태(low impedance state)에 있으므로 많은 양의 전 류를 외부 회로로 공

급할 수 있다. ATmega 마이크로컨트롤러는 최대 40mA까지 외부 회로 로 양의 전류를 공급하는 소스(source)

또는 음의 전류를 공급하는 싱크(sink)로 동작할 수 있다. 이 전류는 LED를 켜거나 여러 가지 종류의 센서를

동작시키기에 충분하지만 모터나 릴 레이와 같이 많은 전력을 요구하는 장치를 구동시키기 위해서는 부족하

다. 아두이노의 핀에 단락 회로(short circuit)를 연결시키거나 많은 전류를 필요로 하는 장치를 구동하는 경우

핀 의 출력 트랜지스터 또는 보드 자체의 고장 원인이 되므로 피해야 한다. 이러한 과전류 상황 을 피하기

위해 출력단에 470Ω 에서 1㏀ 정도의 저항을 통해 외부 회로를 연결하기를 권장한다.

Arduino UNO에는 14개의 디지털 입출력 핀이 제공되며 이 중 6개(핀 3, 5, 6, 9, 10, 11)은 PWM (Pulse Width

Modulation) 신호 출력을 위해 사용할 수 있다. PWM은 디지털 신호를 출력하면서도 아날로그 신호와 같은

효과를 얻을 수 있는 방식으로 LED의 밝기 조절이나 모 터 속도 조절 등을 위해 사용할 수 있다. 디지털 신

호는 구형파(square wave)를 기본으로 on(5V)과 off(0V) 전압을 가지게 된다. PWM은 한 주기 내에서 on과

off 신호가 가지는 비율 을 조절하는 방식으로 지속 시간(duration of period)은 신호가 on 상태인 시간, 듀티

사이 클(duty cycle)은 on인 시간과 off인 시간의 비율을 나타낸다.

ww

w.fi

rstb

ot.c

o.kr

Page 73: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

38 | 페 이 지

( Ver 1.0 )

PWM 신호를 출력하기 위해서는 디지털 핀에 analogWrite 함수를 이용하여 0에서 255 사이 의 값을 출력함

으로써 서로 다른 듀티 사이클을 가지는 구형파를 출력할 수 있다. 255를 출력 하면 듀티 사이클은 100%가

되고 0을 출력하면 듀티 사이클은 0%가 된다. 이 때 디지털 핀 임에도 analogWrite 함수를 사용하여야 한다

는 점에 유의하여야 한다. 먼저 LED를 PWM 신호 출력이 가능한 3번 디지털 핀에 220Ω 저항과 LED를 이용

하여 그림 5의 회로를 구성하고 코드 1을 실행시키면 LED가 꺼진 상태에서 (analogWrite(0))에서 완전 히 켜

진 상태로 (analogWrite(255)) 점차 진행되는 것을 볼 수 있다.

< PWM 신호에 의한 LED 밝기 조절 >

int LED_pin = 3;// LED 연결 핀

void setup()

{

pinMode(LED_pin, OUTPUT)// 출력 모드 설정

}

void loop()

{

int i;

for(i = 0; i < 256; i++)

{

analogWrite(LED_pin, i);// 0(꺼짐)에서 255(켜짐)로 서서히 변화

delay(10);

}

} ww

w.fi

rstb

ot.c

o.kr

Page 74: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

39 | 페 이 지

( Ver 1.0 )

2) 아날로그 입력

아두이노에서 사용되는 ATmega 마이크로컨트롤러에는 6 채널의 아날로그-디지털 변환 장치 (Analog-to-

Digital Converter, ADC)가 포함되어 있다. ADC는 10비트의 해상도를 가지므로 0에서 1023 사이의 값을 반환

한다. 아날로그 핀의 주 용도는 외부 센서를 연결하여 그 값을 읽어 들이는 일이다. 아두이노UNO에는 6개의

아날로그 핀이 마련되어 있으며 아날로그 핀 역시 디지털 핀과 마찬가지로 디지털 데이터의 입출력을 위해

서 사용될 수 있다. 이 경우 아날로그 핀은 A0에서 A5로 지정된다. 아두이노 UNO에서 아날로그 핀을 나타

내는 상수는 디지털 핀을 나타내는 값인 0에서 13번 이후 A0가 14번, A1이 15번 등으로 정의되어 있다.

예시) 아날로그 핀 0번(A0)을 통해 디지털 데이터를 출력

pinMode(A0, OUTPUT);

digitalWrite(A0, HIGH);

아날로그 핀에도 디지털 핀과 마찬가지로 내부 풀업저항이 준비되어 있다. 풀업 저항을 사용 하기 위해서는

디지털 핀과 마찬가지로 입력으로 설정된 핀에 digitalWrite 함수를 통해 HIGH를 출력하면 된다. 하지만 디

지털 입력의 경우 0과 1의 두 가지 값 중 하나만을 입력하므로 내부 풀업 저항을 사용하더라도 읽어 들이는

값에 변화가 없지만 아날로그 입력은 0에서 1023까지 디지털화된 값이 입력되므로 풀업저항을 사용하게 되

면 analogRead 함수를 통해 읽어 들이는 값이 바뀐다.

pinMode(A0, INPUT);

digitalWrite(A0, HIGH); // set pullup on analog pin 0

아날로그 핀이 OUTPUT 상태로 설정된 상태에서 analogRead 함수를 실행하면 정상적인 동작을 수행하지

못하므로 반드시 INPUT 상태로 전환한 후에 사용하여야 한다. 또한 아날로그 핀에 HIGH 값을 출력한 상태

에서 입력 상태로 전환하면 내부 풀업저항이 연결된다는 점도 주의하여야 한다. analogRead 함수를 통해 아

날로그 값을 읽어 들일 때 인접한 아날로그 핀의 상태를 짧은 시간 내에 바꾸는 경우 전기적 잡음이나 지터

(jitter)가 발생하므로 유의하여야 한다. 따라서 아날로그 핀을 디지털 모드로 동작시킨 후 다른 아날로그 핀

에서 analogRead 함수를 실행하기 전에 짧은 지연 시간을 주는 것이 바람직하다. 아날로그 입력핀 A0를 통

해 아날로그 입력을 받는 간단한 프로그램을 작성해 보자. 가변저항에 연결하고 가변저항의 값이 변함에 따

라 가해지는 전압이 A0 핀의 ADC를 거쳐 입력되는 값은 0에서 1023까지 변화함을 볼 수 있다. 현재 가변저

항을 통해 입력되는 아날로그 값은 (실제로는 0V에서 5V 사이의 아날로그 값이 ADC를 거쳐 0에서 1023 사

이의 디지털화 된 값) 스케치 메뉴에 있는 시리얼 모니터를 통해 확인할 수 있다.

ww

w.fi

rstb

ot.c

o.kr

Page 75: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

40 | 페 이 지

( Ver 1.0 )

< 가변저항 연결 회로 >

void setup()

{

Serial.begin(9600); //직렬포트 초기화

}

void loop()

{

int sensorValue = analogRead(A0); //아날로그 입력값 읽기

Serial.println(sensorValue); //입력값을 직렬포트로 출력

}

ww

w.fi

rstb

ot.c

o.kr

Page 76: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

41 | 페 이 지

( Ver 1.0 )

< 별첨 > 아두이노 Library(라이브러리) 추가/ 사용 하기

아두이노를 사용하다보면 새로운 센서나 모듈등을 사용할 때 가장 많이 찾게 되는것이 라이브러리 이다.

아두이노에서는 기본 함수들과 클래스정도는 직접 헤더파일을 추가해주지 않아도 컴파일 과정에서 자동으로

라이브러리가 추가되기 때문에 별다른 작업없이 사용할 수 있다.

기본적인 LED제어나 간단한 센서 정도는 라이브러리 없이 간단하게 아날로그 값이나 디지털 값의 입출력을

통해 값을 읽어오고 전송할 수 있으나, 좀 더 나아가 여러 기능을 가진 센서,모듈들을 사용하기 위해서는

제조사나 인터넷 각종 사이트에서 제공하는 라이브러리가 있어야지만 제어가 가능하다.

라이브러리가 없다고 완전히 제어가 불가능한 것은 아니지만 그만큼 사용자가

여러 기능을 직접 만들어서 구현해야 하기 때문에 코딩이 상당히 번거로운 작업으로 변하게 된다.

아두이노가 설치된 프로그램 경로에 libraries 란 폴더가 존재한다.

폴더안에는 그 라이브러리의 함수들을 정리해 놓은 헤더파일(.h)과 소스파일(.cpp)이 존재한다.

또한 그 라이브러리를 사용한 간단한 예제소스또한 같이 존재한다.

기본 이외의 기능이 필요해 라이브러리를 사용할 경우에는 소스 제일 처음부분에

#include <라이브러리 헤더파일>을 입력한다.

-> #include <라이브러리 헤더파일>

만약 소스가 문법상의 오류 없이 완벽하게 구현이 됐더라도 라이브러리 헤더파일을 상단에 선언해주지

않게 되면 컴파일 도중에 오류가 뜨게 된다.

컴파일 도중에 에러가 뜬다면 헤더파일을 제대로 선언해 주었는지 확인해보는 일도 필요하다.

아두이노가 기본적으로 제공해주는 라이브러리 이외에 인터넷에서 개인 또는 아두이노 페이지에서

공급하는 라이브러리는 외부라이브러리 또는 확장라이브러리라고 하는데 이런 확장라이브러리는

직접 찾아서 따로 내려받아서 설치해주어야 한다.

모두 다 설치할 필요는 없고 자신이 필요하다 싶을 때 그때그때 가서 지금 필요한 라이브러리만

받아주면 된다.

(아두이노 페이지에서 많은 외부라이브러리를 지원해준다)

-> http://playground.arduino.cc/Main/GeneralCodeLibrary

(아두이노 관련 많은 라이브러리를 찾을 수 있는 사이트)

-> https://github.com/

설치하는 방법은 기본라이브러리가 존재하는 방법과 같이 아두이노폴더에 존재하는 libraries폴더에

받은 라이브러리를 저장하여 libraries폴더 안에 설치한 외부라이브러리폴더 안에 올바른 헤더파일과

소스파일이 존재할 경우 설치가 끝난다.

ww

w.fi

rstb

ot.c

o.kr

Page 77: 2WD SMART CAR 만들기 - firstbot.ipdisk.co.krfirstbot.ipdisk.co.kr/publist/HDD1/Link/FirstBotKit/2WD/Make2WD... · 아두이노 우노 rc와 l293d 와의 결선 ... 만들기 ver

Beginning Arduino

42 | 페 이 지

( Ver 1.0 )

라이브러리를 받아 libraries에 저장하였으면 스케치창을 모두 종료하고 다시 재시작한다.

(모두 종료하기 전에는 라이브러리가 보이지 않는다.)

재시작을 한뒤 기본 라이브러리 아래에 따로 설치한 라이브러리가 보인다.

외부의 공개소스로 부터 받은 경우, 초기의 개발도구(버전 1.0.x)에서는 압축이 풀린 상태의 폴더를 기준으로

등록이 가능 했으나, 현재의 버전(버전 1.6.x 등)은 ZIP 파일 자체로 등록이 가능하다.

공개 소스의 예제가 있는 경우, 메뉴 '예제' 역시 동시에 사용할 수 있다.

**** 내용출처 kocoafabeditor (코코아팹에디터 , http://kocoafab.cc/ )

ww

w.fi

rstb

ot.c

o.kr