반응형

【 아두이노레오나르도활용#6사람이 감지되면 홍보 동영상 플레이 시키기!
   ( Movie Play! with Arduino Leonardo using Ultra Sonic Sensor! )

 아두이노 레이나르도 보드와 초음파 센서를 이용해서 모니터 앞으로 사람이 다가서면, 홍보용 동영상을 자동으로 띄워 재생 시킬 수 있는 응용품에 대해 다루고 있습니다. 

 

 - 이번 영상에서는 아두이노 레오나르도 보드와 초음파 센서를 이용해서 사람이 다가서면 PC에 있는 홍보영상이 자동으로 플레이되도록 구현해보겠습니다.

 코드가 간단하며, 아두이노 보드 종류 중에, 키보드와 같은 HID 장치로 인식이 되는 레오나르도 보드나 프로마이크로 보드를 이용하면 손쉽게 PC에 있는 영상을 단축키로 지정해서 플레이할 수 있게 됩니다.

 

【 이전 영상 보기 

【영상 강의 보기-YouTube

아래 영상 클릭 ~!

 

[ 강의 내용 요약 ]

1. 부품 준비

 

2. 회로 연결

 

3. 아두이노 코드

/*  초음파 센서로 동영상 실행시키기             */
/*  라이즈이IOT http://Rasino.tistory.com   */
#include 
int distance;
int triggerPin = 6;
int echoPin = 7;
void setup() {
  Keyboard.begin(); //키보드 컨트롤 관련 함수 선언  
  Serial.begin(9600); 
  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정
  pinMode(echoPin, INPUT);       // 에코 핀을 입력으로 설정
}
void loop() {
  digitalWrite(triggerPin, LOW);    // 트리거 핀 초기화
  digitalWrite(echoPin, LOW);      //  에코 핀 초기화
  delayMicroseconds(2);      // 트리거 핀으로 10 us의 펄스를 발생
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW); 
  distance = pulseIn(echoPin, HIGH)/58; //에코핀 입력의 거리값을 cm단위로 계산
  Serial.println("Distance(cm) = " + String(distance));
  delay(1000); 
  if (distance < 20) {       // 물체(사람)가 20cm 이하 되면 감지(LED경보 작동)
    Keyboard.press(KEY_LEFT_CTRL); // '왼쪽 Ctrl 키'
    delay(2);  
    Keyboard.press(KEY_LEFT_ALT);  // '왼쪽 Alt 키'
    delay(2);  
    Keyboard.press('1'); // 숫자'1' 
    delay(500);          // 시간지연을 두어 여러번 실행되는 것을 방지함
    Keyboard.releaseAll(); // 키를 계속 누르지 있지 않도록 함
    delay(10000);
  }
}

 

4. 아두이노 코드 직접 다운로드 

: 다운받은 후 압축파일을 풀고 사용하세요

UltraPlayer.zip
0.00MB

 

 

5. 동작확인

: 작동은 위 유튜브 영상을 통해서도 확인 가능합니다.

 

 

6. 상세 설명

  - 위 회로도를 보고 초음파 센서와 보드를 연결해주세요

  - 네오나르도 보드는 키보드나 마우스와 같은 HID 장치로 인식하기 때문에, 처음 PC와 연결할 때 장치 드라이버 설치가 필요합니다.

- 다음으로 플레이를 시킬 동영상을 준비합니다. 그리고 PC에 동영상 플레이어가 설치되어 있으면 됩니다. 영상에서는 다음 카카오플레이어가 설치되어 연결 되어 있습니다.

 

- 동영상을 플레이시키는 원리는 이렇습니다. 네오나르도 보드는 PC를 통해 키보드의 키입력이 가능합니다. 따라서 동영상을 단축키로 지정해서 실행 시키면 됩니다.

 

- 그럼 동영상을 단축키로 지정하기 위해 바로가기 아이콘을 바탕화면에 만들어 보겠습니다.

- 찾아 보기를 눌러 플레이시킬 동영상을 선택해줍니다.

- 이름을 적당히 정한 후 확인을 눌러 줍니다.

- 바로가기 아이콘에서 마우스 우클릭 후 속성을 클릭합니다.

- 바로가기 키 항목에서 ctrl + Alt 키를 동시에 누른 상태에서 숫자 1을 입력합니다.

- 사실 숫자 1만 입력하여도 Ctrl+Alt키는 자동 입력됩니다.

- 그럼, 단축키가 제대로 먹히는지 ctrl+Alt+1을 눌러봅니다.

 

- 동영상이 잘 실행됩니다.

- 하지만 문제는 동영상이 전체화면 모드로 실행되지 않습니다.

 - 이럴때는 플레이어 옵션에서 동영상 실행시 전체화면 모드로 실행 옵션을 찾아서 체크해주면 해결 됩니다.

 - 카카오 팟플레이어의 경우 왼쪽 상단의 설정메뉴로 들어가보면 환경설정 메뉴가 있습니다.

 

 - 환경설정으로 들어가서 재생항목에 보면, 재생시 창 크기 설정이 있고, 여기를 최대화 화면으로 설정해주면 됩니다.

 - 그럼 보드를 연결하고 코드를 업로드 해줍니다.

 

「 이 과정에서 OS버전이나 PC환경에 따라 업로드가 잘 안 되는 문제가 생길 수 있는데, 레오나르도 보드의 특성상 키보드장치로 인식이 되어 있을 때 업로드를 위한 통신이 안 되기 때문입니다. 이럴 때는 업로드 버튼을 누르자마자 보드의 리셋키를 눌러 키보드 장치 인식이 끊어진 순간 데이터를 업로드 하면 해결되는데, 타이밍을 잘 맞추어야 합니다.

현재는 업데이트 되어 자동으로 장치 인식기능을 켜고 끄면서 업로드가 자연스럽게 잘 됩니다.

만약, 그 밖의 에러가 날 경우, 통신포트가 제대로 체크되어 있는지? 네오나르도 보드로 선택이 잘 되어 있는지 한 번더 확인해보세요.」

 

 - 코드를 살펴보면, 초음파 센서로 물체와의 거리 값을 구해냅니다.

 distance = pulseIn(echoPin, HIGH)/58; //에코핀 입력의 거리값을 cm단위로 계산 

 

 - 그래서 물체가 20cm 이하로 들어오게 되면, 동영상의 바로가기 아이콘에서 지정해 놓은 단축키를 누르도록 코딩이 되어 있기 때문에 영상에서처럼 동영상이 자동으로 실행이 됩니다.

  if (distance < 20) {       // 물체(사람)가 20cm 이하 되면 감지(LED경보 작동) 
    Keyboard.press(KEY_LEFT_CTRL); // '왼쪽 Ctrl 키' 
    delay(2);   
    Keyboard.press(KEY_LEFT_ALT);  // '왼쪽 Alt 키' 
    delay(2);   
    Keyboard.press('1'); // 숫자'1'  
    delay(500);          // 시간지연을 두어 여러번 실행되는 것을 방지함 
    Keyboard.releaseAll(); // 키를 계속 누르지 있지 않도록 함 
    delay(10000); 
  } 

 

- 마지막으로 시리얼 모니터창을 열어 측정되는 거리값과 함께 영상이 잘 실행되는지 확인해보세요.

만족스럽게 실행이 잘 될 것입니다.  ^^

 

 

만약 PC를 라즈베리파이로 바꾼다면 더욱 소형화 시킨 작품을 만들 수 있겠네요.

 

 

 

오늘 학습내용은 여기까지 이며,  다음 학습영상을 기대해주세요~

감사합니다. ~~~ ^^

 

 

=== 아두이노 네오나르도 에러 잡기! ===

1. 만약 아래와 같은 HID.h  HID.cpp 에러가 난다면, HID.cpp 파일을 아래 경로에서 찾아 백업후, 삭제를 하거나 파일명을 변경해 놓는다.

 

[ 에러 증상 ]

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HID.cpp:17:10: fatal error: Platform.h: No such file or directory
 #include "Platform.h"
          ^~~~~~~~~~~~
compilation terminated.
"Keyboard.h"를 위한 복수개의 라이브러리가 발견되었습니다
 사용됨: C:\Program
"HID.h"를 위한 복수개의 라이브러리가 발견되었습니다
 사용됨: C:\Program
exit status 1
보드 Arduino Leonardo 컴파일 에러.

 

[ 에러 해결법 ]

HID.cpp 파일을 아래 경로에서 찾아 백업후, 삭제를 하거나 파일명을 변경해 놓는다.

경로 : C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

( ※ 아두이노가 설치된 환경이 다를 수 있으므로, 'avr  이부분을 참고하여 찾거나, 찾기 명령으로 ' HID.CPP ' 파일을 찾아서 처리한다. )

 

 

반응형
반응형

【 레오나르도활용#3】 온도& 밝기값 PC비주얼화 하기 (Leonardo

 아두이노 레오나르도(Leonardo)를 통해 온도 센서와 광센서(CDS)의 데이터를 실시간으로 PC로 수집도 하고, 이 데이터를 프로세싱(Processing) IDE를 통해 보기 좋게 비주얼화 해보자.  물론 이렇게 수집된 데이터는 엑셀로 차트를 만들어 볼 수 있어 이번 프로젝트는 활용도가 매우 높다.  코딩도 생각만큼 길지 않으니 차근차근 해보면 어렵지 않다. 
그럼 재미있게 즐겨보자~!    Let's go~!

 

▶ 선수 학습 :
      1. [레오나르도 활용#1] 레오나르도 보드 사용법(보드 스펙& 설치-연결 참조) ☜(클릭)

      2. [레오나르도 활용#2] 온도와 밝기 값 PC로 수집하기(회로 연결 참조) ☜(클릭)
      3. [아두이노 센서#3] TMP36 온도 센서 (온도센서 참조)  ☜ (클릭)
      4. [아두이노 센서#3] 포토레지스터(CDS) 제어(cds 광센서 참조)  ☜ (클릭)

▶ 실습 목표 :  
 1. [ 레오나르도 보드에 온도센서(Tmp36)와 광센서(cds) 회로를 연결하고 동작시킬 수 있다.
 2. [ 온도센서와 광센서로 부터의 데이터 값을 PC메모장을 통해 전송시킬 수 있다.]
 3. [ 전송된 데이터를 엑셀 등을 이용해서 활용해 볼 수 있다 ]
 

 4. [ 전송된 데이터를 프로세싱 IDE 코딩을 통해 보기 좋게 비주얼화 시킬 수 있다. ] 

 

▶ 실습 회로도면 :  앞선 실습1과 회로 연결은 동일합니다.
  (이미지 클릭하면 확대 가능)

 

▶ 실행 결과 이미지 :

온도 밝기 센싱값 출력화면

【아두이노 코딩】  : 
/* Leonardo 보드로 온도 & 밝기 데이터 수집하기 */

#include <Keyboard.h>   
const int TEMP = 0;    // A0 포트 
const int CDS = 1;    // A1 포트  
const int LED = 12; 
const int BUTTON = 11; 
boolean lastBtn = LOW; 
boolean currentBtn = LOW; 
boolean running = false; 
int counter = 1;

void setup ( ) {  
  pinMode(LED, OUTPUT);
  Keyboard.begin();
}

void loop ( )  {
  currentBtn = debounce (lastBtn); 
  if (lastBtn == LOW && currentBtn == HIGH) //버튼 누름 
  { 
     running = !running;   // 상태 값 반대로 변경 
   } 
  lastBtn = currentBtn; // 버튼 상태값 업뎃 
  if (running) // 데이터 기록 중 
  { 
     digitalWrite(LED, HIGH); 
     // millis() 함수는 데이터를 ms 단위로 반환해 줌, 백그라운드 동작 
     // delay() 함수를 사용할 수 없을 때 사용 
   if (millis()%1000 == 0) // 1초마다 if문을 실행 
   { 
      int temperature = analogRead(TEMP); 
      int  brightness = analogRead(CDS);
      float mVoltage = temperature*5000.0/1024.0; //섭씨온도 값 변환 
      float TempDotC = (mVoltage - 500) / 10.0;   //섭씨온도값 변환 
      Keyboard.print(counter);  // 데이터 앞줄마다 번호 매김 
      Keyboard.print(",");
      Keyboard.print(TempDotC);  // 온도 데이터
      Keyboard.print(",");
      Keyboard.print(brightness);   // 밝기 데이터
      Keyboard.print("\n");
      counter++;
    }     
  } 
  else 
  { 
    digitalWrite(LED, LOW); 
  } 
}

//버튼의 체터링 현상 방지를 위한 서브 함수 생성 
boolean debounce (boolean last) 
{ 
  boolean current = digitalRead (BUTTON); 
  if(last != current) 
  { 
    delay(5); 
    current = digitalRead(BUTTON); 
  } 
  return current;     
}

▶ 아두이노 파일다운 :
(다운로드하여서 압축을 풀어 사용하세요)

Leo_2_TMP36_CDS_LED_LIGHT.zip
0.00MB

 【프로세싱 코딩】  : 
/* Leonardo 보드의 온도 & 밝기 데이터 비주얼화 하기 */

PImage imgCDS;
PImage imgTemp;
PFont font;
import processing.serial.*; 
Serial port;
String temp ="";
String br ="";
String data="";
int index=0;
void setup () {
  size(800, 600);    // 출력 화면 크기 설정
  background(255);
  port =new Serial(this, "COM21", 9600);  //보드와 통신 포트 번호를 일치시킴
  port.bufferUntil('.');
  font=loadFont("Arial-Black-50.vlw");   // 출력에 표시할 폰트 지정
  textFont(font, 200);                        // 출력 폰트 사이즈 조절  

}
void draw() {
  background(255,255,255);
  imgTemp = loadImage("Temp1.png");   // 온도 이미지 삽입 
  imgCDS = loadImage("cds1.png");       // cds 이미지 삽입 
  image(imgTemp, 0, 0);                 // ('이미지 이름', '위치 x', '위치 y')
  image(imgCDS, 450, 10, 250,250); //('이미지 이름', '위치 x', '위치 y', '폭', ;높이') 
  fill(150, 150, 10);
  text(temp, 70, 500);            // ('데이터 변수명', '위치 x', '위치 y')
  fill(50, 0, 200);
  text(br, 450, 500);  

}
  void serialEvent(Serial port) {   // 통신 데이터가 있을 경우 실행
  data=port.readStringUntil('.');   // 마침표를 읽을 때까지 이벤트를 실행 
  data=data.substring(0, data.length()-1); // 첫 번째 데이터 값 저장
  index=data.indexOf(",");           // 데이터를 '콤마' 기준으로 구분
  temp=data.substring(0, index);  
  br=data.substring(index+1, data.length());  // 두 번째 데이터 값 저장
}

 

▶ 프로세싱 코드 다운로드 :
(다운로드하여서 압축을 풀어 사용하세요)

imageTempCDS (Ras).zip
4.87MB

▶ 프로세싱에서 글꼴 생성
(프로세싱 출력 화면에서 윈도의 폰트를 사용하기 위해서는 아래와 같은 과정을 통해 , 프로세싱에서 사용할 수 있는 비트맵 형태의 폰트로 변환하는 과정이 필요하다)

[ 도구 메뉴 》 글꼴 생성 》 폰트(크기) 선택 》 OK클릭 》 파일 이름 복사 》 프로세싱 코드에 붙여 넣기 ]

 

▶ 영상강좌 :  
(전체 화면 & 고화질 보기로 보세요)

https://youtu.be/Hdi8QHBYS2I

 

(카카오로 TV로 보기)

 

▶ 에러 대처 :  
【 아두이노 IDE에서 스케치를 실행할 때 아래와 같은 에러가 나타날 경우 

 'Keyboard' 가 없습니다. 스케치에서 '#include '를 포함했나요?

 분명, 'Keyboard.h 헤더 파일을 추가하였지만 에러가 나게 되는데  
만약 위와 같은 에러가 나타난다면, 아두이노 스케치에서 툴 메뉴 아래 보드 메뉴에서 보드를 Leonardo 보드로 선택을 하였는 확인이 필요하다.  보드 선택이 Leonardo로 선택이 되어 있지 않다면, 컴파일만 하더라도 실행이 되지 않고 이와 같이 'Keyboard' 에러를 발생시키게 된다.  

 

반응형
반응형

 아두이노Proj#5 아두이노 스마트 화분 만들기 Ver 3 with LCD

 지난시간 스마트 화분을 만들고 수분의 상태를 간단히 체크할 수 있는 FND ( 7 Segment)를 부착해 보았다.

이번에는 여기에 LCD를 추가하여 화분의 수분 상태를 좀더 그럴싸(?)하게 출력해보고자 한다.

아울러 이런 과정을 통하여 LCD를 다루는법과 코딩 연습에도 도움이 될 것이다. 

 처음부터 멋지게 코딩을 잘짜는 천재는 없다. 이것 저것 여러가지 방법으로 직접코딩해보고(Ctrl+C, Ctrl+V는 지양) ,수많은 연습을 거치면서 경험이 쌓이다 보면 코딩이 점점 쉬워지며, 비로소 코딩능력이 갖춰지는 것이다.  무엇보다 할 수 있다는 자신감을 갖는 것이 중요하다. 태어나면서 부터 코딩전문가가 따로 있는 것이 아니지 않는가?
 지금의 어떤 분야 전문가들도 기껏(?) 대학때 공부한 것으로 전공을 정해서 시작한 후로 제대로 공들인 시간은 그렇게 많지는 않을 것이다. 그 어떤 완전 무지한 분야라도, 그래서 생초보부터 시작하더라도 집중과 몰입을 해준다면 충분히 그 분야 전문가 수준의 역량을 쌓을 수 있다.   그러니 스스로 "나는 저쪽은 잘 몰라?", "저 것은 할 수 없을 거야?"  라는 스스로의 한계선을 미리부터 긋지 말았으면 한다.

 

다시 본론으로 돌아가서,  지난시간 토양습도센서 모듈에서 나오는 아날로그 출력 단자(AO) 값(0V~5V)을 아두이노의 아날로그 입력(A0)단자로 받아서 FND로 출력해 보았다. (0~9의 10단계 숫자 값) 

맵핑이라는 함수를 사용하여 쉽게 처리 할 수 있었는데,  ex)  map(sensorVal, 0, 1023, 9, 0); 

 이번에는 여기에 LCD를 추가하도록 해볼 예정이다. LCD상에 숫자도 표현하고, 화분속의 수분의 상태를 직관적으로 알수 있도록 레벨바 형태로 표시해보고자 한다.   (오늘 과제에서 FND 부분은 생략해도 상관이 없다)

 

▶ 선수 학습 :

   1. [아두이노 센서#34]  토양 센서( YL-38) Sensor 다루기  ☜ (클릭)

   2. [아두이노 기초#11] FND 구동실습 II (숫자 카운트하기)  ☜ (클릭) 

   3. [아두이노 센서#14]     ...I2C LCD 사용하기    ☜ (클릭) 

   4. [아두이노 프로젝트#1] 아두이노 스마트화분 만들기Ver1 ☜ (클릭) 

   5. [아두이노 프로젝트#2] 아두이노 스마트화분 만들기Ver2 ☜ (클릭) 

 

 토양습도센서 (YL-38 , YL-69) 세부 스팩

  ※ 위 선수 부분 참조

 

 워터 펌프 스팩

  ※ 위 선수 부분 참조

 

▶ 실습 목표 :  

  1. [ 토양습도 센서에 대해 이해 할 수 있다. 

 2. [ 워터펌프에 대해 이해 할 수 있다. ]

 3. [ 토양 센서 값에 따라 펌프를 작동시켜 물공급 조절을 할 수 있다.]

 4. [ FND에 숫자를 표현 할 수 있다 ]

 5. [ 습도 data를 숫자 0~9 값으로 맵핑해 출력 할 수 있다 ]

 6. [ LCD를 레벨바 형태로 표현하고 다룰 수 있다.]

 

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

[ 위 회로에서 주의 하셔야 할 것은  아두이노 회로에서 주로 사용되는 TR의 경우(2SA, 2SC타입)  NPN형 타입은 PNP형 타입과 마찬가지로 핀의 순서가 있으니 주의 하셔야 합니다. 

우선, 도면에 사용된 NPN형 TR은 2SC9011 이며, 라벨이 적인 면의 왼쪽을 기준으로 핀 이름이 
1.   2SC9011 :  - E B C -  순서로 되어 있고, 

2.   2SC1815 :  - E C B - 순서로 되어 있으니 반드시 확인 후 연결하세요. 

 

- C9011과 C9012, C9013은 모두 핀 배열이 동일함( E B C)

또한, 이외의 TR을 사용할 경우 미니 테스터기 혹은 인터넷 검색으로 핀 순서를 확인하여 도면대로 연결하시면 문제 없이 동작 할 거예요. ]

 

[ 추가로 위 회로의 모터 연결 방식은 장시간 사용하기에는 좀 무리가 따르며, 전원을 별도로 넣어 줄 수 있는 릴레이 모듈이나, L298 모터 드라이버 모듈을 연결해서 사용하시는 걸 권장합니다. 조만간 보강된 회로의 업로드 버전도 올려 볼게요. ^^; ]   

 

▶ 실습 절차  : 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   물펌프는 물통 속에 담겨진다. 따라서 물펌프의 전선이 빠져나오는 부분은 필요한 경우 글루건 등으로 보강처리 할 필요가 있다. 

3.  우선 본 실험처럼 작은 물통을 준비하고, 간이 화분을 준비해서 실험을 해 본 후 실제 화분에 설치해보면 좋을 것이다. 또한 필요한 경우 센서를 두 개 이상 설치할 수도 있고, 두개의 화분을 하나의 보드로 연결하여 관리 해 볼 수 있을 것이다.

4.  선수학습을 참고하여 FND를 다루는 법을 먼저 익혀보고, 아래 코드에서 처럼, 배열과 for 구문을 이용하여 FND를 좀더 세련되게 코딩하는 법에 대해 숙지 하면 좋다. 

5. 처음 LCD를 다루는 사람은 선수 학습부분을 참고하면 도움이 되며, 여기서는 단순 숫자 값을 그래픽 형태의 레벨바로 표현해 보는 실습이다.  여기에 본인만의 아이디어를 추가하여 연습해보면 코딩 연습에도 도움이 될 것이다.

 

▶ 프로그램 코드 및 설명 : 

/* Auto Water Pot - 자동 물공급 화분 with LCD */

#define A0Pin 0

#include <LiquidCrystal_I2C.h>       // i2c LCD 사용위한 선언

LiquidCrystal_I2C lcd (0x27, 16,2);    // (고유ID, 16칸2줄LCD)

int sensorVal = 0;

int pump = 9;

byte digits[10][7] = {

//  {a,b,c,d,e,f,g}   FND 핀 배열

    {1,1,1,1,1,1,0},      // 0을 출력

    {0,1,1,0,0,0,0},      // 1을 출력

    {1,1,0,1,1,0,1},      // 2를 출력

    {1,1,1,1,0,0,1},      // 3을 출력

    {0,1,1,0,0,1,1},      // 4를 출력

    {1,0,1,1,0,1,1},      // 5를 출력

    {0,0,1,1,1,1,1},      // 6을 출력

    {1,1,1,0,0,1,0},      // 7을 출력

    {1,1,1,1,1,1,1},      // 8을 출력

    {1,1,1,1,0,1,1},      // 9를 출력

};
void setup ( ) {
 Serial.begin(9600); 

 lcd.begin();              // LCD 시작 & 초기화

 lcd.clear();
 
pinMode(pump, OUTPUT); 

 for (int i=2; i<9; i++) {

      pinMode(i,OUTPUT);    // 2~8번, 9(pump) 포트 모두 출력 설정 

  } 
}

 

void displayDigit(int num)   {    // FND 숫자표시 함수

  int pin = 2;
  
for (int i=0; i<7; i++)     {       
    
digitalWrite(pin+i, digits[num][i]);   

  }
}
void loop ( ) {  
  
int FNDVal=0;
  
sensorVal = analogRead(A0Pin);        // 토양센서값 읽어 저장

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

  FNDVal = map(sensorVal,0,1023,9,0); // 습도값을 FND 출력값으로 맵핑
  // 매우습함 : 9,  매우건조 : 0

  displayDigit(FNDVal);                       // FND에 숫자를 표시한다.
  
// 습도 값에 따라 출력 처리 다르게 해줌

  Serial.print("FND Val =");

  Serial.println(FNDVal);

  lcd.clear();

  lcd.setCursor(0,0); 

  lcd.print("Dry---------Wet");           // 첫 줄에 적힐 내용

  lcd.setCursor(7,0);                       // 첫 줄 8째 칸으로 커서 이동

  lcd.print(FNDVal,1);                      // FND 출력 값을 LCD 첫 줄 가운데 출력

  lcd.setCursor(2,1);                        // 두 번째 줄에 3째 칸에 커서 위치

 switch(FNDVal) {
   
case 1:
     
lcd.print("                ");           // 남아 있던 레벨바 잔상 제거
      lcd.write(B11111111);              // 레벨바 모양의 아스키 코드 값
     
break;

    case 2:
     
lcd.print("                ");
     
lcd.write(B11111111);
     
lcd.write(B11111111);
     
break;

    case 3:
     
lcd.print("                ");      
     
for (int i=0; i<3; i++) {       // FNDVal 숫자 만큼 레벨바 생성

        lcd.write(B11111111);
      }
     
break;

    case 4:
     
lcd.print("                ");
     
for (int i=0; i<4; i++) {
       
lcd.write(B11111111);
      }
     
break;

    case 5:
     
lcd.print("                ");
     
for (int i=0; i<5; i++) {
       
lcd.write(B11111111);
     
}

      break;    
   
case 6:
     
lcd.print("                ");   
     
for (int i=0; i<6; i++) {
       
lcd.write(B11111111);
      }
     
break;     

    case 7:
     
lcd.print("                ");   
     
for (int i=0; i<7; i++) {
       
lcd.write(B11111111);
     
}

      break;     

    case 8:
     
lcd.print("                ");   
     
for (int i=0; i<8; i++) {
       
lcd.write(B11111111);
      }
     
break;     

    case 9:
     
lcd.print("                ");   
     
for (int i=0; i<9; i++) {
       
lcd.write(B11111111);
      }
     
break;     
 
}

// 값이 '2'이하로 건조해지면 1초동안 펌프작동

if ( FNDVal <= 2) {   

    Serial.println(" Very Dry ! ");       

    Serial.println(" Punping for 1 Second ! ");       

    digitalWrite(pump, HIGH);   

    delay(1000);     // 펌프 작동시간 설정(1000→1초)

  }

  else {

    Serial.println(" Very Wet ! ");   

    digitalWrite(pump, LOW);  // 펌프작동 멈춤
 
}   
  delay(3000);      //정보수집 시간(간격) 설정

}                             

 

▶ 실행영상 :  

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

(아래는 유튜브로 시청하기)

▶ 아두이노 파일다운 :

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

RasINO_AutoPotFND_LCDok.zip
0.00MB

 

【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.   크게 아래와 같은 두 가지 형태를 보이는데요, 

 

▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!

 

 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치  라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"

 

2. 또 한가지 LCD관련 에러는 ,  no matching function for call to ‘LiquidCrystal_I2C::begin();   라고 뜨는 경우!

 라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요.  그래서 만약 제가 실험에서 사용한 라이브러리가 아닌,  같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다.    라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다.    그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요,   이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다.   그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나,  다른이름으로 임시 변경해 놓거나,  나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다. 

 

 그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠? 

찾는 위치는 보통 아래 두 곳입니다.  (윈도우10 기준이며, 윈도우7도 비슷한 위치) 

 

두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로),   '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다. 

 

< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >

 1. C:\Users\유저-이름\Documents\Arduino\libraries    

 

 <라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >

 2. C:\Program Files (x86)\Arduino\libraries

 

위 두 곳에서 찾아서 삭제를 하세요.   (그냥, 폴더 째로 삭제하면 됩니다.)

 그리고 아래 첨부하는 라이브러리를 다운받아  압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요. 

만약, 압축파일 그대로 추가할 때 에러가 난다면,  앞축을 풀고  xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다.    이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.

 

 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip
0.01MB

  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

(추가) L9110S 모터 모듈을 보강한 회로도:

 앞서의 회로는 기본 아두이노 전원으로 LCD와 FND 그리고 모터를 돌려야 하기 때문에 동작이 조금 불안정 할 수 있어요.   따라서 모터에 공급되는 출력을 증폭시켜 줄 수 있는 모터드라이버 모듈을 보강한 회로와 관련 코드를 첨부하니 참고하세요.    참고로, 그래도 불안정할 경우, 모터드라이버 모듈에 별도의 전원 3.5V~5V(펌프모터 허용 전압)을 공급해주면 훨씬 안정적이고 더욱 오래 작동됩니다.  이때, GND를 아두이노 회로의 GND와 합선(결합) 시켜 주면 됩니다.

< L9110S 모듈 스팩 참고 >

2019/05/07 - [아두이노/3. 아두이노 모듈] - 【 아두이노모듈#15】 L9110S #1(모터 드라이버) 모듈 사용하기

 

이미지를 클릭하면 확대 되며, 아래 클릭하여 다운로드도 가능해요
(Ras2-보강)WaterPotL9110_도면.png
0.49MB

 

[ L9110S 모터 드라이버 모듈 추가한 코드 다운로드 받기 ]

AutoPotFND_LCD_L9110S.zip
0.00MB

[ 작동영상 ]

 

 

  개인적인 견해로,  위의 회로들은 작품의 구현과 비주얼을 위해 LCD를 달았는데요, 전원소모가 좀 있고, 모터와 같이 돌리다 보니, 다소 불안정 하기도 해서,  LCD는 빼고 하셔도 좋습니다. 

 그리고 가장 일반적으로 많이 사용하는 그래서 초급자 분들도 접근하기 쉽도록 우노 보드로 제작하였는데요?   좀더 실용적이려면,  아두이노 보다 작은,  나노보드나, 프로미니 같은 보드로 제작하면, 전력소모도 줄고 크기도 줄어들어 실제 화분에 장착하기도 용이할 거예요. 

 

 

 [ 차세대 버전 예고 ]

 차기 버전에서는,  디스플레이 장치를 미니 OLED를 달고 ,  보드도 사이즈가 작은 보드를 사용하고, 리튬폴리머 배터리를 적용하여 실제로 화분에 부착할 수도 있는 사이즈로 제작할 예정입니다. 

또한, Wemos D1 mini 보드를 사용하여 화분의 습도 상태를 웹의 서버에 기록하도록 해볼 예정입니다. 

 차세대 버전 링크 :

『 매번 물 주기 귀찮은 화분! 말라죽는 우리 집 화분을 구해주세요! 』 아두이노 활용 프로젝트 콘텐츠 소개! 』

 

 

 

※ 주의! : 18650과 같은 리튬배터리는 직접적인 합선(쇼트)이나  회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하시기 바랍니다.

 

 

[ 다운받은 프리징 부품 입력시키는 방법 ]

 

 

위 본문에 사용한 프리징 부품 입니다  : 
(원래 기본 카테고리에 없는 부품들은 사용자 개인들이 만든 것을 구글검색으로 찾아 넣어야 합니다)

Fritzing Part 4개 압축.zip
0.06MB

프리징 부품 추가하는 방법 :

 압축을 풀고 그리고 있던 작업 파일에서  부품검색창으로 갑니다. 

검색창의 검색 목록중  '▽'를 제일 아래쯤으로 가보면,  MINE 혹은 TEMP 라는 비어있는 항목이 나올거에요.  거길 클릭한다음,  그 빈공간에 다시 마우스 우클릭 하면, Import...   새로운 저장소....  등등의 팝업 메뉴가 보일거에요. 

거기서 Import... 를 클릭해서  좀전에 다운받아 압축풀어 놓은 프리징 부품들을 선택하면 부품을 불러올 수 있고 회로도 그릴 때도 집어 넣을 수 있게 됩니다.  

 

 

반응형
반응형

【 아두이노Proj#3아두이노 스마트 화분 만들기 Ver1

 

 아두이노를 이용해 스마트 화분을 만들어 보자~!

우선 핵심기능으로 토양습도센서로 흙의 습도 값을 측정하여 일정 수치이하로 떨어지면(수분이 마르면) 워터펌프를 작동하여 물을 공급해주는 기능을 구현해 보려 한다. 

 아울러 !

 [ FND를 부착하여 수분정도를 알려주는 스마트화분 버전(Ver. 2)여기를 참고  ]

 [ FND와 LCD를 함께 부착하여 수분정도를 알려주는 스마트화분 버전(Ver. 3)여기를 참고  ]

 

▶ 선수 학습 :

   1. [아두이노 센서#34]  토양 센서( YL-38) Sensor 다루기  ☜ (클릭)

 

토양습도센서 (YL-38 , YL-69) 세부 스팩

< 센서모듈과 수분탐침을 연결한 모습 >

 

 

 

 

 

 시중에 YL-38, YL-69 두 종류가 있다, 기능상의 차이는 없으며 핀배열이 조금 상이할 뿐이다. 여기서는 YL-38을 가지고 제작 하려고 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 워터 펌프 스팩

 

 

 

 

 

 

 

 

 

 

 

 

< 워터펌프용 튜브 : 지름 6mm (외경:6mm, 내경:4mm) >

※ 위에 사용된 호수는 외경이 6 mm 이고 내경이 4mm 입니다. 그리고 펌프 출수구에 호수를 끼울때 호수를 출수구 바같으로 감싸듯 끼우게 되는데요, 펌프출수구의 외경이 7.4mm 됩니다. 이렇게 어느정도 역으로 크기 차이가 나야 호수가 수압에 의해 쉽게 빠지지 않습니다. 다만, 지금 정도의 차이에서, 끼워보니 상당히 빡빡했어요. 이럴때는 호수 내부에 물기를 살짝 묻혀서 끼워보면 조금 쉽게 끼워집니다.  ^^

 

▶ 실습 목표 :  

  1. [ 토양습도 센서에 대해 이해 할 수 있다. 

 2. [ 워터펌프에 대해 이해 할 수 있다. ]

 3. [ 토양 센서 값에 따라 펌프를 작동시켜 물공급 조절을 할 수 있다.]

 

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

< 스마트 화분 연결 구성도 >

※ 위 회로에 대해 모터 작동이 원활 하지 않을 수 있고, 장시간 사용시 아두이노 보드에 무리가 갈 수 있어 아래 처럼 NPN타입의 TR과 저항을 추가하여 보강하였다.  가급적이면 아래 회로를 참조하여 구성해주면 좋을 것이다.

(TR은 NPN 타입의 ' 2SC 9013 '을 사용하였으나,   TR 타입이 NPN타입 이면 어떤 것이든 동일하게 사용 가능하다. ) 

- C9011과 C9012, C9013은 모두 핀 배열이 동일함( E B C)

- C1815는 핀배열이 E C B 임

[ 위 회로에서 주의 하셔야 할 것은  아두이노 회로에서 주로 사용되는 TR의 경우(2SA, 2SC타입)  NPN형 타입은 PNP형 타입과 마찬가지로 핀의 순서가 있으니 주의 하셔야 합니다. 

우선, 도면에 사용된 NPN형 TR은 2SC9011 이며, 라벨이 적인 면의 왼쪽을 기준으로 핀 이름이 
1.   2SC9011 :  - E B C -  순서로 되어 있고, 

2.   2SC1815 :  - E C B - 순서로 되어 있으니 반드시 확인 후 연결하세요. 

또한, 이외의 TR을 사용할 경우 미니 테스터기 혹은 인터넷 검색으로 핀 순서를 확인하여 도면대로 연결하시면 문제 없이 동작 할 거예요. ]

 

[ 추가로 위 회로의 모터 연결 방식은 장시간 사용하기에는 좀 무리가 따르며, 전원을 별도로 넣어 줄 수 있는 릴레이 모듈이나, L298 모터 드라이버 모듈을 연결해서 사용하시는 걸 권장합니다. 조만간 보강된 회로의 업로드 버전도 올려 볼게요. ^^; ]   

 

▶ 실습 절차  : 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   물펌프는 물통 속에 담겨진다. 따라서 물펌프의 전선이 빠져나오는 부분은 필요한 경우 글루건 등으로 보강처리 할 필요가 있다. 

3.  우선 본 실험처럼 작은 물통을 준비하고, 간이 화분을 준비해서 실험을 해 본 후 실제 화분에 설치해보면 좋을 것이다. 또한 필요한 경우 센서를 두 개 이상 설치할 수도 있고, 두개의 화분을 하나의 보드로 연결하여 관리 해 볼 수 있을 것이다.

4.  다음 버전에서는 수분 값 등을 FND 혹은 LED, LCD 등을 부착하여 표시해보려고 한다. 

 

 

▶ 프로그램 코드 및 설명 : 

 

/* 스마트 화분 만들기 [코딩]  */

#define A0Pin 0

int sensorVal = 0;

int pump = 13;

void setup ( ) {
 Serial.begin(9600);

 pinMode(pump, OUTPUT);

 }

void loop ( ) { 

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

  delay(1000);

  Serial.print("Asensor = ");

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

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

  if ( sensorVal <= 900) {   

    Serial.println(" Very Wet ! ");       

    digitalWrite(pump, LOW);   

  }

 else if ( sensorVal > 900){

    Serial.println(" Very Dry ! ");   

    digitalWrite(pump, HIGH);

    Serial.println(" Pump On for 1 Second!");   

    delay(1000);

  }   

  delay(3000);   // 정보수집 시간(간격) 설정

}

▶ 실행영상 :  

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

 

(아래는 유튜브로 시청하기)

https://youtu.be/GlYIry2jga8

▶ 아두이노 파일다운 :

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

AutoWaterPot.zip
0.00MB

 

반응형
반응형

【 아두이노모듈#7】 TM1637 (100초) 시계 만들기 #1


 지난시간 TM1637 FND (4 Digit Display) 모듈의 함수들을 이용해서 다양하게 컨트롤 해보았다. 이제 활용도가 높은 시계를 만들어보려 한다. 

 우선, 프로그래밍 연습겸 , 조금 쉽게 접근하기 위해서 100초까지 카운트 되어 넘어가는 100초 시계부터 만들어 보도록 하자. (TM1637Display.h 사용)



▶ 선수 학습 :

 

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

  3. (모듈#6TM1637 4Digit 마스터하기#3 (모듈함수사용 참고 강좌클릭


▶ TM1637 세부 스팩 


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



▶ 실습 목표 :  

  1. [ 아두이노의 현재시간값 함수를 사용해 볼 수 있다 

 2. [ 시간데이터값에서, 초 2자리, 분 2자리 등의 데이터를 추출해서 FND모듈의 각 자리에 출력 해 볼 수 있다. ]

 3. [ 시계표시를 위한 '도트'를 컨트롤 할 수 있다.]



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



▶ 실습 절차  : 


1.   필요한 라이브러리 등을 '라이브러리 매니저'등을 통해서 설치한다. ( TM1637Display.h )

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. 1분은 60초, 60분은 1시간의 개념은 여기서는 구현하지 않고, 시간값을 추출하는 함수에서 초 2자리, 분 2자리의 데이터를 추출하여 FND의 분과 초 자리에 각각 출력 해보는 형태로 프로그래밍 한다. 
5. 이것이 이루어 지면, 다음 회차에 60단위로 작동하는 시계를 쉽게 구현할 수 있을 것이다. 


▶ 프로그램 코드 및 설명 : 


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

/* 100초 시계 구현 하기  (알고리즘 공부)             */

#include <Arduino.h>

#include <TM1637Display.h>

#define CLK 8

#define DIO 9

TM1637Display display(CLK, DIO);

int Sec1, Sec2, Min1, Min2, Tm1, Tm2 = 0;

unsigned long previousTime, currentTime;

uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };   // 초기값 00:00 셋팅

uint8_t segto;


void setup ( ) {

 previousTime = millis();       // 현재의 시간을 입력 받음

 display.setBrightness(0xF);  // 최대 밝기 (1~7 밝기 조절)

 Serial.begin(9600);

}

void loop ( )  {

 currentTime = millis()/1000;   // 최하 단위를 초로 바꾸어 줌

 Sec2 = currentTime%10;    // 현재시간값에서 초단위 '일의 자리'만 저장   

 Sec1 = (currentTime/10)%10;  // 현재시간값에서 초단위 '십의 자리'만 저장

 Min2 = (currentTime/100)%10;// 현재시간값에서 분단위 '일의 자리'만 저장

 Min1 = (currentTime/1000)%10;//현재시간값에서 분단위 '십의 자리'만저장

  data[0]=display.encodeDigit(Min1);    // FND 분단위 십의 자리

  data[1]=display.encodeDigit(Min2);   // FND 분단위 일의 자리   

  data[2]=display.encodeDigit(Sec1);     // FND 초단위 십의 자리

  data[3]=display.encodeDigit(Sec2);    // FND 초단위 일의 자리

  segto = 0x80 | display.encodeDigit(Min2);  // 초시계용 ':'도트

  display.setSegments(data);

  display.setSegments(&segto,1,1);

  delay(500);

  display.setSegments(data);         //도트가 깜빡이게 하기 위해 반복 출력

  delay(500);

}


▶ 참고 자료 :  

※ FND의 내부 구조 및 숫자 출력 함수 사용법 등은 앞의 선수학습 게시글을 참조할 것.




▶ 실행영상 :  

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



▶ 아두이노 파일다운 :

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

TM1637_100Sec_Watch.zip



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

TM1637-master.zip



반응형
반응형

【 아두이노모듈#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) :



반응형
반응형

【 아두이노 모듈#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



반응형