아두이노 7세그먼트(TM1637)시계 만들기

Posted by JaGG
2018. 6. 25. 00:51 카테고리 없음

안녕하세요. 오늘은 아두이노를 이용한 간단한 시계를 만들어 볼까합니다.


먼저 오늘 만들어볼 시계는 시계의 클럭을 유지시켜줄수 있는 보드를 사용하지 않았기 때문에 아두이노 전원이 꺼지면 시계또한 초기화 된다는 점을 먼저 알려드립니다.


아두이노 시계를 만들기 위해서 오늘 사용할 부품은 7세그먼트로 그냥 부품을 사용하는 것이 아닌 TM1637보드가 내장되어 있는 모듈을 사용합니다.


이 보드를 사용하면 단 4개의 케이블만으로 세그먼트 연결이 가능하며 제어또한 간단해집니다.


1. 회로도



회로를 아두이노에 연결한 모습입니다.


아두이노 5v    --    + 세그먼트   

아두아노 gnd    --    - 세그먼트     

아두이노 D2    --    CLK 세그먼트

아두이노 D3    --    DIO 세그먼트


위와 같이 연결하면 되겠습니다.


2. 라이브러리 다운로드



DigitalTube.zip

TimerOne.zip


먼저 위의 두 라이브러리를 다운로드받은 후 아두이노 라이브러리 폴더에 추가합니다.


3. 소스코드


ClockDisplay.ino


위 파일은 아래의 소스코드 파일입니다.




#include <TimerOne.h>

#include "TM1637.h"

#define ON 1

#define OFF 0


int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};

unsigned char ClockPoint = 1;

unsigned char Update;

unsigned char halfsecond = 0;

unsigned char second;

unsigned char minute = 00;

unsigned char hour = 20;



#define CLK 2//pins definitions for TM1637 and can be changed to other ports

#define DIO 3

TM1637 tm1637(CLK,DIO);


void setup()

{

  tm1637.set();

  tm1637.init();

  Timer1.initialize(500000);//timing for 500ms

  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR

}

void loop()

{

  if(Update == ON)

  {

    TimeUpdate();

    tm1637.display(TimeDisp);

  }


}

void TimingISR()

{

  halfsecond ++;

  Update = ON;

  if(halfsecond == 2){

    second ++;

    if(second == 60)

    {

      minute ++;

      if(minute == 60)

      {

        hour ++;

        if(hour == 24)hour = 0;

        minute = 0;

      }

      second = 0;

    }

    halfsecond = 0;

  }

 // Serial.println(second);

  ClockPoint = (~ClockPoint) & 0x01;

}

void TimeUpdate(void)

{

  if(ClockPoint)tm1637.point(POINT_ON);

  else tm1637.point(POINT_OFF);

  TimeDisp[0] = hour / 10;

  TimeDisp[1] = hour % 10;

  TimeDisp[2] = minute / 10;

  TimeDisp[3] = minute % 10;

  Update = OFF;

}



소스는 위와같습니다.


여기서 시간을 설정하는 부분은 가장 위쪽에

이부분 입니다. minute, hour변수에 현재 시간을 입력하고 업로딩하면 시간을 출력할 수 있습니다.


많은 사람들이 사용하는 예제 프로그램으로 시계를 만들어 보았습니다. 제대로 된 시계는 아니지만 예제파일로 얼마든지 이런 프로그램을 만들어 낼 수 있습니다.


다음 시간에는 시계의 클럭값을 저장해서 전원이 꺼졌을 때도 시간이 초기화 되지않는 진짜 시계를 함께 만들어보겠습니다.



아두이노 가변저항으로 서보모터 제어하기

Posted by JaGG
2018. 6. 24. 21:34 카테고리 없음

안녕하세요. 오늘은 아두이노 sg-90 서보모터와 가변저항으로 간단하게 모터를 제어하는 방법에 대해서 살펴보겠습니다.


서보모터는 관절값을 가지는 모터로 로봇팔과 같은 관절로봇이나 각도값을 가지는 프로젝트용 모터로써 사용됩니다.


1. 서보모터(sg-90)


위의 사진에 있는 모터가 sg-90 서보모터 입니다.


가격이 2000원 정도로 저렴하고 사이즈가 매우 작기 때문에 아두이노 프로젝트를 할 때 가장 많이 쓰이는 모터입니다.


그리고 한가지 더 sg-90의 특징은 다른 모터들은 모터 드라이버를 사용해서 제어해야 하지만 sg-90은 드라이버없이 아두이노에서 라이브러리를 받아서 손쉽게 사용이 가능합니다.

아두이노 연결은 빨간색(+), 검정색(-), 주황색(data)로 아두이노에 연결하면 됩니다.



2. 가변저항



다음은 가변 저항입니다. 흔히 볼륨 이라고도 말하며 우리가 흔히 볼 수 있는 오디오같은 기기의 볼륨설정을 할 때 사용되는 부품입니다.


가변저항은 말 그대로 값이 변하는 저항입니다.


저항은 전기의 흐름을 방해하는 역할을 하는 부품으로 앞서 LED, 버튼 등에서 저항을 많이 사용해 왔습니다. 가변 저항은 이 저항들과 기능은 같지만 그 값을 변화시킬 수 있다는 특징을 가지고 있습니다.


볼륨을 돌려서 최대값 부터 최소값까지 저항을 조절할 수 있으며 이 때 가변저항에서 출력되는 전기의 세기에 따라서 아날로그 값으로 변환이 가능합니다.


그리고 앞서 배웠던 CDS센서 역시 가변 저항의 원리를 가지고 만들어진 부품입니다.


아두이노 연결은 중간에 data핀을 연결하고 양쪽에 각각 Vcc와 GND를 연결해주면 됩니다.



3. 회로연결




연결은 다음과 같습니다.


항상 우선적으로 해야할 일은 브래드보드에 아두이노 +, -선을 연결하는 것입니다.


아두이노 우노 보드에는 Vcc(5v)단자가 하나밖에 없기 때문에 두 개 이상의 부품을 연결하기 위해서는 브래드보드의 사용이 필수입니다.


그리고 각 부품의 연결은 위 부품설명에서 했던것과 같습니다.


가변 저항은 A1, 서보모터는 D13번에 연결했습니다.



4. 소스코드


비교적 간단한 소스코드로 제어가 가능합니다. 먼저 서보모터를 사용하기 위해서 Servo.h라이브러리를 정의합니다.


그리고 Servo 함수에 sv라고 이름을 재정의 하여 프로그램 상에서 코드를 간결하게 만들어줍니다.


오늘 배우는 프로그램에서 가장 중요한 포인트는 map()함수 입니다.


map함수는 기존의 목표값(0 ~ 1023)을 원하는 범위의 값으로 재정의 해주는 기능을 가지고 있습니다.


가변 저항의 값의 범위는 0 ~ 1023인 반면에 서보모터의 범위는 0~180이기 때문에 map함수가 필요한 것입니다.


map(val, 0, 1023, 0, 120);


이라는 코드를 사용함으로써 가변 저항에서 나오는 값을 0~ 120으로 만들어 서보모터의 각도값으로 사용할 수 있는 것입니다.




아두이노 모션감지센서 제어하기

Posted by JaGG
2018. 6. 18. 12:17 카테고리 없음


오늘은 아두이노 모션감지센서에 대해서 알아보겠습니다. 모션감지센서는 말 그대로 사람의 움직임에 따라 센서가 감지되는 것으로 딱 움직임만 인식을 할뿐 정확한 동작이나 어느 특정 모션을 인식 하지는 못합니다.


그리고 동작감지센서는 우리 실생활에서 생각보다 쉽게 찾아볼 수 있는데요 현관이나 복도 등에서 자신이 다가갔을 때 가동으로 불이 켜지는 것을 본적이 있을것입니다.

이 때 사용하는 센서가 동작감지센서로 이 센서는 IR(적외선)센서와 같이 분류할 수 있습니다.


 


위 사진은 우연히 백화점 피팅룸에서 발견한 동작감지센서입니다.


이 시스템은 사람이 피팅룸에 들어갔을 때 내부의 센서가 사람의 동작을 인식하여 자동으로 내부의 불을 켜주는 것입니다.


그리고 오늘 우리가 만들어볼 동작감지센서 프로젝트 역시 위와 다르지 않습니다.



1. 동작감지센서


동작감지센서의 정식 명칭은 Pyro-electric IR 모션센서로써 위에서 설명한것과 같이 IR(적외선)센서의 일종입니다. 적외선 센서 앞에 둥근 반사판?을 사용해서 감지범위를 높여서 직진방향의 감지범위가 아닌 좀 더 광범위한 센서의 인식이 가능해집니다.


동작감지센서라는 명칭을 가지고 있지만 사람의 특정 모션을 잡아낼 수는 없습니다. 앞서 드린 설명과 같이 적외선 센서의 특성을 가지므로 사람의 동작이 감지 되었는가? 되지않았는가? 만을 감지할 수 있습니다.



2. 아두이노 연결방법 


이 센서에는 3개의 핀이 있습니다. 쓰임은 물론 전원을 위한 Vcc, GND이며 남은 한가닥은 SIG 데이터 입력핀입니다.

그 밖에 처리는 센서 내부에서 해결하기 때문에 유저가 신경쓸 부분은 없습니다.



현재 그림에서 동작감지센서는 디지털핀에 연결되어 있습니다. 이렇게 연결하고 센서값을 확인했을때 감지가 되는가 되지않는가 즉 0, 1로 결과값이 출력됩니다.


그리고 이 데이터핀을 아날로그에 연결하면 670정도의 값이 나옵니다. 결과는 감지가 되는가 되지않는가로 똑같지만 출력되는 값이 다른것을 알 수 있습니다.


그리고 기분탓인지는 모르겠으나 저는 아날로그가 더 잘 되는것 같아 아날로그에 연결하여 센서를 사용했습니다. 


센서 연결이 끝났다면 이제 작은 프로젝트를 진행해 보겠습니다.


오늘 배운 동작감지센서를 포함하여 앞서 배웠던 CDS센서와, LED를 이용합니다.


CDS센서와, LED의 사용방법은 아래 주소를 참고해 주시기 바랍니다.


LED : http://jagglife.tistory.com/11

CDS : http://jagglife.tistory.com/10



3. 미니 프로젝트


만들어볼 미니 프로젝트는 내 방에서 전등 스위치 없이 자동으로 전등을 켜는 장치입니다.


방에 들어갔을 때 문앞에서 센서가 인식하여 불을 켜주고 방을 나갈 때 센서가 다시 인식되어 불이 꺼지는 방식입니다.


물론 여러가지 변수가 있어 지금 하려는 프로젝트는 한없이 부족해 보일 수 있지만, 지금은 기초단계 강좌이기때문에 다른 환경변수는 무시하고 다음에 중급단계에서 제대로 만들어 보겠습니다.


4. 프로젝트 회로도



회로도는 위와 같습니다. 

LED와 CDS센서제어를 해보셨다면 지금 위의 회로는 어렵지 않게 구성이 가능하리라 생각됩니다.


확실한 이해를 돕기 위해 동작감지센서, CDS센서, LED를 나누어 배치했습니다.



5. 아두이노 센서값 확인


앞으로 아두이노를 이용한 어느 프로젝트를 하더라도 가장 중요한 작업이 지금 센서값을 확인하는 작업이 될것입니다.


센서를 이용하려면 어떤 값이 입력되는지를 알아야 프로젝트에 사용할 수 있습니다.


"만약 센서값이 50이하 일 때 LED를 켜라" 같이 센서값을 모른다면 다음의 프로그램은 짤 수가 없죠.


int Led=11;

int RIP=A5;

int PR=A1;

int sound=7;

 

void setup() {

  Serial.begin(9600);

  pinMode(RIP, INPUT);

  pinMode(sound, INPUT);

  pinMode(Led, OUTPUT);

  

}

 

void loop () {

  int CDS = analogRead(PR);

  int val = analogRead(RIP);   

 

 

  Serial.print("motion : ");

  Serial.print(val);

  Serial.print(", cds : ");

  Serial.println(CDS);

 

  delay(100);

}


위 코드가 동작감지센서, CDS센서의 값을 하이퍼터미널로 확인하는 코드입니다.


이 코드를 그대로 활용하여 센서값의 범위를 찾으시길 바랍니다.


6. 미니프로젝트 프로그램


영상에서 동작하는 모습을 확인하실 수 있습니다.


마지막으로 위에서 설명한 프로젝트의 코드입니다.


int Led=8;

int RIP=A5;

int PR=A1;

 int flag = 0;

 

void setup() {

  pinMode(RIP, INPUT);

  pinMode(Led, OUTPUT);

  pinMode(PR, INPUT);

  

}

 

void loop() {

 

 

 int cds_data = analogRead(PR);

 int motion_data = analogRead(RIP);

 

 if(cds_data < 60 && motion_data > 10){

   if(flag ==0) flag = 1;

 }

 if(cds_data > 70 && motion_data > 10){

   if(flag ==1) flag = 0;

 }

 

 if(flag == 1) digitalWrite(Led, HIGH);

 else if(flag == 0) digitalWrite(Led, LOW);

 

 delay(4000);

 

}