루덴스코드 Blog

CEA-014 아두이노 2개로 신호등 2개 연결하기

인터넷에서 "아두이노 신호등" 으로 검색해 보면 상당한 많은 자료들을 얻을 수 있습니다. 대부분 아두이노 우노에 LED 3개를 연결해서 신호등 하나를 만드는 내용입니다. 혹은 5개를 연결해서 차량용 신호등 하나와 보행자용 신호등하나를 만드는 것도 있습니다.

이 정도의 신호등은 지난시간까지 공부한 내용으로 여러분이 혼자서도 충분히 만들수 있습니다.

오늘 여러분에게 소개할 신호등은 아두이노 우노 2개를 사용해서 만들게 됩니다. 하나의 아두이노에서 LED 3개를 순차적으로 점멸시키는 것은 대부분의 신호등 프로그램과 비슷합니다. 그런데 거기에 두가지를 추가했습니다.




1. 시작시간을 초기화 하는 신호등 리셋 스위치

이 리셋스위치를 누르면 신호등의 신호는 처음으로 초기화됩니다. 초기화되서 맨 처음부터 정해진 순서대로 다시 순서대로 불이 들어옵니다.

2. 설정된 시간이 되면 작동하는 타이머

가변저항, 포텐셔미터의 값을 읽어서 1 에서 100 사이의 값으로 만듭니다. 그 값을 시간으로 계산합니다. 리셋스위치를 누른 후 정해진 시간이 지나면 다른 아두이노의 리셋스위치를 작동시킵니다.




신호등 1개는 너무 쉬워서 2개를 만들어서 연결해 보겠습니다.



그냥 막 연결하지 말고, "제대로" 연결해 봅시다. 보행자도 차를 탄 사람도 불편하지 않게 신호등 체계를 만들어 봅시다.



신호등간 신호를 주는 방식을 간단하게 고안해봤습니다. 하나의 신호등을 초기화하면 옆에 붙은 신호등이 일정한 시간간격을 두고 같이 초기화됩니다. 이 시간간격을 차량이동 예상 시간으로 만들어두면 됩니다.



3개의 아두이노를 꾸며봤습니다. 저항을 잘 보면 색띠가 있습니다. 색띠를 읽으면 저항값을 알 수 있습니다. 참고로 위에서부터 330, 330, 330, 10k, 1k 값을 가집니다. 맨 마지막 저항은 왜 들어갔을까요? 영상에서는 설명해주지 않습니다만 들어가지 않으면 안되는 저항입니다. 나중에 조금 더 아두이노를 공부한 다음에 이 저항에 대해서 설명할 기회가 되면 그때 설명하겠습니다.



Notepad++ 를 사용해서 편집합니다. 제가 주로 사용하는 텍스트에디터는 노트패드++ 입니다. 무료라서 쓰고 있지만 성능도 결코 왠만한 다른 에디터에 떨어지지 않습니다. 플러그인이 많고 다양해서 만족하면서 쓰고 있습니다. 



맨 위의 영상을 꼭 확인해보세요. 여기 전체 소스코드를 올립니다.



#define SIGNAL_RED  5

#define SIGNAL_YELLOW  6

#define SIGNAL_GREEN  7

#define TIMEPIN   A0

#define STARTSWITCH  10 // 스위치 입력

#define NEXTSIGNAL  11 // 다음 신호등 스위치 출력

#define BUTTON_ON   0

#define BUTTON_OFF  1


#define LED_RED_TIME  3000

#define LED_YELLOW_TIME  2000

#define LED_GREEN_TIME  3000



bool buttonState = 1;

bool lastButtonState = 1;

bool resetFlag = 0;

unsigned long timeValue = 0;

byte i=0;

unsigned long nowTime, oldTime;

  

void setup(){

  Serial.begin(9600);

  pinMode(SIGNAL_RED, OUTPUT);

  pinMode(SIGNAL_YELLOW, OUTPUT);

  pinMode(SIGNAL_GREEN, OUTPUT);

  pinMode(STARTSWITCH, INPUT);

  pinMode(NEXTSIGNAL, OUTPUT);

}


void loop(){

  buttonState = digitalRead(STARTSWITCH);


  if(buttonState != lastButtonState ) {

    lastButtonState = buttonState;

    delay(100);

i++;

if(i%2==1) {

signalTowerReset();

Serial.print("timeValue = ");

Serial.println(timeValue);

}

  }

  if(resetFlag) sendTimeSignal();

  ledSignalTower();

}




void signalTowerReset()

{

ledBlink3(); // 전체 신호등이 3번 깜박


resetFlag = 1;

    timeValue = map(analogRead(TIMEPIN), 0, 1023, 1, 100); // 신호등간 시간간격 [0~1023] => [0~99]

nowTime = millis();

oldTime = nowTime;

}



void sendTimeSignal(){

if((nowTime-oldTime)<timeValue*1000){

digitalWrite(NEXTSIGNAL, HIGH);

}

if(((nowTime-oldTime)>=timeValue*1000) && ((nowTime-oldTime)<(timeValue+1)*1000)) {

digitalWrite(NEXTSIGNAL, LOW);

}

if((nowTime-oldTime)>=(timeValue+1)*1000) {

digitalWrite(NEXTSIGNAL, HIGH);

resetFlag = 0;

}

}


void ledSignalTower(){

  nowTime = millis();

  if((nowTime-oldTime>=0)&&(nowTime-oldTime<LED_RED_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, LOW);

 }


  if((nowTime-oldTime>=LED_RED_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);

 for(byte i=0;i<6;i++ ){

   if((nowTime-oldTime>=LED_RED_TIME+LED_YELLOW_TIME*i/6)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME*(i+1)/6))

 {  digitalWrite(SIGNAL_YELLOW, i%2); }  

 }

  }  

 

 

  if((nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, LOW);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);  

 }

  if(nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME) oldTime = nowTime;

}


 

void ledBlink3(){

  for(int tempi=0;tempi<3;tempi++){

digitalWrite(SIGNAL_RED, 1);

digitalWrite(SIGNAL_YELLOW, 1);

digitalWrite(SIGNAL_GREEN, 1);

delay(200);

digitalWrite(SIGNAL_RED, 0);

digitalWrite(SIGNAL_YELLOW, 0);

digitalWrite(SIGNAL_GREEN, 0);

delay(200);

  }

}


Comment +0

[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

CEA-005 아두이노 IDE 보드 업데이트, 라이브러리 설치와 업데이트 



지난 시간에 아두이노 IDE 를 설치했습니다. 그리고 BLINK 라는 첫번째 예제 프로그램을 실행해 봤습니다. 이제 본격적으로 아두이노를 사용해서 프로그램을 해보는 시간이 되었습니다.


그런데 혹시나 예전에 아두이노 IDE 를 설치하셨던 분이 계시면 최신버젼으로 업데이트를 해주는 것이 필요합니다. 보드가 변경되거나 혹은 보드에 더 잘 맞는 펌웨어가 나오거나 할때마다 개개인이 알아서 이 부분을 고쳐주는 것은 쉽지 않습니다. 사실 아두이노 이전에는 그렇게 했습니다. 무엇인가 변경이 되면 플로피디스크나 CD 를 넣고, 펌웨어 업데이트를 했습니다. 하는 방법도 쉽지 않았습니다. 하다가 잘못되면 하드웨어가 망가지기도 했습니다.


아두이노는 전문가들을 위해서 세부적으로 조작 가능한 개발환경을 제공하는 대신에 일반인들을 대상으로 쉽고 편하게 개발할 수 있도록 한다는 철학이 있습니다. 그래서 아두이노 IDE 프로그램을 관리하는 곳에서 일괄적으로 클릭 한두번으로 보드 업데이트, 라이브러리 설치, 라이브러리 업데이트가 가능하게 해두었습니다.




본격적으로 프로그램에 들어가기 전에 라이브러리 설치와 업데이트, 보드 업데이트 방법을 익혀보겠습니다.



태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, 업데이트, 라이브러리, 보드

Comment +0

CEA-004 아두이노 IDE 설치와 첫 프로그램 


아두이노 IDE 를 설치해 봅시다. 그리고 첫번째 프로그램을 실행해보겠습니다.



STEP 1. 아두이노 홈페이지에 방문해서 아두이노 프로그램(IDE)을 다운받습니다.


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

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



저 주소로 접속하면 다운받을 프로그램의 링크가 다시 나옵니다. 영어를 읽을 수 있으면 읽어서 그대로 따라하시면 됩니다. 아니면 아래에 있는 링크를 따라갑시다


STEP 2. 다운받은 프로그램을 PC 에 설치합니다.


STEP 3. 아두이노와 PCUSB 케이블로 연결합니다.


STEP 4. 설치된 아이콘을 더블클릭하면 IDE 가 실행됩니다.


STEP 5. IDE 내부에서 보드와 포트를 설정합니다.


아두이노 IDE 를 실행시킨 상태에서 [파일]-[예제]-[01.Basics]-[Blink] 를 선택해서 클릭합니다. 


제 아두이노 우노보드를 잘 보면 1초 간격으로 LED 가 깜박이는 것을 볼 수 있습니다.

 

 

 



 




태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, blink

Comment +0

CEA-003 아두이노 기본프로그램과 실습 준비물



아두이노 공부를 위해 필요한 기본 준비물들을 소개합니다.


지난 시간에 만들었던 아두이노 우노와 소형브레드보드를 올린 상자를 사용하겠습니다. 상자안에는 필요한 부품들을 보관할 수 있습니다. 상자만드는 법은 이전 동영상을 보시고 따라하시면 됩니다.


아두이노 우노, 브레드 보드와 함께 다음의 부품들을 준비하셔서 간단한 실습을 진행하면서 아두이노를 학습할 수 있습니다. 물론 아두이노를 공부하는 것은 단지 공부를 위한 것이 아니라 해결하기 원하는 문제를 해결할 수 있는 수단을 갖는 것입니다. .


다음 준비물을 준비합시다.



1. 아두이노 우노 + USB  케이블

2. 브레드보드


3. 저항 220, 330, 1k, 2k, 10k 각 20개씩

4. LED 10개

5. 택트스위치 4개

6. 점퍼와이어 혹은 듀폰케이블 1 set

7. 가변저항 혹은 포텐셔미터 1개

8. CDS 센서

9. 초음파센서


10. 이더넷실드 (+ LAN 케이블)

11. 9-12V 어댑터

12. 인터넷 공유기 (가정에서 사용하고 있는 것)



이 외에도 여러가지 센서들과 액츄에이터가 있습니다. 그 부분은 기초과정을 마치고 난 다음에 기회를 보아서 설명하도록 하겠습니다.



아두이노 우노와 브레드보드입니다. 빈 상자에 붙여두었습니다. 작고 휴대가 간편하게 구축한 개발환경입니다. 



필요한 부품들 중 저항의 모습입니다. 220, 330, 1k, 2k, 10k 저항을 준비하시면 실습뿐만 아니라 앞으로 사용하는데 큰 지장이 없습니다. 



중앙 아래에 있는 CDS 센서는 빛의 밝기를 감지하는 센서입니다. 오른쪽에 있는 가변저항은 포텐셔미터로 불립니다. 생긴 모양은 다양하게 있습니다. 브레드보드에 꼽아서 사용하기 편한 타입으로 저렴한 것을 구하시면 됩니다. 가변저항은 10k오옴까지 변할 수 있을 것을 구합니다. 위에 있는 것은 초음파센서입니다. 왼쪽에 있는 스위치는 택트스위치입니다.



LED 의 종류는 다양합니다. 용도에 따라 맞는 것을 사용하면 됩니다. 왼쪽 빨간색 LED 를 보시면 원통형으로 지름 3mm 짜리가 있고 그 옆에 원통형 5mm 와 2x5mm 짜리 사각 LED 가 있습니다. 저렴하면서 신호확인용으로 가장 많이 사용되는 종류입니다. 밝은 빛을 필요로 하는 플래시를 만드는 것이 아니라면 이 세 종류 중 하나를 사용하면 됩니다. 개인적으로 2x5mm 짜리 사각 LED 를 좋아합니다. 2mm 짜리라서 여러개를 일렬로 늘어놓기 좋습니다. 만능기판이나 브레드보드에 사용하기도 좋습니다.



점퍼선 혹은 듀폰케이블이라고 불리는 케이블입니다. 3가지 종류가 있습니다. 일반적으로 가장 많이 쓰이는 것이 가장 오른쪽에 있는 양쪽이 M-M 타입인 케이블입니다. 하지만 센서를 사용할 때 M-F 타입이나 F-F 타입도 있으면 유용하게 사용됩니다. 이 세 종류를 꼭 구입하시기 바랍니다.



이더넷실드입니다. 아두이노 우노의 통신용 모듈이나 실드가 여러개 있습니다. 그 중 블루투스와 이더넷실드를 가장 많이 사용합니다. 블루투스는 스마트폰이나 다른 기기가 있어야 합니다. 하지만 이더넷실드는 그 자체로 인터넷에 바로 연결이 됩니다. IOT 를 위한 기본 통신 모듈로 이더넷실드를 사용합니다. 블루투스는 다음번에 스마트폰용 앱을 제작하면서 그때 아두이노와 블루투스로 통신하는 것을 해보겠습니다. 아두이노 프로그램을 할 수 있고, 이더넷실드까지 사용할 수있다면 블루투스 통신은 30분이면 충분히 이해할 수 있습니다. 더 필요한 것은 앱(App)개발이지요.



제가 가지고 있는 것 중에 아두이노 우노와 브레드보드를 올린 상자 두개를 사진으로 올립니다. 왼쪽처럼 조금 큰 상자를 사용하면 안에 들어갈 수 있는 것들이 많습니다. 오른쪽처럼 작은 상자를 만들면 가지고 다니기 편합니다.



모두 수납한 사진입니다.


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

Comment +0

CEA-002 arduino Paper Box


아두이노 작업환경을 만드는 동영상입니다.






준비물은 적당한 크기의 택배상자와 M2.5 볼트, 너트, 와셔입니다. 와셔는 M2.5 의 것을 써도 괜찮고 아니면 M3 의 와셔를 써도 좋습니다.










동영상을 보시면 쉽게 따라하실 수 있을겁니다. 저렴한 종이 상자로 개발환경과 부품수납공간을 만들어보세요. 



태그 : CEA, 코딩교육, 아두이노, arduino, 개발환경, 수납공간, 종이상자

Comment +1

  • 박진만 2017.10.08 22:45 신고

    멋지네요.
    저도 만들어서 공부할 때,
    수업할 때 사용해야겠네요.
    좋은 동영상 고맙습니다.

CEA-001 코딩교육 아두이노 따라잡기 시작 





확대


1. 코딩교육, 아두이노 따라잡기

2. 아두이노란?

3. 아두이노 우노 / 마시모밴지 / 오픈소스, 오픈하드웨어

4. 코딩교육 VS 프로그램교육



Comment +0