先前在網路上購買這個模組時,賣家把 APDS-9930 誤當作 APDS-9960賣給我,因模組上沒有標示 9930 或 9960 的型號,讓我測試手勢感測的程式,一直都不成功。後來查資料才發現這兩個模組幾乎一樣,差別只在手勢感測功能,改用 APDS-9930 的程式後就可以正常運作。我購買 APDS-9960 是要用手勢感測來控制 LED 燈的箭頭方向,因模組的錯誤暫時沒辦法做了。剛好利用這個機會瞭解一下 APDS-9930 接近和姿態感測模組的功能與用法。另一篇再來實作 APDS-9960 RGB非接觸手勢檢測感測的功能。
APDS-9930 是I2C介面的環境光傳感器(ALS)和帶有IR LED 的接近傳感器,採用單個8引腳封裝。環境光傳感器利用雙光電二極管以 0.01 lux 的低照度性能近似人眼的響應。這種高靈敏度使該設備可以在變暗的玻璃後面運行。接近傳感器可檢測到100毫米的物體,從明亮的陽光到黑暗的房間,接近檢測功能都可以正常運行。模塊內增加了微光學透鏡,可高效地發送和接收紅外能量,從而降低了總功耗。
APDS-9930規格:
APDS-9930 是I2C介面的環境光傳感器(ALS)和帶有IR LED 的接近傳感器,採用單個8引腳封裝。環境光傳感器利用雙光電二極管以 0.01 lux 的低照度性能近似人眼的響應。這種高靈敏度使該設備可以在變暗的玻璃後面運行。接近傳感器可檢測到100毫米的物體,從明亮的陽光到黑暗的房間,接近檢測功能都可以正常運行。模塊內增加了微光學透鏡,可高效地發送和接收紅外能量,從而降低了總功耗。
APDS-9930規格:
- 集成 ALS、紅外 LED 和接近檢測器的光學模組
- 環境亮度感測 (ALS, Ambient Light Sensing) 近似人眼的視覺反應
- 帶有上限和下限閾值的可程式中斷功能
- 高達 16 位解析度
- 深色玻璃後運作的高靈敏度
- 0.01lux 低流明性能
- 接近檢測完全校準到 100 毫米檢測
- 程式範圍為 2.7 毫秒到大於 8 秒
- 提供專用中斷引腳
[安裝APDS9930 Library]
APDS9930 函式庫提供用於從 APDS-9930 環境光和接近傳感器讀取數據。本實作需要安裝以下程式庫: 程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。[材料]
- Arduino Uno x 1
- APDS-9930 顏色、非接觸手勢檢測傳感器模組 x1
- LED x 1
- 連接線 x 4
[接線圖]
| Arduino Uno | APDS-9930 | 其他 |
|---|---|---|
| 3.3V | VCC | - |
| GND | GND | - |
| A5 | SCL | - |
| A4 | SDA | - |
| GND | - | 接LED負極 |
| D10 | - | 接LED正極 |
[程式]
以下是 Depau/APDS9930 函式庫中的參考範例,當物體接近APDS-9930感測器時,接在 D10 的 LED燈,會偵測物體接近時,LED燈變暗,遠離感測器時, LED燈變亮的情況。/****************************************************************
AmbientLightLED.ino
Source:Depau/APDS9930
****************************************************************/
#define PWM_LED_PIN 10
#define DUMP_REGS
#include <Wire.h>
#include <APDS9930.h>
// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;
float max_light = 0;
void setup() {
//analogReference(EXTERNAL);
pinMode(PWM_LED_PIN, OUTPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("APDS-9930 - Ambient light sensor"));
Serial.println(F("--------------------------------"));
// Initialize APDS-9930 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9930 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9930 init!"));
}
// Start running the APDS-9930 light sensor (no interrupts)
if ( apds.enableLightSensor(false) ) {
Serial.println(F("Light sensor is now running"));
} else {
Serial.println(F("Something went wrong during light sensor init!"));
}
#ifdef DUMP_REGS
/* Register dump */
uint8_t reg;
uint8_t val;
for(reg = 0x00; reg <= 0x19; reg++) {
if( (reg != 0x10) && \
(reg != 0x11) )
{
apds.wireReadDataByte(reg, val);
Serial.print(reg, HEX);
Serial.print(": 0x");
Serial.println(val, HEX);
}
}
apds.wireReadDataByte(0x1E, val);
Serial.print(0x1E, HEX);
Serial.print(": 0x");
Serial.println(val, HEX);
#endif
// Wait for initialization and calibration to finish
delay(500);
}
void loop() {
// Read the light levels (ambient, red, green, blue)
if ( !apds.readAmbientLightLux(ambient_light) ||
!apds.readCh0Light(ch0) ||
!apds.readCh1Light(ch1) ) {
Serial.println(F("Error reading light values"));
} else {
Serial.print(F("Ambient: "));
Serial.print(ambient_light);
Serial.print(F(" Ch0: "));
Serial.print(ch0);
Serial.print(F(" Ch1: "));
Serial.println(ch1);
if ( ambient_light > max_light ) {
max_light = ambient_light;
}
ambient_light = map(ambient_light, 0, max_light, 0, 1023); //將測得的值換算成1023的比例給D10 PWM
analogWrite(PWM_LED_PIN, ambient_light);
}
// Wait 1 second before next reading
delay(100);
}
[執行結果]
[參考資料]
- Github:Depau/APDS9930 library

張貼留言