반응형

【 아두이노모듈#6】 TM1637 4Digit Display #3. 마스터하기

 지난시간 TM1637 FND (4 Digit Display)를 이용해서 스톱워치와 숫자 표시(0,~ F)를 기본으로 다루어 보았다. (TM1637.h 사용) 


 이제 TM1637Display.h 를 사용하여 다양한 명령어(함수)를 활용해보고 여러가지 형태로 제어를 해서 TM1637을 마스터 해보도록 하자. 



▶ 선수 학습 :

 

  1. (모듈#4TM1637 4Digit Display #1 (TM1637 기본 참고 강좌클릭
  2. (모듈#5TM1637 Data shift 하기#2 (숫자 출력 참고 강좌클릭


▶ TM1637 세부 스팩 






  TM1637 모듈은, CATALEX 사,  Grove 사,  두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다.  이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)



▶ 실습 목표 :  


  1. [ 0~ F 값 출력 하기 

 2. [ showNumBerDec 함수 이용하여 숫자 다양하게 표시하기]

 3. [ 시계표시를 위한 '도트' 출력하기 ]

 4. [ 밝기 테스트 하기 : 1~7 단계 ]

 5. [ 모듈 켜고 끄기 test ]

 6. [ 0부터 ~ F까지 좌로 시프트 시키기 (2회 반복) ]

 7. [ 배열로 알파벳 만들어 출력하기 ]



▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)


▶ 실습 절차  : 


1.   회로 도면을 보면서 부품들을 연결한다.
  이번 실습에서는 브레드 보드는 필요치 않으므로 TM1637모듈을 아두이노에 직접연결(직결) 하여도 된다. 

2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다.
(여기서는 'TM1637Display.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637Display.h>를 사용하고 있으며, 만약, 프로그램 작성후 실행시 라이브러리 관련 에러가 날 경우 거의 대부분 "TM1637Display.h" 를 두 개(두 군데) 이상 중복 설치되어 나타나는 에러 이므로, 
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)

※ 라이브러리 다운로드 방법 : 
   1. 첨부파일로 다운로드 가능. 
   2. 아두이노 IDE에서 라이브러리 매니저 화면에서 'tm1637Display'로 검색 후 설치 하기.


3. '깃허브' 에서 'tm1637' 검색으로 다운로드 가능
   링크 연결 : https://github.com/avishorp/TM1637 
    

3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 

4. 실습 목표의 7가지 기능을 테스트 하기 위해서 각 동작마다 delay 타임을 1초~2초 정도 적절히 넣어서 동작의 구분이 쉽도록 한다. 
5. 실력 향상을 위해서는 아래 코딩으로 동작이 확인 되면 주석을 참고하여, 생각하고 있는 동작 형태로 바꾸어 실험해본다. 


▶ 프로그램 코드 및 설명 : 


/* TM1637Display .h  라이브러리  완벽마스터하기  */

/* 활용을 위한  [기능] 위주로 정리 하였음      */


#include <TM1637Display.h>

#define CLK 8    // 클럭 포트

#define DIO 9     // 데이터 입력 포트

TM1637Display  display(CLK, DIO);

int i, j, k;

  uint8_t data[] =  { 0xff, 0xff, 0xff, 0xff };

  uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };

  uint8_t count[] = {  0xff, 0xff, 0xff, 0xff  };

const uint8_t SEG_LOVE[] = {        // 우측 FND 이미지 참조

  SEG_D | SEG_E | SEG_F,                                     // L

  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O

  SEG_B | SEG_E | SEG_F | SEG_G,                         // V

  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G   };         // E

const uint8_t SEG_DONE[] = {

  SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,              // d

  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O

  SEG_C | SEG_E | SEG_G,                                    // n

  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G      };      // E


//  FND의 각 Segment 배열 위치는 아래 이미지 참조   



void setup ( ) {          // 모든 프로그램을 setup작성함
 
display.setBrightness(7);                // 0~7, 밝기 조절 

  display.setSegments(data);  //배열 출력(FND8888 비트 모두가 출력된다)

  delay(1000);

   // ##### [ 0~F 출력하기] #####

   // encode digit를 이용해서 배열 내용을 변경해 넣을 수 있다

  // 0 ~ 9는 숫자로 10 ~ 15까지는 알파벳 A ~ F로 출력된다

  // encodeDigit(x)x0~15 입력으로 숫자 0부터 알파벳 F까지만 표시가능

  data[0] = display.encodeDigit(0);

  data[1] = display.encodeDigit(1);

  data[2] = display.encodeDigit(2);

  data[3] = display.encodeDigit(3);

  display.setSegments(data);      // 위 숫자 0~3배열값 한번에 출력

  delay(1000);


  data[0] = display.encodeDigit(4);

  data[1] = display.encodeDigit(5);

  data[2] = display.encodeDigit(6);

  data[3] = display.encodeDigit(7);

  display.setSegments(data); //숫자 4~7배열값 한번에 출력

  delay(1000);

  data[0] = display.encodeDigit(8);

  data[1] = display.encodeDigit(9);

  data[2] = display.encodeDigit(0);

  data[3] = display.encodeDigit(0);

  display.setSegments(data); //숫자 8,9,0,0 배열값 한번에 출력

  delay(2000);

  data[0] = display.encodeDigit(10);

  data[1] = display.encodeDigit(11);

  data[2] = display.encodeDigit(12);

  data[3] = display.encodeDigit(13);

  display.setSegments(data);  //10~13값에 해당하는 A~d 출력

  delay(1000);

  data[0] = display.encodeDigit(14);  // 'E' 출력

  data[1] = display.encodeDigit(15);  // 'F' 출력

  data[2] = display.encodeDigit(16); //'F'다음은 다시0부터 반복

  data[3] = display.encodeDigit(17); // '1' 출력

  display.setSegments(data);     delay(2000);   //  E F 0 1 출력



//#### [ showNumberDec 함수 이용하여 다양하게 표시해보기] ####
  display.showNumberDec(1318, false, 4, 0);    //숫자 값 직접 출력할 경우
  // 1318 : 표시할 숫자 , 4 : 표시숫자 길이, 0 : 표시할 위치(맨좌측부터 0123)
 
delay(1000);

  display.showNumberDec(567, false, 3, 1);      delay(2000);
  //아래처럼 옵션에 숫자 3자리만 출력하고 2번째('1')digit부터 표시 경우, 기존
  //
출력된 숫자 등은 그대로 표시됨. 따라서 위 기존 출력'1318'에서 '1'이 계속 표시
  //
되어, '1567'이 최종 출력됨. 567 :표시할 숫자 , 3 :숫자 길이, 1 :표시할 위치

  display.showNumberDec(0, false);   delay(1000);     // 출력 : ___0

  display.showNumberDec(0, true);     delay(1000);     // 출력 : 0000

  display.showNumberDec(1, false);    delay(1000);     // Expect: ___1

  display.showNumberDec(1, true);      delay(1000);    // Expect: 0001

  display.showNumberDec(301, false); delay(1000);    // Expect: _301

  display.showNumberDec(301, true);   delay(1000);      // Expect: 0301

  display.showNumberDec(14, false, 2, 1); delay(1000); // Expect: _14_

  display.showNumberDec(4, true, 2, 2); delay(1000);   // Expect: 04__

  display.showNumberDec(-1, false);      delay(1000);  // Expect: __-1

  display.showNumberDec(-12);            delay(1000);   // Expect: _-12

  display.showNumberDec(-999);           delay(1000);   // Expect: -999

 // ##### [ 시계표시를 위한 '도트' 출력 하기  ] #####
  for(int j=0; j <= 2; j++) {
   
for(int k=0; k <= 4; k++) {
     
display.showNumberDecEx(0, (0x80 >> k), true); 
  // showNumberDecEx(표시할 숫자, 도트출력, 0일때 '0'자체 표시 유무)
      delay(500);    // 돗트가 꺼지고(500)켜지는(500)시간 총합한 1초 간격
     }
   }


// ##### [ 밝기 테스트 : 1~7 단계  ] #####

  for(int k = 0; k < 4; k++)

    data[k] = 0xff;

  for(int k = 0; k < 7; k++) {

    display.setBrightness(k);

    display.setSegments(data);

    delay(800);

  }

// ##### [ 모듈 켜고 끄기 test  ] #####

  for(k = 0; k < 3; k++) {

    display.setBrightness(7, false);     // 겨기

    display.setSegments(data);

    delay(500);

    display.setBrightness(7, true);       // 끄기

    display.setSegments(data);

    delay(500); 

  }


//##### [ 0부터 ~ F까지 좌로 시프트 시키기 (2회 반복)] #####

for (i = 0; i <= 1; i++)  {                 // 2회 반복

    for(k = 0; k <= 12; k++) {           // 12까지 하면 F까지 출력가능

      for(j =0; j <= 3; j++) {             // 한번에 숫자 4출력해야함

        count[j] = display.encodeDigit(j+k);     //배열에 값 넣기

        display.setSegments(count);               //배열값 출력

        delay(20);

      }

      delay(250);

    } 

    delay(2000);

  }

//#### [배열로 알파벳 만들어 출력하기(앞 부분 배열선언 참조)] ###

  display.setSegments(SEG_LOVE);      // LOVE 출력

  delay(1000);

  display.setSegments(SEG_DONE);      // dOnE 출력

}

void loop() {

}


※ 동작의 구별을 명확히 하려고 위와 같이 루프문이 아닌 셋업 문에 대부분의 명령을 작성하였고,
이렇게 하여도 동작에 문제가 생기지 않는다. (아두이노의 리셋키를 눌러주면 다시 실행된다)


▶ 참고 자료 :  

※ FND의 내부 구조를 파악하고 있으면 사용자문자를 직접 제작하려고 할 때 도움이 된다. 



※ 아래처럼 16진 Hex 코드 값으로 코딩할 수 도 있다. 



※ FND 구조의 한계상 모든 영문 알파벳을 자연스럽게 표시하기는 힘드나, 

아래 표처럼 유사한 형태로 정의하여 사용할 수 있다. 




※ showNumberDec 함수를 잘 이용하면, 보다더 다양한 형태로 FND모듈을 다룰 수 있다. 




▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)


TM1637Display.zip


반응형
반응형

【 아두이노모듈#5】 TM1637 4Digit Display #2. Data shift 하기


 지난시간 TM1637 FND (4 Digit Display)를 이용해서 스톱워치 를 만들어 보았다. 이번에는 0에서 15까지의 숫자를 차례로 시프트 시켜 출력해보려 한다. 


10 이상의 숫자는 FND Digit의 1자리로는 표시가 불가능하기 때문에,
16진법에서 표시하는 방식으로 나타내려 한다. 

(10→A, 11→B, 12→C, 13→D, 14→E, 15→F )


▶ 선수 학습 :

 

  1. (모듈#4) TM1637 4Digit Display #1 (TM1637 기본 참고) 강좌클릭


▶ TM1637 세부 스팩 






  TM1637 모듈은, CATALEX 사,  Grove 사,  두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다.  이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)



▶ 실습 목표 :  


 - 숫자 1~F 까지 4자리씩 끊어서 출력해보자. 



▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)


▶ 실습 절차  : 


1.   회로 도면을 보면서 부품들을 연결한다.
  이번 실습에서는 브레드 보드는 필요치 않으므로 TM1637모듈을 아두이노에 직접연결(직결) 하여도 된다. 

2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. (여기서는 'TM1637.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637.h> 헤더에서 사용할 수 있는 함수를 다루고 있으며, 다음 시간에는 <TM1637Display.h>를 사용해보려 한다.  

※ 라이브러리 다운로드 방법 : 
   1. 첨부파일로 다운로드 가능. 
   2. 아두이노 IDE에서 라이브러리 매니저 화면에서 'tm1637'로 검색 후 설치 하기.


3. '깃허브' 에서 'tm1637' 검색으로 다운로드 가능
   링크 연결 : https://github.com/avishorp/TM1637 
 (※ 현재, 깃 허브에서는 TM1637Display.h 파일만 검색되니, 라이브러리 메니저 창을 이용하기 바람)
    

3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 

4. 동작 영상에서는 FND 모듈의 밝기 값을 제일 밝은 7로 바꾸어 촬영한 것이다.  → tm1637.set(7);


▶ 프로그램 코드 및 설명 : 


/* TM1637 .h 라이브러리  테스트 해보기*/

/* 0~15 까지 시프트출력 반복 [ 10~15A~F로 출력*/


#include "TM1637.h

#define CLK 8    // 클럭 포트

#define DIO 9     // 데이터 입력 포트

TM1637 tm1637(CLK,DIO);  


void setup ( )

{

   tm1637.init();    // 초기화

   tm1637.set(BRIGHT_TYPICAL);

  // 밝기는 0~7 까지 설정 가능,

  // BRIGHT_TYPICAL(초기값은) 2로 설정 되어 있음

}


void loop ( ) {

  int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};   

                           // 0~9,A,b,C,d,E,F

  int8_t ListDisp[4];    // 4자리 FND digit 수 설정

  unsigned char i = 0;

  unsigned char count = 0;

  delay(150);

  while(1)

    {

      i = count;

      count ++;

      if(count == sizeof(NumTab)) count = 0; // 배열 갯 수만큼 카운트

        for(unsigned char BitSelect = 0;BitSelect < 4;BitSelect ++)

        //한 번에 배열의 4자리 Data값을 출력할Digit 자리에 저장

            ListDisp[BitSelect] = NumTab[i];  

            i ++;

            if(i == sizeof(NumTab)) i = 0;

        }

        tm1637.display(0,ListDisp[0]);    // 우측부터 첫 째 자리 Digit

        tm1637.display(1,ListDisp[1]);     // 우측부터 둘 째 자리 Digit

        tm1637.display(2,ListDisp[2]);    // 우측부터 셋 째 자리 Digit

        tm1637.display(3,ListDisp[3]);    // 우측부터 넷 째 자리 Digit

        delay(400);        // 숫자가 시프트 되어 표시 되는 시간 설정

     }

 }



▶ 실행영상 :  

(전체화면 보기로 보세요)



▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

TM1637_viewTest_II.zip



▶ 라이브러리 다운(TM1637) :



반응형
반응형

【 아두이노모듈#4】 TM1637 4Digit Display #1. Stop Watch만들기 


 오늘은 TM1637 FND (4 Digit Display)를 이용해서 스톱워치 를 만들어 보려한다. 아두이노 프로그램 내용은 'Frankie.Chu'의 내용을 이용하여 작성하였다.

 이 모듈은 TM1637 이라는 칩이 핵심역할을 하며, FND 4개로 구성되어 있고, 시계 표시를 위한 포인트도 있으며, 다양한 형태로 디스플레이가 가능한 장점이 있다. 사이즈 또한 작고 컴팩트 하며, 전원핀을 포함해서 4개의 핀으로 제어(I2C통신)가 가능하기 때문에 회로 구성이 매우 간결해진다.


▶ 선수 학습 :

 

   없음.


▶ TM1637 이용한 스톱워치 회로. 






  TM1637 모듈은, CATALEX 사,  Grove 사,  두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다.  이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)



▶ 실습 목표 :  


 - 시리얼 모니터 창을 통해 스톱워치 기능을 동작 구현 하라. 

 (S : 시작  ,   P : 멈춤  ,   W : 시간 저장하기  , L : 저장한 시간 보여주기 ,  R : 리셋 ) 


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 실습 절차  : 


1.   회로 도면을 보면서 부품들을 연결한다.

2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. (여기서는 'TM1637.h' 사용)

라이브러리 다운로드 방법 : 
   1. 첨부파일로 다운로드 가능. 
   2. 아두이노 IDE에서 라이브러리 매니저 화면에서 'tm1637'로 검색 후 설치 하기.


3. '깃허브' 에서 'tm1637' 검색으로 다운로드 가능
   링크 연결 : https://github.com/avishorp/TM1637 
    

3.   아래 프로그래밍을 돌려보고 라이브러리 에러가 나지 않으면 라이브러리 설치가 잘 된 것이며, 프로그램 내용이 길어 차분하게 잘 작성하도록 한다. 

4. 실행이 되면 아래와 같은 시리얼 모니터 창을 열어 명령어를 입력 하여 작동이 잘 되는지 확인 한다.





▶ 프로그램 코드 및 설명 : 


/* TM 1637 이용한 스톱 워치 만들기 */


#include<IRremote.h>

#include <EEPROM.h>

#include <TimerOne.h>

#include <avr/pgmspace.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 microsecond_10 = 0;

unsigned char second;

unsigned char _microsecond_10 = 0;

unsigned char _second;

unsigned int eepromaddr;

boolean Flag_ReadTime;

#define CLK 8        

#define DIO 9

TM1637 tm1637(CLK,DIO);


void setup ( ) {

  Serial.begin(9600);

  tm1637.set(BRIGHT_TYPICAL); 

  tm1637.init();

  Timer1.initialize(10000);      

  Timer1.attachInterrupt(TimingISR);  

  Serial.println("Please send command to control the stopwatch:");

  Serial.println("S - start");

  Serial.println("P - pause");

  Serial.println("L - list the time");

  Serial.println("W - write the time to EEPROM ");

  Serial.println("R - reset");  

}


void loop ( ) {

char command;

command = Serial.read();


switch(command)    {

    case 'S':
        stopwatchStart();
        Serial.println("Start timing...");

    break;


    case 'P':
        stopwatchPause();

Serial.println("Stopwatch was Paused");

    break;


    case 'L':

readTime();

    break;


    case 'W':

saveTime();

Serial.println("Save the time");
break;


    case 'R':

stopwatchReset();

Serial.println("Stopwatch was reset");

break;

 

   default:

break;

  }

  if(Update == ON)   {

    TimeUpdate();

    tm1637.display(TimeDisp);

  } 

}


void TimingISR ( ) {

 microsecond_10 ++;

  Update = ON;

  if(microsecond_10 == 100){

    second ++;

    if(second == 60)

    {

      second = 0;

    }

    microsecond_10 = 0;  

  }

  ClockPoint = (~ClockPoint) & 0x01;

  if(Flag_ReadTime == 0)

  {

    _microsecond_10 = microsecond_10;

    _second = second;

  } 

 } 


void TimeUpdate (void)

{

  if(ClockPoint)tm1637.point(POINT_ON); 

  else tm1637.point(POINT_ON); 

  TimeDisp[2] = _microsecond_10 / 10;

  TimeDisp[3] = _microsecond_10 % 10;

  TimeDisp[0] = _second / 10;

  TimeDisp[1] = _second % 10;

  Update = OFF;

}

void stopwatchStart( )     // timer1 on

{

  Flag_ReadTime = 0;

  TCCR1B |= Timer1.clockSelectBits; 

}


void stopwatchPause ( )  

{

  TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));

}


void stopwatchReset ( )

{

  stopwatchPause();

  Flag_ReadTime = 0;

  _microsecond_10 = 0;

  _second = 0;

  microsecond_10 = 0;

  second = 0;

  Update = ON;

}


void saveTime( )

{

  EEPROM.write(eepromaddr ++,microsecond_10);

  EEPROM.write(eepromaddr ++,second);

}


void readTime ( )

{

  Flag_ReadTime = 1;

  if(eepromaddr == 0)   {

    Serial.println("The time had been read");

    _microsecond_10 = 0;

    _second = 0;

    }

  else {

  _second = EEPROM.read(-- eepromaddr);

  _microsecond_10 = EEPROM.read(-- eepromaddr);

  Serial.println("List the time");

  }

  Update = ON;

}


▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)




반응형
반응형

【 아두이노 모듈#3】 IR 리모컨으로 3개의 LED 켜기 IR실습 #3



 오늘은 지난 시간 다루었던 IR-적외선 모듈과 리모컨 편의 3편으로 다루어 보려 한다. 

 지난시간에는 IR모듈만 연결하여 리모컨을 눌렀을 때의 데이터를 사람이 알아보기 쉬운 의미있는 값으로 바꾸어 시리얼 모니터로 출력해 보았다. 이번에는 이 값들을 가지고 특정키가 눌러 졌을 때 아두이노 출력 포트를 제어하여 LED를 켜보도록 하자, 물론 간편한 예로 LED를 다루지만 모터제어나 여러가지 제어가 가능하다는 걸 이해하면 좋을 것이다. 


▶ 선수 학습 :

 

1. (모듈#1) IR-적외선모듈( KY-022)다루기#1 (적외선리모컨참고) 강좌클릭

2. (모듈#2) IR-적외선모듈( KY-022)다루기#2 (적외선리모컨참고) 강좌클릭



▶ IR-적외선 리모트 모듈 사양 및 동작 특성







  송신부에서는 데이터 값을 가지는 적외선을 약38Khz의 반송(운반주파수에 실어서 보내는데(변조),  이는 자연광형광등 불빛 등 주변 빛으로 부터 적외선()을 잘 구분하여 수신하기 위함이고 송신부에서는 이 반송 주파수를 제거하여(복조데이터 값을 얻게 된다.

 ※ 송신기에서 사용되는 적외선은 가시광선 바로 위의 영역으로 열 발생이 없는 근적외선을 이용한다.



▶ 실습 목표 :  


 - 리모컨의 숫자 키(1, 2, 3)를 눌렀을 때 , 각각의 LED 1초 가량 ON Off 되도록 프로그래밍 하라.  (아래 Key Value 값 참조)


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 실습 절차  : 


1.   회로 도면을 보면서 부품들을 연결한다.

2.   LED의 극성이나, 전원 단자 +, - 서로 바뀌지 않도록 주의한다.

3.   여기서는 LED 3개를 사용 하였으나 3LED 1개를 사용하여도 무방하니 부품이 있을 경우 추가적으로 실험 해보도록 한다.
 

▶ 프로그램 코드 및 설명 : 


/* IR-적외선 리모트 모듈 리모콘 xinda’ 실습 3   */

/* 숫자 키로 LED 켜기, Rasino.tistory.com, Alex KIM   */    


#include<IRremote.h>

#define IR_KEY_1 0xFF6897

#define IR_KEY_2 0xFF9867

#define IR_KEY_3 0xFFB04F

int IRPIN = 7;

int LED1 = 8;      //  흰색 LED

int LED2 = 9;      //  파란색 LED

int LED3 = 10;    //   빨간색 LED


IRrecv irDetect(IRPIN); // 'irDetect'라는 이름으로 수신객체 생성

decode_results irIn//값 저장 되는 클래스객체(decode_res...)의 이름(irln)선언


void setup( ) {

  Serial.begin(9600);

  irDetect.enableIRIn();  // 수신 시작

  pinMode(LED1, OUTPUT);     

  pinMode(LED2, OUTPUT);

  pinMode(LED3, OUTPUT); 

}


void loop( ) {

  if (irDetect.decode(&irIn)) {  //수신된 값이 있다면 아래 실행

    decodeIR();              // 값을 출력하는 서브루틴 호출

    irDetect.resume( );     // 다음 값 받기

   }

}


void decodeIR( ) {           //  값을 출력하는 서브함수 제작

switch(irIn.value) {

case IR_KEY_1:

  digitalWrite(LED1, HIGH);

  delay(2000);

      digitalWrite(LED1, LOW);      

  break;

 

case IR_KEY_2:

  digitalWrite(LED2, HIGH);

  delay(2000);

  digitalWrite(LED2, LOW);      

  break;


  case IR_KEY_3:

  digitalWrite(LED3, HIGH);

  delay(2000);

      digitalWrite(LED3, LOW);    

  break; 

 }

}


['Xinda' 리모콘의 키 값 참조] 



▶ 실행영상 :  

(전체화면 보기로 보세요)



▶ 아두이노 파일다운 :

irRemote_LED.ino


반응형
반응형

【 아두이노 모듈#2】 IR-적외선 모듈( KY-022) 다루기 #2


 오늘은 지난 시간 다루었던 IR-적외선 모듈과 리모컨 편의 2편으로 다루어 보려 한다. 

 지난시간에는 IR모듈만 연결하여 리모컨을 눌렀을 때의 데이터를 시리얼 모니터로 확인해보았다. 이번 시간에는 이렇게 입력된 데이터를 가지고 쉽게 알아 볼 수 있는 단어로 바꾸어 시리얼 모니터로 표시해보자.  
(예, LEFT BUTTON,  LEFT Click , LEFT Arrow, Right Arrow... )




▶ 선수 학습 :

 

1. (모듈#1) IR-적외선모듈( KY-022)다루기#1 (적외선리모컨참고) 강좌클릭



▶ IR-적외선 리모트 모듈 사양 및 동작 특성





  송신부에서는 데이터 값을 가지는 적외선을 약38Khz의 반송(운반주파수에 실어서 보내는데(변조),  이는 자연광형광등 불빛 등 주변 빛으로 부터 적외선()을 잘 구분하여 수신하기 위함이고 송신부에서는 이 반송 주파수를 제거하여(복조데이터 값을 얻게 된다.

 ※ 송신기에서 사용되는 적외선은 가시광선 바로 위의 영역으로 열 발생이 없는 근적외선을 이용한다.







▶ 실습 목표 :  


1. 리모컨을 눌렀을 때 각 버튼의 Data 값을 시리얼 모니터로 확인해 볼 수 있다. 


2. if ... case 구문을 이용하여 리모컨 버튼 각각의 데이터 값을 사람이 판독하기 쉬운 단어로 바꾸어 시리얼 모니터로 출력 할 수 있다. 


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)





▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    브레드 보드 없이 직접 보드에 연결하여도 무방하다. 
3.   수신 모듈의 전원 연결이 뒤바뀌지 않도록 주의한다.
4. 리모컨의 키값은 선수학습편의 프로그램으로 키를 직접눌러 알아낼 수 있으며, 아래 키코드표를 참고하여 프로그램을 작성하면 된다. (가지고 있는 리모콘이 사진상에 있는 'Xinda'리모콘이라면 모두 같은 값을 가질 것이다)
 

▶ 프로그램 코드 및 설명 : 


/* IR-적외선 리모트 모듈 리모콘 xinda’ 실습 2   */

#include<IRremote.h>

int IRPIN = 7;

IRrecv irDetect(IRPIN); // 'irDetect'라는 이름으로 수신객체 생성

decode_results irIn; //값 저장 되는 클래스객체(decode_res...)의 이름(irln)선언


void setup( ) {

  Serial.begin(9600);

  irDetect.enableIRIn();  // 수신 시작

}


void loop( ) {

  if (irDetect.decode(&irIn)) {  //수신된 값이 있다면 아래 실행

    decodeIR();              // 값을 출력하는 서브루틴 호출

    irDetect.resume( );     // 다음 값 받기

   }

}


void decodeIR( ) {           //  값을 출력하는 서브함수 제작

  switch(irIn.value) {

  case 0xFF629D:

  Serial.println("Up Arrow");

  break;

  case 0xFF22DD:

  Serial.println("Left Arrow");

  break;

  case 0xFF02FD:

  Serial.println("OK ");

  break;

  case 0xFFC23D:

  Serial.println("Right Arrow");

  break;

  case 0xFFA857:

  Serial.println("Down Arrow");

  break;

  case 0xFF6897:

  Serial.println("1");

  break;    

  case 0xFF9867:

  Serial.println("2");

  break;    

  case 0xFFB04F:

  Serial.println("3");

  break;

  case 0xFF30CF:

  Serial.println("4");

  break;

  case 0xFF18E7:

  Serial.println("5");

  break;  

  case 0xFF7A85:

  Serial.println("6");

  break;

  case 0xFF10EF:

  Serial.println("7");

  break;  

  case 0xFF38C7:

  Serial.println("8");

  break;

  case 0xFF5AA5:

  Serial.println("9");

  break;

  case 0xFF42BD:

  Serial.println("*");

  break;    

  case 0xFF4AB5:

  Serial.println("0");

  break;

  case 0xFF52AD:

  Serial.println("#");

  break;

  }  

}


['Xinda' 리모콘의 키 값 참조] 



▶ 실행영상 :  

(전체화면 보기로 보세요)



▶ 아두이노 파일다운 :

irRemote_Serial_Value.ino



반응형
반응형

【 아두이노 모듈#1】 IR-적외선 모듈( KY-022) 다루기 #1


 오늘은 IR-적외선 모듈과 리모컨에 대해 다루어 보려 한다. 

일반적으로 TV나 오디오 등 가전기기 들의 리모컨에 적용하는 방식으로 알아두면 여러가지로 유용하게 응용 할 수 있다.

 




▶ 선수 학습 :

 없음. 


▶ IR-적외선 리모트 모듈 사양 및 동작 특성





  송신부에서는 데이터 값을 가지는 적외선을 약38Khz의 반송(운반) 주파수에 실어서 보내는데(변조),  이는 자연광, 형광등 불빛 등 주변 빛으로 부터 적외선()을 잘 구분하여 수신하기 위함이고 , 송신부에서는 이 반송 주파수를 제거하여(복조) 데이터 값을 얻게 된다.

 송신기에서 사용되는 적외선은 가시광선 바로 위의 영역으로 열 발생이 없는 근적외선을 이용한다.








▶ 실습 목표 :  


1. 리모컨을 눌렀을 때 각 버튼의 Data 값을 시리얼 모니터로 확인해 볼 수 있다. 


2. 이를 통해 일반적으로 사용되는 상용리모컨의 버튼별 data도 알아 낼 수 있다. 


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)




▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    브레드 보드 없이 직접 보드에 연결하여도 무방하다. 
3.   수신 모듈의 전원 연결이 뒤바뀌지 않도록 주의한다.
 

▶ 실습전 준비사항  : 

 1. 코드에 사용된 ' IRremote.h ' 라이브러리를 먼저 다운받아 설치하세요. ( 아래 첨부파일을 다운받고,  아두이노 IDE의 메뉴에서
" 스케치 》라이브러리 포함하기 
》ZIP라이브러리 추가... " 메뉴를 이용해서 추가해 주면 됩니다.
 

▶ 프로그램 코드 및 설명 : 

/* IR-적외선 리모트 모듈 리모콘 xinda 실습   */


#include<IRremote.h>

int IRPIN = 7;

IRrecv irDetect(IRPIN); // 'irDetect'라는 이름으로 수신객체 생성

decode_results irIn; //값 저장 되는 클래스객체(decode_res...)의 이름(irln)선언


void setup() {

  Serial.begin(9600);

  irDetect.enableIRIn();  // 수신 시작

}


void loop() {

  if (irDetect.decode(&irIn)) {   //수신된 값이 있다면

    Serial.println(irIn.value, HEX);  // 값을 시리얼창으로 출력

    irDetect.resume();     // 다음 값 받기

   }

   delay(100);     // 100ms 마다 수신 & 수신 에러 방지

// 리모컨 계속 눌림값(FFFFFF)이 수신 되지 않게 하려면 300ms이상으 조절

}   



▶ 실행영상 :  

(전체화면 보기로 보세요)



▶ 아두이노 파일다운 :

irRemote_Serial.ino



반응형
반응형

【 아두이노 센서#34】 토양 센서( YL-38) Sensor 다루기 

 오늘은 토양의 수분을 감지해서 습도를 알아 낼 수 있는 센서에 다루어 보려 한다. 실제로 화분에 센서를 꽂아 넣고 습도를 측정한 후 미니 물펌프를 이용하면 화분의 수분이 건조해 질 때 마다 물을 공급해 질 수 있는 장치를 간단히 구현 할 수 있다.  이 장치에 대해서는 차기에 구현해서 올려 보도록 하고, 오늘은 습도센서 자체에 대해 알아보려 한다.




▶ 선수 학습 :

 없음. 


▶ 토양 습도 센서 사양 및 동작 특성




 습도 센서 종류가 아래처럼 두 가지 모델이 있는데, 별다른 기능의 차이는 없으며, 핀 배열이 조금 다를 뿐이다.





▶ 실습 목표 :  


1. 습도 센서의 작동 원리를 이해 할 수 있다. 


2. 센서로부터 받은 데이터 값을 시리얼 모니터로 표시 해볼 수 있다. ( 데이터 처리 가능)



▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    센서에다 이컵 혹은 티슈에 물을 적셔서 센서 습도를 조절하여 테스트 한다. 
3.   센서의 출력 단자 A0로 부터의 출력값을 아두이노의 A0포트로 입력 받아 시리얼 모니터를 통해 값의 변화를 확인 해 본다. 


▶ 프로그램 코드 및 설명 : 

/* 토양 습도 센서( Ground Humidity) 실험   */



#define A0Pin 0

int sensorVal = 0;



void setup( )  {

  Serial.begin(9600);

}


void loop() {

sensorVal = analogRead(A0Pin);  // 토양센서 센서값 읽어 저장

  delay(1000);

  Serial.print("Asensor = ");

  Serial.println(sensorVal);  // 0(습함) ~ 1023(건조)값 출력 

   

   // 습도 값에 따라 출력 처리 다르게 해줌

  if ( sensorVal <= 450) {    

    Serial.println(" Very Wet ! ");        

  }

  if (sensorVal > 500 && sensorVal <= 1000) {

    Serial.println(" It's OK ! ");    

  }

  else if ( sensorVal > 1000){

    Serial.println(" Very Dry ! ");    

  }

}



▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

GroundHumidity.ino



반응형
반응형

【 아두이노 센서#33】 인체감지 센서( HC-SR501) Sensor 다루기 



  오늘은 인체를 감지해서 신호를 내보낼 수 있는 센서에 대해 다루려고 한다.

모델 번호가 HC-SR501 인 센서는 아파트나 회사등 각종 건물 천정에 많이 부착되어 있어서 주변에서 많이 볼 수 있는 센서이기도 하다. 

 아파트 현관문이나 복도, 베란다 등에 사람이 감지되면 전등을 잠시 동안 켜주거나, 문이 닫힌 사무실 내의 움직임을 감지하는 방법용 등으로 많이 사용된다. 




▶ 선수 학습 :

 없음. 


▶ 충격 감지 센서 사양 및 동작 특성





▶ 실습 목표 :  


1. 인체 감지 센서의 작동원리에 대해 이해 할 수 있다. 


2. 센서에 부착된 가변저항과 점퍼선의 기능에 대해 이해 할 수 있다. 



▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)







▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    센서에 있는 두 개의 가변저항을 조절하여, 센싱되는 민감도와 출력값의 출력 시간을 조절 해본다.   
3.   트리거 모드 점퍼를 변경해서 실험해 본다.
( - Single Trig 모드 : 센서 출력이 HIGH가 되고, Delay Time이 끝나면 자동적으로 LOW가 되는 모드.
 - Repeat Trig 모드 : 센서 출력이 HIGH가 되고 Delay Time이 끝나도 만약 계속 인체 신호가 감지 된다면 LOW를 출력하지 않고 계속 HIGH를 출력하는 모드.)  

▶ 프로그램 코드 및 설명 : 

/* 인체 감지 센서(Shock Sensor) 실험   */


int Led = 8;

int SensorOut = 7;

int val;



void setup( )  {

  pinMode(Led, OUTPUT);

  pinMode(SensorOut, INPUT);

}


void loop() {


val = digitalRead(SensorOut);  // 적외선 센서값 읽어 저장

  if (val == HIGH)  {

    digitalWrite(Led, HIGH);

  }  

  else  {

    digitalWrite(Led, LOW);

  }

  delay(100);  

}



▶ 실행영상 :  

(전체화면 보기로 보세요)





▶ 아두이노 파일다운 :

HC-SR501.zip



반응형
반응형

【 아두이노 센서#31】 쇼크 센서( 충격감지) Shock Sensor 다루기 

  오늘은 쇼크센서라고 하는 충격 감지 센서에 대해 다루어 보려고 한다. 

틸트센서는 정해놓은 위치에 기울기가 바뀌면 스위치 기능 처럼 On / Off 할 수 있었다면, 쇼크센서는 외부 충격(흔들림, 떨어뜨림, 부딪힘)에 모두 반응 하는 센서이다.  다만, 충격의 강도나 크기 자체를 특정 할 수 없기 때문에 실험을 통해 반응하는 정도를 확인해보고, 필요하다면 다른 센서와 함께 보완적으로 사용하면 좋을 것이다.



▶ 선수 학습 :

 없음. 


▶ 충격 감지 센서 사양 및 동작 특성



▶ 실습 목표 :  


1. 외부 충격에 따라 센서가 반응 하는 정도를 살펴 볼 수 있다. 


2. 흔듬, 충격, 기울임 등 센서가 반을 할 수 있는 다양한 형태에 대해 실험 해 볼 수 있다. 



▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)




▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    외부 충격이나 흔듬, 기울이기 등 다양한 형태로 센서의 반응을 살펴 본다. 
3.   외부 충격이 있을 때 LED를 켜는 동작으로 프로그래밍 한다. (현재는 LED를 사용하지만 릴레이 등을 연결하여 더 큰 부품이나 회로를 제어 할 수 있다는 것을 이해한다.)

▶ 프로그램 코드 및 설명 : 

/* 충격 센서(Shock Sensor)의 동작을 LED로 확인해보기   */


int Shock = 3;

int ShockLED = 7;


void setup( )  {

  pinMode(Shock, INPUT);

  pinMode(ShockLED, OUTPUT);

}


void loop() {


  if (digitalRead(Shock) == HIGH)    {

      digitalWrite(ShockLED, HIGH);

delay(30);

  }


  else   {

      digitalWrite(ShockLED, LOW);      

      delay(100);  

  }

}



▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

ShockDetected.ino

반응형
반응형

【 아두이노 센서#30】 틸트센서( KY-017) Sensor 다루기 


  오늘은 틸트 ( Tilt Sensor)를 다루어 보고자 한다. 일명 기울기 센서라고 하는데, 기울기가 변화되는 것을 감지해서 무언가를 작동시킬 수 있는 스위치의 역할로 사용할 수 있다. 





▶ 선수 학습 :

 없음. 


▶ IR 센서 사양 및 동작 특성





▶ 실습 목표 :  


1. 틸트 센서를 기울여 기울기에 따른 스위치 동작을 이해 할 수 있다. 


2. LED를 연결하여 틸트 센서의 동작에 따른 LED를 On /Off 할 수 있다.


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    틸트 센서 내부에 있는 기울기용 스위치 역할 을 하는 물질은 수은이기 때문에 유리관이 깨지지 않도록 주의 해서 다룬다. 
3.    LED를 별도로 넣어 센서를 기울여 보고 LED가 On/Off 되는지 확인한다.(기울기에 따른 동작의 민감도를 직접 확인 해본다. ) 

▶ 프로그램 코드 및 설명 : 

/* 틸트 tilt 센서의 동작을 LED로 확인해보기   */


int Led = 8;

int SwOut = 7;

int val;


void setup() {

  pinMode(Led, OUTPUT);

  pinMode(SwOut, INPUT);

}


void loop() {

  val = digitalRead(SwOut);  // 틸트센서 센서값 읽어 저장

  if (val == HIGH)

  {

    digitalWrite(Led, HIGH);

  }

  else

  {

    digitalWrite(Led, LOW);

  }

  delay(100);  

}



▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

Tilt_SW.ino




반응형