아두이노를 사용한 간단한 Decision Maker

포인투랩은 서울의 심장부! 바로 강남 지역에 위치하고 있습니다. 포인투 주변에는 맛있는 음식점들이 정말 많은데요, 사실 너무 많아서 매일 무엇을 먹어야할지 결정하는 것이 참으로 어렵습니다. 저 혼자 매일 점심을 먹는다면 매일 햄버거를 먹겠지만… 아마 그럼 JS가 아주 싫어하실거에요. 그래서 이 문제를 해결하기 위해 오늘은 아두이노를 사용해서 간단한 Decision Maker (의사결정기? 뭐라 해야할지 모르겠네요 ㅋㅋ)를 만들건데요, LED 6개를 사용해서 리셋버튼이 눌리면 1번부터 6번까지 하나를 랜덤하게 골라주는 조그만 기계입니다. 결정장애가 있는 분들도 만들어 쓰셔도 좋을거에요.이번 프로젝트는 좀 있어보이게 만들어보고 싶어서 브레드보드 대신 여기저기 납땜을 해서 제작을 해보았는데요, 그냥 빵판에 만드셔도 이쁘게 잘 꾸미시면 될 것 같습니다.

준비물:
아두이노 나노 x 1
LED (색깔은 마음대로 정해주세요) x 6
버튼형 스위치 x 1
전선들

하드웨어 연결:
hwc
LED를 Digital output 2번부터 7번까지에 330옴 저항에 직렬로 연결해줍니다. 그리고 리셋과 그라운드 사이에 스위치를 연결해주면 하드웨어 연결은 끝났습니다. 간단하죠?

a20150727_145331
저는 마침 굴러다니는 원형 플라스틱 케이스가 있어서 여기에 제작을 하기로 마음먹었습니다.

a20150727_155945
핸드 드릴비트로 구멍을 내주시구요.

a20150728_111035
위의 회로도 대로 부품들을 연결합니다. (좀 지저분하네요.. 그냥 이쁘게 봐주세요 😉 )

a20150728_111045
스위치까지 연결해주니 요로코롬 완성이 되었습니다.

Programming Arduino

int menu;

void setup() {
  Serial.begin(9600);
  // set the digital pin as output:
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  randomSeed(((analogRead(A0)+53)*(analogRead(A1)+15)*(analogRead(A2)*29))/64);//랜덤숫자가 실제로 랜덤하게 만들어줌
  menu = random (181,241); //random number between 181 & 240
  int ledStart=0;
  int initDelay = 65;
  int choice = menu%6+2; //사실 결과는 여기서 이미 나와있습니다. 나머지 코드는 LED동작과 관련된거에요.

  Serial.println((analogRead(A0)+53)*(analogRead(A1)+15)*(analogRead(A2)*29));
  Serial.println(menu);
  Serial.println(choice);
  //Initialize LEDs
  circle(20,5);    //5 rounds of 20ms LED circle
  circle(30,4);    //4 rounds of 30ms LED circle
  circle(40,2);

  //앞에서 설정된 결과값이 나올때까지 LED가 뺑뺑이를 돕니다
  while (ledStart+100 <= menu){
    int remainder = (menu - ledStart)%6 + 2;
    oneway(15,remainder);
    ledStart++;
  }

  //결과에 가까워질수록 좀 느리게
  while (ledStart+30 <= menu){
    int remainder=(menu-ledStart)%6 + 2;
    oneway(55,remainder);
    ledStart++;
  }

  //더 느리게
  while(ledStart<=menu){
    int remainder=(menu-ledStart)%6 + 2;
    oneway(initDelay,remainder);
    ledStart++;
    initDelay=initDelay+10;
  }

  // 마무리 처리
  if (ledStart > menu){
    int lastRound=7;
    while(lastRound>choice){
      oneway(initDelay,lastRound);
      lastRound--;
      initDelay=initDelay+10;
    }
    delay(100);
    digitalWrite(choice,1);
  }
}


void loop() //한번 실행되고 멈추도록 loop은 비워둡니다.
{}

//LED들을 순서대로 켜주고, 다시 순서대로 끄는 function
void circle(int interval, int times)
{
  for(int i=0; i<times; i++){
    for(int j=2; j<8; j++){
      digitalWrite(9-j, 1);
      delay(interval);
    }
    for(int j=2; j<8; j++){
      digitalWrite(9-j,0);
      delay(interval);
    }
  }
}

//LED하나를 켜고 다시 끄는 function
void oneway(int interval, int k)
{
  digitalWrite(k,1);
  delay(interval);
  digitalWrite(k,0);
  delay(interval);
}

위의 코드를 간단하게 설명하자면 먼저 랜덤한 숫자를 하나 받고, 그리고 그 수를 6으로 나눠서 그 나머지에 2를 더하고 (핀 2번부터 7번까지 쓰기때문에 2를 더해줍니다), LED를 뺑뺑이 돌려서 결과값을 보여줍니다. 코드에 코멘트 해둔 것 처럼 사실 결과값은 코드 앞쪽에서 이미 결정되고 나머지는 좀 긴장감을 주려고 LED를 돌리는 코드입니다.

매일 아침 출근을 하면 각자 먹고싶은 것들을 선착순으로 적어냅니다. 그리고 점심시간 직전에 요 Decision maker를 사용해서 메뉴를 골라서 점심을 먹으러 가는데요, 첫날은 아주 아무도 어떠한 불만도 없이 잘 진행이 되었답니다. 앞으로도 쭉 그랬으면 아주 보람찰 것 같습니다 😀
a20150729_104847

 

아두이노를 사용한 간단한 Decision Maker”의 2개의 댓글

코멘트 남기기