아두이노 선풍기 만들기(아두이노)

in #kr-arduino8 years ago

아두이노 선풍기 만들기(아두이노)



오늘은 일상에서의 주제를 찾다가 여름이고 해서 선풍기를 주제로 아두니로를 실험을 해 보았습니다. 선풍기의 동작을 관찰하고 각 특징을 기록하고 그 특징들을 아두이노 시각으로 정리 하여 아두이노 상에서 선풍기의 원리를 최대한 유사하게 표현하여 실험을 진행했습니다. 실제로 제작하지 않았고 가상시뮬레이터에서 여러분들도 같이 체험할 수 있게 가상시뮬레이터에서 실험이 이루어집니다.

자! 아두이노 상에서 선풍기를 한번 실험해 볼까요.

1. 선풍기의 동작 관찰


우선 선풍기를 아두이로 만들려면 선풍기의 특징들을 우선 알아야 합니다.

간단히 선풍기의 특징을 정리해 볼까요.

  • 선풍기는 각 단계별로 바람의 세기를 조절 할 수 있다.
  • 선풍기는 180도 정도의 각으로 좌/우 회전을 시킬 수 있다.
  • 선풍기는 동작을 제어하는 스위치버턴이 있으며 현재 상태를 LED로 표시하는 선풍기가 있다.

3가지 특징으로 접근해 보면, 선풍기의 바람(DC모터)을 단계 별로 세기를 조절하는 스위치버턴와 좌/우회전(Servo모터) 시키는 스위치버턴 그리고 스위치를 누를 때 스위치 상태를 7-Segment Display로 표현하면 대충 선풍기의 느낌으로 제작이 가능해 집니다.

2. 아두이노 선풍기 회로도


  • 준비물 : DC모터, 서보모터, 저항 1K옴 1개, 저항 220옴 1개, npn 1개, 다이오드 1개, 스위치버턴 2개, 7-Segment Display 1개, 아두이노우노, 외부전원
  • 내용 : 5번핀이 DC모터 제어핀으로 사용, 9번핀은 서보모터 제어핀으로 사용, 스위치버턴은 2,3번을 사용, 7-Segement Display 4,6,7,8,10,11,12 핀으로 제어하게 됩니다.

위 그림과 같은 느낌으로 제어를 한다는 가정하에서 회로도를 만들면 다음과 같습니다.

좀 복잡하실꺼에요. 아래 코딩에 사전학습 post들을 보시고 개별적으로 해당 부품에 대한 이해하시고 회로도를 보시면 회로도가 어느정도 이해하실 거라 생각됩니다.

3. 코딩



실험에 사용되는 부품들에 대한 사전학습이 필요합니다.

  • 스위치버턴 - 인터럽트함수를 이용하여 제어하게 됨
  • 7 Segment LED - 선풍기 바람의 세기의 단계를 숫자로 표시
  • 서보모터 : 몸체의 회전
  • DC모터 : 바람의세기 제어

기본적으로 위 내용을 우선 원리를 이해하셨으면 본격적으로 코딩에 들어갑시다.

1)선풍기 바람 세기 제어


DC모터 속도를 제어 합니다.

int motorPin = 5;
...
pinMode(motorPin, OUTPUT); 
...
analogWrite(motorPin, 속도);

DC모터는 5번핀을 이용하고 핀모드는 출력 모드입니다. 그리고 analogWrite()함수로 DC모터의 속도를 조절할 수 있습니다.

0,1,2,3 단계로 4개의 상태로 나눠서 바람의 세기를 제어를 하면 아래와 같습니다.

  switch(step){
    case 0:
     analogWrite(motorPin, 0);
     break;
    case 1:
     analogWrite(motorPin, 85);
     break;
    case 2:
     analogWrite(motorPin, 170);
     break;
    case 3:
     analogWrite(motorPin, 255);
     break;
  }

step은 단계 변수로 step의 값에 따라서 DC모터의 세기가 결정됩니다.

바람의 세기버턴을 누르면 step의 값이 0,1,2,3으로 변환하게 하려면 아래와 같이 코딩하면 됩니다.

attachInterrupt(digitalPinToInterrupt(interruptPin1), exchange1, FALLING);
void exchange1() {
  step++;
  if(step==4) step=0;
    
     switch(step){   
       ... 생략
     }  
}

스위치 버턴은 인터럽트함수를 이용하여 인터럽트 스위치 버턴을 누르면 현재 선풍기의 바람의 세기를 변경할 수 있게 됩니다.

2) 바람의 세기 단계를 7-Segment Display(애노드형) 출력


현재 step 단계를 7-Segment Display로 출력하면 됩니다.

해당 숫자를 출력하기 위해서 0.1.2.3 숫자의 패턴을 만들어야 합니다. 애노드형이니깐 아래와 같이 표현할 수 있습니다.

int segValue[4][7] = {
  {0,0,0,0,0,0,1}, //0
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
};

이 패턴을 가지고 step의 숫자가 출력되는 위치는 어디 일까요. 바로 스위치가 눌러질 때 그 때가 바로 숫자가 변경되는 시점이 됩니다.

void exchange1() {
  step++;
  if(step==4) step=0;
  for(int j=0;j<7;j++){ //setp 숫자 출력
     digitalWrite(segPin[j], segValue[step][j]);        
  }

3) 좌/우 회전시키기


서보모터로 좌/우 회전을 시키기 위해서는 어떻게 해야 할까요. 대충 0~180도 사이를 왔다 갔다 회전을 시키면 됩니다. 회전 최소 간격을 10도기준 0.1초로 해서 회전시키는 방식을 취했습니다.

    if(millis()-timeVal>=100){
        angle=angle+addAngle; //angle(각) 변화값 
        if(angle==180){ 
          addAngle=-10;
        }
        else if(angle==0){
          addAngle=10;
        }  
        servo1.write(angle); //회전각
        timeVal = millis();
    }

위 코딩을 자세히 보시면 addAngle이 초기값으로 10도로 세팅되어 있고 10도씩 0.1초 간격으로 증가하게 됩니다. 이때 180도가 되면 addAngle은 -10으로 바뀌고 -10도씩 0.1초 간격으로 감소하게 됩니다. 이때 0도가 되면 다시 addAngle은 10으로 바큅니다. 0~180도 사이를 왔다 갔다 회전을 하게 하는 동작 코딩이 됩니다.

그러면, 회전을 시킬려면 스위치 버턴을 누르면 회전을 시킬지 정지할지를 정하면 됩니다. 이경우도 인터럽트함수를 이요합니다. 왜냐면 어떤 명령을 수행중에 특정 상태로 강제로 변환 시키기 위해서는 인터럽트함수만한게 없습니다. 회전을 하는 중에서도 강제로 중단시켜야 할 때 유영하게 사용 할 수 있기 때문입니다.

attachInterrupt(digitalPinToInterrupt(interruptPin2), exchange2, FALLING);
void exchange2() {
  sw_state=!sw_state;
  timeVal = millis();
}

인터럽트스위치버턴이 눌러지먼 sw_state가 반전시킵니다.

void loop(){
  if(step>0 && sw_state==true){
    회전명령;
  }
}   

이렇게 코딩하면 sw_state 상태값에 따라서 서보모터의 회전을 결정하게 됩니다.

추가로"step>0" 이 표현이 넣었습니다. 그 이유는 회전은 선풍기가 돌때만 회전되어야지 돌지도 않는데 선풍기화 회전할 필요는 없겠죠. 그래서 선풍기 바람의 세기가 0일때는 회전 할 필요가 없다는 의미로 추가했습니다.

결론은 선풍기 바람의 세기가 0이상이고 선풍기회전스위치버턴이 눌러서 sw_state가 true일때마 회전하라는 의미입니다.

종합해 보면,

#include <Servo.h> 

Servo servo1; 
int servoPin1 = 9;
int motorPin = 5;

unsigned long timeVal = 0; //이전시간

int segValue[4][7] = {
  {0,0,0,0,0,0,1}, //0
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
};
int segPin[8]={4,6,7,8,10,11,12}; //a,b,c,d,e,f,g 핀


int interruptPin1 = 2; //바람 세기 스위치버턴
int interruptPin2 = 3; //회전 스위치버턴
int step = 0; //바람의세기 단계
boolean sw_state = false; //회전스위치 상태값
int angle = 0; //회전각
int addAngle = 10; //회전조절각

void setup() 
{ 
  pinMode(motorPin, OUTPUT); //DC모터
  servo1.attach(servoPin1); //서보모터
    
  for(int i=0;i<7;i++){ //7-Segment Display핀 모드를 선언과 동시체 초기 0단계 표시
    pinMode(segPin[i], OUTPUT);
    digitalWrite(segPin[i], segValue[0][i]);
  }
  
    //인터럽트함수 선언
  pinMode(interruptPin1, INPUT_PULLUP);
  pinMode(interruptPin2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin1), exchange1, FALLING); 
  attachInterrupt(digitalPinToInterrupt(interruptPin2), exchange2, FALLING);
  

  //초기 세팅
  analogWrite(motorPin, 0); //바람세기 = 0
  servo1.write(angle); //회전각 = 0
  delay(1000);
}

void loop() 
{   
  if(step>0 && sw_state==true){
    if(millis()-timeVal>=100){
        angle=angle+addAngle;
        if(angle==180){
          addAngle=-10;
        }
        else if(angle==0){
          addAngle=10;
        }  
        servo1.write(angle);        
        timeVal = millis();
    }
  }   
}
void exchange1() {
  step++;
  if(step==4) step=0;
  for(int j=0;j<7;j++){
     digitalWrite(segPin[j], segValue[step][j]);        
  }
  switch(step){
    case 0:
     analogWrite(motorPin, 0);
     break;
    case 1:
     analogWrite(motorPin, 85);
     break;
    case 2:
     analogWrite(motorPin, 170);
     break;
    case 3:
     analogWrite(motorPin, 255);
     break;
  }
}
void exchange2() {
  sw_state=!sw_state;
  timeVal = millis();
}

4. 결과


위그림에서 회전과 바람세기 스위치버턴을 누르면 아래 동영상처럼 동작을 하게 됩니다.

한가지 특수 기능을 표현했습니다. 단순하게 회전과 바람세기을 명령을 내리는 것이 아니라 둘간의 상황이 잘 어울리게 코딩을 했습니다. 바람의 세기가 0일때는 회전상태일지라도 정지가 되고 바람의 세기가 0이 아닌 1이상일 때는 회전정지 상태가 아니면 회전되게 코딩을 표현 했는데 최대한 진짜 선풍기처럼 표현한 부분입니다.

if(sw_state==true){
  선풍기회전;
}

위 코딩에서 "step>0"이란 조건문 한개로 방금 말한 특수 기능을 수행합니다.

if(step>0 && sw_state==true){
  선풍기회전;
}

단순한 한개의 조건을 체크 했을 뿐인데 재밌는 기능을 수행하게 되었네요.

마무리


오늘은 아두이노 가상시뮬레이터에서 코딩적 관점에서 회로도를 만들고 실험이 이루어졌습니다. 실제로 선풍기를 제작한다면 DC모터로 선풍기를 만들지 않고 AC모터로 만들고 좀 더 큰 사이즈의 형태로 실제 선풍기와 같은 형태로 제작을 했다면 좀 더 멋졌겠지만 그러지는 못했네요.

오늘 실험은 일상에서 흔히 볼 수 있는 특정 사물 동작 하나를 관찰하고 그것을 아두이노 시각으로 풀이해 보았습니다. 여러분들도 이런 실험을 한번 해보세요. 이런 학습을 하다보면 처음에는 모방 실험이 되겠지만 그 노하우가 쌓이면 사물의 관찰에서 인간과 같은 생물의 동작을 관찰하고 그것을 아두이노 시각으로 풀이해 낼 수 있게 됩니다. 즉, 상상이 현실이 됩니다. 단지 여러분들에게 필요한 것은 상상입니다.

오늘 실험에서 리모콘이나 Bluetooth를 연동하면 추가로 원격 제어를 할 수 있기 때문에 한번 상상코딩을 해보셨으면 합니다. 리모콘과 Bluetooth를 그동안 자주 거론되고 실험에 사용한 부품입니다. 그리고 라이브러리를 이용하면 간단히 제어를 할 수 있습니다. 함수 몇개만 사용하시면 쉽게 제어가 되니깐 위 코딩에서 어떻게 이 부품들을 적용할지만 코딩 로직만 잘 상상하시면 됩니다 한번 도전해 보세요. 그리고 하실 수 있으시다면 DC모터가 아닌 AC모터를 이용해서 실제 선풍기처럼 제작을 해보셔도 됩니다. AC모터와 AC모터를 제어할 모터쉴드를 구하시고 아두이노로 AC모터를 제어코딩만 하시면 실제 선풍기를 만드실 수 있을 꺼에요.

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]3주차 보상글추천, 1,2주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-3-1-2

3주차에 도전하세요

그리고 즐거운 스티밋하세요!

짱짱맨 응원에 감사합니다.

만능박사 아두이노 ㅎㅎㅎㅎ

저 코딩 짤려고 한시간 고생했네요. 각 부품별 동작 코딩은 바로 나오는데 연동했을 때 몇가지 상황을 조건을 추가하니깐 살짝 고생 했네요.
아직 저에게는 아두이노 길이 멀기만 하네요.
바로 바로 코딩이 나와야 하는데 ...

올 ~ 재밌는데요. ㅎㅎㅎㅎ ^^ 실제 작은 제품이랑 성능비교 들어가봐도 웃길 듯 합니다. ㅎㅎㅎ

뭔가 대상을 아두이노시각으로 관찰하고 그 대상을 유사하게 구현하는 모방 학습이 재미있는 것 같아요. 나중에 응용실험에 엄청 도움되고요.

아두이노의 시각이라... 오 진짜 신기하네요. 코딩맨님 엄청 많은 프로젝트를 하시는데요. 코딩맨님은 하고 싶은 프로젝트가 뭐에요?

IOT 농업쪽으로 원격 수경재배 시스템 구축하는 것을 해보고 싶었는데 상상만 하다가 끝났어요.
참 쉽지가 않더군요. 묘종부터 수경으로 재배할려면 양액도 구해야 하고 원격으로 제어할려면 물과 양액 혼합시키는 장치도 마련해야하고. D0센서를 이용하여 물속의 산소 측정도 할 수 있는 장치도 마련해야 하고 시스템 구축할려면 서버도 만들어야 하고 우선 수경재배에 따른 농장물 재배 데이터를 있어야 하는데 단순 재배법으로 시스템 구축하기도 힘들고요. 공기중 이산화탄소 측정도 해야하고 질소인가 공급그것도 있고요. 상상만 오지게 했죠.

과거, 그냥 가정수경재배화분으로 실험으로 출발하면 되는데 그때 수경재배틀과 모터펌프랑 기타 기자재 재료부품들을 구매하기 그래서 못해 봤어요.

로봇쪽은 부품들이 너무 비싸서 엄두를 못내고요. 로봇이 재밌긴 하는데 거긴 재미로 도전하기는 좀 그래서 대충 기초 제어 원리만 이해하는 수준이고요.

윽 저도 비슷한 고민하는 입장인데 완전 공감되네요. ㅎㅎㅎㅎ 원격 수경재배라... 설명해주신 걸 보니깐 복잡한 건 많을 것 같은데요. 굉장히 재밌을 것 같습니다.

단순하게 빛, 물, 영양분 세가기 기본 제어만 하면 되는데 문제는 세부적인 접근하여 제어 할 때 각각의 상황들을 제어하면서 전체틀안에서 자동 제어하는 시스템을 상상하니깐 스케일이 엄청 커져버려고 감당 할 수 없어 실험 조차 못해 봤네요.
처음 아두이노를 입문하고 얼마 되지 않는 시간에 상상했던 거라서 그때 식물공장같은 만든다면 전재하에 상상을 참 많이 했는데 결과는 시도조차 못하고 끝난 거라 아직도 기억이 나네요.

최근에는 관심있는게 근육신경센서를 이용하여 로봇팔/다리같은 것을 제어해보고 싶은데 근육센서가 너무 비싸네요. 로봇쪽은 부품들이 이것도 만만치 않고 신경데이터 의료정보를 분석해서 제어 신호로 계산하는 것도 쉬운 일이 아니고 하니 막연한 관심만 있네요. 외국에서 실제 장애인들을 위한 로봇팔같은거 제작하는 거 보면 참 부럽더군요. 우리나라도 이런 연구가 많이 대학들에서 이뤄져야 하는데 이런 부분들이 좀 열악한 것 같아요.

말씀하신 걸 들으니깐 저도 흥미가 생깁니다. ㅎㅎㅎㅎㅎㅎㅎ 하하하하핳핳. 로봇이라.... 정말 로망이에요. ㅎㅎㅎㅎㅎ 로봇을 개발할 수 있는 순간이 온다면 얼마나 기쁠지 모르겠습니다. ㅎㅎㅎ

드론 모터 + 배터리 해서 3단계 조절가능한 휴대용 선풍기 코드 짜준적 있는데 그거 아직도 쓸려나ㅎㅎㅎ

오! 드론모터면 비싼 부품으로 선풍기를 만드렸군요. ^^

You received 1.19 % upvote as a reward From round 2 on 2018.07.16. Congrats!

Thank you.

초정밀 제어 선풍기가 등장했네요. 전류가 작아서 바람이 세지 않을 것 같네요.ㅋ

간단히 원리만 실험한거라 AC모터로 바꾸고 외부 전류를 더 높이고 모터쉴드를 추가하면 성능은 바로 향상 될 꺼에요.

시원한 거 하나 만들어주세요. 너무 더워요 ㅜㅜ

열전냉각기(펠티어소자)를 이용하면 진짜 시원한 뭔가를 만들 수 있을꺼에요.
가격대비 실험용으로는 좀 부품이 비싸서 실험은 해보고 싶긴 하는데 사서 실험 할 정도는 안되고 사용법도 단순해서 구지 실험이 필요한 부품이 아니어서 포기했지만요.
미니냉장고, 에어컨으로 실험들을 많이 하더군요.
대충 회로도와 코딩은 쉬운데 껍데기 제작이 너무 힘드네요.
손재주가 없어서 재밌는 것을 만들고 싶어서 모형 만드는 것이 너무 제게는 힘드네요.

펠티어냉각소자로 미니냉장곤, 에어컨 만들면 여름 주제로 딱인데 아쉽긴 하네요.

으아니? 스팀잇에 아두이노를 올리시는 분을 이제서야 보게되다니...! 즐감하겠습니다~!ㅎㅎ

반갑습니다.
아두이노 글들이 맥이 끊어지지 않도록 꾸준히 올렸는데 최근 kr-dev 태그쪽에 아두니노 글들이 어느정도 올라오고 있어서 뿌듯하네요.
아무도 쓰지않는 kr-arduino 태그를 처음 쓰면서 벌써 반년이 넘어갔네요.
kr-dev와 kr-arduino로 아두이노를 활성화 시킬려고 노력 중인데 쉽지는 않네요.

항상 응원합니다. 더위 잘 견디시고 건강하세요 이건 뭐,,,,찜통이군요.

응원에 감사해요.
조금만 움직여더 땀이네요.
비나 한번 쏴! 하고 내렸으면 하는 날씨네요.