반응형

 【 아두이노 센서#13】 TC74 온도센서 활용하기 1 




 이번 시간은 I2C 통신 방식을 이용하는 TC74 온도 센서에 대해 다루어 보고자 한다. TMP36온도센서와 차이점은 직접적으로 섭씨온도 값을 얻어 낼수 있고 동일 회로에서 다수개의 TC74 온도센서를 활용 할 수 있다는 장점이 있다. 


▶ 실습에 사용되는 온도센서 자료 ( TC74 ) 


《 DIP 타입 


《 SMD 타입




[ TC74 상세 스팩 ]




[ TC74 고유 주소 파악하기 ]



위 제조사에서 제공하는 스팩을 보면 " Address Options : " 이라는 것이 있다. 

만약 구입한 온도센서 모델이 아래 이미지 처럼 " TC74A0 " 라고 되어 있을 경우,

" A0 = 1001 000 "  이라고 되어 있는데,  이를 2진수 값으로 생각하고( 1001000 ),   

10진 값으로 계산 해보면 ,

  =  1x 2^6 + 1x 2^3   

  = 1 x 64  + 1 x 8

  = 72     가 된다.


즉 10진값 '72' 가 이 센서의 고유 주소가 된다. 

16진 값으로는 0x48 이 된다.     이주소를 기억했다가 프로그래밍의 해당부분에 입력하면 된다. 




--------------------------------------------------


만약 구입한 온도센서 모델이 아래 이미지 처럼 " TC74A5 " 라고 되어 있을 경우,

위의 상세 스팩을 참고하면 " A0 = 1001 000 "  이라고 되어 있는데,  이를 2진 값으로 생각하고( 1001101 ),   

10진 값으로 계산 해보면 ,

  =  (1 x 2^6) + (1 x 2^3) + (1 x 2^2)  +  (1 x 2^0)   

  = 1 x 64  + 1 x 8 + 1 x 4 + 1 x 1

  = 77  이 된다.


즉 10진값 '77'  혹은 16진값으로 0x4D가 이 센서의 고유 주소가 된다. 







I2C 통신을 위해서는 SDA핀과 SCL(SCLK)핀에 풀업 저항을 달아서 연결해야 통신이 제대로 이루어 진다.   (풀업 저항 값으로는 4.7K가 적당하며,  여의치 않을 경우 1K~10KΩ 사이의 저항값 사용가능)




▶ 실습 목표 :  


1. TC74 센서의 온도 값을 시리얼 모니터로 출력해 보자.


2. I2C 통신기능에 대해 익혀본다.


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)





※ 일반적으로 TC74 를 구입할 때 주소를 구분해서 구매할 필요는 없으나, 

하나의 시스템에서 여러개의 온도센서를 가지고 활용하려 할 때는 고유주소가 다른 센서를 사용해야 각각의 제어가 가능하니 참조하길 바란다. 




▶ 실습 절차  : 

1. 위 회로를 보고 각 부품과 보드를 연결한다. 

2. L기본적으로 I2C 통신을 위한 PIN(SDA, SCL)에는 풀업 저항을 달아 주어야 통신이 잘 이루어 진다.  

3.연결이 완성되면 프로그램을 아두이노 보드에 로딩시키고 시리얼 모니터 창을 열어 출력값을 확인 해본다. 

4.손가락으로 잡아보면 천천히 온도값이 올라가는 것을 확인 할 수 있다. 기타 온도 변화를 빠르게 확인 하는 방법으로 센서를 냉동실에 1분 가량 잠시 넣어 두었다가 다시 연결하여 측정해보면 영하에서 부터 상온까지 서서히 올라가는 것을 관찰 할 수 있으며, 인두기 혹은 히터를 이용해볼 수도 있다.  



▶ 프로그램 코드 및 설명 : 


  // I2C 온도 센서(TC74A0-5.0VAT) 이용하기

  // I2C 온도 센서에서 값을 읽어 시리얼 포트로 출력하기

#include <Wire.h  //I2C 라이브러리 삽입

  //I2C 센서 ID10진수로 저장한 temp_address 변수 선언

int temp_address=72;   // 제조회사 제공 고정 값

void setup()  {

  Serial.begin(9600);

  Wire.begin();                 // I2C Wire 객체 시작

}

void loop() {

             // I2C 센서의 주소와 통신을 개시하는 요청 전송

  Wire.beginTransmission(temp_address);

            // I2C 센서의 0번 레지스터를 읽겠다는 명령을 쓰기 모드에서 전송

  Wire.write(0);

  Wire.endTransmission();     // 전송 완료(0값 전송 종료)

    // 지정된 주소의 I2C 센서에서 1바이트 값을 읽음

  Wire.requestFrom(temp_address, 1);

  while(Wire.available()==0);    // 응답이 올 때까지 대기

  int c=Wire.read();                        // 온도를 읽어 변수 c에 저장

           // 섭씨를 화씨로 변환(소수점 반올림)

  int f=round(c*9.0/5.0 +32.0);

       // 시리얼 포트로 섭씨온도와 화씨온도 출력

  Serial.print(c);

  Serial.print("C ");

  Serial.print(f);

  Serial.println("F");

  delay(500);  

  }



1. I2C온도 센서를 이용하기 위해서는 <Wire.h> 파일을 선언해야 한다. 만약 헤더파일이 없을 경우 라이브러리 관리창에서 검색하여 추가해 준다.
2. 본인이 가지고 있는 온도 센서의 라벨을 확인하여 고유주소를 정확하게 적어 놓는다. 
 만약 센서가 "TC74A0" 일 경우 int temp_address = 72; 라고 적는다. 

3. TC74 온도 센서는 기본적으로 섭씨 온도값을 출력 하므로 화씨 온도값을 출력하고자 한다면, 썹씨를 화씨로 변환하는 공식을 사용하면 쉽게 출력 할 수 있다. 

4. 시리얼 모니터 실행시 에러가 난다면, 프로그램상의 통신 속도(9600)와 시리얼 모니터 창의 설정 속도가 일치하는지 확인 해야 한다. 


※ 섭씨온도를 화씨온도로 변환 하는 식  [  (섭씨 x 9.0) / 5.0 + 32.0  ] 



▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)




▶ 아두이노 파일(다운) :


I2C 스캐너 프로그램  :  

I2Cscaner.ino



반응형
반응형

 【 아두이노 센서#12】 시프트레지스터 Bit(연산자)제어 실습


※ 사전 학습하면 좋을 내용(앞선 강의)

☞  시프트 레지스터의 개념(시프트 레지스터 이해하기 ☜클릭)


 시프트레지스터 2단 연결 실습(데이지 체인-Daisy Chain 실습 ☜클릭)


 오늘은 2단으로 연결된 상태에서 비트제어 함수를 통해서 좀 모양나도록(?) LED를 제어해보고자 한다. 



▶ 실습에 사용되는 74HC595 IC 자료



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 아래 8bit 시프트 레지스터 도면과 같은 회로를 2단으로 연결 구성한다.

 

2. 8bit짜리의 LED를 차례로 하나씩 켜지도록 한다.(1단, 2단 회로 동시 동작)



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


2단 연결회로는 아래 회로에서 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)




(2단 연결을 위해서는 괄호안의 수량 만큼 부품이 필요하다)





▶ 실습 절차  : 

1. 위 회로 연결 도면을 보며 착오가 없도록 연결해준다. LED의 +, - 극성 방향에 주의 해서 연결한다. 

2. 저항은 LED를 보호해 줄 수 있는 저항 값을 달아주면 되기에 가지고 있는 저항 중에 100Ω~470Ω 사이의 저항값이 있으면, 어떤 것이든 사용가능하다. 


3. IC가 동작하기 위한 전원(vcc-16번, Gnd-8번)은 반드시 인가 되어야 동작이 되며, 만약 +,-를 정반대로 인가할 경우 IC가 손상될 수 있으니 주의한다.


4. 2단 연결을 위해서는 위의 회로 연결 내용을 참고해서 연결 한다.

2단 연결회로는 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)


아래 그림에서 9번 핀에서 8bit 데이터의 앞선 값이 계속 출력된다. 

이 핀의 출력을 다음 단의 입력으로 넣는 것이다.

   



▶ 비트(bit) 제어 관련 함수 정리 :



▶ 프로그램 코드 및 설명 : 


const int SER=8;        // 아두 8핀 <-> 595IC Serial Data  (14)

const int LATCH=9;  // 아두 9핀 <-> 595IC  Latch CLK (12)

const int CLK= 10;    // 아두 10핀 <-> 595IC Shift CLK (11)

byte x = B00000000;  // 바이트 의 값은 모두 ‘0’ 으로 초기화

 

void setup() {

  //시프트 레지스터에 연결된 각 핀의 입출력 모드를 출력으로 지정

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

}

void loop() {     

for (int i=1; i>=0; i--)          //  i 1에서 까지 감소 (LED On /Off)

  {

      for (int j=8; j>=0; j--)  // j 8에서 0까지 감소 (1~8번 LED On/Off)

      {

       digitalWrite(LATCH, LOW);    // 레지스터 값 변경하려는 신호 보냄

      shiftOut(SER, CLK, LSBFIRST,bitWrite(x,j,i));   // 1단 레지스터 (595 IC)

      shiftOut(SER, CLK, MSBFIRST,bitWrite(x,j,i));  // 2단 레지스터 (595 IC)

      digitalWrite(LATCH, HIGH);    //'HIGH' 입력으로 데이터 전송 끝을 알림

       delay (50); 

      }

  }


1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 

2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  위 IC와 회로는 8bit 구조 이기 때문에 shiftOut() 함수를 두 개 연속으로 써주어야 두 개의 8bit LED가 같은 타이밍으로 동작하게 된다. 
4. 위 bit 연산자 함수 목록 중에 아래와 같은 연산자를 사용한 프로그래밍이다. 




▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)


《안에서 밖으로 켜기》





《밖에서 안으로 켜기》

아래 동작을 위해서는 

shiftOut() 함수를 아래와 같이 MSB 와 LSB 위치를 서로 바꾸어 주면 된다.

      shiftOut(SER, CLK, MSBFIRST,bitWrite(x,j,i));   // 1단 레지스터 (595 IC)

      shiftOut(SER, CLK, LSBFIRST,bitWrite(x,j,i));  // 2단 레지스터 (595 IC)




※ LED 배열을 하트 모양으로 만들어 보면 , 아주 근사한 장식품이 될 것이다.


▶ 아두이노 파일(다운) :




반응형
반응형

 【 아두이노 센서#11】 시프트레지스터 2단 연결하기 (Daisy Chain)


지난시간 시프트 레지스터의 개념(시프트 레지스터 이해하기 ☜클릭)과 나이트 라이더 LED를 구현해 보았다. (나이트 라이더 실습1 ☜클릭)


 오늘은 8bit 인 시프트 레지스터를 2단으로 연결 하여 16개의 LED를 순차적으로 켜보는 실습을 해보겠다. 이를 통해 다단 연결(앞단의 출력을 뒷 단으로 연결 하면 여러단으로 연결이 가능)이 가능하고 이러한 연결을 Daisy Chain 이라 한다. 


 사실 8bit 시프트 레지스터이기 때문에 2단으로 연결하더라도 16bit로 동작하지는 않지만, 16bit로 데이터가 이동되는 것 처럼 보이도록 프로그램을 짜 볼 것이다. 



▶ 실습에 사용되는 74HC595 IC 자료



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 아래 8bit 시프트 레지스터 도면과 같은 회로를 2단으로 연결 구성한다.

 

2. LED가 마치 16bit로 시프트(이동) 되도록 프로그래밍 한다. 



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


2단 연결회로는 아래 회로에서 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)




(2단 연결을 위해서는 괄호안의 수량 만큼 부품이 필요하다)





▶ 실습 절차  : 

1. 위 회로 연결 도면을 보며 착오가 없도록 연결해준다. LED의 +, - 극성 방향에 주의 해서 연결한다. 

2. 저항은 LED를 보호해 줄 수 있는 저항 값을 달아주면 되기에 가지고 있는 저항 중에 100Ω~470Ω 사이의 저항값이 있으면, 어떤 것이든 사용가능하다. 


3. IC가 동작하기 위한 전원(vcc-16번, Gnd-8번)은 반드시 인가 되어야 동작이 되며, 만약 +,-를 정반대로 인가할 경우 IC가 손상될 수 있으니 주의한다.


4. 2단 연결을 위해서는 위의 회로 연결 내용을 참고해서 연결 한다.

2단 연결회로는 같은 부품과 회로를 우측에 똑 같이 하나 더 구성하여 연결 하면 된다. 

1. 둘째 단 IC의 시리얼 입력(14pin)은 첫 단 IC의 9번 핀에서 받도록 연결한다

즉, IC1의 9pin 과 IC2의 14pin 을 서로 연결해준다)

2. 둘째 딴의 Latch클럭(12pin)과 shift클럭(11pin)에는 첫 단 IC 핀과 묶어준다(동기화)


아래 그림에서 9번 핀에서 8bit 데이터의 앞선 값이 계속 출력된다. 

이 핀의 출력을 다음 단의 입력으로 넣는 것이다.

   



▶ 프로그램 코드 및 설명 : 


const int SER=8;        // 아두 8핀 <-> 595IC Serial Data  (14)

const int LATCH=9;  // 아두 9핀 <-> 595IC  Latch CLK (12)

const int CLK= 10;    // 아두 10핀 <-> 595IC Shift CLK (11)

 

void setup() {

  //시프트 레지스터에 연결된 각 핀의 입출력 모드를 출력으로 지정

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

  shiftOut(SER, CLK, LSBFIRST, 0);

  shiftOut(SER, CLK, LSBFIRST, 0);

  Serial.begin(9600);

}

void loop() {     

   for (int i =0 ; i <256; i++) {

   digitalWrite(LATCH, LOW);

   digitalWrite(SER, !(i%16));   //  15OFF ,1ON 

 //  1에서 15까지 나머지(%)1이 되고, 16배수 마다 나머지는 0, 

     LED를 켜기 위해 이것의 반대  (HIGH) 데이터로 삽입 (! 사용)

 // 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ...

   Serial.println(!(i%16));

   digitalWrite(CLK, HIGH);   //Data1신호에 하나씩 쉬프트됨 

   digitalWrite(CLK, LOW);     //다음 클럭 신호 생성을 위해 OFF

   digitalWrite(LATCH, HIGH); //Latch신호로 shift레지스터의 데이터를 출력함

   delay(50);    }

}



1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 
2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  '%'는 나머지 연산자로 앞의 값을 뒤의 값으로 나눈 후, 나머지 값을 나타내는 연산자이다. 
16개의 LED 중에 LED가 하나씩만 켜지도록 하기 위해 나머지 연산자(%)를 사용하였다. 따라서 프로그램에서 16으로 나누었기 때문에, 16번 째 LED마다 나머지 값은 '0'이 됨을 알 수 있다. 
단, 이때 회로 연결 구조상 LED는 HIGH 신호가 들어와야 켜지기 때문에, 이 값을 반대로 뒤집는 것이 필요하여 !(부정-반대) 연산자를 사용하여 16번째 마다 '1' 이 나오고 다른 순서에는 '0'의 값이 출력 되도록 한 것이다.


▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)


《천천히 동작》



《빠르게 동작》


※ LED 배열을 하트 모양으로 만들어 보면 , 아주 근사한 장식품이 될 것이다.


▶ 아두이노 파일(다운) :

LATCH74595_4.ino




반응형
반응형

 【 아두이노 센서#10】 나이트 라이더 만들어보기


지난시간 시프트 레지스터의 개념(시프트 레지스터 이해하기☜클릭)과 홀 수 번째 LED를 켜보는 실습(시프트 레지스터 실습1☜클릭)을 해 보았다. 


 오늘은 조금 응용해서 Light Rider 라는 것을 만들어 볼 것이다. 


오래전 한국에 방영된 전격Z작전과 리메이크작 미드 Knight Rider 에서 이름을 따서 Light Rider라 지었다. 드라마에서 '키트'라고 불리는 인공지능 무적 스포츠카 앞부분에 달린 LED의 동작 형태를 따라 만든 것이다. 


 지금은 구리(?)지만... 센세이셔널 했던 당시 미드를 잠시 감상해보자





▶ 실험에 사용되는 74HC595 IC 자료



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 8bit 시프트 레지스터 IC 이기 때문에, LED 8개를 연결한다. 

 

2. LED의 불 빛 하나가 좌에서 우로, 다시 우에서 좌로 연속으로 이동하듯 켜지는 동작이 반복되도록 한다. 



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)





(괄호 안은 2단으로 연결할 경우 필요 수량)





▶ 실습 절차  : 

1. 위 회로 연결 도면을 보며 착오가 없도록 연결해준다. LED의 +, - 극성 방향에 주의 해서 연결한다. 

2. 저항은 LED를 보호해 줄 수 있는 저항 값을 달아주면 되기에 가지고 있는 저항 중에 100Ω~470Ω 사이의 저항값이 있으면, 어떤 것이든 사용가능하다. 


3. IC가 동작하기 위한 전원(vcc-16번, Gnd-8번)은 반드시 인가 되어야 동작이 되며, 만약 +,-를 정반대로 인가할 경우 IC가 손상될 수 있으니 주의한다.



▶ 프로그램 코드 및 설명 : 


const int SER=8;        // 아두 8핀 <-> 595IC Serial Data  (14)

const int LATCH=9;  // 아두 9핀 <-> 595IC  Latch CLK (12)

const int CLK= 10;    // 아두 10핀 <-> 595IC Shift CLK (11)


// LED 점등을 10진수로 계산한 값을 배열로 저장 

int seq[14]={ 1, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2 };

 

void setup() {

  //시프트 레지스터에 연결된 각 핀의 입출력 모드를 출력으로 지정

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);


}

void loop() {     

    for (int i=0;  i <14; i++)  {

   digitalWrite(LATCH, LOW);              //LATCHLOW 입력

   shiftOut(SER, CLK, MSBFIRST, seq[i]); // 배열의 인덱스(i) 값 전송

   digitalWrite(LATCH, HIGH);             //LATCHHIGH 입력

   delay(100);                                     // delay값으로 LED켜지는 속도 조절

   }   

}



1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 
2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  "int seq[14]={1,2,4 ... "을 살펴보자, LSB(최하위비트)에서 MSB(최상위비트)로 LED가 하나씩만 켜질 수 있는 10진 값을 배열형태로 잡아 놓은 것이다. 최상위비트(값:128)를 켠 다음에는 다시 하위비트로 내려가는 방향으로 배열이 구성되어 있다.


▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)



▶ 아두이노 파일(다운) :

Latch_LightRider.ino


반응형
반응형

 【 아두이노 센서#9】 시프트 레지스터 이해하기 실습1

지난시간 시프트 레지스터의 개념에 대해 다루었다.(시프트 레지스터 이해하기

☜클릭).  

이제 이어지는 몇 가지 실험을 잘 수행 한다면 시프트 레지스터를 능숙히 다룰 수 있을 것이다. 



▶ 실험에 사용되는 74HC595 IC 자료



《 74HC595 IC 핀배열》


▶ 실습 목표 :  


1. 8bit 시프트 레지스터 IC 이기 때문에, LED 8개를 연결하고,  데이터(2진 값) 예, '10101010' 혹은 '01010101' 등을 LED로 시프트 시켜 표시해보는 실습이다. 

 

2. 예를 들어, 짝수번째 LED 켜기, 홀수 번째 LED켜기, 11110000, 00001111, 11001011, 등등 원하는 데이터를 아두이노에서 IC에 시리얼로 입력하면 패러럴(병렬) 형태로 LED로 나타낼 수 있다. 


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)





(괄호 안은 2단으로 연결할 경우 필요 수량)





▶ 실습 절차  : 

1. 위 회로 연결 도면을 보며 착오가 없도록 연결해준다. LED의 +, - 극성 방향에 주의 해서 연결한다. 

2. 저항은 LED를 보호해 줄 수 있는 저항 값을 달아주면 되기에 가지고 있는 저항 중에 100Ω~470Ω 사이의 저항값이 있으면, 어떤 것이든 사용가능하다. 


3. IC가 동작하기 위한 전원(vcc-16번, Gnd-8번)은 반드시 인가 되어야 동작이 되며, 만약 +,-를 정반대로 인가할 경우 IC가 손상될 수 있으니 주의한다.



▶ 프로그램 코드 및 설명 : 


const int SER=8;        // 아두 8<-> 595IC Serial Data  (14)

const int LATCH=9;  // 아두 9<-> 595IC  Latch CLK (12)

const int CLK= 10;    // 아두 10<-> 595IC Shift CLK (11)


void setup() {

  //시프트 레지스터에 연결된 각 핀의 입출력 모드를 출력으로 지정

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

  digitalWrite(LATCH, LOW);

  // 비트값 10101010 전송 (2진 값을 10진 값으로(170) 바꾸어본다

  shiftOut(SER, CLK, MSBFIRST, B10101010); 

  //LATCHHIGH 입력 : 홀수 LED 점등

  digitalWrite(LATCH, HIGH);

}

void loop() {     

          // Loop 문에는 비워 놓는다

}



1.  프로그램 코드를 파악할 때 맨 위쪽 《74HC595 핀배열 을 참고해서 본다면 파악하기가 훨씬 쉽다. 
2.  int 변수 선언에서 'const int' 라고 선언을 하면, 선언된 변수의 내용 값이 프로그램 내에서 어떤 계산이나 착오에 의해 변하는 것을 막고 싶을 때 선언하는 것이다. 때문에 이런 염려가 없을 경우는 그냥 'int' 로 선언 하면 된다. 

3.  shiftout() 함수 속 데이터 값은 2진 값 형태로 입력이 가능하고 10진값 등의 형태로도 입력이 가능하다. 따라서 B10101010을 10진값으로 변환하면 '170'이 되고 이값을 그대로 입력해도 똑같은 결과를 얻을 수 있다. 만약 2진 ↔ 10진 변환을 손쉽게 하고 싶다면, 윈도우에 있는 계산기(calculator)를 실행시키고 옵션에 공학용 계산기로 변환하면 2진, 8진, 10진, 16진 값을 동시에 확인 할 수 있어 편리하다.

▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)



▶ 아두이노 파일(다운) :

01_shift-Register.ino


반응형
반응형

 【 아두이노 센서#8】 시프트 레지스터 이해하기 (Shift Register)

오늘은 시프트 레지스터에 대해 다루어 보고자 한다. 시프트 레지스터를 활용하면 여러개의 포트를 사용하여 병렬로 제어할 수 밖에 없는 상황에서, 한 두개의 시리얼 라인으로 제어가 가능한 장점이 있다. 이를 위해서는 시프트 기능을 구현해주는 레지스터 구조로 되어 있는 IC인 74HC595 칩을 활용 하면 된다. 



▶ 실험에 사용되는 74HC595 IC 자료


《상세 스팩》


《로직 다이어그램》


1. 아래 이미지에서 보면 SER(시리얼 데이터)가 첫 번째 레지스터에 입력되고 동기클럭신호(SRCLK) 에 따라 다음단의 레지스터로 차례로 시프트(이동)된다. 


2. 모든 데이터(8bit)가 스토리지 레지스터(버퍼)로 이동된 상태가 되면,  RCLK(래치 클럭) 신호에 의해 외부로 동시에(병렬) 출력이 된다.  이 때 3-state 버퍼라고 하는 것이 출력에 달려있는데, OE(아웃 인에이블) 단자로 출력을 할지? 말지?(홀드)를 조절 가능하다.  



《 핵심 개념 》


※ 아래 이미지를 보면 마지막 시프트 레지스터의 출력 단자에서 나오는 출력이 보일 것이다.(Serial data output) 이 단자를 두 번째 시프트 레지스터의 시리얼 데이터 입력으로 넣게 되면, 다단 연결이 가능하게 된다. 이런 식으로 3단, 4단,  다단연결이 가능하게 된다.








1. 먼저 버퍼(Buffer)란? 무엇인지 살펴보자,  아래 이미지에서 AND게이트에서 나오는 출력 C부분에 Buffer를 연결하였다. 

 보통의 경우 C에서 나오는 출력 값(예, 5V)의 레벨이 떨어져 나오는 경우가 발생할 수 있다. 그런 신호를 사용하면 회로에서 원하는 결과를 얻지 못 할 수 있다. 이 때 버퍼를 한 단계 거치게 되면 버퍼에 공급되는 전원을 출력하는 형태가 되기 때문에 출력레벨을 원래대로 맞출 수 있는 장점이 있어 사용하게 된다. 

 또한 결과적으로 출력값을 한 스텝 저장(홀드)하게 된다. 


2.  두 개 이상의 게이트를 직결할 경우를 생각해보자, 

 AND1에서의 출력과 AND2에서의 출력을 하나의 라인으로 이용하고자 연결한 것이겠지만,  AND1과 AND2에서 동시에 데이터가 출력이 되었을 때 문제가 된다. 


만약 AND1에서 HIGH 신호가 나오고, AND2에서 LOW 신호가 동시에 나오면?   HIGH 신호가 될까? LOW 신호가 될까? (마치 5V 선과 0V 선을 이어 붙인 것이나 다름없다)  

또한 AND1에서 나온 X 출력이 F단자로 빠져나가기도 하겠지만, AND2의 출력단자 Y로도 역입력이 되게 되는데, 이는 무리가 가게 되고 경우에 따라서는 손상을 입힐 수도 있다. 



2-1.  따라서 아래 이미지 처럼 각 AND게이트 각 출력단에 3state 버퍼를 연결하여 이런 문제를 해결하게 된다. 


   3 state란? 세 가지 상태를 말하는데, 0(LOW) 출력상태, 1(HIGH) 출력상태,  Hi-임피던스 상태를 말한다. 

- EN(인에이블) 단자를 이용해서 0과 1을 출력하게 만들거나(Enable 단자 On) 

- 다른 곳의 출력이 여기에 되먹임 되지 않도록(손상이 가지 않도록)  '고 임피던스'(High 저항) 상태로 만들수 있다(Enable 단자 Off). 






반응형
반응형

 【 아두이노 센서#7】 I2C LCD로 TMP36 온도센서값 출력하기 #3

 지난 시간에 tmp36 온도센서의 값을 일반 LCD에 표시(☜클릭) 하는 실습을 하였고, 오늘은 I2C 통신이 가능한 LCD에 이 온도 값을 표시해보고자 한다.




▶ 실험에 사용되는 온도센서 자료 ( TMP36 ) 


아래는 온도 값과 출력전압과의 상관관계를 나타낸 그래프이다.

예를 들어 TMP36센서는 주변 온도가 50도씨 일때 출력단자로 1.0V의 전압값을 출력한다는 뜻이다.


 그래프특성을 살펴보고 자신이 사용하고자 하는 환경에 맞는 센서를 사용하면 되며,  통상적으로 활용 온도 범위가 넓은 TMP36센서를 많이 사용한다. 


[ 실습에 사용될 RGB LED(3색LED) 구조 및 사양 ]


RGB LED 는 그림에서 보듯 3가지 색 LED가 한 몸체에 구성되어 있다고 이해하면 쉽다.

다만, 단자하나는 공통단자로 연결되어 있고, LED의 마이너스(-) 극이 공통단자로 되면 Common 케소드(음극),    플러스(+)극이 공통단자로 되면 Common 애노드(양극)이 된다. (통상적으로 부품의 다리 길이가 제일 긴 단자가 공통단자다)


따라서 부품을 사용하기전에 자신의 부품이 컴온 캐소드 타입인지? , 컴온 애노드 타입인지?  반드시 확인해야 하며, 단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


1. 온도 범위에 따라 LED의 색을 다르게 표시하라. 

[예, 수치 값이 165 이하는 블루색, 165~175는 그린색,  그 이상은 레드색]

2. 온도 값(섭씨)을 I2C LCD로 출력 하라. 


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)







▶ 실습 절차  : 

1. 안정적으로 사용하기 위해서는 LED 공통단자에 220Ω정도의 저항을 달아 준다.

2.LED 3개를 사용 하여 회로를 구성하여도 무방하며이때에도 각각 저항을 연결해주는 것이 좋다.


3. I2C 통신 모듈이 장착된 LCD를 사용하면 회로  연결이 매우 간편해 진다.- 1602(162) LCD의 경우 고유주소는 대개 ’0x27’이며 스캐닝 프로그램 이용해 확인 가능하다.



▶ 프로그램 코드 및 설명 : 


#include <Wire.h>                          // I2C 통신을 위한 헤더파일 추가

#include <LiquidCrystal_I2C.h> // I2C LCD 헤더파일 추가

LiquidCrystal_I2C lcd (0x27, 16,2); // 1602 LCD의 고유 주소 설정

const int RLED=9;    // 빨간색 LED 상수형변수에 아두이노 9번 핀 할당

const int GLED=10; // 녹색 LED 상수형변수에 아두이노 10핀 할당

const int BLED=11; //파란색 LED 상수형변수에 아두이노 11핀 할당

const int TEMP=0;     // 아날로그 입력 0(A0) 핀 선

const int LOWER_BOUND=160;      // 온도 하한 값을 정의 함

const int UPPER_BOUND=170;       // 온도 상한 값을 정의 함

int val=0;                      // 온도 센서의 현재 값을 저장하는 변수 선언

byte SpecialChar0[8] = {      // 온도 표시를 위한 특수 문자 배열

 B00010,

 B00101,

 B00101,

 B00010,

 B00000,

 B00000,

 B00000,

 B00000   };


void setup()   {

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);       // BLED를 출력으로 지정

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);        // BLED를 출력으로 지정

  lcd.begin();               // LiquidCrystal_I2C.h 에서 lcd.begin(16,2)’                                 

                                       //  지정하면 에러 발생함, ‘()’ 안을 비워 둘 것

  lcd.clear();

  lcd.createChar(1,SpecialChar1);      

}

 

void loop()   {

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;

  float TempDotC = (mVoltage - 500) / 10.0;

  Serial.print(TempDotC);

  Serial.println("℃\n");

  lcd.setCursor(0,0); 

  lcd.print("Tmp36 Sensor !");

  lcd.setCursor(0,1);

  lcd.print("Temp:");

  lcd.print(TempDotC);

  lcd.write(0);

  lcd.print("C"); 

  delay(500);

  if(val < LOWER_BOUND) {             // 경계 값 비교

    digitalWrite(RLED,LOW);

    digitalWrite(GLED,LOW);

    digitalWrite(BLED, HIGH);      //  켜려고 하는 LED HIGH 값 지정

  }

  else if (val>UPPER_BOUND) {//상위 경계선값 이상이면 Red LED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED, LOW); 

    digitalWrite(BLED, LOW);    

  }

  else {                                               // 경계선 사이 값이라면 Green LED On

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, HIGH);  

    digitalWrite(BLED, LOW);    

  }

}   



▶ 프로그램 코드 다운로드 :

TEMP_sensor_LCD_I2C.zip


 



1.  TMP 36 온도 센서를 이용해서 온도값에 따른 RGB LED의 색을 다르게출력 해보는 실습이다.
2.  Common Anode 타입의 RGB LED는 공통단자를 V+ 연결 하기 때문에 LED를 On 하기 위해서는 입력단자 LOW신호가 들어가야 한다.

3.  온도 변화에 따른 LED 색을 다르게 표시하기 위해  TMP36의 출력 값을 측정하여 경계값을 설정한다
  예165  이하면  블루 LED ON’     
  175 
값 이상이면  레드 LED ON’ 
  165~175 
사이 값이면  그린 LED ON’

4.   정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 변환하여 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 과제로 진행해 해보고자 한.


※위의 섭씨온도식에서 




▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)





【 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




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

반응형
반응형

 【 아두이노 센서#6】 I2C (Inter Integrated Circuit) 통신 



 지난 시간 TMP36 온도센서를 가지고 LCD 디스플레이 장치에 온도를 표시 해보았다. (☞  온도센서 tmp36 LCD 편), 이때 단 하나 아쉬운 것은 LCD가 패러럴로 아두이노 포트에 연결되고 병렬로 직접 제어를 하다보면 복잡하기도 하고 아두이노 제어포트가 부족한 상황이 발생 한다. 

 이런 문제는 I2C 통신 모듈이 달려있는 LCD를 연결함으로서 간단히 해결되는데,  오늘은 이런 I2C 통신에 대해 알아보는 시간을 갖도록 하겠다. 



I2C 통신





1   .I2C 통신은 필립스에서 개발한 통신 방식으로서 여러 개의 디바이스에 고유의 아이디를 부여해 디바이스 다자간 직접 통신이 가능하도록 만든 통신 방식.

2.   I2C프로토콜은 CLOCKDATA회선 두 개로 통신하기 때문에 두 가닥(Two-wire)프로토콜이라고 한다.

3.   I2C 최소한의 입출력 핀(SDA,SCL)만 사용하여 양방향 통신이 가능 하다
(SDA: Serial DAta,  SCL: Serial CLock)

4.    기존에 RS232C를 이용한 두 가닥 시리얼 통신(USART)이 있지만 I2C 통신은 1:N , N:N 통신이 가능하다. 때문에 마스터 와 슬레이브 설정이 필요하다.(최대 128개 연결)
때문에 각 장치마다 고유주소가 필요하고, 주소저장을 위한 레지스터가 존재한다

5.   통신을 위해서는 풀업 저항 필요
- 4.7KΩ
권장-빠른 속도의 통신에서는 약 2.2KΩ
- 오픈 드레인의 특성상 오픈 상태에서는 플업 저항 이 없으면 그라운드 상태가 되기 때문이다.

6.  I2C 통신은 예를 들어 여러 개의 온도센서들로 부터의 데이터를 처리하고자 할 경우 등에 적합하다.


▶ SPI(Serial Peripheral Interface) 통신과의 비교 :  






▶ I2C 통신 절차 :

  (이미지 클릭하면 확대 가능)


 I2C 통신 방법

1.  마스터에서 시작 비트를 전송한다.
2.  마스터에서 통신하려는 슬레이브 장치의 7비트 주소를 보낸다
3.  I2C 장치의 레지스터에 데이터를 쓸 것인지 아니면 읽어 올 것인
   지에 따라 마스터에서 1비트의 읽기 명령(1) 이나 쓰기 명령(0)을 
   보낸다
4.  슬레이브에서는 Acknowledge 또는 ACK비트(Low신호) 응답
    한다
5.  마스터는 I2C의 레지스터를 읽겠다는 1바이트 명령을 쓰기 모드
    에서 전송하고, 슬레이브에서는 ACK비트로 응답한다. 마스터는 
    I2C기기에서 전송되는 1바이트 정보를 읽기 모드에서 수신한다.  
    1바이트씩 읽고 나면 슬레이브에 ACK비트를 전송한다.

6.  마스터 에서 STOP 비트를 전송하여 마스터와 슬레이브 간 통신
    을 완료한다.

 Read 절차

1.  마스터에서 ReadAddressWrite Control ByteR/W bit
    를 Read셋팅Write 하면 슬레이브에서 Data를 전송 하게 
   된다.

2.  원하는 크기(데이터) 만큼 다 읽었다면 마스터는 슬레이브에게 
    Data를 그만 달라고 No ACK 신호를 준다( Data LineHigh)



 위 LCD 이미지의 뒷 면에 부착된 모듈이 바로 I2C통신을 가능하게 해주는 모듈이다.  최근에는 대부분의 기기에서 I2C 통신 혹은 SPI통신용 모듈이 부착되거나 내장되어 출시되고 있다.   따라서 향후에는 I2C(모듈)를 적극 이용해서 실습을 진행할 예정이다.


I2C 스캐너 사용하기  :  


※ I2C 센서를 사용하기 위해서는 I2C 센서 마다의 고유 주소를 알아야 하는데, 이 주소를 알기 위해서는 제조회사에서 제공하는 Data Sheet를 참고 할 수도 있으나, 좀더 쉽게 알아 낼 수 있는 방법이 지금 소개하는 I2C 스캐너 이다.
스캔너는 아두이노에 아래 프로그램을 작성하고 실행을 시키면 시리얼 모니터 창을 통해 주소를 확인 할 수 있다. 



▶ I2C 스캐너 프로그램 코드 : 


#include <Wire.h>

void setup()

{

  Wire.begin();  

  Serial.begin(9600);

  while (!Serial);          

  Serial.println("\nI2C Scanner");

}

void loop()

{

  byte error, address;

  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;

  for(address = 1; address < 127; address++ )

  {

    Wire.beginTransmission(address);

    error = Wire.endTransmission();

if (error == 0)

    {

      if (address<16)

      Serial.print("0");

      Serial.print("I2C device found at address 0x");

      Serial.print(address,HEX);

      Serial.println(" ←");

      Serial.print("I2C device Dec Number is: ");

      Serial.print(address,DEC);

      Serial.println(" ←");

      nDevices++;

    }

    else if (error==4)

    {

      Serial.print("Unknow error at address 0x");

      if (address<16)

        Serial.print("0");

      Serial.println(address,HEX);

    }  

   }

  if (nDevices == 0)

    Serial.println("No I2C devices found\n");

  else

    Serial.println("done!\n");

   delay(5000);

}




▶ I2C 스캐너 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)



위 시리얼 모티터 상에서 0x48(16진)  혹은 72(10진) 값이  해당 부품의 고유주소가 되며, 이는 부품마다 다를 수 있다.



반응형
반응형

 【 아두이노 센서#5】 TMP36 온도센서 #3 with LCD 




 지난 시간 TMP36 온도센서를 가지고 온도값을 시리얼 모니터로 확인하는 실습을 진행하였다. (바로가기 ☞ TMP36 온도센서 시리얼모니터 편)

이번 시간에는 지난시간에 이어서 센싱되는 온도값을 LCD 디스플레이 화면으로 출력해보는 실습을 진행 하려고 한다. 


▶ 실험에 사용되는 온도센서 자료 ( TMP36 ) 


아래는 온도 값과 출력전압과의 상관관계를 나타낸 그래프이다.

예를 들어 TMP36센서는 주변 온도가 50도씨 일때 출력단자로 1.0V의 전압값을 출력한다는 뜻이다.


 그래프특성을 살펴보고 자신이 사용하고자 하는 환경에 맞는 센서를 사용하면 되며,  통상적으로 활용 온도 범위가 넓은 TMP36센서를 많이 사용한다. 


[ 실습에 사용될 RGB LED(3색LED) 구조 및 사양 ]


RGB LED 는 그림에서 보듯 3가지 색 LED가 한 몸체에 구성되어 있다고 이해하면 쉽다.

다만, 단자하나는 공통단자로 연결되어 있고, LED의 마이너스(-) 극이 공통단자로 되면 Common 케소드(음극),    플러스(+)극이 공통단자로 되면 Common 애노드(양극)이 된다. (통상적으로 부품의 다리 길이가 제일 긴 단자가 공통단자다)


따라서 부품을 사용하기전에 자신의 부품이 컴온 캐소드 타입인지? , 컴온 애노드 타입인지?  반드시 확인해야 하며, 단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


1. 온도 범위에 따라 LED의 색을 다르게 표시하라. 

[예, 수치 값이 165 이하는 블루색, 165~175는 그린색,  그 이상은 레드색]

2. 온도(섭씨) 값을 LCD 화면으로 출력하라.


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)






※ LCD 부분 연결은 위 회로도를 보며 연결하도록 한다.


▶ 실습 절차  : 

1. 안정적으로 사용하기 위해서는 LED 공통단자에 220Ω정도의 저항을 
 달아 준다.

2.LED 3개를 사용 하여 회로를 구성하여도 무방하며이때에도 각각 
 저항을 연결해주는 것이 좋다.

3.실습에 사용되는 LCD는 16열 2행(16by2)LCD로서 기본적으로 가장 
 많이 사용되던 형태이다. 16핀 중에서 주요 제어 라인을 아두이노
 포트로 직접 제어를 하는 형태이다.

4. 만약, LCD로 출력이 잘 되지 않을 경우 먼저 시리얼모니터로 
 데이터 출력을 점검해보고 이상이 없다면 LCD 연결라인이나 LCD관련 프로그램 부분을 살펴보면 좋을 것이다. (다음 실습에서 사용하기 편리한 I2C 타입의 LCD를 다루어 볼 것이다)   




▶ 프로그램 코드 및 설명 : 


#include <LiquidCrystal.h>            // LCD를 사용하기 위한 헤더파일

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);    // LCD 핀 설정

const int RLED=9;    // 빨간색 LED 상수형변수에 아두이노 9번 핀 할당

const int GLED=10; // 녹색 LED 상수형변수에 아두이노 10핀 할당

const int BLED=11; //파란색 LED 상수형변수에 아두이노 11핀 할당

const int TEMP=0;     // 아날로그 입력 0(A0) 핀 선

const int LOWER_BOUND=162;      // 온도 하한 값을 정의 함

const int UPPER_BOUND=168;       // 온도 상한 값을 정의 함

int val=0;                      // 온도 센서의 현재 값을 저장하는 변수 선언

byte SpecialChar1[8] = { B00010,  B00101B00101, B00010,

 B00000B00000B00000B00000   };

void setup() {

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);        // BLED를 출력으로 지정

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);        // BLED를 출력으로 지정

  lcd.begin(16,2);

  lcd.clear();

  lcd.createChar(1,SpecialChar1);     

}

void loop()    {

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;

  float TempDotC = (mVoltage - 500) / 10.0;

  Serial.print(TempDotC);     Serial.println("℃\n");

  lcd.setCursor(0,0); 

  lcd.print("Tmp36 Sensor !");

  lcd.setCursor(0,1);

  lcd.print("Temp:");

  lcd.print(TempDotC);

  lcd.write(1);      

  lcd.print("C"); 

  delay(500);

  if(val < LOWER_BOUND) {       // 경계 값 비교     

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED,HIGH);

    digitalWrite(BLED, HIGH);   } //  켜려고 하는 LEDHIGH 값 지정

  else if (val>UPPER_BOUND) {//상위 경계선값 이상이면 Red LED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED, LOW); 

    digitalWrite(BLED, LOW);    }

else {  // 경계선 사이 값이라면 Green LED On

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, HIGH);  

    digitalWrite(BLED, LOW);    }    

}   


1.TMP 36 온도 센서를 이용해서 온도값에 따른 RGB LED의 색을 
 다르게출력 해보는 실습이다.
2.Common Anode 타입의 RGB LED는 공통단자를 V+ 연결 하기 
 때문에 LED를 On 하기 위해서는 입력단자 LOW신호가 들어가야 한다.

3.온도 변화에 따른 LED 색을 다르게 표시하기 위해  TMP36의 출력 
 값을 측정하여 경계값을 설정한다
  예165  이하면  블루 LED ON’     
  175 
값 이상이면  레드 LED ON’ 
  165~175 
사이 값이면  그린 LED ON’

4. 정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 
변환하여 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 
과제로 진행해 본다.


※위의 섭씨온도식에서 






▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)





반응형
반응형

 【 아두이노 센서#4】 TMP36 온도센서 #2





▶ 실험에 사용되는 온도센서 자료 ( TMP36 ) 


아래는 온도 값과 출력전압과의 상관관계를 나타낸 그래프이다.

예를 들어 TMP36센서는 주변 온도가 50도씨 일때 출력단자로 1.0V의 전압값을 출력한다는 뜻이다.


 그래프특성을 살펴보고 자신이 사용하고자 하는 환경에 맞는 센서를 사용하면 되며,  통상적으로 활용 온도 범위가 넓은 TMP36센서를 많이 사용한다. 


[ 실습에 사용될 RGB LED(3색LED) 구조 및 사양 ]


RGB LED 는 그림에서 보듯 3가지 색 LED가 한 몸체에 구성되어 있다고 이해하면 쉽다.

다만, 단자하나는 공통단자로 연결되어 있고, LED의 마이너스(-) 극이 공통단자로 되면 Common 케소드(음극),    플러스(+)극이 공통단자로 되면 Common 애노드(양극)이 된다. (통상적으로 부품의 다리 길이가 제일 긴 단자가 공통단자다)


따라서 부품을 사용하기전에 자신의 부품이 컴온 캐소드 타입인지? , 컴온 애노드 타입인지?  반드시 확인해야 하며, 단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


 온도 범위에 따라 LED의 색을 다르게 표시하라. 

[예, 수치 값이 165 이하는 블루색, 165~175는 그린색,  그 이상은 레드색]


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)





▶ 실습 절차  : 

1. 안정적으로 사용하기 위해서는 LED 공통단자에 220Ω정도의 저항을 
 달아 준다.

2.LED 3개를 사용 하여 회로를 구성하여도 무방하며이때에도 각각 
 저항을 연결해주는 것이 좋다.




▶ 프로그램 코드 및 설명 : 


const int RLED=9;            //9번 핀을 사용하는 빨간색 BLED 상수정의

const int GLED=10;         //10번 핀을 사용하는 초록색 GLED 상수정의

const int BLED=11;         //11번 핀을 사용하는 파란색 RLED 상수 정의

const int TEMP=0;                        //아날로그 입력 0번 핀을 상수 정의

const int LOWER_BOUND=165;      // 온도 하한 값을 정의 함

const int UPPER_BOUND=175;       // 온도 상한 값을 정의 함

int val=0;                          // 온도 센서의 현재 값을 저장하는 val 변수 선언

void setup() {

  pinMode(RLED, OUTPUT);       // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);       // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);      // BLED를 출력으로 지정

}

void loop() {                        // 공통단자가 '-'인 RGB LED 부품 사용

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;     // 센서의 출력값을 전압값으로 변환

  float TempDotC = (mVoltage - 500) / 10.0;  // 전압값을 Tmp36식에 의해 섭씨온도로변환

  Serial.print(TempDotC);

  Serial.println("℃\n");

  delay(500);

  if(val < LOWER_BOUND)   {         // 아래쪽 경계 값 보다 작다면

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED,HIGH);      val=analogRead(TEMP);     // 하위 경계선 값 이하이면 Blue LED ON

  if(val < LOWER_BOUND)   {

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, LOW);

    digitalWrite(BLED, HIGH);      //  켜려고 하는 LED HIGH 값 지정

  }

  else if (val>UPPER_BOUND) {//상위 경계선값 이상이면 Red LED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED, LOW); 

    digitalWrite(BLED, LOW);    

  }

  else {                                               // 경계선 사이 값이라면 Green LED On

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, HIGH);  

    digitalWrite(BLED, LOW);    

  }

}   


1.TMP 36 온도 센서를 이용해서 온도값에 따른 RGB LED의 색을 
 다르게출력 해보는 실습이다.
2.Common Anode 타입의 RGB LED는 공통단자를 V+ 연결 하기 
 때문에 LED를 On 하기 위해서는 입력단자 LOW신호가 들어가야 한다.

3.온도 변화에 따른 LED 색을 다르게 표시하기 위해  TMP36의 출력 
 값을 측정하여 경계값을 설정한다
  예165  이하면  블루 LED ON’     
  175 
값 이상이면  레드 LED ON’ 
  165~175 
사이 값이면  그린 LED ON’

4. 정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 변환하여 
 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 과제로 진행해
 본다.


※위의 섭씨온도식에서 




▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)





반응형