루덴스코드 Blog

[CEA-009~13] LED 3개를 스위치로 점멸시키기











지난 시간에 이어 3개의 LED 를 점멸시켜보겠습니다. 아두이노 우노에는 0 번에서 13번까지 총 13개의 디지털 입출력이 가능한 핀이 있습니다. 여기에 A0 에서 A5 까지 6개의 아날로그 입력 핀이 있습니다. 합치면 19개의 핀이 있고 모두 디지털입출력이 가능합니다.



3개의 LED 를 2, 3, 4번에 연결하고, 스위치는 9번에 연결합니다. 스위치를 연결할 때 주의항 내용이 있습니다. 플로팅(Floating) 상태에 두지 않기 위해서 풀업 또는 풀다운 상태를 만들어주어야 합니다.



하드웨어 연결이 끝났으면 소프트웨어를 만들어봅시다. 코딩의 시작입니다.



LED 는 초기에 켜져있다가 스위치를 누르면 LED 가 꺼지게 만들어봅시다. 



앞에서 만들어 본 코드를 조금씩 고쳐서 원하는 대로 LED 불빛이 바뀌게 해봅시다.



스위치가 눌려있는 동안 2, 3, 4 번에 연결된 LED 는 순서대로 켜지고 꺼지게 됩니다. 간단한 조건인 if 문을 사용할 수 있으면 됩니다. 변수를 하나 만들어 두고 반복할 때마다 1씩 증가하게 합니다. 1일대는 첫번째 LED를, 2일때는 두번째 LED를, 3일때는 세번째 LED를 켜고, 그 외의 다른 수(4)일때는 0이 되게 합니다.



위에서 만들었던 코드를 수정해봅시다.



% 연산은 나누고 남은 수, 나머지를 반환합니다. 그래서 i 를 계속 증가시킬때 i%3 은 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, ... 이렇게 세개 숫자를 반복해서 보내줍니다. 

여기에 버튼을 누를 때마다 LED의 빛을 하나씩 옆으로 이동하게 해봅시다. 위 소스를 실행시키면 약간 이상합니다. 그 부분을 찾아보세요.



앞에서 내준 숙제의 답입니다. 미리 보지 마시고 꼭 세번째 동영상을 보고 프로그램을 고쳐본 다음에 보세요.



답은 동영상을 확인하세요. 잘 보면 보입니다.

Comment +0

CEA-008 LED 1개 점멸하기 (하드웨어해석)


LED 를 1개 점멸시키는 회로를 구성하고 아두이노로 프로그램을 직접 짜 보았습니다. 이제 지난시간에 만들었던 회로에 대해서 조금 더 깊이있게 살펴보겠습니다. 초등학생이라면 이 부분은 건너뛰어도 됩니다. 시간은 오래 걸리지 않으니까 한번 보기는 하시구요, 잘 이해가 안되면 억지로 이해하려고 하지 마세요. LED 에 맞는 저항값을 어떻게 구하는지를 선생님께 물어보시면 선생님이 그 값을 계산해서 주실겁니다. 



영상에 나오는 사진을 몇장 첨부합니다.



LED 에 불을 켜는 프로그램과 회로를 구성했습니다. 구성한 회로가 어떤 것인지를 한번 살펴보겠습니다.



전기의 속도는 30만km/s 입니다. 1 초에 30만 km 를 간다는 뜻입니다. 빛과 속도가 같습니다. 하지만 전자의 이동 속도는 도체의 종류, 전압, 기타 환경에 따라서 많이 달라지는데 일반적으로 가정에서 사용하는 전선을 쓴다고 가정했을때 전자의 속도는 7~8mm/s 정도가 됩니다. 1 초에 7~8mm 밖에 움직이지 못합니다.  



전기가 흐를때 LED 를 통과하면서 전기에너지는 빛에너지로 바뀝니다. LED 는 전기에너지를 열에너지로 허비하는 것이 거의 없습니다. 백열등이나 형광등에서 LED 등으로 바뀌는 가장 큰 이유가 바로 효율때문입니다.



LED 는 2V 정도의 전압강하가 있습니다. 그리고 20mA 정도의 전류가 흐를때 최적의 빛을 냅니다. 물론 이 수치는 LED 마다 다릅니다. 일반적으로 20mA 는 LED 에게는 안전한 전류입니다. 이정도의 전류를 만들기 위해서 필요한 저항을 구하는 방법입니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN, 전압강하

Comment +0

CEA-007 LED 1개 점멸하기 (소프트웨어)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 지난 시간에 하드웨어 구성을 마쳤습니다. 아두이노는 하드웨어와 소프트웨어를 동시에 다룰 수 있어야 합니다. 하드웨어가 어떻게 구성되었는지 모른다면 소프트웨어를 만들 수 없습니다.



영상에 나오는 사진을 몇장 첨부합니다.



LED 점멸하는 소프트웨어입니다. 기본 소스는 다음과 같습니다. 


void setup() {

  pinMode(12, OUTPUT);

}


void loop() {

  digitalWrite(12,0);

  delay(100);

  digitalWrite(12,1);

  delay(100);

}


12는 LED 가 연결된 아두이노의 핀번호 이고, 1 은 그 핀으로 전기가 흐른다(5V 출력)는 것, 0 은 그 핀으로 전기가 흐르지 않는다(0V 출력)는 것을 의미합니다.



예제에 나오는 LED_BUILTIN 은 13을 의미합니다. LED_BUILTIN 이 사용된 장소를 위 그림에 담았습니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN

Comment +0

CEA-006 LED 1개 점멸하기 (하드웨어 구성)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 아직 정식으로 C 언어를 공부한 것이 아니라서 많은 부분을 설명하지는 못합니다. 하지만 우선은 그냥 따라서 해보는 것이 중요합니다.




해보면 생각보다 그렇게 어렵지도 복잡하지도 않습니다. 단지 아직 모를뿐이지요.


제대로 프로그래밍 언어를 공부하려면 시간도 걸리고 어려움이 있겠지만 아두이노를 가지고 사용하기 위해 프로그램을 익한다면 시간도 그렇고 오래걸리지는 않습니다. 당신이 조금만 똑똑하면 한주일이면 가능하고, 조금 명석한 편이 아니라면 3주일이면 됩니다. 


영상에 나오는 사진을 몇장 첨부합니다.



기본 예제에 나오는 LED Blink 프로그램을 살펴봅시다.



LED 를 사용할 때 극성에 주의하셔야 합니다. 내부를 잘 보면 굵은 쪽이 있습니다. 그 쪽에 - 또는 GND 쪽을 연결합니다.



실제 회로를 기호로 그린 그림입니다. LED 와 저항 330 또는 220 옴을 연결해주면 됩니다.



아두이노에서 LED 에 불을 켜 봅시다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CH.03.아두이노 LED 깜박이기

이제 아두이노 IDE 설치까지 마쳤을테니 LED 를 깜박거려보겠습니다.

PC용 프로그램에서 가장 먼저하는 것이 Hello World 를 출력하는 것이라면 MCU(Micro Controller Unit) 프로그램에서 가장 먼저하는 것은 LED 를 켜고 끄는 것입니다. 이걸 할 수 있으면 절반은 한 것입니다.

즉, 컴파일러(크로스컴파일러)를 설치하고, 그것으로 프로그램을 짜서 실행코드를 만들고 만들어진 실행코드를 원하는 정해진 타켓(여기서는 아두이노)에 넣어서 정상적으로 작동(LED가 켜지고 꺼지게 하는 일)하게 하는 것까지 할 수 있으면 그 다음부터는 혼자서 천천히 하면 다 됩니다.

그러면 위의 한 문단에 적힌 말을 차분히 되새김질해 보겠습니다.

우리는 아두이노 IDE 를 가지고 아두이노에 사용될 수 있는 프로그램을 짭니다. 다시말해서 우리가 아두이노 IDE 를 가지고 짜는 프로그램은 PC 에서는 전혀 사용할 수 없는 프로그램이라는 뜻입니다. 그래서 아두이노와 같이 PC 가 아닌 것들을 있고, 그것들 안에 PC를 사용해서 실행시키고자 하는 명령코드를 넣을때 우리는 크로스컴파일한다고 말합니다. 아두이노 우노 보드에 붙어있는 MCU 는 ATMEGA328P 라는 칩입니다. 이 칩은 PC에 들어있는 인텔칩과는 전혀 다른 칩입니다. 그래서 PC 에 명령을 주듯이 명령을 주면 알아듣지 못합니다. 

이를테면 한국에서는 나이 어린 아이의 머리에 손을 올리는 것은 아이를 귀엽게 보고 있다는 뜻입니다. 하지만 상당수의 다른 나라에서는 얼굴이나 머리에 손을 대는 것을 극도로 싫어합니다. 어떤 문화권에서 엄지 손가락을 올리는 것은 최고라는 뜻을 나타내지만 호주 같은 곳에서는 욕이 됩니다. 미국에 가서 발표를 하려면 당연히 영어로 원고를 써야하겠지요. 아두이노에 명령을 주려면 아두이노가 알아들을 수 있는 명령어로 된 지시를 내려야 합니다. 그런데 그 지시문을 만들때 한국에서 만든 노트에, 한국에서 만든 펜을 사용한다고 이해하시면 좋을듯 합니다.

즉, PC 에 있는 문서편집기를 사용해서 아두이노에 줄 명령을 씁니다. 우선은 C 는 C++ 을 이용해서 명령을 기록합니다. 그리고 그것을 번역합니다. 보통 PC 프로그램에서 많이 했던 것처럼 PC가 알아듣는 말로 번역하는 대신 아두이노에 있는 ATMEGA328P 라는 칩이 알아들을 수 있는 말로 번역합니다. 그 번역기가 바로 AVR-GCC 가 됩니다. AVR-GCC 를 통해 나온 번역된 명령문은 bin 파일 또는 hex 파일로 저장이 됩니다. 단, 아두이노를 사용한다면 이 부분은 신경쓸 필요가 없습니다. 아두이노를 사용하기 전, 보통 bin 파일이나 hex 파일을 별도의 장치를 통해 MCU 안으로 강제로 밀어넣었습니다. 아주 오래전에는 롬라이터라는 기계를 써서 롬에 프로그램을 넣고 그 롬을 보드에 장착시켰습니다. 조금 시간이 지나면서 플래시메모리가 나왔습니다. 롬은 단 한번만 쓰고 다시는 지우거나 수정이 불가능했습니다. 그런데 플래시메모리는 약간의 제한은 있지만 쓰고 지우는 것이 가능했습니다. 현재 사용되는 대부분의 MCU 는 내부에 플래시메모리와 SRAM 을 가지고 있습니다. 보통 PC 에서 부르는 램은 SRAM 과 동일합니다. 그리고 PC 의 HDD 대신 MCU 는 플래시메모리를 가지고 있다고 보시면 됩니다. PC 는 내부에 CPU, HDD, RAM 을 가지고 있습니다. 반면 MCU 는 하나의 칩 안에 CPU, HDD, RAM 이 다 들어있습니다. 그래서 MCU 라고 부릅니다. MCU 안에 있는 플래시메모리에 어떤 명령문을 기록하기 위해 MCU 마다 특별한 방법을 제시합니다. 그런데 아두이노를 쓸때는 우리는 그것을 신경쓰지 않아도 됩니다. 아두이노안에 있는 하드웨어와 기본펌웨어에서 그것을 처리해줍니다. 대신 우리는 USB 선을 통해서 아두이노로 명령문을 보내주기만 하면 됩니다. 그러면 아두이노는 알아서 그 명령문을 받아서 내부에 있는 플래시메모리에 저장해둡니다.

이 내용은 추후 필요하다면 보충해보도록 하겠습니다. 그러면 이제 LED 를 켜고 끄는 프로그램을 작동시켜 보겠습니다.

아두이노 IDE 를 엽니다.


'파일' - '예제' - '01.Basic' - 'Blink' 를 선택합니다.


주석처리된 부분을 삭제하면 다음과 같습니다.

void setup() {
     pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(13, HIGH); 
    delay(1000); 
    digitalWrite(13, LOW); 
    delay(1000); 
}


이 프로그램 코드를 보면 C 나 C++ 을 사용하셨던 분들은 처음에 많이 이상했을겁니다. 일반적으로 C , C++ 에서는 main() 이라는 함수가 처음에 나와야 하는데 아두이노엔 main() 이 없습니다. 

아두이노는 main() 을 없애고 대신 setup() 과 loop() 를 둡니다. setup() 은 처음 한번만 실행되는 함수입니다. 여기엔 처음 한번만 실행되면 충분한 설정값을 넣게 됩니다. loop() 는 전기가 흐르는 한 계속해서 해야 할 일을 넣게 됩니다. 위에서는 핀 13 번을 LED 를 켜고 끌수 있도록 출력으로 설정했습니다. 설정은 한번만 하면 되니까 setup() 함수 안에 넣었습니다.

void setup() {
     pinMode(13, OUTPUT);
}

그 다음 1초 간격으로 LED 를 켜고 끄는 작업을 무한 반복 합니다. 전기가 흐르는 한 이 일은 계속됩니다. 

a. 13번 핀에 +5V 를 흐르게 합니다.
b. 그 다음 1초동안 그 상태 그대로 있게 합니다.
c. 그리고 난 다음 13번 핀을 0V 가 되게 합니다.
d. 다시 1초동안 현재 상태를 유지하게 합니다. 그리고 다시 처음, a 로 갑니다.

    digitalWrite(13, HIGH); 

13번 핀을 현재 아두이노에 들어온 가장 높은 전압에 연결하라는 명령입니다. 아두이노에 들어온 전압이 5V 라면 핀에서 나오는 전압은 5V 가 될 것이고, 만약 3.3V 라면 핀이서 나오는 전압은 3.3V가 될 것입니다. 아두이노 우노는 5V 이므로 13번 핀은 5V 가 걸려있게 됩니다. 마찬가지로 가장 낮은 전압에 연결할 때는 digitalWrite(13, LOW) 를 사용합니다.

    delay(1000); 

이 내용은 delay() 함수를 이해해야 합니다. 일반적으로 PC 에서 프로그램을 한다면 이런 식으로 일부러 시스템의 자원을 낭비하는 일을 하지 않습니다. 하지만 때론 MCU 에서는 몇가지 이유로 이렇게 의도적으로 시간을 버리는(?) 코드를 쓰곤 합니다. 우선은 위의 경우 처럼 1초 동안 아무것도 하지 않아야 할 때 사용합니다. 또 다른 경우는 하드웨어적으로 하나의 신호가 들어간 후 일정시간이 지나야만 그 신호가 적용될 때 의도적인 delay() 를 사용하게 됩니다. 이 부분은 다음에 별도로 다루도록 하겠습니다.

setup() 는 단 1회만 실행되지만 loop() 는 무한반복됩니다. 우선 아두이노 프로그램을 처음하시는 분은 이걸 그냥 기억해두시면 좋겠습니다. 그리고 조금 더 깊이 main() 이 어디 갔는지 궁금하시 분들을 위해 사라진 main() 의 위치를 여기 적어두겠습니다.

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

제 PC 의 경우 64비트 윈도우10 운영체제를 사용합니다. 아두이노는 위와 같은 경로에 설치되어 있고, 그 경로를 따라 들어가면 

\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

가 있습니다. 주석과 일부를 제거하고 setup(), loop()와 관련된 부분을 보면,

#include <Arduino.h>

int main(void)
{
    init();
    initVariant();
    setup();


    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }


    return 0;
}

위와 같습니다. 결국 보이지는 않았지만 main() 안에 setup() 은 1회 실행으로, loop() 은 무한반복으로 운명지워져 있었던 것입니다.


이제 프로그램이 제대로 작동하는지 살펴보겠습니다.

우선 아래 그림처럼 아두이노우노를 선택하십시오.


그 다음 포트를 선택합니다. USB 케이블로 아두이노와 PC 가 연결되어 있다면 COM 포트가 하나 만들어졌을 것입니다.
 

아두이노 보드 설정이 바르게 되었고, 포트까지 바르게 연결되었다면 이제 프로그램을 컴파일해서 아두이노로 보내면 됩니다. 이 과정은 아래 사진에 있는 화살표를 클릭하면 됩니다. IDE 에서 컴파일을 하고 실행파일을 만든 다음 그것을 바로 USB 케이블 통해 시리얼통신으로 보냅니다. 아두이노 보드에서는 전송되어 온 값을 받아서 플래시메모리에 기록하게 됩니다.


아래 사진은 컴파일이 정상으로 되었고, 전송까지 잘 완료되었음을 보여줍니다.
 


이제 보드를 잘 보면 보드에 붙어있는 LED 하나가 1초 간격으로 깜박이고 있을 겁니다. 여기까지 하셨으면 아두이노 절반은 하신 겁니다. 축하합니다.


Comment +0

유투브에서 재미있는 영상을 발견했다.
앞으로 유투브의 영상을 종종 소개하면서 그 내용과 제작 방법까지도 한번 다뤄보면 어떨까 싶다.


 
LED Cube Live Winamp Visualization


LED 로 전광판을 만드는 것은 이제는 식상한 공작이 되어가고 있다. 16*16 짜리 LED 를 구하기도 어렵지 않고 프로그램도 왠만하면 다 공개되어 있어서 그냥 쓰면 될 정도다.
물론 여기 동영상으로 제공되는 큐빅은 아이디어가 좋은 것이지 기술적으로 어려운 것은 아니다. 다만 번뜩이는 아이디어로 입체화된 LED Equailzer 를 보게 된다.

언제 한번 만들어봤으면 하는 마음이 든다. TY52 를 사용해서 6*6*6, 즉 216개의 LED (각 6개씩만 넣어도 이렇게 많다니...) 로 큐빅을 만들고 제어를 위해서 6*3, 즉 18개의 포트를 사용하면 된다. 그러면 TY52에 약간의 OP-Amp 만 추가하면 이걸 충분히 만들수 있겠다. 그리고 음성신호를 입력받아야 하나 AD컨버터가 하나 있어야 하겠다. 동영상은 4*4*4, 64개의 LED를 사용했다. 이 정도로도 충분히 복잡하고 또 쓸만해 보인다.

문제는 216개의 LED 를 공간상에 제대로 배치를 해야 한다는 것인데, 이 부분은 거의 노가다 수준이 될 듯 하다. ... 이쯤되니 또 귀찮아서 못만들겠다는 생각이 든다...



Comment +0