Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉛ 近接センサ VCNL4040

 Adafruitの赤外線物体検出センサと環境光センサを搭載した近接センサ・モジュール VCNL4040(Vishay Semiconductors)を利用します。

AdafruitのStemma QT/Qwiicボード

 VCNL4040ボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

近接センサVCNL4040のおもなスペック

 VCNL4040のデータシート

  • 動作電圧 2.5~3.6V
  • 動作温度範囲  -40~+85°C
  • 検出範囲 0~20cm
  • 光センサの測定可能範囲 0.0125~6553 lux
  • インターフェース I2C(10~400kHz)
  • スレーブ・アドレス 0x60

使用環境

  • Arduino UNO R4 Minima
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

 Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。

スレーブ・アドレスを確認

 従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。

  0x60を見つけてきました。

 


ライブラリの用意

 VCNL4040で検索して、見つかった  Adafruit VCNL4040ライブラリをインストールします。

 インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。


サンプル・スケッチ

 メニューのファイル->スケッチ例から、Adafruit VCNL4040のVCNL4040_test.inoを選択します。

  コンパイル、実行します。

 

 

4桁の7セグメントLED表示器をつないで測定結果を表示する

 連載の第4回目の記事を参照しながら表示器を接続します。

Arduino UNO R4 Minimaでセンサ・インターフェーシング ④ 温湿度センサSi7021の測定結果を7セグメントLEDに表示


 スケッチです。

 7セグメントLED表示器は、第12回 温湿度センサ SHTC3でスレーブ・アドレスが重なったので、デフォルトの0x70から、ジャンパのA0をショートして0x71に変更してあります。デフォルトのまま使うときは0x70で使ってください。


#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <Adafruit_VCNL4040.h> Adafruit_7segment matrix = Adafruit_7segment(); Adafruit_VCNL4040 vcnl4040 = Adafruit_VCNL4040(); void setup() { Serial.begin(115200); // Wait until serial port is opened while (!Serial) { delay(1); } Serial.println("Adafruit VCNL4040 + 7segment LED "); if (!vcnl4040.begin()) { Serial.println("Couldn't find VCNL4040 chip"); while (1); } Serial.println("Found VCNL4040 chip"); //vcnl4040.setProximityLEDCurrent(VCNL4040_LED_CURRENT_200MA); Serial.print("Proximity LED current set to: "); switch(vcnl4040.getProximityLEDCurrent()) { case VCNL4040_LED_CURRENT_50MA: Serial.println("50 mA"); break; case VCNL4040_LED_CURRENT_75MA: Serial.println("75 mA"); break; case VCNL4040_LED_CURRENT_100MA: Serial.println("100 mA"); break; case VCNL4040_LED_CURRENT_120MA: Serial.println("120 mA"); break; case VCNL4040_LED_CURRENT_140MA: Serial.println("140 mA"); break; case VCNL4040_LED_CURRENT_160MA: Serial.println("160 mA"); break; case VCNL4040_LED_CURRENT_180MA: Serial.println("180 mA"); break; case VCNL4040_LED_CURRENT_200MA: Serial.println("200 mA"); break; } //vcnl4040.setProximityLEDDutyCycle(VCNL4040_LED_DUTY_1_40); Serial.print("Proximity LED duty cycle set to: "); switch(vcnl4040.getProximityLEDDutyCycle()) { case VCNL4040_LED_DUTY_1_40: Serial.println("1/40"); break; case VCNL4040_LED_DUTY_1_80: Serial.println("1/80"); break; case VCNL4040_LED_DUTY_1_160: Serial.println("1/160"); break; case VCNL4040_LED_DUTY_1_320: Serial.println("1/320"); break; } //vcnl4040.setAmbientIntegrationTime(VCNL4040_AMBIENT_INTEGRATION_TIME_80MS); Serial.print("Ambient light integration time set to: "); switch(vcnl4040.getAmbientIntegrationTime()) { case VCNL4040_AMBIENT_INTEGRATION_TIME_80MS: Serial.println("80 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_160MS: Serial.println("160 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_320MS: Serial.println("320 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_640MS: Serial.println("640 ms"); break; } //vcnl4040.setProximityIntegrationTime(VCNL4040_PROXIMITY_INTEGRATION_TIME_8T); Serial.print("Proximity integration time set to: "); switch(vcnl4040.getProximityIntegrationTime()) { case VCNL4040_PROXIMITY_INTEGRATION_TIME_1T: Serial.println("1T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_1_5T: Serial.println("1.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_2T: Serial.println("2T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_2_5T: Serial.println("2.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_3T: Serial.println("3T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_3_5T: Serial.println("3.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_4T: Serial.println("4T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_8T: Serial.println("8T"); break; } //vcnl4040.setProximityHighResolution(false); Serial.print("Proximity measurement high resolution? "); Serial.println(vcnl4040.getProximityHighResolution() ? "True" : "False"); Serial.println(""); matrix.begin(0x71); matrix.setBrightness(0x05); // default 0x0E } void loop() { Serial.print("Proximity:"); Serial.println(vcnl4040.getProximity()); Serial.print("Ambient light:"); Serial.println(vcnl4040.getLux()); Serial.print("Raw white light:"); Serial.println(vcnl4040.getWhiteLight()); Serial.println(""); matrix.print(vcnl4040.getProximity(), DEC); matrix.writeDisplay(); delay(500); }

 実行例です。距離の値Proximityだけを表示しています。反射する物体が近いほど数値は高く、無限だと1が表示されます。

グラフィック・ディスプレイに測定結果を表示

 次の記事を参考に、グラフィック・ディスプレイに測定した周囲光、生の白色光、近接レベルを表示します。

  Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 スケッチです。


#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_VCNL4040.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_VCNL4040 vcnl4040 = Adafruit_VCNL4040(); void setup() { Serial.begin(115200); // Wait until serial port is opened while (!Serial) { delay(1); } Serial.println("Adafruit VCNL4040 + SSD1306 "); if (!vcnl4040.begin()) { Serial.println("Couldn't find VCNL4040 chip"); while (1); } Serial.println("Found VCNL4040 chip"); //vcnl4040.setProximityLEDCurrent(VCNL4040_LED_CURRENT_200MA); Serial.print("Proximity LED current set to: "); switch(vcnl4040.getProximityLEDCurrent()) { case VCNL4040_LED_CURRENT_50MA: Serial.println("50 mA"); break; case VCNL4040_LED_CURRENT_75MA: Serial.println("75 mA"); break; case VCNL4040_LED_CURRENT_100MA: Serial.println("100 mA"); break; case VCNL4040_LED_CURRENT_120MA: Serial.println("120 mA"); break; case VCNL4040_LED_CURRENT_140MA: Serial.println("140 mA"); break; case VCNL4040_LED_CURRENT_160MA: Serial.println("160 mA"); break; case VCNL4040_LED_CURRENT_180MA: Serial.println("180 mA"); break; case VCNL4040_LED_CURRENT_200MA: Serial.println("200 mA"); break; } //vcnl4040.setProximityLEDDutyCycle(VCNL4040_LED_DUTY_1_40); Serial.print("Proximity LED duty cycle set to: "); switch(vcnl4040.getProximityLEDDutyCycle()) { case VCNL4040_LED_DUTY_1_40: Serial.println("1/40"); break; case VCNL4040_LED_DUTY_1_80: Serial.println("1/80"); break; case VCNL4040_LED_DUTY_1_160: Serial.println("1/160"); break; case VCNL4040_LED_DUTY_1_320: Serial.println("1/320"); break; } //vcnl4040.setAmbientIntegrationTime(VCNL4040_AMBIENT_INTEGRATION_TIME_80MS); Serial.print("Ambient light integration time set to: "); switch(vcnl4040.getAmbientIntegrationTime()) { case VCNL4040_AMBIENT_INTEGRATION_TIME_80MS: Serial.println("80 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_160MS: Serial.println("160 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_320MS: Serial.println("320 ms"); break; case VCNL4040_AMBIENT_INTEGRATION_TIME_640MS: Serial.println("640 ms"); break; } //vcnl4040.setProximityIntegrationTime(VCNL4040_PROXIMITY_INTEGRATION_TIME_8T); Serial.print("Proximity integration time set to: "); switch(vcnl4040.getProximityIntegrationTime()) { case VCNL4040_PROXIMITY_INTEGRATION_TIME_1T: Serial.println("1T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_1_5T: Serial.println("1.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_2T: Serial.println("2T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_2_5T: Serial.println("2.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_3T: Serial.println("3T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_3_5T: Serial.println("3.5T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_4T: Serial.println("4T"); break; case VCNL4040_PROXIMITY_INTEGRATION_TIME_8T: Serial.println("8T"); break; } //vcnl4040.setProximityHighResolution(false); Serial.print("Proximity measurement high resolution? "); Serial.println(vcnl4040.getProximityHighResolution() ? "True" : "False"); Serial.println(""); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay(); display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE); display.setTextSize(1); // Normal 1:1 pixel scale display.setTextColor(SSD1306_WHITE); // Draw white text display.setCursor(3,3); display.println("Ambient:"); display.setCursor(79,3); display.println("Raw:"); display.setCursor(4,34); display.println("Proximity:"); display.display(); delay(200); } void loop() { Serial.print("Proximity:"); Serial.println(vcnl4040.getProximity()); Serial.print("Ambient light:"); Serial.println(vcnl4040.getLux()); Serial.print("Raw white light:"); Serial.println(vcnl4040.getWhiteLight()); Serial.println(""); display.setTextSize(2); // Draw 2X-scale text display.setCursor(10,17); display.fillRect(10, 17, 70, 16, SSD1306_BLACK); display.println(vcnl4040.getLux()); display.setCursor(80,17); display.fillRect(80, 17, 46, 16, SSD1306_BLACK); display.println(vcnl4040.getWhiteLight(),1); display.setCursor(10, 46); display.fillRect(10, 46, 100, 16, SSD1306_BLACK); display.println(vcnl4040.getProximity()); display.display(); delay(500); }

 実行例です。
 

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉚ 光センサ LTR303

次へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉜ 光センサ VEML7700