반응형

【 아두이노모듈#12 RFID (RC522) 사용하기 #2

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 연결하는 기본회로 만들어 보았는데, 시리얼모니터를 통해 특정 ID카드의 고유값(UID)을 확인한 승인 처리 및 거부 처리 해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

      1. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

※ RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 잃고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 

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

RFID RC522 모듈 연결 회로도

▶ 실습 절차  : 

 

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

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

 

4. 프로그램을 동작시키고 승인처리할 카드키 값을 읽어 프로그램에 적용한다.

5. 승인 및 거부 처리가 잘 되는지 확인한다. 

 

▶ 프로그램 코드 및 설명 : 

/* ID 카드의 UID값에 따라 승인 또는 거부 처리하기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

void setup ( ) {

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
 
Serial.println();

  }

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
    
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
 
String content= "";
 
byte letter;   
 
for (byte i = 0; i < rfid.uid.size; i++)
 
{  
    
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    
Serial.print(rfid.uid.uidByte[i], HEX);
    
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    
content.concat(String(rfid.uid.uidByte[i], HEX));
 
}

  Serial.println();
 
Serial.print("Message : ");
 
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록
 {
   
Serial.println("Authorized access");
   
Serial.println();
   
delay(3000);      // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }
 // UID값이 다르다면 엑세스 거부 처리
  else   {
   
Serial.println(" Access denied");
   
delay(3000);     // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }

}

 

▶ 실행영상 :  

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

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

https://youtu.be/I9uYJHTNAzA

 

▶ 아두이노 파일다운 :

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

RFID_Access_Denaied_ok.zip
0.00MB

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#11RFID (RC522) 사용하기 #1

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 이번 실습에서는 아두이노와 연결하는 기본회로를 구성하고 시리얼 모니터를 통해 카드별로 UID를 확인해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

   없음.

 

RFID 모듈 (RC522) 세부 스팩

 RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 읽고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 

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

RFID 기본 회로도

 

▶ 실습 절차  : 

 

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

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다.
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  설치된 라이브러리가 제공하는 예제파일을 열어 실행시킨다. (ReadNUD : UID 스캔 프로그램)

  (메뉴 : 파일 》 예제 》 MFRC522 》 ReadNUD 클릭)  

라이브러리 설치후 제공되는 예제파일 실행

4. 프로그램을 동작시키고 카드키를 RC522본체에 접촉시킨 후 시리얼 모니터창을 통해 UID값을 확인한다.

 

▶ 프로그램 코드 및 설명 : 

/* RC522.h 라이브러리에 포함된 ReadNUID 예제 참조 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정
MFRC522
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언
MFRC522::MIFARE_Key key;
byte
nuidPICC[4];   // 카드 ID들을 저장(비교)하기 위한 배열(변수)선언

void setup ( ) {

  Serial.begin(9600);
 
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  // ID값 초기화 

  for (byte i = 0; i < 6; i++) {

    key.keyByte[i] = 0xFF;

  }

// MIFARE 타입의 카드키 종류들만 인식됨을 표시

  Serial.println(F("This code scan the MIFARE Classsic NUID."));

  Serial.print(F("Using the following key:"));

  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
   
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함

  Serial.print(F("PICC type: "));

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  Serial.println(rfid.PICC_GetTypeName(piccType));

  // MIFARE 방식의 카드인지 확인 루틴

  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 

    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&

    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {

    Serial.println(F("Your tag is not of type MIFARE Classic."));

    return;

  }

 // 이전 인식된 카드와 다른, 혹은 새카드가 인식되면

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||

    rfid.uid.uidByte[1] != nuidPICC[1] ||

    rfid.uid.uidByte[2] != nuidPICC[2] ||

    rfid.uid.uidByte[3] != nuidPICC[3] ) {

    Serial.println(F("A new card has been detected."));

 // 고유아이디(UID) 값을 저장한다.

    for (byte i = 0; i < 4; i++) {

      nuidPICC[i] = rfid.uid.uidByte[i];

    }

 // 그 UID 값을 16진값으로 출력 한다.

    Serial.println(F("The NUID tag is:"));

    Serial.print(F("In hex: "));

    printHex(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

 // 그 UID 값을 10진값으로 출력 한다.

    Serial.print(F("In dec: "));

    printDec(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

  }

 // 연속으로 동일한 카드를 접촉하면 다른 처리 없이

 // '이미 인식된 카드'라는 메세지를 출력한다.

  else Serial.println(F("Card read previously."));

  rfid.PICC_HaltA();

  rfid.PCD_StopCrypto1();

}

// 16진 값으로 변환 해주는 함수 정의

void printHex(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], HEX);

  }

}

// 10진 값으로 변환 해주는 함수 정의

void printDec(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], DEC);

  }

}

 

▶ 실행영상 :  

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

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

https://youtu.be/uwi1Uk9U64w

RFID 회로 조립과 최초 동작확인

 

▶ 아두이노 파일다운 :

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

01_ReadNUID.zip
0.00MB

 

 

컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#10】 1채널 릴레이(JQC-3FF-S-Z) 사용하기

 

 아두이노를 사용하다보면 대부분 5V~12V 사이의 회로 위주로 제어하게 되는데, 실생활에서 사용되는 선풍기, 등기구 등의 제어를 하고 싶어 질 때가 있다. 이를 가능하게 해주는 부품이 바로 릴레이 이며, 낮은 전압으로 높은 전압을 사용하는 기기 제어가 가능 한 것이 릴레이 사용의 주 목적이다.(코일의 유도전기 원리 이용)

 릴레이 부품을 직접 사용하여도 좋지만, 여기서는 아두이노에서 간단한 핀연결 만으로 사용할 수 있는 릴레이 모듈을 소개하고자 한다. 또한, 1채널(1ch)릴레이에 대해 소개하지만, 2ch 이상의 모듈을 사용하면 동시에 여러가지 기기기를 제어 할 수 있다는 것을 기억하면 도움이 된다. 

 또한, 릴레이를 멀티탭이나 콘센트에 직접 설치하여 제어하게 되면 거의 모든 전기 제품을 제어 할 수 있을 것이다. 

▶ 선수 학습 :

   없음.

▶ 

릴레이모듈 (1ch, JQC-3FF-S-Z) 세부 스팩

 

릴레이 사용법 
 - 릴레이는 코일에 전류를 흘려 코일의 유도 작용에 의해 접점을 On / Off 해주는 스위치이다. 
 - 이를 이용하면, 낮은 전압(예, 5V)으로 220V의 전원을 끊거나 연결시킬 수 있다.
 - 좌측 IN에 HIGH(또는 LOW) 신호가 가해지면 Com단자와 NO 단자가 연결되어 스위치 형태로 작동 된다.
 - NC (Normal Close : 평상시 연결되어 있음)   
 - NO (Normal Open : 평상시 열려 있음, 연결 끊어짐) 

  - NC단자와 Com 단자가 디폴트로 연결 되어 있고, 릴레이가 동작이 되면 이 연결이 끊어지고,
    Com단자가 NO단자와 연결이 됩니다. 이 부분을 전기제품이나 콘센트의 한 쪽 부분의 연결을 끊어 
    스위치 형태로 구성할 수 있다.

 

▶ 실습 목표 :  

  1. [ 릴레이의 사용목적에 대해 이해 할 수 있다. 

 2. [ 릴레이 모듈의 동작 방법에 대해 이해 할 수 있다.]

 3. [ 등기구를 대신한 LED의 On/Off 제어 회로를 이해 할 수 있다.]

 

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

 

 

  ※ 부품 목록 :

 

 

▶ 실습 절차  : 

 
1.   부품을 준비하여 위와 같은 회로를 구성한다. 
2.   여기서 소개하는 릴레이가 아니더라도 동일하게 구성하면 되고, 9V, 12V 릴레이 모듈을 사용할 수 있도록 별도 전원연결 형태로 회로를 그렸으나, 5V 릴레이의 경우 릴레이에 별도전원 연결 없이 , 아두이노 전원만으로도 충분히 사용가능하다. (아래 실제 제작 동영상 참조) 

 

3.  아래 코딩을 실행하면 LED가 On 되어 있으며, 푸쉬버튼 스위치를 누르게 되면 LED가 Off 된다. 이와 같이 동작 확인이 되면, 반대로 동작하도록 코딩의 내용을 스스로 변경해보라.

 

 

 

▶ 프로그램 코드 및 설명 : 

 

/* 1채널 릴레이 다루어 보기  */

 

int relay = 7;

int button = 2;

 

void setup ( ) {

  pinMode(relay, OUTPUT); // 릴레이 연결 핀 출력으로 설정

  pinMode(button, INPUT); // 버튼 연결 핀 입력으로 설정

  Serial.begin(9600);

}

 

 

void loop ( )  {

  Serial.println(digitalRead(button));    

  Serial.println(digitalRead(relay));    

  if (digitalRead(button)== HIGH) {

    digitalWrite(relay, LOW);   // 이 부분을 수정하면 반대로 동작

  }

  else {

    digitalWrite(relay, HIGH);  // 이 부분을 수정하면 반대로 동작

  }

}

 

▶ 실행영상 :  

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

 

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

https://youtu.be/X-cczSjPhtg

 

▶ 아두이노 파일다운 :

 

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

relay1.zip
다운로드

 

 

반응형
반응형

【 아두이노모듈#9】 TM1637 & DS1307 리얼타임 시계 만들기


 지난시간 RTC 모듈의 기본사용법에 대해 학습해보았다. 이번 시간에는 이 RTC 모듈의 기록된 시간을 동기화 하여 시계회로의 전원이 차단 되더라도 흘러가는 시간이 유지되는 시계회로를 완성해 보고자 한다. 



▶ 선수 학습 :

   1. [아두이노 모듈#8] DS1307 리얼타임클럭 모듈 ☜ (클릭)

   2. [아두이노 모듈#9] TM1637(시:분) 시계 만들기 ☜ (클릭)


▶ DS1307 세부 스팩 


※ .라이브러리 다운로드

 - DS1307RTC:https://github.com/PaulStoffregen/DS1307RTC

 - RTClib : https://github.com/adafruit/RTClib  


  RTC(리얼 타임 클럭) 모듈은 DS1307과 DS3231 두 종류가 많이 사용된다. 두 모듈의 차이는 DS3231 모듈의 오차가 1년에 수분 정도로 조금 더 정밀도가 높아 진 것인데, DS1307을 사용해도 큰 오차가 나는 것이 아니기에 걱정말고 사용해보자. 
(DS1307 : 한 달 약 5분 미만,  DS3231 : 1년 약 5분 미만 오차)


【 RTC 모듈 시계의 구동원리 】 

: 시계를 만들때 현재의 시간을 맞추어 주어야 하는데, RTC를 가지고 PC와의 시간을 동기화 시키면,그 시간이 RTC모듈의 메모리에 저장되며, 모듈에 있는 베터리로 인해 시계회로에 공급되는 전원이 차단 되어도 메모리에 저장된 기준시간은 유지된되게 된다.  시계회로에서는 이 RTC 모듈에서 보통 1초마다 현재 시간값을 가지고와서 출력(사용)하게 된다. 



▶ 실습 목표 :  

  1. [ RTC 모듈에 대해 이해할 수 있다. 

 2. [ PC의 현재 시간을 RTC모듈에 동기화 시킬 수 있다.]

 3. [ 동기화된 시간을 아두이노 IDE의 시리얼 모니터 창을 통해 출력할 수 있다. ]

 4. [ TM1637 모듈에 14:49 (시 : 분) 형태로 출력해 볼 수 있다. ]

 5. [ 전원이 차단 되어도 시간이 유지되는 것을 확인 할 수 있다 ]

 


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



▶ 실습 절차  : 


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

2.   i2c 통신을 이용하는 모듈이기 때문에 <Wire.h> 라이브러리가 필요하며, 비교적 연결이 간단하고 쉽다. 


3. RTC의 메모리에 현재시간 값을 기록 하기 위해, Set Time 코드를 실행시킨다.(선수학습의 1번 항목 참고1. [아두이노 모듈#8] )

4. 아래의 코드를 실행시켜 시계프로그램을 완성한다. 


▶ 프로그램 코드 및 설명 : 


/* RTC 모듈에 있는 시간 값을 불러와 TM1637로 출력  */


#include <TM1637Display.h> // FND 시계모듈 라이브러리

#include <RTClib.h>     // RTC 기본 라이브러리

RTC_DS1307 RTC;         // RTC 모듈 객체 생성

#define CLK 8

#define DIO 9

TM1637Display display(CLK, DIO);

int Time, Minute;

char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};      //요일 관련 배열 선언 (생략가능)


void setup ( ) {

Serial.begin(9600);  

  display.setBrightness(7);    // 0~7, 밝기 조절

  Serial.begin(9600);

  RTC.begin();

  if (! RTC.begin()) {     // RTC모듈 연결 확인 루틴

    Serial.println("Couldn't find RTC");

    while (1);

  }

  if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

  }

}


void loop ( )  {

  DateTime now=RTC.now(); // RTC에 저장된 값을 불러옴

  Serial.print(now.year(), DEC);

  int Time = now.hour();

  int Minute = now.minute();

  

  int digitoneT = Time / 10;

  int digittwoT = Time % 10;

  int digitoneM = Minute / 10;

  int digittwoM = Minute % 10;


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

   uint8_t segto;

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

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

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

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


// 시와 분 사이 ' : ' 출력하고 깜빡임

   segto = 0x80 | display.encodeDigit(digittwoT);

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

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이

   display.setSegments(data);     

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이


// 아래는 시리얼 모니터창에 시간출력(생략 가능) 

  Serial.print(now.year(), DEC);

  Serial.print('-');

  Serial.print(now.month(), DEC);

  Serial.print('-');

  Serial.print(now.day(), DEC);

  Serial.print(" (");

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

  Serial.print(") ");

  Serial.print(now.hour(), DEC);

  Serial.print(':');

  Serial.print(now.minute(), DEC);

  Serial.print(':');

  Serial.print(now.second(), DEC);

  Serial.println();

}


▶ 실행영상 :  

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




▶ 아두이노 파일다운 :

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


[ 위 시계 프로그램-아두이노- ]

OK_ds1307_4digit_Watch.zip



[ RTC 타이머에 현재시간 셋팅 프로그램-아두이노-   순서상으로 이걸 먼저하고 바로 위 코드를 다시 업로드 시켜야 합니다.]

(RTC 타이머에 PC로 부터 동기된 현지 시간을 셋팅해주는 프로그램입니다.

따라서 현재시간을 RTC모듈에 이프로그램으로 기록하고 나서, 다시 위 프로그램을 업로드 하면, 

수정된 현지시간으로 시계가 돌아가게 됩니다. )

DS1307_SetTime2.zip


[ 만약 <TM1637Display.h> 관련한 에러가 나는 경우  해당 라이브러리가 설치 되지 않았거나 중복 설치, 잘못된 라이브러리 설치 등의 이유입니다.    해당 라이브러리 설치 안내는 선수학습: https://rasino.tistory.com/209  참고하시고,  별도로 라이브러리는 아래 다시 첨부하니 다운받아 설치해서 다시 실행해보세요 ]  


TM1637Display 라이브러리 다운로드 :  (압축풀지말고 라이브러리 메니저 창에서 zip 형태로 추가하기)

TM1637-master.zip


TM1637 Grove 제품의 경우 핀배열이 Catalex 사와 같을 거예요.  하지만, 핀이 달려있는 위치가 다르니, 역시 핀배열을 잘 확인 하셔야 해요.  Grove 사 모듈을 뒤집어 보면 위에서 부터 GND, VCC, DIO, CLK 이런 순으로 되어 있을 거예요.  그럼 연결만 그 핀에 맞추어 제대로 하면 됩니다. 

그리고 제일 중요한 것, DIO핀과 CLK핀을 아두이노에 연결 한 핀 번호랑, 코드에서 적어준 번호와 일치해야 제대로 동작합니다. 


아래 아두이노 코드는 TM1637 Grove사에서 제공하는 테스트 프로그램 이에요.  아래 코드를 다운받아 핀번호 확인후 업로드해서 실행시켜 보세요.

TM1637_Grove.zip


  


반응형
반응형

【 아두이노모듈#8】 DS1307 (RTC) 리얼타임클럭 모듈 배우기 #1


 지난시간 TM1637 FND 모듈로 시계를 만들어 보았다. 하지만 오차가 0.001 초만 나더라도 시간이 갈 수록 시간 오차가 커질 것이다. 이문제를 해결하기 위해서 좀더 정밀한 클럭을 지닌 RTC 모듈에 시간값을 동기화 시켜서 사용하게되는데,  오늘은 시계를 구성하기에 앞서 이 RTC 모듈에 대해 알아보도록 하자. 



▶ 선수 학습 :

   없음.


▶ DS1307 세부 스팩 



※ .라이브러리 다운로드

 - DS1307RTC:https://github.com/PaulStoffregen/DS1307RTC

 - RTClib : https://github.com/adafruit/RTClib  


  RTC(리얼 타임 클럭) 모듈은 DS1307과 DS3231 두 종류가 많이 사용된다. 두 모듈의 차이는 DS3231 모듈의 오차가 1년에 수분 정도로 조금 더 정밀도가 높아 진 것인데, DS1307을 사용해도 큰 오차가 나는 것이 아니기에 걱정말고 사용해보자.
(DS1307 : 한 달 약 5분 미만,  DS3231 : 1년 약 5분 미만 오차)


【 RTC 모듈 시계의 구동원리 】 

: 시계를 만들때 현재의 시간을 맞추어 주어야 하는데, RTC를 가지고 PC와의 시간을 동기화 시키면,그 시간이 RTC모듈의 메모리에 저장되며, 모듈에 있는 베터리로 인해 시계회로에 공급되는 전원이 차단 되어도 메모리에 저장된 기준시간은 유지된되게 된다.  시계회로에서는 이 RTC 모듈에서 보통 1초마다 현재 시간값을 가지고와서 출력(사용)하게 된다. 



▶ 실습 목표 :  

  1. [ RTC 모듈에 대해 이해할 수 있다. 

 2. [ PC의 현재 시간을 RTC모듈에 동기화 시킬 수 있다.]

 3. [ 동기화된 시간을 아두이노 IDE의 시리얼 모니터 창을 통해 출력할 수 있다. ]

 4. [ 2019/3/15(날짜)와 14:49:12(시간) 형태로 출력해 볼 수 있다. ]



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



▶ 실습 절차  : 


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

2.   i2c 통신을 이용하는 모듈이기 때문에 <Wire.h> 라이브러리가 필요하며, 비교적 연결이 간단하고 쉽다.  브레드보드 없이 직접 연결이 가능하지만, 추후에 FND모듈을 함께 연결하려면 , 필요할 수 있으니 브레드보드를 사용해서 연결해본다. 
3. 시리얼모니터를 통해 설정된 날짜와 시간값을 확인하게 되는데, 에러가 날 경우에는 통신속도(보드레이트)를 서로 같도록 맞추어 주었는지 확인하도록 한다.  


▶ 프로그램 코드 및 설명 : 


/* RTC 모듈에 PC를 이용하여 현재의 일시를 동기화 하기 */


#include <RTClib.h> // RTC 기본 라이브러리

#include <Wire.h>   // i2c 통신 라이브러리

RTC_DS1307 RTC;    // RTC클래스 생성


void setup ( ) {

Serial.begin(9600);  

Wire.begin();

RTC.begin();

RTC.adjust(DateTime(__DATE__,__TIME__));

//연결된 pc의 현재시간을 RTC모듈 기억소자에 동기화 함

//위 동기화 명령라인은 처음 한 번만 실행하고 하고 이후로는 주석처리

}

void loop ( )  {

DateTime now=RTC.now(); // RTC에 저장된 값을 불러옴

// 시리얼 모니터창에 아래의 형식으로 출력함

Serial.print(now.year(), DEC); 

Serial.print('/'); 

Serial.print(now.month(), DEC); 

Serial.print('/'); 

Serial.print(now.day(), DEC); 

Serial.print(' '); 

Serial.print(now.hour(), DEC); 

Serial.print(':'); 

Serial.print(now.minute(), DEC); 

Serial.print(':'); 

Serial.print(now.second(), DEC); 

Serial.println(); 

delay(1000);    //1초마다 현재의 일시를 모니터로 출력.

}


▶ 참고 자료 :  

 없음.

▶ 실행영상 :  

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



▶ 아두이노 파일다운 :

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


반응형
반응형

【 아두이노모듈#9】 TM1637 (시:분) 시계 만들기 #3

 지난시간 TM1637 FND (4 Digit Display) 모듈을 이용하여 분과 초를 나타내는 초시계를 만들어 보았다.  

 이번 시간에는 통상적으로 사용할 수 있는 시간과 분으로 된 시계를 만들어 보려 한다. 지난번 회로에서 코딩만 살짝 추가 하면 바로 구현 할 수 있다. 

 

 

▶ 선수 학습 :

 

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

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

  4. (모듈#7)  100초 시계만들기#4  (시간 카운트 참고 강좌클릭

  5. (모듈#8"분 : 초" 시계 만들기#5 (분과 초 60단위 코딩 참고 강좌클릭

 

▶ TM1637 세부 스팩 

 

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

 

 

▶ 실습 목표 :  

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

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

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

 4. [ 시간값 24시간 단위, 분 60분, 초 60초 단위로 코딩할 수 있다]

 

 

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

▶ 실습 절차  : 

1.   필요한 라이브러리 등을 '라이브러리 매니저' 혹은 구글링으로 찾아 다운받을 수 있다. 필요한 라이브러리는  ( TM1637Display.h ) 이다!  (단, 2번 내용을 참고하여 여기 게시글 제일 아래에 제시하는 라이브러리를 받아 사용하면 최소한 라이브러리 문제는 발생하지 않음!)
 
2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. 
(여기서는 'TM1637Display.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637Display.h>를 사용하고 있으며, 만약, 프로그램 작성후 실행시 라이브러리 관련 에러가 날 경우 거의 대부분 "TM1637Display.h" 를 두 개(두 군데) 이상 중복 설치되어 나타나는 에러 이므로, 
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)
또한, 같은 이름의 <TM1637Display.h> 이라도, 실제 파일의 용량을 체크해 보면 용량이 다른 경우가 있을 수 있다. 그 이유는 파일 속에 명령어 등이 더 추가가 되거나 전반적인 명령어 내용이 아예 다를 수 있다.  따라서 둘 중 하나는 실행이 안 될 수 있다.  
 
3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 
 
4. 이전 프로그램에서는 99까지 그대로 카운트 되도록 놔두었으나, 이제 59초에서 60초가 되면, 초부분을 00으로 리셋시키고, 1분씩 증가시켜보자. 또한 60분이 되면 시간 값을 1증가 시키고, 24시가 되면 00으로 리셋을 시켜 보자. 

 

▶ 프로그램 코드 및 설명 : 

/* 시:분 시계 만들기 코드입니다  */
/* 1분~ 60분, 1~24시간 단위로 넘어가는 시계 구현*/
/* 4Digit FND의 2자리에 분, 또다른 2자리에 시 배치 */
#include <TM1637Display.h>
#include <TimeLib.h>
#define CLK 8
#define DIO 9
int Sec1, Sec2, Min1, Min2, Tm1, Tm2 = 0;
unsigned long previousTime, currentTime;
TM1637Display display(CLK, DIO);

void setup() {
 previousTime = millis();     // 현재의 시간을 입력 받음
 display.setBrightness(0xF);                
 Serial.begin(9600);
}

void loop()  {
  currentTime = millis();  
  if (currentTime - previousTime > 1000) {   // 1초 이상 경과 체크
    previousTime = currentTime;
    Sec2++;                     // ‘초단위’  1의 자리 값을 1 증가
      if(Sec2 == 10) {          // 10초가 되면 초단위 10의 자리 증가
        Sec2 = 0;
        Sec1++;
      }
  }
  if (Sec1 == 6 && Sec2 == 0) {  //만약 증가시킬 Sec1이 ‘6’이고, 
    Sec1 = 0;                    // Sec2가 ‘0’이라면 , 초단위 변수들을 ‘0’
    Sec2 = 0;                    // 으로 리셋 후,  분단위 일의 자리   
    Min2++;                      //  60초가 되었으므로 1분 증가
  }
  if(Min2 ==10) {                //  9분에서 10분이 될 때의 처리
    Min2 =0;
    Min1++;
  }
  if (Min1 == 6 && Min2 ==0) {    // 초단위와 마찬가지로 분단위 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm2++;                        // 60분이 되었으므로 1시간 증가
  }
  if (Tm2 == 10) {                // 9시에서 10시가 될 때의 처리
    Tm2 = 0;
    Tm1++;
  }
  if (Tm1 == 2 && Tm2 ==4) {      //24시간이 되면 모두 0시0분0초로 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm1  = 0;
    Tm2  = 0;     
  }
  uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 }; // 초기값으로 00:00 셋팅
  uint8_t segto;
/* 만약 분:초 시계로 변경하려면 아래 주석 4줄을 활성화 하세요 (시:분) 코드 4줄은 비활성 시키기
  data[0]=display.encodeDigit(Min1);     
  data[1]=display.encodeDigit(Min2);
  data[2]=display.encodeDigit(Sec1); 
  data[3]=display.encodeDigit(Sec2); 
*/
// 아래 4줄은 시:분 시계용 코드 입니다.
  data[0]=display.encodeDigit(Tm1);   
  data[1]=display.encodeDigit(Tm2);
  data[2]=display.encodeDigit(Min1); 
  data[3]=display.encodeDigit(Min2); 
//  segto = 0x80 | display.encodeDigit(Min2);  // 분:초 시계용 도트 :
  segto = 0x80 | display.encodeDigit(Tm2);     // 시:분 시계용 도트 :
  display.setSegments(data);
  display.setSegments(&segto,1,1);             // 도트 ‘:’ 켜고
  delay(500);
  display.setSegments(data);                   // 깜빡이게 하기
  delay(500);
}

 

 

▶ 참고 자료 :  

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

 

 
▶ 실행영상 :  

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

 

 

▶ 아두이노 파일다운 :

 

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

▶ 라이브러리 추가 하는 방법
① 라이브러리 추가 하려면, 위 파일을 다운로드 받고 압축을 풀어 아두이노 라이브러리 폴더에 폴더 그대로 복사해 넣거나,  폴더 위치는 보통 아두이노가 설치된 문서 폴더 아래에 있습니다.     예시)    C:\문서\Arduino\libraries
② 압축을 풀지 않은 상태에서,  아두이노 IDE 메뉴 ≫ 스케치 ≫ 라이브러리 추가하기 ≫ .ZIP 라이브러리 추가 ≫ 메뉴에서 라이브러리 압축파일을 선택해 주면 추가됩니다.

반응형
반응형

【 아두이노모듈#8】 TM1637 (분:초) 시계 만들기 #2

 

 지난시간 TM1637 FND (4 Digit Display) 모듈을 이용하여 100초까지 카운트 되는 초시계를 만들어 보았다.  

 이번 시간에는 현재의 시계처럼, 1시간 단위로 넘어갈 수 있도록 코딩을 통해 제어해 보고자 한다. 

 

▶ 선수 학습 :

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

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

  4. (모듈#7100초 시계만들기#4  (시간 카운트 참고 강좌클릭
  5. (모듈#9 TM1637 "시:분" 시계만들기#4  (시간 카운트 참고 강좌클릭

 

▶ TM1637 세부 스팩 

 

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

 

▶ 실습 목표 :  

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

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

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

 4. [ 시간을 60초 단위, 60분 단위로 코딩할 수 있다.]

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

 

▶ 실습 절차  : 

1.   필요한 라이브러리 등을 '라이브러리 매니저' 혹은 구글링으로 찾아 다운받을 수 있다. 필요한 라이브러리는  ( TM1637Display.h ) 이다!  (단, 2번 내용을 참고하여 여기 게시글 제일 아래에 제시하는 라이브러리를 받아 사용하면 최소한 라이브러리 문제는 발생하지 않음!)
 
2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. 
(여기서는 'TM1637Display.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637Display.h>를 사용하고 있으며, 만약, 프로그램 작성후 실행시 라이브러리 관련 에러가 날 경우 거의 대부분 "TM1637Display.h" 를 두 개(두 군데) 이상 중복 설치되어 나타나는 에러 이므로, 
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)
또한, 같은 이름의 <TM1637Display.h> 이라도, 실제 파일의 용량을 체크해 보면 용량이 다른 경우가 있을 수 있다. 그 이유는 파일 속에 명령어 등이 더 추가가 되거나 전반적인 명령어 내용이 아예 다를 수 있다.  따라서 둘 중 하나는 실행이 안 될 수 있다.  
 
3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 
 
4. 이전 프로그램에서는 99까지 그대로 카운트 되도록 놔두었으나, 이제 59초에서 60초가 되면, 초부분을 00으로 리셋시키고, 1분씩 증가시켜보자. 또한 60분이 되면 시간 값을 1증가 시키고, 24시가 되면 00으로 리셋을 시켜 보자. 

▶ 프로그램 코드 및 설명 : 

/* 분:초 시계 만들기 코드입니다  */
#include <TM1637Display.h>
#include <TimeLib.h>
#define CLK 8
#define DIO 9
int Sec1, Sec2, Min1, Min2, Tm1, Tm2 = 0;
unsigned long previousTime, currentTime;
TM1637Display display(CLK, DIO);

void setup() {
 previousTime = millis();     // 현재의 시간을 입력 받음
 display.setBrightness(0xF);                
 Serial.begin(9600);
}

void loop()  {
  currentTime = millis();  
  if (currentTime - previousTime > 1000) {   // 1초 이상 경과 체크
    previousTime = currentTime;
    Sec2++;                     // ‘초단위’  1의 자리 값을 1 증가
      if(Sec2 == 10) {          // 10초가 되면 초단위 10의 자리 증가
        Sec2 = 0;
        Sec1++;
      }
  }
  if (Sec1 == 6 && Sec2 == 0) {  //만약 증가시킬 Sec1이 ‘6’이고, 
    Sec1 = 0;                    // Sec2가 ‘0’이라면 , 초단위 변수들을 ‘0’
    Sec2 = 0;                    // 으로 리셋 후,  분단위 일의 자리   
    Min2++;                      //  60초가 되었으므로 1분 증가
  }
  if(Min2 ==10) {                //  9분에서 10분이 될 때의 처리
    Min2 =0;
    Min1++;
  }
  if (Min1 == 6 && Min2 ==0) {    // 초단위와 마찬가지로 분단위 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm2++;                        // 60분이 되었으므로 1시간 증가
  }
  if (Tm2 == 10) {                // 9시에서 10시가 될 때의 처리
    Tm2 = 0;
    Tm1++;
  }
  if (Tm1 == 2 && Tm2 ==4) {      //24시간이 되면 모두 0시0분0초로 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm1  = 0;
    Tm2  = 0;     
  }
  uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 }; // 초기값으로 00:00 셋팅
  uint8_t segto;
// 아래 4줄은 분:초 시계용 코드 입니다.
  data[0]=display.encodeDigit(Min1);     
  data[1]=display.encodeDigit(Min2);
  data[2]=display.encodeDigit(Sec1); 
  data[3]=display.encodeDigit(Sec2); 

/* 만약 시:분 시계로 변경하려면 아래 주석 4줄을 활성화 하세요 (분:초) 코드 4줄은 비활성 시키기
  data[0]=display.encodeDigit(Tm1);   
  data[1]=display.encodeDigit(Tm2);
  data[2]=display.encodeDigit(Min1); 
  data[3]=display.encodeDigit(Min2); 
*/
  segto = 0x80 | display.encodeDigit(Min2);      // 분:초 시계용
//  segto = 0x80 | display.encodeDigit(Tm2);     // 시:분 시계용
  display.setSegments(data);
  display.setSegments(&segto,1,1);               // 도트 ‘:’ 켜고
  delay(500);
  display.setSegments(data);                     // 깜빡이게 하기
  delay(500);
}

/* 0~ 60, 1~ 60 단위로 넘어가는 시계 구현*/

/* 4Digit FND2자리에 분, 또다른 2자리에 초 배치 */

#include <TM1637Display.h>

#define CLK 8

#define DIO 9

int Time, Minute;

int cont = 0;

int Sec1, Sec2, Min1, Min2;

unsigned long previousTime, currentTime;

 

TM1637Display display(CLK, DIO);

void setup ( ) {

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

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

 Serial.begin(9600);

/*    Sec1 = 5;   // 초기 시간 값을 설정할 경우

    Sec2 = 2;

    Min1 = 3;

    Min2 = 1;

*/

 

}

 

void loop ( )  {

currentTime = millis();    // 현재 시간값을 받아 currentTime에 저장

  if (currentTime - previousTime >= 1000) {// 1초 이상 경과 체크

    previousTime = currentTime;    // 현재시간 업데이트

    Sec2++;                          // ‘초단위  1의 자리 값을 1 증가

      if(Sec2 == 10) {            // 10초가 되면 초단위 10의 자리증가

        Sec2 = 0;

        Sec1++;

      }

  }

 

 // 만약 증가시킬 Sec1이 ‘6’이고Sec2 ‘0’이라면 초단위 

 // 변수들을 ‘0’으로 리셋 ,  분단위 일의 자리변수(min2)를 

// 1증가 시켜 줌.  분단위 변수가 10분이 될 때 체크

  if (Sec1 == 6 && Sec2 == 0) {

 

    Sec1 = 0;                            

    Sec2 = 0;                           

    Min2++;                              

  }

  if(Min2 ==10) {                     

    Min2 =0;

    Min1++;

  }

 

  if (Min1 == 6 && Min2 ==0) { //초단위와 마찬가지로 분단위처리

    Sec1 = 0;

    Sec2 = 0;

    Min1 = 0;

 

    Min2 = 0;     

}

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

 uint8_t segto;

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

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

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

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

 

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

 display.setSegments(data);

 display.setSegments(&segto,1,1); // 도트 ‘:’ 켜고

 delay(500);

 display.setSegments(data);        // 깜빡이게 하기

 delay(500);

 

 }

 

▶ 참고 자료 :  

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

 

 
▶ 실행영상 :  

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

 

▶ 아두이노 파일다운 :

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

TM1637_Watch_Time_Min_Sec.zip
0.00MB

 

TM1637-master.zip
1.36MB

▶ 라이브러리 추가 하는 방법
① 라이브러리 추가 하려면, 위 파일을 다운로드 받고 압축을 풀어 아두이노 라이브러리 폴더에 폴더 그대로 복사해 넣거나,  폴더 위치는 보통 아두이노가 설치된 문서 폴더 아래에 있습니다.     예시)    C:\문서\Arduino\libraries
② 압축을 풀지 않은 상태에서,  아두이노 IDE 메뉴 ≫ 스케치 ≫ 라이브러리 추가하기 ≫ .ZIP 라이브러리 추가 ≫ 메뉴에서 라이브러리 압축파일을 선택해 주면 추가됩니다.

반응형
반응형

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



반응형