로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2011/09/11
첨부#1 TSL2561-Arduino-Library.zip (7KB) (Down:894)
첨부#2 TSL2561.pdf (334KB) (Down:328)
ㆍ추천: 0  ㆍ조회: 2615   
  TSL2561 조도 측정기의 제작
제목 : TSL2561 Low power, digital luminosity (light) sensor
참조 : http://www.adafruit.com/products/439
 
중국산 저가 조도계를 사용하고 계신가요? 아마 이 센서의 성능이 더 좋을 겁니다. !!!
  
 
규격 :
사람의 눈에 근접하는 특성
주위조명의 조도를 정밀하게 측정
작동온도 범위: -30 에서 80 C 까지 
조도측정 범위 : 0.1 에서 40,000 Lux 까지 
작동전압 범위: 2.7 - 3.6V 
연결방식 (Interface) : I2C 
 저소비 전력 : 0.75 mW
50 혹은 60 Hz 빛의 리플을 자동으로 제거 
센서 지향각 : 60 도 (중심축에서 ±60 도의 빛을 검출)
TSL2561 조도센서의 자료 : http://www.adafruit.com/datasheets/TSL2561.pdf

센서의 설명 :
TSL2561 조도 센서는 넓은 범위의 조명 환경에서 사용하는 향상된 디지털 감광 센서이다.
저가격의 CdS 셀과 비교한다면, 이 센서는 더 정밀하면서도, 0.1 - 40,000+ Lux 범위에서,
즉시 다른 감도의 감광 범위로 조도를 추출하거나 설정할 수 있습니다.
 
이 센서의 중요한 부분은 적외선 영역과 가시광선+적외선 영역을 감지하는 두개의 감광 다이오드로,
광학필터가 장착된 적외선 영역과 적외선+ 가시광선 영역역을 분리하여 측정할 수 있습니다.
광검출 센서는 인간의 눈으로는 볼 수 없는 빛이라도 반복해서 정밀하게 빛을 검출합니다.

  

센서는 가시광선과 근적외선 영역을 포함하는 전영역 채널 0 와 적외선 영역을 검출하는 채널 1 ,
2개의 광검출 다이오드를 내장하고 있습니다. 각각의 광검출 채널은 독립적으로 작동합니다.
가시광선 영역의 광 검출값은 전영역 검출값에서 적외선 영역 검출값을 감산하여 계산합니다.
센서는 디지털 I2C 제어 BUS로 센서를 3개 까지 I2C 주소로 분리하여 선택할 수 있습니다.


 
센서에 내장된 ADC는 MPU에 아날로그 입력이 없어도 사용할 수 있다는 뜻입니다.
변환시간은 100 ms ~400 ms으로  내장발진 주파수 735KHz 적분 Field Register의 설정값에 따라 틀려집니다.
Field value 00: 적분시간 Tint = (11 × 918)/fosc = 13.7 ms, 적분시간 Scaling 11/322 = 0.034
Field value 01: 적분시간 Tint = (81 × 918)/fosc = 101 ms, 적분시간 Scaling 81/322 = 0.252
Field value 10: 적분시간 Tint = (322 × 918)/fosc = 402 ms, 적분시간 Scaling 322/322 = 1

내부 ADC의 분해능(Resolution)은 16 비트, 최대측정값(Full Sscale)은 65535, 적분시간(Tint)는 178ms 입니다.
최종검사에서 640nm(파장분포 1/2 =17 nm)의 적색 LED와 940nm(파장분포 1/2 =40nm)의 IR-LED로 검사합니다.
0.5mA의 낮은 작동전류와 15uA의 작동중지 상태는 저 소비전력의 자료저장(data logger)에 좋습니다.

TSL2561 Register


TSL2561의 연결방법
센서는 빵판에 조립할 수 있는 6핀 커넥터와 함께 발송하므로 쉽게 시작할 수 있습니다.
짧은 핀이 위로, 긴 핀이 아래로 가도록 센서기판에 조립하면 빵판에 쉽게 꼽을 수 있습니다.
커넥터를 밑에 놓고 센서가 위로 향하게 기판을 빵판에 놓고, 기판 윗쪽에서 6개의 패드를 납땜합니다.
다음은 아듀이노 기판에 연결해야 합니다.
 
 
우리는 이번에 아듀이노를 사용할 것입니다.
그러나 가까이에 있는 어떤 MPU도 이 코드를 적용할 수 있습니다.

센서의 VCC 핀을 3V3 핀에 연결합니다. 센서에 3.3V 보다 높은 5V VCC를 공급하지 마세요.
센서의 GND 핀은 GND로 연결합니다. 센서의 I2C SCL 핀을 A5 (SCL) 핀에 연결합니다.
센서의 I2C SDA 핀을 A4 (SDA) 핀에 연결합니다. 거의 모든 MPU의 I2C 포트는 특별히 정한 핀을 사용해야 합니다.
 
3.3V의 TSL2561의 데이터 핀을 어떻게 5V의 아듀이노에 연결해도 좋은가? 이 경우는 OK 입니다.
I2C 버스의 10K 풀업저항이 3.3V에 연결되어 있으므로, 실제 데이터 레벨은 3.3V 입니다. 
센서와 장치는 오랜 시간 3.3V 전원으로 I2C를 사용해도 잘 됩니다.

그러나 I2C 장치를 5V로 풀업하거나 5V를 센서전원으로 사용하지 마세요.
만일 DS1307과 함께 사용하려면 DS1307의 SDA/SDL에 연결된 풀업저항을 모두 제거해야 합니다.
TSL2561에 연결된 3.3V의 풀업을 공용으로 2개의 센서에 안전하게 사용할 수 있습니다.
 
ADDR (i2c address change) 혹은 INT (interrupt output) 핀은 연결할 필요가 없습니다.
ADDR 핀은 I2C 주소가 충돌한 경우에만 주소를 변경합니다.
ADDR 핀을 GND로 연결하면 I2C 주소가 0x29로 결정(set) 됩니다. 
ADDR 핀을 3V3으로 연결하면 I2C 주소가 0x49로 결정(set) 됩니다.
혹은 연결하지 않고 부동(float)시키면 I2c 주소는 0x39로 결정(set) 됩니다.
 
INT 핀은 감광 레벨이 변화하면 INT를 출력하도록 설정했다면 센서로 부터의 INT 신호가 출력됩니다.
INT는 상한문턱과 하한문턱 값을 설정하고, 측정값이 문턱값을 넘으면 신호가 발생됩니다.
우리의 이번  예제에는 이 코드가 없습니다.  이것을 쓰지 않는 다면, 센서의 연결은 이것으로 끝났습니다.
INT 핀과 3.3V 핀 사이에는 10K-100K 풀업 저항을 사용합니다.

지금까지 TSL2561 조도센서를 아듀이노 MPU 기판으로 연결하는 방법을 설명했습니다.
다음은 센서에서 읽은 값을 조도로 계산하는 예제 소스를 설명할 것입니다.
 
TSL2561 라이브러리
아듀이노 라이브러리 : https://github.com/adafruit/TSL2561-Arduino-Library
혹은 첨부파일 #1을 받아서 압축을 풀면 TLS2561 폴더와 TSL2561.pde가 나옵니다.
 
TSL2561 폴더 안에는 TSL2561.cpp 와 TSL2561.h 가 들어 있습니다.
TSL2561 폴더 전체를 PC의 arduino-0022 -> libraries -> 안에 통째로 넣어 줍니다.
Arduino-0022 IDE를 다시 실행하면 Import Library에 TSL2561이 등록되어 있습니다.

아듀이노 소스
첨부파일 #1에 들어 있는 TSL2561.pde를 아듀이노 스켓치에서 소스로 사용합니다.
예제 프로그램은 읽은 값을 조도(lux)로 계산하는 방법입니다.

측정값을 보려면 직렬 모니터를 9600 bps로 열어야 합니다.
측정 값이 바뀌는 것을 보려면 램프를 사용하거나 손으로 센서를 가려 줍니다.
 
 
소스코드의 첫번째 부분은 허용된 ADDR 핀의 정의이다. 전선으로 연결해야 한다
// 센서의 주소는 ADDR 핀을 사용하는 방법에 의존된다.
// ADDR 핀을 접지(gnd)와 연결하면 0x29,
// 연결하지 않고 놀리면(float) 주소는 0x39,  // 1개의 센서는 이것을 사용한다.
// 3V3 전원에 연결하면 0x49 이다.
TSL2561 tsl(TSL2561_ADDR_FLOAT);   // 센서의 주소를 생성하도록 정의해야 한다.
 
감도(gian) 0 (증폭이 없다, 낮은 밝기에 좋다)으로 하든지,
혹은 16 (어두운 상황에서 감도를 올린 상태)으로 하든지
센서의 감도와 적분시간을 원하는대로 설정할 수 있다. 
// 밝거나 어두운 상황에 적응하기 위해 감도를 바꿔치기(on the fly)할 수 있다.
// tsl.setGain(TSL2561_GAIN_0X); // 감도 0 (밝은 빛 상황)
tsl.setGain(TSL2561_GAIN_16X); // 감도 16 (어두운 빛 상황),
우선 이것을 사용한다.
 
그리고 적분시간도 바꿀 수 있다. 이것은 얼마나 오래동안 빛의 측정값을 모으는가 이다.
긴 모집 시간은 많은 빛을 검출할 것이다. 만일 밝은 빛이라면 적분시간을 13 ms로 설정하라.
만일 어두운 빛이라면 101 ms으로 설정하고, 매우 어두운 빛이라면 402 ms으로 설정하라.
// 검출 빛을 긴시간 적분하기 위해서 적분시간을 바꿀 수 있다.
// 긴 시간은 늦다. 그러나 어두운 상황에서 빛의 감도가 매우 좋다.
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // 짧은 적분 시간 (밝은 빛), 우선 이것을 사용한다. 
// tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // 중간 적분 시간 (중간 빛)
// tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // 긴 적분 시간 (어두운 빛)
 
어떤 종류의 빛을 검출할 것인지 바꿀 수 있다.
센서에는 2개의 다이오드가 있다. 하나는 전영역 또 하나는 적외선이다.
하나 만 측정하든지 전영역 가시광선 값에서 적외선 영역 값을 감산해서 측정할 수 있다.
측정이 준비되었을 때, 3개의 옵션으로 getLuminosity 함수를 호출하여 측정할 수 있다.
TSL2561_VISIBLE,
TSL2561_INFRARED,
TSL2561_FULLSPECTRUM.

만일 가시영역을 선택하면, 2개의 다이오드에서 읽은 값의 차이가 주어진다.
// 간단한 데이터 읽기의 예. 적외선 영역, 전영역 혹은 가시영역 (2개의 다이오드 값의 차이)
// 13 - 402 ms를 소모하며, 어떤 것이든 다음에 오는 3 개중 1 개를 선택해야 한다.
uint16_t x = tsl.getLuminosity(TSL2561_VISIBLE);
//uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM);
//uint16_t x = tsl.getLuminosity(TSL2561_INFRARED);

만일 조도(lux)의 계산을 원하면, 같은 시간에 모두를 읽게 된다.
다음 코드의 예를 사용한다. 각각 16 비트를  32 비트로 평활(smoothing)한다.
전영역 빛을 측정할 때, 조도(lux) 계산의 하위함수는 라이브러리에 들어 있으므로 생략할 수 있다.

// 더욱 발전된 데이터 읽기의 예로 16 비트 적외선 영역과 16 비트 전영역을 32 비트로 읽는다.
// 이 방법은 당신이 원하는대로 계산하든지 비교할 수 있다.
uint32_t lum = tsl.getFullLuminosity();  // 전영역 값을 32 비트 변수로 설정하고 밝기를 측정한다. 
uint16_t ir, full;    // 적외선 영역과 전영역을 모두 16 비트 변수로 설정
ir = lum >> 16;   // 32 비트 측정값을 16 비트로 나누고 16 비트 값으로 적외선 값에 저장한다.  
full = lum & 0xFFFF;    // 32 비트 측정값은 그대로 16 비트로 만들어 전영역 값에 저장한다.

 
Serial.print("IR: "); Serial.print(ir); Serial.print(" ");    // 적외선 값을 표시 
Serial.print("Full: "); Serial.print(full); Serial.print(" ");   // 전영역 값을 표시
Serial.print("Visible: "); Serial.print(full - ir); Serial.print(" ");  // 전영역 - 적외선 값을 표시
Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));   // 조도(lux) 값을 표시

라이브러리의 설명
다음은 조도(lux)를 계산하는 함수이다.
라이브러리에 있는 함수는 별도로 만들지 않고, 호출하면 실행된다.

uint32_t TSL2561::calculateLux(uint16_t ch0, uint16_t ch1) {   // 실제로 측정하지 않고 변수만 설정한다
  unsigned long chScale;     // 센서 ADC의 적분시간 설정 변수
  unsigned long channel1;    // 적외선 센서
  unsigned long channel0;    // 전영역 센서
 
  switch (_integration)  {
    case TSL2561_INTEGRATIONTIME_13MS:  
// 적분시간이 13 ms 이면 여기를 실행
      chScale = TSL2561_LUX_CHSCALE_TINT0;
      break;
    case TSL2561_INTEGRATIONTIME_101MS: 
// 적분시간이 101 ms 이면 여기를 실행
      chScale = TSL2561_LUX_CHSCALE_TINT1;
      break;
    default: // No scaling ... integration time = 402ms
      chScale = (1 << TSL2561_LUX_CHSCALE); 
// 적분시간이 402 ms 이면 여기를 실행
      break;
  }
 
주함수에서 감도를 설정하면 라이브러리의 이 부분이 실행된다.
  // Scale for gain (1x or 16x) 센서의 감도를 설정
  if (!_gain) chScale = chScale << 4;
  // scale the channel values 센서의 범위를 설정
  channel0 = (ch0 * chScale) >> TSL2561_LUX_CHSCALE;  // 전영역 측정 채널
  channel1 = (ch1 * chScale) >> TSL2561_LUX_CHSCALE;  // 적외영역 측정 채널
  // find the ratio of the channel values (Channel1/Channel0) // 센서 채널의 비례상수(ratio)를 설정 
  unsigned long ratio1 = 0;
  if (channel0 != 0) ratio1 = (channel1 << (TSL2561_LUX_RATIOSCALE+1)) / channel0;
  unsigned long ratio = (ratio1 + 1) >> 1;  // 비례상수 값을 round 연산한다.

결론
ADC가 내장된 스마트 센서들은 복잡한 아날로그 증폭기와 정밀한 ADC가 필요없으므로,
MPU에서 16 비트 분해능으로 측정값을 읽을 수 있습니다. 게다가 교정된 LUX 값으로 변환도 가능합니다.
물론 시판용으로 만든다면 법정 인증검사기관의 검교정을 받아야 하지만,,, 이 정도로도 실용적입니다.
LED 제품을 생산하는 제조업체에서 미리 인증된 측정기로 2차 교정하면, 생산제품의 검사에 사용이 가능합니다.

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
AVRTOOLS™

   
윗글 Arduino DMX512 수신기 제작
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 176 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 257 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 291 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 350 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 333 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 402 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 374 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 322 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 531 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 458 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 275 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 356 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 517 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 389 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 266 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 486 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 360 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 219 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 383 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1654 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2528 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2067 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 461 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 415 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3629 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2615 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0