MAX44009 Ambient Ligiht Sensor Module#
▷ Maxim MAX44009 #
ไอซี MAX44009 (Datasheet) ผลิตโดยบริษัท Maxim Integrated เป็นเซนเซอร์แสงที่ทำงานและให้เอาต์พุตแบบดิจิทัล (Digital Ambient Light Sensor) และสามารถวัดความเข้มแสงที่มองเห็นด้วยตาเปล่าได้ในสภาวะแวดล้อมโดยรอบ
คุณสมบัติของ MAX44009
- ทำงานได้โดยใช้พลังงานต่ำ (โดยทั่วไปแล้ว ปริมาณกระแสไฟฟ้าอยู่ในระดับต่ำกว่า 1μA)
- สามารถวัดค่าความเข้มแสงได้ในช่วง 0.045 Lux ถึง 188,000 Lux สำหรับความยาวคลื่นของแสงในช่วง 400nm ~ 700nm
- ใช้แรงดันไฟเลี้ยง (VCC) ในช่วง 1.7V ~ 3.6V
- ทำงานได้ในช่วงอุณหภูมิ -40 ~ +85 °C
- สื่อสารข้อมูลด้วยบัส I2C ความเร็วได้ถึง 400kHz
- มีขา A0 (Address Select) จำนวนหนึ่งขา (อินพุต)
- มีขา /INT (Active-Low) สำหรับการตั้งค่า Threadhold และเอาไว้เปรียบเทียบกับค่าที่วัดได้ สามารถเปิดการสร้างสัญญาณอินเทอร์รัพท์เป็นเอาต์พุตได้โดยอัตโนมัติ ตามเงื่อนไขการเปรียบเทียบค่า Threadhold
ภายใน MAX44009 มีวงจรที่ประกอบด้วยโฟโต้ไดโอด (Photodiode) และมีวงจรสำหรับการชดเชยหรือตัดส่วนที่เกิดจากอินฟราเรดออกไป (IR compensation / IR rejection)
เมื่อได้รับแสง จะทำให้เกิดกระแสไฟฟ้าไหลที่ตัวโฟโต้ไดโอด และนำไปผ่านวงจรแปลงกระแสให้เป็นแรงดันไฟฟ้า (OpAmp-based Current-to-Voltage Converter) แล้วแปลงสัญญาณแอนะล็อกให้เป็นข้อมูลดิจิทัล สำหรับการประมวลผลและสื่อสารข้อมูลผ่านบัส I2C ในลำดับถัดไป
รูป: Block Diagram ของไอซี MAX44009
การทำงานของ MAX44009 มีให้เลือกหลายโหมด ซึ่งขึ้นอยู่กับการตั้งค่าบิต Bit 7 CONTINUOUS และ Bit 6 MANUALในรีจิสเตอร์ Configuration Register (Address 0x02)
- Default Mode: เป็นโหมดการวัดค่าที่เกิดขึ้นซ้ำทุก ๆ 800 มิลวินาที
- Automatic Mode: เป็นโหมดการวัดค่าที่มีระยะเวลาในการวัดถูกเลือกโดยอัตโนมัติ (Integration time: TIM) อยู่ในช่วง 100 มิลลิวินาที ถึง 800 มิลลิวินาที ซึ่งขึ้นอยู่กับปริมาณแสงที่ได้รับในขณะทำการวัด
- Manual Mode: เป็นโหมดที่มีการเลือกระยะเวลาในการวัดได้ ตั้งแต่ 6.25 มิลลิวินาที ถึง 50 มิลลิวินาที
- Continuous Mode: เป็นโหมดการวัดต่อเนื่องซ้ำไปเรื่อย ๆ และเลือกระยะเวลาในการวัดได้
Bit 7 CONTINUOUS | Bit 6 MANUAL | Description |
---|---|---|
0 | 0 | Default, integration time 800 msec |
0 | 1 | Manual (one-shot), integration time selected by TIM[2:0] bits |
1 | 0 | Continuous, automatic integration time: 100 .. 800 msec |
1 | 1 | Continuous, manual integration time selected by TIM[2:0] bits |
รูป: รายการรีจิสเตอร์ที่มีอยู่ภายใน MAX44009 สำหรับการอ่านหรือเขียนข้อมูลไบต์ด้วยบัส I2C
รูป: การเลือกค่าบิตสำหรับ Integration Time (TIM)
รูป: การเขียนหรืออ่านหนึ่งไบต์ลงในรีจิสเตอร์ (Write or Read Register) ภายใน MAX44009
การเขียนค่าลงในรีจิสเตอร์ขนาดหนึ่งไบต์ มีลำดับดังนี้
- ไมโครคอนโทรลเลอร์เริ่มต้นด้วยการส่งสัญญาณเริ่มต้น (Start Signal: S)
- ส่งไบต์แอดเดรสของอุปกรณ์ + บิตสำหรับการเขียน (R/W Bit: 0) แล้วตรวจสอบบิต Acknowledge: A
- ส่งไบต์ข้อมูลที่ระบุแอดเดรสของรีจิสเตอร์ (Register Address) แล้วตรวจสอบบิต ACK จากอุปกรณ์
- ส่งไบต์ข้อมูล (Data Byte) ที่ต้องการเขียนลงในรีจิสเตอร์ดังกล่าว แล้วตรวจสอบบิต ACK จากอุปกรณ์
- จบท้ายด้วยการส่งสัญญาณจบ (Stop Signal: P)
การอ่านค่าลงในรีจิสเตอร์ขนาดหนึ่งไบต์
- เริ่มต้นด้วยการส่งสัญญาณเริ่มต้น (Start Signal: S)
- ส่งไบต์แอดเดรสของอุปกรณ์ + บิตสำหรับการอ่าน (R/W Bit: 1) แล้วตรวจสอบบิต Acknowledge: A จากอุปกรณ์
- ส่งไบต์ข้อมูลที่ระบุแอดเดรสของรีจิสเตอร์ (Register Address) แล้วตรวจสอบบิต ACK จากอุปกรณ์
- ส่งสัญญาณเริ่มต้นอีกครั้ง (Repeated Start: R) ข้อมูลที่ต้องการเขียนลงในรีจิสเตอร์ แล้วตรวจสอบบิต ACK จากอุปกรณ์
- อ่านข้อมูลหนึ่งไบต์ จากอุปกรณ์ แล้วส่ง No Ack (/A) ไปยังอุปกรณ์
- จบท้ายด้วยการส่งสัญญาณจบ (Stop Signal: P)
รูป: การอ่านข้อมูลไบต์จากรีจิสเตอร์ที่มีแอดเดรสต่างกัน (Register Address 1, 2) ตามลำดับ
▷ GY-49 Module#
เนื่องจากไอซี MAX44009 มีขนาดเล็ก จึงนิยมใช้โมดูล Breakout เช่น โมดูล GY-49
โมดูล GY-49 มี 4 ขา ได้แก่
Pin | Description |
---|---|
VCC | Voltage Supply (+3.3V ~ +5V) |
GND | Ground |
SCL | I2C Clock |
SDA | I2C Data |
ไอซี MAX44009 มีขา A0 (Address Select) ให้กำหนดค่าแอดเดรสของอุปกรณ์ได้เป็น 0x4A
และ 0x4B
) แต่โมดูล GY-49 ไม่มีขาสำหรับ ADDR แต่จะมี Solder Jumper
สำหรับบัดกรี เพื่อกำหนดค่าบิต (และมีค่า Default เป็น 0x4A
)
รูป: โมดูล GY-49 จากมุมมองด้านที่มีไอซี 662K (3.3V LDO Voltage Regulator) และด้านที่รับแสงซึ่งมีไอซี MAX44009 และมีการบัดกรีตรงตำแหน่ง Solder Jumper เอาไว้
รูป: ผังวงจรของโมดูล GY-49 (Source: wiki.sunfounder.cc)
จากตัวอย่างผังวงจรจะเห็นได้ว่า โมดูล GY-49 มีไอซี MAX44009 และมีวงจร แปลงแรงดันไฟเลี้ยง (LDO Voltage Regulator เช่น ใช้ไอซี 622K) แปลงจากไฟเลี้ยง +5V ให้เป็น +3.3V และมีวงจรที่ทำหน้าที่แปลงระดับแรงดันลอจิก (Logic Level Shifter) โดยใช้ทรานซิสเตอร์แบบ MOSFET (ใช้ไอซีเบอร์ K27 / 702 / 2N7002KDW: Dual N-Channel MOSFET, SOT3-6-3)
ตัวอย่างไลบรารีสำหรับการเขียนโค้ดด้วย Arduino และ MicroPython และมีการแชร์ไว้ใน Github ได้แก่
▷ ตัวอย่างการเขียนโค้ด Arduino#
โค้ด Arduino Sketch สาธิตการอ่านค่าจากโมดูล GY-49 โดยการเชื่อมต่อระหว่างไมโครคอนโทรลเลอร์ Arduino Uno / Nano หรือ ESP32 ด้วยบัส I2C ความเร็ว 400kHz ถ้าใช้บอร์ด Arduino Nano ให้ใช้ขา A4 และ A5 สำหรับสัญญาณ SDA และ SCL ตามลำดับ แต่ถ้าเป็นบอร์ด ESP32 สามารถเลือกใช้ขาได้ตามความเหมาะสม
//-------------------------------------------------------------------
// Author: RSP @ KMUTNB
// Date: 2022-08-23
// Target: Arduino ESP32 or Uno/Nano
//-------------------------------------------------------------------
#include <Wire.h>
// Select I2C Pins for ESP32
#define I2C_SDA_PIN (33)
#define I2C_SCL_PIN (32)
// Note: For arduino Uno or Nano, use A4 and A5 pins for SDA and SCL.
// Set the I2C address for the MAX44009 device
#define MAX44009_ADDR (0x4a) // 0x4a or 0x4b
void setup() {
Serial.begin( 115200 );
#if defined(ESP32)
// set I2C Pins for ESP32
Serial.println( "Set I2C pins for ESP32" );
Wire.begin( I2C_SDA_PIN, I2C_SCL_PIN );
#else
Wire.begin();
#endif
Wire.setClock( 400000 ); // set I2C speed to 400kHz
Wire.beginTransmission( MAX44009_ADDR );
if ( Wire.endTransmission() > 0 ) {
Serial.println( "MAX44009 not found! [error]" );
} else {
Serial.println( "MAX44009 found! [ok]" );
}
}
void loop() {
float lux = -1.0;
if ( MAX44009_read( MAX44009_ADDR, &lux ) ) {
#if defined(ESP32)
Serial.printf( "Light: %.1f lx\n", lux );
#else
Serial.print( "Light: " );
Serial.print( lux, 1 ); // only 1 digit after the decimal point
Serial.println( " lx" );
#endif
} else {
Serial.println( "Sensor reading error!" );
}
}
bool MAX44009_read( uint8_t addr, float *lux ) {
uint8_t buf[2];
*lux = 0.0;
Wire.beginTransmission( addr );
Wire.write( 0x02 ); // select the configuration register
Wire.write( 0x44 ); // use manual mode, TIM[2:0]=0b100 (50 msec) or
//Wire.write( 0x80 ); // use automatic mode
if ( Wire.endTransmission() > 0 ) {
Serial.println( "No sensor response!" );
return false;
}
delay(800); // wait for 800 msec
uint8_t reg_addr[] = {0x03,0x04};
for ( int i=0; i < 2; i++ ) {
Wire.beginTransmission( addr );
Wire.write( reg_addr[i] ); // specify the register address
Wire.endTransmission( false ); // no stop, followed by repeated start
Wire.requestFrom( addr, 1 );
if ( Wire.available() == 1 ) {
buf[i] = Wire.read(); // data from the selected register
} else {
return false;
}
}
Wire.endTransmission();
// Convert the data to lux
int exponent = (buf[0] & 0xf0) >> 4; // 4-bit exponent (E)
int mantissa = ((buf[0] & 0x0f) << 4) | (buf[1] & 0x0f); // 8-bit mantissa (M)
*lux = (1UL << exponent) * mantissa * 0.045;
return true;
}
อีกตัวอย่างหนึ่งเป็นการสาธิตการใช้ไลบรารี Arduino MAX4409
โค้ดตัวอย่างการใช้ไลบรารี https://github.com/RobTillaart/Max44009/
#include <Wire.h>
#include "Max44009.h" // https://github.com/RobTillaart/Max44009/
Max44009 light( 0x4A );
void setup() {
Serial.begin( 115200 );
Wire.begin();
Wire.setClock( 400000 );
delay(100);
light.setAutomaticMode(); // use automatic mode
}
void loop() {
float lux = light.getLux();
if ( light.getError() ) {
Serial.println( "Sensor reading failed! [error]" );
}
else {
Serial.print( "Light: " );
Serial.print( lux, 1 );
Serial.println( " lx" );
}
delay(1000);
}
รูป: การต่อวงจรทดลองโดยใช้บอร์ดไมโครคอนโทรลเลอร์ Arduino Nano (5V)
รูป: การต่อวงจรทดลองโดยใช้บอร์ดไมโครคอนโทรลเลอร์ ESP32 (3.3V)
▷ กล่าวสรุป#
บทความนี้ได้นำเสนอการใช้งานโมดูลที่มีไอซี MAX44009 ซึ่งเป็นเซนเซอร์แบบดิจิทัลสำหรับการวัดความเข้มแสงในสภาวะแวดล้อมโดยรอบ โดยนำมาทดลองใช้งานร่วมกับบอร์ดไมโครคอนโทรลเลอร์ ESP32 และ Arduino Nano และเขียนโปรแกรมด้วย Arduino IDE
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Created: 2022-08-23 | Last Updated: 2022-08-24