로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/08/07
Link#1 (Down:268)
ㆍ추천: 0  ㆍ조회: 7057   
  아듀이노 기본명령
아듀이노 응용 동영상 보기 #1  arduino_walker_baby_steps.avi(656.1KB)
아듀이노 응용 동영상 보기 #2 Plantbot_arduino.avi(495.8KB)

 
 
이 정도의 응용장치 제작은 어려운 것이 아닙니다, 아듀이노 기판과 소프트웨어만 있으면, 
단지 노력이 필요한 것 뿐이죠 !!! 열심히 읽고 배우다 보면, 자신도 모르게 모두 이루어 집니다.
억지로 외우려 하지 말고, 이해가 될 때까지 편한 마음으로 읽어 보십시요. 
 
실행코드를 만드는 도구인 C언어는 명령구문이 영문이라는 것 외에는 어려운 것이 아닙니다,
10 개 이내의 명령구문의 사용법을 터득하면 누구나 만들 수 있습니다, 비전공인 사람들도 잘 씁니다.
오히려 전자공학을 전공한 사람들이 C언어를 못쓰는 사람들이 수두룩 한데요,,,
걱정하지 마십시요, 오늘 이 자료를 읽고 나면 C 언어와 한층 가까와 질 수 있습니다.

이유는 단순히, C언어 컴파일러의 설치와 타겟환경의 설정이 까다롭고 복잡하기 때문입니다.
특히 초보자들은 하드웨어의 표준이 없이 자신이 모든것을 준비하는 과정이 너무 혼란스럽고,
소프트웨어로는 처음부터 무었을 어떻게 시작해야 하는지 경험이 없어 막막하기 때문입니다.
이론은 많이 배웠으나, 실무경험이 없는 것 뿐이므로, 실무경험은 아듀이노로 도전해 보시기 바랍니다.

아듀이노는 표준화된 하드웨어와 환경설정이 완료된 무설치 C언어 컴파일러를 공짜로 배포하고 있고,
표준화된 하드웨어에 연결하는 주변부품의 접속, 실행코드와 소스까지 포함된 자료가 공개되어 있으므로,
사용자층이 미술, 미디어 아티스트, 디자인 분야에 까지 점점 늘어나고 있습니다.
물리나 화학을 전공한 분들도, 어듀이노를 이용하면 시험장치를 쉽게 만들수 있다고 생각합니다.

이제부터 용기를 내서 시작해 보십시요, 아듀이노의 가장 기본적인 구조부터 설명해 보겠습니다.
아듀이노는 3개로 구분되며, 명령구문(structure), 변수(variables)와 상수(constant), 함수(function)입니다.
아듀이노는 C/C++ 기반으로 만들어진 언어입니다. 내장된 컴파일러는 개조된 WinAVR 공개버전입니다.
(아듀이노의 명령은 표준 C++과 문법의 동일하며, 입출력 전용명령만 조금 상이합니다)

아듀이노 기판의 응용회로 예 (아듀이노 데시밀라와 100% 호환)
  
------------------------------------------------------------------------------------------------------------------
아듀이노의 구문 (structure)
아듀이노 프로그램은 다음과 같이 초기화인 setup()과 본문인 loop()로 구분합니다.
이 항목을 이해하면 C언어를 바로 배울 수 있습니다, 어렵지 않습니다,,,,
단순하게 화살표의 흐름이 어떻게 되는지 만 이해하면 됩니다.
이 항목을 이해하였다면, 이제부터는 C언어가 당신의 제2 언어가 될 수 있습니다.

리셋 (전원인가 혹은 리셋 스위치)
  
setup()
{    
   명령구문1                                                                 loop()와 setup()을 정통적인 C의 문법으로 변경하면 
  ↓                                                                             void setup() 
   명령구문n                                                                 { ,,,,,}            
}                                                                                 
  ↓                                                                             int main()
loop()                                                                         { 
{     ----   ↖                                                                   setup();      // 초기 설정 1회 실행
  명령구문1  ↑  적색으로 된 화살표는 loop()의 실행이            while(1)      // 무조건 무한반복
  ↓             ↑  마지막 명령줄에서 처음으로 되돌아가는          {    
  명령구문n 
↑ 자동반복되는 상태를 보여준다                   
       명령구문;  // 이곳에 본문이 들어간다.
}      ____  ↗                                                                    }               // 반복위치로 돌아가는 지점
                                                                                  }   // 이곳은 무조건 무한반복 때문에, 결코 실행되지 않는다. 
 
C 문법에서 제어장치는 소스로 만든 응용코드로 작동하며, 응용코드는 소스가 의도한 모든것을 가지고 있습니다.
실행코드는 전원을 켰을 때 한번만 실행하면 되는것이 아닙니다. 밖에서 보기엔 그럴지도 모르지만,,
실지로는 위와 같이 시작에 ~도중 ~마무리 까지 해야할 일을 순서데로 나열해서 명령구문의 집합을 만들고,
전원을 끄기 전까지는 명령령구문의 집합을 순서데로 무한히 반복하는 loop()의 구조를 사용해야 만 합니다.
 
만일 실행코드가 무한반복의 순환구조를 쓰지않고, 단 1번만 작동하고 프로그램의 실행이 멈춘다면,
로봇인 경우를 예를 들면 한발만 옮기고, 더이상 움직이지 않는 결과가 나오게 되겠지요,,, 

그밖에, 설계자의 의도에 따라, 주변의 상태를 검출하여 방향을 바꾸거나 새로운 동작을 하려면,
읽어낸 주변조건의 상태에 따라서, 별도로 실행할 몇개의 실행코드 뭉치를 준비하고,
입력포트에서 검출된 물리적인 상태를 판단하는 분기처리를 하는 몇개의 구문을 준비하면 되는 것입니다. 

여기서 물리적인 주변상태를 검출하는 일을 입력처리라고 하며, 비교 및 분기하는 일을 분기처리라고 합니다.
분기된 결과에 따라 현재상태를 표시하거나, 통신으로 메세지를 송신하거나, 동작을 하는 것을 출력처리라고 합니다. 
 
오래전에 근무하던 직장에서, 소프트웨어를 담당하는 직원에게 플로우챠트를 가져오라 하니,
A4 한장에다 사각형을 3개 만 그려놓고는  입력 ---> 분기 ---> 출력 이렇게 써서 가져 왔더군요,
기가 막혀서 말도 안 나왔었는데요, 그 당시는 정말로 황당하더군요,
아뭏튼 입력--->분기 --->출력은 소프트웨어의 ABC입니다. 너무도 잘 알려진 기본 구조입니다.
 
2개의 분기조건을 처리하는 아듀이노의 플로우차트(흐름도)의 예
원형은 시작 혹은 함수이름, 마름모는 분기, 평행사변형은 입력/출력, 사각형은 연산을 표시합니다.
(초기화는 생략할 수도 있으며, 분기 이후의 처리방법은 설계방법에 따라 틀려집니다.)  
  

------------------------------------------------------------------------------------------------------------------
● void setup()
setup()은 아듀이노 기판을 준비(초기화)합니다.
아듀이노가 리셋 (전원인가, 업로드 완료, 리셋스위치 작동) 후에 단 1번만 작동합니다. (반복구조가 아니므로)
순환구조 안에초기화를 넣어서 매번 반복해서 초기화를 하는 장치도 있습니다, (아듀이노도 가능합니다) 
 
setup()은 언제나 loop()의 위에 있어야 합니다.(기판의 초기화이으로 먼저 실행되야 합니다)
변수의 초기화, 입출력 핀의 방향 (pin Modes), 직렬포트(serial communication) 초기화,
라이브러리의 시작 , 타이머, 인터럽트 등을 설정(setup) 할 수 있습니다.

int buttonPin = 3;  // 누름 스위치의 포트를 3번으로 선언
void setup()        // 셋업의 머리 (셋업은 리셋후 단 1회만 작동함) 
{                       // 셋업의 본문 시작
  beginSerial(9600);                      // 직렬포트를 9600 bps로 설정
  pinMode(buttonPin, INPUT);       // 입출력핀의 방향을 설정 (누름스위치 포트 3번을 입력으로 설정) 
}                       // 셋업의 끝 (다음엔 본문인 loop()를 실행합니다.

------------------------------------------------------------------------------------------------------------------
● void loop()
setup()의 다음에는 loop()가 있습니다. loop()는 반복 실행입니다.
마지막 명령 줄 까지 모두 실행되고 나면 loop()의 처음부터 반복하여 실행합니다.

loop()는 전원을 끌 때까지 무한히 반복해서 코드를 실행합니다.
실행코드의 예를 들면, 입력을 읽거나 판단하여 출력을 제어(작동시킴) 합니다.
 
// 반복해서 누름 스위치의 상태를 읽는다.
// 그리고 직렬포트로 송신한다.
void loop()          // 반복하는 본문의 머리
{                        // 본문의 시작
  if (digitalRead(buttonPin) == HIGH)    // 만일 누름스위치의 값이 HIGH 이면
    serialWrite('H');                            // 직렬포트에 문자 H를 송신

  else                                              // 그렇지 않으면 (누름스위치의 값이 HIGH 가 아니면)
    serialWrite('L');                            // 직렬포트에 문자 L을 송신

  delay(1000);                                   // 1초를 대기한다 
}                        // 본문의 끝 -> 자동으로 본문의 시작위치로 돌아간다. (그래서 끝없이 반복된다)

 
------------------------------------------------------------------------------------------------------------------
참고
// 는 주석(설명)을 의미하며 // 이후의 문장은 컴파일러가 번역하지 않습니다.


void 는 loop()에서 함수를 호출할 때, 자동적으로  함수안에서 나오는 변수가 없음을 말합니다.

() 안에 변수가 없음은 들어가는 변수들이 없다는 것을 말합니다.

void 함수() 으로 선언된 함수는, 함수에서 처리할 변수는 모두 지역변수이거나,
외부로 나가거나 외부에서 들어오는 변수는 모두 광역변수(global variable)를 사용한다는 것을 의미합니다.

{  } 는 브라켓이라고 합니다, 명령구문을 확장시킵니다. 즉 브라켓이 없으면 1줄로 명령구문이 끝나는데,
{  } 안에 여러 줄의 명령구문을 하나의 함수나 분기명령후의 처리구문으로 만들어 줍니다. 

예를 들면 아래와 같이 1줄로 끝나는 명령을
if (var ==1) digitalWrite(ledPin, HIGH);
 
다음과 같이 { }을 사용하면 하나의 분기후에 처리하는 명령구문을 여러 줄로 확장해 줍니다.
if (var ==1)
{
  digitalWrite(ledPin, HIGH);
  digitalWrite(ledPin, LOW);
  digitalWrite(ledPin, HIGH);
  digitalWrite(ledPin, LOW);
}

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

예제 설명
이제 아듀이노의 구조를 배웠으므로, 가장 간단한 1개의 LED를 깜빡이는 응용소스를 만들어 보겠습니다.
아듀이노 소프트웨어는 압축만 풀면, 즉시 실행이 가능한, 포터블방식의 윈도우즈 소프트웨어입니다.
내려받기한 arduino_0011 소프트웨어가 저장된 폴더를 열고, 아듀이노 실행파일을 작동시킵니다.

File > Sketchbook > Examples > Digital > Blink 를 선택하면 응용소스가 Sketch 창에 나옵니다.
소스파일의 컴파일은 Sketch > Verify/Compile 메뉴를 눌러, 실행파일(Binary)을 생성합니다.

/* Blinking LED  */           // 이것 또한 주석문입니다.
int ledPin = 13;                 // LED를 포트 13에 연결하는 변수의 선언
 
void setup()                    // 이제야 1회만 실행하는 setup() 이 나옵니다.
{
  pinMode(ledPin, OUTPUT);   // 단 한줄 명령만 들어 있네요. 포트 13 번을 출력으로 설정합니다
}

void loop()                          // C의 void main(void) 에 해당하는 loop()는 자동으로 반복되는 주함수입니다.
{
  digitalWrite(ledPin, HIGH);   // LED를 켭니다
  delay(1000);                      // 1초를 기다린 다음에 다음 명령줄을 실행하겠지요
  digitalWrite(ledPin, LOW);   // LED를 끕니다
  delay(1000);                     // 다시 1초를 기다리네요
}                                       // 더이상의 명령줄이 없으니 loop()의 처음으로 반복실행 됩니다.

이제, 아듀이노 기판의 포트 13번과 GND에 시험용 LED를 연결소켓에 연결합니다.
PC와 아듀이노 기판을 USB 케이블로 연결하고, 기판의 리셋을 누르고, 응용코드를 업로드 합니다.

File > Upload to I/O Borad를 누르면 응용코드가 데시밀라 기판으로 업로드됩니다.
USB 케이블로 연결된 아듀이노 기판의 TX,RX LED가 깜박이며 업로드 상태를 보여줍니다.

잠시 후, 포트 13번에 연결된 LED가 깜빡이면, 응용소스를 컴파일한 다음, 업로드까지 잘 된 것입니다.
이제 부터는 만들고 싶은 응용소스를, 간단히 아듀이노 기판에 업로드하여 작동시킬 수 있습니다.

------------------------------------------------------------------------------------------------------------------
변수(variable)

다음과 같이 명령구문에서 사용할 변수를 선언합니다.
loop()와 setup()의 앞에서 선언해 주어야 합니다.
int potPin = 2;
int ledPin = 13;
int val = 0;

 
즉, loop() 나 setup() 에서 사용할 변수들의 종류와 이름 그리고 숫자를 변수에 대입합니다.
int potPin = 2; 은 이름이 potPin인 정수형(int) 변수(variable)에 2를 할당한다는 변수의 선언입니다.
이것을 포트의 번호로 사용한다면, 명령에서 potPin에서 데이터를 읽으면 2번핀의 상태를 읽어 옵니다.
즉, 숫자로 된 포트번호에 자신이 알기 쉽게 이름을 지어 주는 것입니다.

변수는 숫자나 포트번호를 기억하기 쉬운 이름으로 대신하여 프로그램 소스를 자연언어처럼 만들어 줍니다 ,   
일부 외국의 프로그래머들은 = 을  is 라고 발음 합니다. (뜻과 발음이 일치하니 말이 됩니다)
 
int val =0; 은  아마도 숫자를 기억(저장)하는 정수형(2바이트) 변수인 것 같습니다. 일단 0으로 시작하네요,
변수선언 이후의 loop() 안의 어느 명령줄에서 이 변수를 무었으로 사용할지 것인지는,
loop()안에 작성된 val 이라는 변수를 사용하는 명령을 확인해야 비로서 알수 있습니다,

현재는 0 이라는 숫자(값)가 val 이라는 이름의 변수에 대입된 상태라는 것은 확실 하지요. 
결국 변수는 그안에 무었이 들어 있는가 보다는, 변수의 내용을 무슨용도로 어떻게 사용항 것인가가 목적입니다.
  
------------------------------------------------------------------------------------------------------------------
함수(function)

loop() 안에서 즉, loop() 다음의 브라겟 { } 안에서 변수나 조건분기 혹은 등록된 명령구문이 아닌
임의의 명령구문이 나온다면, 이것은 함수를 의미합니다. ()안이 비어 있음은 void 함수이기 때문입니다.
함수의 이름은 if, for, switch, setup, loop 등 예약어로 등록되어 있는 문자열은 사용할 수 없습니다.
 
예를 들어 다음과 같이 loop()가 작성되어 있다면,
loop()
{
    readAD();               // 아날로그 포트를 읽는다.
    outPORT();            //  디지털 포트로 출력(제어)한다
}
 
loop() 의 앞이나 뒤에 readAD() 라는 함수를 만들어 주어야 합니다.
void readAD()
{
     // 여기에는 loop()에서 readAD() 함수를 부르면 실행할 명령을 작성해 둡니다.
}
 
또한 outPORT() 라는 함수도 선언 해야 합니다. (함수를 부른 만큼 함수의 작성은 당연하지요)
void outPORT()
{
     // 여기에는 loop()에서 outPORT() 함수를 부르면 실행할 명령을 작성해 둡니다.
}
 
함수 readAD()는 loop()의 브라켓 { } 안에 직접 기술해도 되는 명령줄을 단순히 아래로 분리하여 독립시키고
그것을 여러 명령줄에서 임의로 불러서 한번씩, 혹은 필요한 만큼 실행 시키는 목적을 구현합니다.   
즉 여러번 작성해야 하는 완전히 같은 구조의 명령구문을 반복해서 입력하는 수고를 덜어 줍니다. 
 
------------------------------------------------------------------------------------------------------------------
제어 구문 (control structure)

if
정해진 조건이 맞는지 확인한다. 구조는 다음과 같다.
(이 명령이 C 언어의 가장 중요한 핵심이다, if 구문만으로 모든 제어프로그램을 할 수도 있다)
if (Variable > 50) 
{
  // 여기에 실행할 명령을 넣는다. 예 LED를 켠다.
}


변수 Variable 이 50 보다 큰가를 검사한다. 만일 그렇다면, 프로그램이 실행된다.
다시 설명하면, ( )안의 조건문이 만족되면, {  }안의 명령구문(statments)을 실행한다.
아니면 { }안의 명령(code)을 실행안하고(skip) 넘어(over)간다. 
즉 조건이 아니라면, if 구문(statments) 뒤에오는 { }안의 명령구문들은 모두 무시된다
 
다음 줄이 없이 한줄에 세미코론(;)으로 정의된 조건 구문이 오면, 조건이 맞을 때 if ()뒤의 명령구문; 을 실행한다.
if (x > 120)  digitalWrite(LEDpin, HIGH);
 
줄(line)이 바뀌어도 세미코론(;)으로 정의된 조건 구문이 오면, 조건이 맞으면 세미코론이 있는 줄까지 실행한다.
즉 C는 명령구문의 줄은 실행과  전혀 관계가 없으며 , 브라켓 { } 이나 세미코론 ; 이 구문을 구분하는 기준이다.
if (x > 120)
digitalWrite(LEDpin, HIGH);

브라겟 { }를 if 구문뒤에 한줄로 이어서 넣어도 if 구문의 ()안의 조건이 만족한다면, { }안의 명령을 실행한다.
if (x > 120) {digitalWrite(LEDpin, HIGH);}   // all are correct

if 구문의 조건에는 1개 이상의 연산자(operator)를 사용할 수 있다.
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=10 과 같이 한개의 연산자 = 은 대입문이지 비교 연산자가 아니다.
한개의 = 는 대입문으로 x를 10으로 세트할 뿐이다.
2개의 등식 연산자 == 이 변수값이 숫자 10 과 같은가 아닌가를 검사하는 연산자이다.

------------------------------------------------------------------------------------------------------------------
if 와 else
기본적인 if 구문의 코드를 확장하여 여러개의 조건분기를 함께 한다. 
예를 들면, 아날로그 입력이 500보다 작은가를 시험한다면,
다른 처리는 500보다 큰것으로 된다. 코드는 다음과 같다.

if (pinFiveInput < 500)    // pinFiveInput에 들은 값이 500보다 작으면, 다음 { }안의 명령구문을 실행
{
  // if 구문의 분기조건을 만족하면 이곳을 실행한다.
}
else                            // pinFiveInput에 들은 값이 500보다 작지 않다면, 다음 { }안의 명령구문을 실행
{
  // if 구문의 분기조건을 만족하지 않으면 여곳을 실행한다.
}

------------------------------------------------------------------------------------------------------------------
if 와 else if
if 구문의 처리 이후에 단순히 else의 조건이 1개가 아닌 경우에,
추가로 조건분기를 한번 더 하려고 한다면, else if 구문을 사용한다.
즉 이 처리방법은 if 와 else 로 된 단 2개의 조건을 갖는 분기명령이라면
else if는 2개 이상의 조건으로 분기를 확장할 수 있다.
 
if (pinFiveInput < 500)    // 변수 pinFiveInput에 들은 값이 500 보다 작으면 A를 실행 
{
  // do Thing A
}
else if (pinFiveInput >= 1000)    // 변수 pinFiveInput 에 들은 값이 1000 보다 크거나 같다면 B를 실행
{
  // do Thing B
}
else                             // 변수 pinFiveInput 에 들은 값이 1000 보다 작다면 C를 실행
{
  // do Thing C
}                                 // if 에 이어서 else if 와 else를 사용하면 2개 이상의 분기가 가능하다.

------------------------------------------------------------------------------------------------------------------
for
{ }로 된 명령구문들이 들어있는 뭉치를 반복하는 구문입니다.
일반적으로 반복이 끝날 때까지 카운터를 증가 혹은 감소시키는 반복명령이며,
(이 명령은 C 언어의 2번째로 많이 쓰이는 구문이며, for 구문은 반복적인 처리를 할때 필요하다)

for 반복구문은 다음과 같이 3개의 부분으로 되어 있습니다.
// for (초기값; 반복조건; 증가값)
for (initialization; condition; increment)
{
// 반복해서 처리할 명령구문 statement(s);
}

for 구문에는 어떤 반복 명령도 사용할 수 있으며,
가끔은 어레이 명령과 데이터/포트 수집을 혼합하여 사용하는 것도 가능 합니다.
예를 들면 for의 반복조건으로 (i=0; digiatlREAD(3) ==HIGH; i++) 이라고 했다면
반복조건으로 디지털입력 포트3번을 읽어서 그값이 HIGH이면 { } 의 실행을 반복한다는 뜻이다. 
 
for 구문에서 사용되는 반복카운터의 초기값은 처음에 1번만 사용됩니다.
반복구문용 카운터는 for 구문실행시 실행 초기에 초기값으로 되고,

for를 매번 반복할 때 마다,  매번( )안의 반복조건을 점검합니다.    ←
반복조건이 맞다면, { } 안의명령구문을 실행 합니다.                      ↑
그다음은, 증가(혹은 감소)값 만큼, 카운터 값를 변경시킵니다.        →
(1회 실행된 for 구문은, for 구문의 처음으로 다시 돌아가서, for 구문의 반복조건을 점검합니다.)
 
만일 반복조건이, 조건이 아닌 상태로 변경되었다면, 여기에서 for 반복구문은 끝나게 됩니다.
반복조건은 카운터값을 사용해도 되지만, 어떤 변수라도 사용할 수 있습니다.
 
그러나 반복조건이 계속유지되는 조건을 사용하면 for 구문은 영원히 반복해서 작동합니다.
이렇게 되면 for 구문 다음의 코드가 실행되지 않는 문제점을 발생하게 됩니다.(for 실행만을 계속하게 됩니다)
만일 초기값이 반복조건과 처음부터 맞지 않으면, for 구문은 한번도 실행되지 않고 종료됩니다.
지금까지 함수 setup, loop와 if, if else, else if, for 등의 제어구문(control statments)에 대하여 설명했습니다.

------------------------------------------------------------------------------------------------------------------
이제부터 아듀이노 전용명령을 사용하는 응용소스에 대해서 설명하도록 하겠습니다.

아듀이노 전용명령에는 아날로그 입력/출력 그리고 직렬통신 입력/출력이 있습니다.
아날로그 입력/출력을 사용하면, 복잡한 아날로그 처리를 단 1줄의 명령줄 만으로 구현이 가능합니다.  

아날로그 입력은 지정된 아날로그 포트에서 아날로그 값을 읽습니다.
변수 = analogRead (포트번호); 
아날로그 입력은 A0~A7 포트를 사용해야 하며, AREF 단자에는 전원전압 5V를 공급하거나, 
혹은 1.024V, 2.048V, 4.095V 등의 기준전압을 만들어 공급해 주어야 합니다.

 
아날로그 출력은 지정된 아날로그 포트로 아날로그 값을 보냅니다.
analogWrite(포트번호, PWM출력값);
아날로그 포트를 출력할 수 있는 포트는 D3, D5, D6, D9, D10, D11 입니다. 다른포트는 PWM 출력이 안됩니다.
부득이 다른포트에 아날로그 출력을 사용하려면, 소프트웨어 PWM을 쓰면 됩니다만, 조금 복잡합니다.
 
먼저, 아날로그 출력명령을 사용하여 LED를 점점 밝게 켜는 것이 반복되는 소스를 보겟습니다.
int PWMpin = 10;   //  PWM 포트핀을 10으로 설정 (디지털 핀 10번에 LED를 연결)

void loop()
{
   for (int i=0; i <= 255; i++)          // 반복 카운터 i의 초기값은 0, 반복조건은 255 이하, i++은 카운터를 +1 

  {
      analogWrite(PWMpin, i);      // PWM 핀에 반복 카운터 변수i를 출력
      delay(10);                          // 10 ms의 시간을 대기
   }                                         // 반복조건이 끝날 때 까지 for 구문을 반복해서 실행한다
}

만일 for 구문에서 { }에서 한줄로 된 구문을 사용한다면, 다음과 같이 작성해도 됩니다.
for (int i=0; i <= 255; i++) analogWrite(PWMpin, i);
이렇게 되면 PWM을 반복하는 추가된 지연시간은 0 ms으로 되고,
아듀이노에 사용된 MPU의 최대 실행속도로 PWM을 출력하게 됩니다.

------------------------------------------------------------------------------------------------------------------
이번에는 아날로그 출력명령으로 LED의 밝기를 연속해서 밝게~어둡게 반복하는 응용소스입니다.
int value = 0;                            // LED의 밝기를 정하는 변수
int ledpin = 9;                           // LED를 포트번호 9번에 연결함
 
void setup()                             // 셋업은 아무 처리가 없음  
{
}

void loop()                               // 본문 시작 =C 구문의 while(1)과  같다.
{
  for (value = 0 ; value <= 255; value+=5) // LED 밝기를 0, 5, 10, 15, 20 ~ 255 까지 증가시킨다. 
  {                                           // LED의 밝기를 점점 밝게 켠다. 
    analogWrite(ledpin, value);     // 5씩 증가된 LED 밝기값을 매번 LED가 연결된 포트로 출력한다. 
    delay(30);                            // 30 ms을 기다린다. (출력 주파수를 결정한다) 
  }                                           // LED 값이 255가 되면 반복구문 for를 끝낸다.  


  for (value = 255; value >=0; value-=5)   // LED 밝기값을 255,250,245~0 까지 5씩 감소시킨다. 
  {                                          // LED의 밝기를 점차적으로 어둡게한다.
    analogWrite(ledpin, value);    //  5씩 감소된 LED 밝기값을 매번 LED가 연결된 포트로 출력한다.
    delay(30);                           // 30 ms을 기다린다. (출력 주파수를 결정한다)
  }                                          // LED 밝기가 0 이되면 반복구문 for를 끝낸다. 
}                                            // 본문의 끝 (본문시작으로 간다)


------------------------------------------------------------------------------------------------------------------
이번에는 스위치를 누르면 LED를 깜빡이고, 스위치를 놓으면 LED를 밝게-어둡게 변화시키는 방법입니다.
int ledPin = 9;                // LED를 포트 9번에 연결
int inputPin = 2;             // 누름 스위치를 포트 2번에 연결
int val = 0;                    // 누름 스위치 저장값을 0 으로 시작
int fadeval = 0;              // LED에 출력하는 밝기값을 0으로 시작

void setup() {              // 머릿말(header) 줄에 시작 브라켓 { 를 넣는 방법도 많이 사용합니다.
  pinMode(ledPin, OUTPUT);     // LED를 연결한 포트를 출력으로 설정
  pinMode(inputPin, INPUT);     // 누름스위치를 연결한 포트를 입력으로 설정
}

void loop(){                            // 무한반복형 본문의 시작 
  val = digitalRead(inputPin);     // 누름스위치가 연결된 포트를 읽어서 변수 val에 저장
 
  if (val == HIGH) {                   // 누름스위치에 저장된 값이 HIGH 이면 다음 { }안의 구문들을 실행
    digitalWrite(ledPin, LOW);    // 누름 스위치의 값이 1 이면 LED를 끈다.
    delay(50);                          // 50ms를 대기한다
    digitalWrite(ledPin, HIGH);   //  LED를 켠다
    delay(50);                         // 50ms를 대기한다
  }

  else {                                 // 만일 누름스위치 값이 LOW 이면 다음 { }안의 구문들을 실행
    for(fadeval = 0 ; fadeval <= 255; fadeval+=5) {    // LED 밝기값을 0~255 까지 5씩 증가 (점점 밝게) 
      analogWrite(ledPin, fadeval);                        // LED에 밝기값 0-255를 출력 
      delay(10);                        // 10ms을 기다린다   
    }                                       // 밝기값이 255 이면 for 구문의 반복을 종료한다.

    for(fadeval = 255; fadeval >=0; fadeval-=5) {      // LED의 밝기값을 255에서 0까지 5씩 감소시킨다.
      analogWrite(ledPin, fadeval);                         // LED에 밝기값 255 ~ 0을  출력 
      delay(10);                        // 10ms을 기다린다    
    }                                       // for의 끝 (LED 밝기값이 0 이면 for 구문의 반복을 종료한다.)
  }                                         // else의 끝  
}                                           // loop의 끝
 
------------------------------------------------------------------------------------------------------------------
이번에는 아듀이노 기판의 아날로그 입력에 가변저항을 연결하여 시험하는 응용소스입니다.

왼쪽은 아듀이노 기판이며, 오른쪽은 가변저항과 LED를 연결한 시험용 빵판(bread board)입니다. 
전자회로 시험용 빵판이 있으면, 만능기판에 납땜인두로 납땜을 하지 않고 전자부품의 연결이 됩니다.
또한 빵판에 사용했던 전자부품은 거의 손상되지 않으므로, 다음번에 그대로 사용할 수 있습니다. 

 
 
참조 사이트 : http://itp.nyu.edu/~mjc497/weblog/2006/09/
제목 : Analog Inputs (part 1)
설명 : LED의 밝기를 조절한다.
         가변저항의 값을 읽어서 LED의 밝기를 조절한다.
저자 : Michael Chladil
소스 설명 : 다음은 아듀이노의 아날로그 입력을 시험하는 응용소스입니다.

#define ANALOG_INPUT  0  // 다음 3줄은 포트번호를 정의하는 선언문입니다. 
#define PWM_OUTPUT    9
#define DELAY_TIME    10


int  potValue        = 0; //다음 3줄은 본문에서 사용할 변수의 초기값을 설정합니다.
long lastMillis      = 0;
int  currentLEDLevel = 0;


void setup() // 다음 4줄은 리셋후 1번만 실행되는 작동준비용 초기화(setup)입니다. 
{
  Serial.begin(9600);  // 직렬포트의 통신속도를 9600 bps로 설정합니다.
}


void loop()  // 이제부터 본문입니다. 아듀이노의 loop()는 자동반복형 main()함수 입니다. 
{
  potValue = analogRead (ANALOG_INPUT);  // 아날로그 포트를 읽어서 pot값에 저장합니다.
 
  Serial.println (potValue);   // 아날로그 포트에서 읽은 가변저항 값을 직렬포트로 전송합니다.
  

  // 반복구문 for가 나왔습니다, for 구문은 (초기값; 반복조건; 증가값)으로 설정합니다.
  for (currentLEDLevel = potValue; currentLEDLevel >= 0; currentLEDLevel--)
  {
    analogWrite(PWM_OUTPUT, currentLEDLevel);  // 가변저항 값을 그대로 LED로 출력합니다.
    delay (DELAY_TIME);                                     // 지연시간 만큼 기다립니다.
  }                                                                     // for 구문의 끝 (for 조건이 되면 반복해서 작동된다)


  delay (DELAY_TIME);       // 마지막 지연시간을 추가로 줍니다. (제가 보기엔 이것은 없어도 됩니다)
}                                       // loop() 함수의 끝


------------------------------------------------------------------------------------------------------------------
참조 사이트 (아듀이노 응용소스) : http://www.arduino.cc/en/Tutorial/HomePage
동영상 자료 : youtube를 링크하려 했으나, 게시판이 avi, swf 만 가능하고 flv는 링크를 거부하네요,
결국 동영상을 avi 로 변환하여 직접 올렸습니다, 라이센스에 문제로 삭제할지도 모릅니다.

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA

 AVRTOOLS™
   
윗글 아듀이노 온도센서, XBee 송수신
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 1071 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 18174 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 3057 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 3207 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 6495 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 5274 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3799 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 3324 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3703 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 3342 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3622 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 8291 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4366 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3774 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5714 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4440 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3952 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3651 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6984 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 4144 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5833 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7481 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8632 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4683 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 5177 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5831 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 10055 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 17985 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 7029 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5745 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 5116 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4320 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 6310 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4880 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4816 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 5142 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5687 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4265 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13892 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9847 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 6145 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 7095 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4344 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3636 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3406 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5488 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 5329 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5989 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4396 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3658 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4989 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9967 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3840 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 5256 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6821 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 5134 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 5171 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5465 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 5035 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7919 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 7057 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0