루덴스코드 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

누구나 따라하는 아두이노 프로그램 - 6장. 프로그램방법


누구나따라하는아두이노프로그램_v2_내용_CH06.pdf





Comment +0

누구나 따라하는 아두이노 프로그램 - 5장. 하드웨어연결


누구나따라하는아두이노프로그램_v2_내용_CH05.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 4장. 기본구조


누구나따라하는아두이노프로그램_v2_내용_CH04.pdf






Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 II


누구나따라하는아두이노프로그램_v2_내용_CH03B.pdf




Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 I


누구나따라하는아두이노프로그램_v2_내용_CH03A.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 2장. 초등학생도 따라할 수 있는 아두 이노 따라잡기


누구나따라하는아두이노프로그램_v2_내용_CH02.pdf



Comment +0

유튜브 강의 목록입니다. 링크를 따라가시면 목록이 있습니다. 목록은 계속 업데이트 중입니다. 매주 1 ~ 4 편까지 강의를 만들고 있습니다.



누구나 따라하는 아두이노 프로그램 (초딩도 따라하는 아두이노 프로그램) 책의 내용이 거의 완성되었습니다. 

물론 앞으로 고칠 부분이 많이 있을 것입니다.

하지만 우선 공개하고 추가로 보완하면서 계속 수정해 나가기로 마음 먹었습니다.


수정이 필요한 부분은 다음 사이트로 접속해서 댓글로 피드백을 주시기 바랍니다.


http://winduino.co.kr/212



누구나따라하는아두이노프로그램_v2_20160522_여백무.pdf




P.S.1. 책에 대한 질문사항이나 기타 잘못된 부분을 발견해셨다면 네이버 카페 "윈두이노"에서 내용을 적어주세요.  (LINK : http://cafe.naver.com/winduino )


P.S.2. 블로그에 댓글을 적어보았는데, 해외에서 유입되는 다양한 스팸성 광고글들이 너무 많습니다. 그렇다고 로그인한 사람만 댓글을 쓸수 있게 하려니 그것도 불편해져서 차라리 한국사람이 제일 많은 네이버에 카페를 만들어 사용하고자 합니다.


카페까지 가서 글을 쓰고 기타 활동을 하는 것이 불편하시더라도 자신이 알고 있는 것은 다른 사람들과 공유하고, 모르는 것을 쉽게 물어볼 수 있는 그런 커뮤니티가 되기를 바랍니다.




Comment +4

  • 이현석 2016.04.30 04:02 신고

    저도 대안학교에서 고등학생을 상대로 짧은 강의 경험이 있으며 책 제작까지 생각해본 입장에서 제 개인적인 생각을 말씀드리겠습니다.
    학교에서 저는 아이들에게 C, JAVA, 아두이노, 알고리즘등 여러가지 가르쳐 보았지만 대다수의 아이들은 이해하기 힘들어 했었습니다. 즉 초등학생도 몇몇 아이를 제외하고는 이해하기 힘들거라고 생각합니다.
    선생님께서 만드신 책의 내용은 좋으나 초등학교 고학년아이들부터 조금이나마 이해할수 있다고 생각이 듭니다.
    제가 이런 생각을 하는 이유는 그림설명이 많이 없다는 것입니다. 아이들은 말과 글보다 그림이나 실습으로 가르치는 방법이 이해가 빠르다고 전 느꼈습니다.
    제가 생각했던 책의 내용을 말씀드리겠습니다. 저의 경우 스크래치 -> 작동원리 -> 스케치 순으로 생각을 했었습니다. 물론 예제들도 많이 있어야 되구요.
    스크래치부분은 무작정 따라하기입니다. 그런다음 작동원리를 이해합니다. 여기까지 된다면 아이들 스스로 스크래치를 사용하여 개인 작품을 만드는 것입니다. 이 과정을 마친후 스케치로 넘어와 스크래치에서 했던 예제들을 스케치로 이해하는 방식입니다. 물론 이 많은 내용들을 하기위해서는 많은 시간이 필요로 합니다만, 이러한 방식으로 배운다면 나중에 혼자서 작품을 만들기에는 충분하다는 제 개인적인 생각입니다.
    솔직히 전 아직 실력이 미숙하며 요즘 아이들 수준을 모르기 때문에 제가 생각한 부분들이 틀리 수 있다고 생각합니다. 하지만 선생님께서 만드신 책을 보고 조금이라도 도움이 될까 싶어 글을 남겨 봅니다.
    참고로 아두이노 스토리 카페에서 선생님께서 쓰신 글을 보고 왔습니다. 수고하십시오.

    • 좋은 댓글을 남겨주셔서 고맙습니다. C, 자바등을 가르치기는 쉽지 않았을 거라고 생각됩니다. 사실 PC 프로그램을 가르치는 것은 대학생에게도 쉽지 않습니다. 특히 책을 위주로 진도를 고려해야하면 더욱 더 그렇지요.

      대안학교에서 스크래치와 아두이노를 가르쳐봤습니다. 초등학교 4학년 이상을 대상으로 했고, 대부분 영어는 전혀 모르는 아이들이었습니다. 스크래치는 그래픽 블록이어서 아무런 어려움이 없었고, 오히려 아이들은 쉬는 시간도 잊고 게임은 만든다고 열심이었습니다. 중간 점심시간을 가지고 4시간 수업을 했었는데, 거의 쉬는 시간 없이 계속 질문을 하면서 자신들이 만들고 싶어하는 게임을 만들어갔습니다.

      아두이노도 비슷합니다. 복잡한 프로그램을 하지는 않았지만 LED 를 켜고 끄는 하나의 예제만 알려주고 아이들은 스스로 LED 를 8개나 혹은 그 이상 붙여서 전체를 점멸시키거나, 순차적으로 점멸시키면서 푹 빠져들었습니다.

      보통 4시간짜리 강의로 토요일마다 해서 총 4번 합니다. 그러면 아이들은 거의 처음 4시간 정도만 강의를 듣고 나머지는 직접 알아서 합니다. 하면서 모르는 것, 하고 싶은 것을 제게 가져옵니다. 그러면 그 부분을 알려줍니다. 아는 아이는 다른 아이들에게 자랑스럽게 자기가 한 것을 보이고, 가르쳐줍니다.

      물론 책에는 그런 내용을 다 담을 수 없고, 실제 강의를 할때는 칠판에 온갖 그림을 그려가면서 강의합니다. 말과 그림이 강의의 대부분을 차지합니다. 텍스트는 사실 큰 비중이 없지요. 하지만 책으로 만들다보니 어쩔수 없이 말이 빠지고, 말이 빠진 상태에서 그림을 넣는 것도 쉽지 않더군요. ^^

      다음번에는 이런 부분들을 더 보완해서 강의를 책으로만이 아니라 동영상으로만들어볼까 생각하고 있습니다.

  • 셜레노 2016.06.02 17:58 신고

    안녕하세요, 바람님...
    제가 바람님께서 공개해 주신 가이드 학습내용을 보고 아두이노를 시작하려고 합니다.
    그런데, 시작부터 꼬이네요...
    증상은 제가 사용하는 PC가 Win7 X64입니다.
    그리고 알려주신 대로 IDE를 설치하기 위해 공시사이트에 가서 다운로드를 받아 설치하였습니다.
    그런데, 사이트에는 X86밖에 보이지 않습니다.
    64는 리눅스에만 구분되어 있더라구요.
    이렇게 설치 후 아두이노 보드에 USB를 연결하면 드라이버가 깔리지 않았다는 메세지가 뜹니다.
    그리고 혹시나 해서 CH24X 드라이버도 깔아보았습니다. 하지만 달리지는 것이 없습니다.
    IDE를 실행하면 드라이버가 감지 되었을 경우 포트에 아두이노가 연결된 상태를 확인 할 수 있다는 설명이 있는데 이와 연관된 문제인듯 포트라는 글자가 활성화 되지 않은 상태 입니다.
    이러한 문제를 어떻게 해결해야 할지 도움 요청 드립니다.

    그리고... 아직 돌아오지 못한 9명의 아이들 위해 저도 마음으로 기도 합니다.
    그리고, 이러한 지식의 나눔 거듭 감사드립니다.

    • 조금 더 자세히 써주시겠습니까? 우노보드 연결한 것인지, 호환보드라면 usb 연결되는 칩이 어떤것인지 알려주세요.
      윈도우쪽에 문제가 있을수 있고 오래 사용한 pc 경우 usb 포트 자체에 문제가 있을수도 있습니다.