언어튜토리얼2- Arduino(강슬기)

템플릿은 참고용입니다.

템플릿에 구애받지 말고 자유롭게 작성해 주세요~

위키피디아 형식으로 적는 것도 좋겠죠?

-----------------------------------------

언어이름:

강사명:

시간:

참여자:

----------------------------------------

과정:

Arduino Environment Download & Install

아르두이노 인바이런먼트(소프트웨어) 다운로드 및 설치

1. 아르두이노 보드와 케이블을 준비한다. 여기서 설명할 여러 보드 중에 Arduino Diecimila를 위주로 설명할 예정.

다른 보드는 사이트를 참고해가며 설치 및 사용한다. 케이블은 USB를 사용하되 A plug to B plug를 사용한다.

저번 시간에도 섦여했듯이 다시 한번 관련 주요 부품에 대해서 알아보자

2. http://arduino.cc/en/Main/Software로 가서 자신의 컴퓨터 시스템에 맞는 최신 소프트웨어(현재 Arduino 0012가 최신)를 다운 받는다.

( 예: 맥 사용자는 Mac OS X, 윈도우 사용자는 Windows를 눌러 다운로드 받는다.). 다운을 받을 후 Zip파일을 푼면 그 안에 또 다른 폴더들과 파일들을 볼 수 있다.

3. 먼저 자신의 컴퓨터와 보드간에 통신을 위해서는 FTDI칩의 Driver을 깔아야한다. 드라이버 파일은 이 경로(drivers/FTDI USB Drivers)를 통해 찾을 수 있다. 아르두이노 보드는 이 칩에 대한 최신 정보와 드라이버는 이곳에서. http://www.ftdichip.com/Drivers/VCP.htm

4. 설치하기 전에 보드에 점퍼(Jumper)라는 것이 있는데 이것을 통해 USB또는 파워서플라이에서 전원을 공급받는다. USB에서 공급받는 전원은 비교적 작은 규모의 LED들을 켜고 끄는 정도는가능하다. 그 밖에 큰 프로젝트들은 점퍼를 이동해 외부 전원을 이용할 수 있게 셋팅을 하고 보통 6V-12V전원을 쓸 수 있다.(비교적 9V를 많이 쓰고 이 정도 전압으로 대부분의 학생 프로젝트는 가능한다.) 기초 과정에서는 USB파워로만 작업 할 예정. 따라서 USB를 사진처럼 꽂고 PWR에 불이 들어왔는지 확인한다.

5. 아까 말한 폴더로 돌아와서 실행 파일을 찾아 실행시킨다. 이때 USB가 꽂혀있는지 물게되는데 위 과정을 하지 않을시에는 취소하고 USB를 연결하고 설치 작업을 계속한다. 설치 과정이 진행되면 아래와 같이 따라서 설정한다.

http://www.koders.com/noncode/fid50F96AA7D90DE2D88F0F8206EAE365B5BFC83522.

5. 자 이러면 프로그래밍을 할 준비가 되었다. 테스트용으로 보드에 별다른 구성없이 바로 LED를 켜 볼 수 있다. 이는 보드에 기본 LED를 켤 수 있도록 저항이 달려있는 아웃풋 핀이 있다. 그곳이 Pin13이다. 일단 LED를 꺼내 다리가 긴쪽(즉, + 되는 쪽)이 pin13에 그리고 다리가 짧은 쪽(GND쪽)이 바로 옆에 그라운드에 꽂는다. 보통 LED를 켤 때는 맞는 저항을 사용하여야하지만 앞에서 말했지만 Pin 13에는 저항이 있어 LED를 테스트를 쉽게 할 수 있다.

6. 자 이제 소프트웨어를 돌려보자. 아르두이노 폴더 안에 소프트웨어의 아이콘을 더블 클릭해서 실행한다.

7. 실행을 하게되면 화면이 뜨고 File > Sketchbook > Examples > Digital > Blink을 실행시키면 아래와 같은 코드가 불러져온다.

8. 자 또한번의 중요한 설정 과정이 있는데 USB Port가 작동이 잘 되는지 어느 포트에 연결이 되어있는지 찾아줘야 작동을 하게된다.

보통 윈도우에서는 COM1 또는 COM2에 시리얼 아르두이노 보드가 설치되어지고, USB보드는 COM3, COM4, COM5중에 연결된다. 확실히 알 수 있는 방법은 '장치관리자' 로 가서 PORT를 확인하면 알 수 있다.

위 확인 작업이 끝난 후 Menu > Tools > Serial Port에서 좀 전에 확인한 포트를 찾아주고 다시 Menu > Tools > Board에서 지금 자신이 쓰고 있는 보드를 설정해준다.

9. 자 이제 Upload버튼을 눌러보자. 1-2초정도 기다리면 RX와 TX LED가 깜빡깜빡거리면서 작동되는 것을 볼 수 있다.

만약 업로드가 제대로 되었다면 아래 검정색 메세지 창에 "Done Uploading"이란 메세지가 뜰 것이다. 참고로 Decimila보드에선 Reset Button을 누르지 않아도 되나 다른 이전 버젼들의 버드에서 반드시 Reset Button을 누르고 난 뒤에 업로드를 해야지만 작동이 됨을 알아두자.

10. 약 2-3초 정도 후에 LED가 깜박 깜박하는 것을 볼 수 있다. 처음 과정이라 조금 복잡하나 그 이후로는 쉽게 프로그램을 실행하고 코딩하고 업로딩하는 식으로 단순하게 작업을 진행할 수 있다.

11. 질문사항???

R(resistance) = V (voltage) / I (current)

V = R * I

I = V / R

프로그래밍 기초

Pseudo Code

만약 빛이 50보다 작게 받으면

불을 켠다

그렇지 않으면

불을 끈다

/* .... */ 이것은 여러 줄을 코멘트 기능으로 프로그램에 영향을 미치지 않는 가려지는 기능을 한다.

따라서 나중에 코드를 다시볼 때 혼동스럽지 않게 하기 위해 이것을 적절히 사용하며 코딩해야한다.

// 이것은 위와 같은 코멘트 기능이나 한줄짜리로 사용된다.

; 모든 프로그램 한줄이 마치면 반드시 세미콜론을 이용하여 다음줄과 구분을 짓는다. (명심)

{ ... } 컬리브랭킷은 한 문장이 아닌 여러 코딩 문장을 실행시킬 때 사용한다. 가령

if (i=0){

불을 켠다

모터를 돌린다

실행을 멈춘다

}

식으로 만약에 i이 값이 0이 되면 먼저 불을켜고 모터를 돌리고 난 뒤 작동을 멈춤을 한꺼번에 동작을 한다.

자 그럼 본적으로 기본 아르두이노 프로그램의 형태를 보자!

// x라는 정수를 담을 수 있는 방을 만듦

int x;

// 처음 시작할 때 기본적으로 셋업해주는 역할을 한다. 딱 한번만 실행된다. 따라서 핀의 아웃핀 인풋 설정을 해줄때 이곳에 작성한다

void setup()

{

// put code here

{

// 프로그램을 빠져나가기 전이나 종료 명령이 없으면 무한대로 계속 반복 진행된다. 실제 작동 설계는 이곳에서 이루어진다.

void loop()

{

//put code here

}

식으로 대부분 구성하게 되어진다.

조금 더 자세한 대표 코드를 보게되면

PinMode(pin, MODE);

- 사용할 핀을 설정하면서 아웃풋으로 쓸 것인지 인풋으로 쓸 것인지 결정해주는 코드

- 보통 이 코드는 setup안에 넣는다.

digitalWrite(pin, HIGH/LOW);

- 이 코드는 어떤 하나의 디지털 핀을 작동 시킬것인지(5V) 아니면 정지 시킬것이지(0V)를 설정한다.

int digitalRead(pin);

- 이 코드는 어떤 하나의 디지털 핀을 작동하는 것인지(5V) 아니면 정지되는 것인지(0V)를 읽는 역할을 한다.

if (statement) {block_code1} else {block_code2}

- 조건문 코드를 만나면 block_code1을 수행할 것인지 block_code2를 수행할 것인지를 판단한다.

for (init; end; increment) { }

- 일정한 코드를 일정한 조건문에 시간 동안 반복 실행 시키는 기능

Digital Input/Output

Analog Input/Output

Breadboard 사용법

LED와 Resistors

Resistor Color Code

Resistor 계산기

웹용

http://www.pelco.com/support/tools/resistorcalc.aspx

윈도우 인스톨형

http://imagesearch.naver.com/search.naver?where=idetail&rev=4&query=%C0%FA%C7%D7%20%B0%E8%BB%EA%B1%E2&from=image&ac=1&sort=0&res_fr=0&res_to=0&merge=0&spq=1&start=1&a=pho_l&f=tab&r=1&u=http%3A%2F%2Fblog.naver.com%2Fsj10302%3FRedirect%3DLog%26logNo%3D130024210510

맥용 가젯용

http://www.apple.com/downloads/dashboard/calculate_convert/resistulator.html

직렬, 병렬, 싱글 LED를 작동하기 위해 저항을 계산해주는 곳 (웹)

http://www.quickar.com/noqbestledcalc.htm

브레드 보드 이용하여 LED켜기

과제 - 4또는 5개의 LED를 순차적으로 껐다 켜기

과제 모범 정답!!!

int timer = 100; // 변수를 선언합니다. 이변수는 LED가 켜지는 시간을 의미.

// 100이란 수를 변경하면 led가 움직이는 시간이 변함

int pins[] = { 2, 3, 4, 5, 6, 7 }; // 배열을 선언. 2~7까지 이 배열은 밑에서 출력핀으로 설정. 0과 1은 빠짐

int num_pins = 6; // 핀의 갯수가 6개라고 변수

void setup()

{

int i;

for (i = 0; i < num_pins; i++) // i는 0부터 핀의 갯수 6개 까지 반복하며 수행.

pinMode(pins[i], OUTPUT); // pinMode 함수를 이용해 배열로 선언한 핀들을 OUTPUT 로 설정.

}

void loop()

{

int i;

for (i = 0; i < num_pins; i++) { // i값이 0부터 5까지 +1 씩 증가하며 {... } 안을 수행.

digitalWrite(pins[i], HIGH); // digitalWrite함수를 이용해 pins[i]에 연결된 LED를 하나 켜 줌.

delay(timer); // led가 켜져있는 시간동안 delay

digitalWrite(pins[i], LOW); // led 끄기

}

for (i = num_pins - 1; i >= 0; i--) { // 위와 같지만 감소하면서..

digitalWrite(pins[i], HIGH);

delay(timer);

digitalWrite(pins[i], LOW);

}

}

TIP!!!

1. RXD, TXD핀의 사용

왜 핀 0과 1에는 LED 를 달지 않았을까? 회로를 보면 핀 0과 1은 RXD, TXD 핀이다. 이 두핀으로 부트로더를 이용해 프로그램을 다운로드 할 수 있는데...

이곳에 어떤 부하가 달리면 다운로드가 안될 수 있다. 그래서 빼 놓은 것이고 되도록 이면 이 포트는 그냥 두는 것이 낫다.

이 두 핀도 넣고 싶다면 이 두 핀에 LED를 달기전에 프로그램을

int pins[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

int num_pins = 8;

로 작성후 컴파일하고 다운로드 하고 LED를 달아 보시면 8개의 LED가 왔다갔다 켜지는 것을 볼 수 있을 것이다.

2. For 구문의 활용

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

{

// 조건에 맞고 반복 시킬 구문

}

불필요한 코드를 줄일 수 있다.

- While과 Do... While과 다른 점?

PWM(Pulse Width Modulation) 출력 이용하기

PWM은 쉽게 말해서 아날로그 아웃풋이다. 우리가 집에서 쓰고 있는 조광기도 PWM의 원리로 만들어진 것이다. 또한 모니터 속도 역시 이 방법으로 쓰기도 합니다. 예를 들어 모터를 들어보자.

모터를 단순히 ON/OFF만 한다면 그냥 스위치나 RELAY를 사용하면 되지만 모터의 속도를 가변시키려면 좀 복잡하다. DC 모터속도를 가변시키는 가장 간단한 방법은 전압을 제어하는 것이다. 하지만 전압제어방식은 모터에 공급되는 전압외는 모두 손실(열)로 빠져 나가게 된다. 즉 효율이 매우 낮다는 것이다.

그럼 다른 방법은 무엇이 있을까요. 모터에 스위치를 달아 ON,OFF 시간을 제어하면 된다. 가령 1초동안에 ON을 하고 9초동안에 OFF를 한다면 결국 전체적으로 보면 1/10속도만큼 느려지게 되는 것이다. 이것이 PWM방식이다. 물론 실제로는 이보다 훨씬 빠른 속도(수백hz~수십khz)로 제어를 한다. 즉 ON,OFF의 비(RATIO)를 제어하여 속도를 제어하는 것이다.

예제 실습

File > Sketchbook > Example > Analog > Fading

int value = 0; // variable to keep the actual value

int ledpin = 9; // light connected to digital pin 9

void setup()

{

// nothing for setup

}

void loop()

{

for(value = 0 ; value <= 255; value+=5) // fade in (from min to max)

{

analogWrite(ledpin, value); // sets the value (range from 0 to 255)

delay(30); // waits for 30 milli seconds to see the dimming effect

}

for(value = 255; value >=0; value-=5) // fade out (from max to min)

{

analogWrite(ledpin, value);

delay(30);

}

}

값이 1, 0이 아니라 255로 나누어 펄스의 속도를 줄이는 방식.

INPUT 장치들의 사용

스위치 이용하여 LED켜기

/* 버튼을 눌렀을 때만 LED 깜빡거리기

-------------------------------------------

*/

int ledPin = 13; // LED를 어디에서 켤 것인가를 선택

int inPin = 7; // 입력핀은 어디로 선탹할 것인가 (여기서는 버튼을 어디에 연결할 것인가)

int val = 0; // val이란 공간에 0이란 초기값을 지정

void setup()

{

pinMode(ledPin, OUTPUT); // LED를 아웃풋로 쓴다는 것을 설정

pinMode(inPin, INPUT); // 버튼을 인풋장치로 쓴다는 것을 설정

}

Void loop()

{

val = digitalRead(inPin); // 인풋의 값을 읽어온다

// 인풋이 HIGH(버튼이 눌려져있는지) 확인한다

if (val == HIGH)

{

digitalWrite(ledPin, LOW); // LED를 끈다

} else {

// LED를 깜빡이고 꺼진다

digitalWrite(ledPin, HIGH);

delay (200);

digitalWrite(ledPin, Low);

delay(1000);

}

}

빛 센서 이용하여 LED불 밝기 조절하기

int val = 0; // val에 0이란 초기값 설정

void setup()

{

pinMode(13, OUTPUT); // ledPin을 아웃풋으로 설정

}

void loop()

{

val = analogRead(0); // 센서에서 들어오는 값을 읽는다

digitalWrite(13, HIGH); // LED를 켠다

delay(val); //잠깐 동안 프로그램을 멈춘다

digitalWrite(13, LOW); // LED를 끈다

delay(val); // 잠깐 동안 프로그램을 멈춘다

}

피에조 센서 이용하여 LED켜기

소리에 반응해서 13번 핀에 연결된 LED가 켜졌다 꺼졌다를 반복한다.

원래는 피에조센서를 사용해야 하지만 피에조 부져도 동일한 내부 구조라 작동에는 문제가 없다.

진동판 같은 것이 있는데.. 소리든 외부의 압력이든 진동판이 떨리게 되면 전압이 발생.

그 발생한 전압을 ADC로 읽어서 어느 기준치 이상의 값이 입력되면 LED를 토글하고 PC로는 "Knock!" 라는 문자열을 보내게 됩니다.

회로는 간단하디. 피에조센서나 부져, 컨덴서 마이크나 심지어 스피커를 연결해도 된다.

저항은 pull down 저항으로 소리가 없으면 Analog 입력값을 0으로 만들어 준다.

1. 샘플을 연다

File > Sketchbook > Example > Analog > Knock

2. 센서와 부품을 구성 후 컴파일한다.

하지만 잘 작동이 안됨으로 아래 소스 코드를 이용하여 다시 한다.

3. 다시 제작한 소스 코드 (제작자 ID: hehevnt)

int ledPin = 13; // 소리가 날때마다 토글 시킬 LED

int knockSensor = 0; // analog pin 0

int val = 0; // variable to store the value read from the sensor pin

int statePin = LOW; // variable used to store the last LED status, to toggle the light

int THRESHOLD = 3; // 이값이 기준값으로 값이 커질수록 더욱 큰 소리에 반응 합니다.

void setup() {

pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT

Serial.begin(9600); // use the serial port

}

void loop() {

while( (val=analogRead(knockSensor)) <= THRESHOLD ); // 기준값보다 큰 값이 들어올때 까지 대기

statePin = !statePin; // toggle the status of the ledPin (this trick doesn't use time cycles)

digitalWrite(ledPin, statePin); // turn the led on or off

Serial.println("Knock!"); // 소리가 나면 피씨로 "Knock!" 보내기

Serial.println(val,DEC); // 입력된 ADC 값을 PC로 보내기

delay(100);

}

----------------------------------------

회고: