概要
BL652ブレイクアウトボードで、アナログ出力のセンサの値をA/D変換して読み取ってみた。
背景と目的
前回のI2C通信に引き続き、BL652ブレイクアウトボードでの実用を想定して、アナログ接続のセンサからA/D変換で値を読み取ってみる。
詳細
0. 実施環境と参考情報
- 土壌水分センサ: DFRobot社Gravityシリーズ
- 光センサ: CdS手持ち品
- ドキュメント置き場
- 参考資料
1. 回路
以下の回路を使用し、AIN4~AIN7のA/D変換値を読み取る。
- AIN4: 5V系の電源電圧検出用回路を接続
- AIN5: 土壌水分センサを接続
- AIN6: 光センサを接続
- AIN7: 予備系統
なお、GPIO14,16,18,20は計測時以外の無駄な電流をなくすための制御ポートとして用意している。(今回はどうでもいいのでONしっぱなしで使う)
2. コーディング
参考資料2を参考に、コーディングした。動作は、3秒に1回、A/D変換入力4chを取得。AD変換の設定は、
- 減衰比: 1/6
- 分解能: 12bit
- アクイジションタイム: 40usec
とした。BL652の仕様上、A/D変換の基準電圧が0.6Vで減衰比1/Nのとき、ディジタルフルスケールが0.6 * N [V]に対応する。
GPIO14,16,18,20は、今回は待機電流はどうでもいいのでHIGHにしたまま。
// 変数 ----------------------------------------------------------- DIM pinVBAT,pinMOIST,pinPHOTO,pinEX1 // ADC入力 pinVBAT = 28 pinMOIST = 29 pinPHOTO = 30 pinEX1 = 31 DIM pinVBATEN, pinMOISTEN, pinPHOTOEN, pinEX1EN // センサ電源 pinVBATEN = 20 pinMOISTEN = 18 pinPHOTOEN = 16 pinEX1EN = 14 DIM r // 作業用 DIM adcVBAT, adcMOIST, adcPHOTO, adcEX1 // ADC計測値 DIM VCE as float : VCE = 0.013 // VBAT計測回路オフセット, 13mV // 関数 ---------------------------------------------------------------- // ADCピン設定 FUNCTION config_ADCPins() // GPIOSETFUNCEX (nSigNum, nFunction, subFunc$) // subFunc$ will be a string that has the following form:- "\Gain_hex\Resolution_hex\Acquisition_hex" // ADC基準電圧は0.6V、1/Nスケーリングの場合、0.6*N[V]がディジタルフルスケールになる DIM subFunc$ : subFunc$ = "\16\0C\14" // gain=1/6scaling, resolution=12bit, aquisition_time=40usec r = GPIOSETFUNCEX(pinVBAT, 3, subFunc$) r = GPIOSETFUNCEX(pinMOIST, 3, subFunc$) r = GPIOSETFUNCEX(pinPHOTO, 3, subFunc$) r = GPIOSETFUNCEX(pinEX1, 3, subFunc$) ENDFUNC 1 // センサ回路電源設定 FUNCTION config_SensorPowerSupply() // GPIOSETFUNC (nSigNum, nFunction, nSubFunc) // nSubFunc r = GPIOSETFUNC(pinVBATEN, 2, 0) // VBAT r = GPIOSETFUNC(pinMOISTEN, 2, 0) // MOIST r = GPIOSETFUNC(pinPHOTOEN, 2, 0) // PHOTO r = GPIOSETFUNC(pinEX1EN, 2, 0) // EX1 ENDFUNC 1 // センサ回路ON FUNCTION enable_Sensors() GpioWrite(pinVBATEN, 1) // VBAT GpioWrite(pinMOISTEN, 1) // MOIST GpioWrite(pinPHOTOEN, 1) // PHOTO GpioWrite(pinEX1EN, 1) // EX1 ENDFUNC 1 // AD変換 FUNCTION get_ADC() DIM VBAT as float // ADC adcVBAT = GpioRead(pinVBAT) adcMOIST = GpioRead(pinMOIST) adcPHOTO = GpioRead(pinPHOTO) adcEX1 = GpioRead(pinEX1) VBAT = (adcVBAT * 0.6 * 6 / 4096.0 - VCE) * 2.0 + VCE // 表示 PRINT "VBAT = "; VBAT; "V\n" PRINT "MOIST = "; adcMOIST; "\n" PRINT "PHOTO = "; adcPHOTO; "\n" PRINT "EX1 = "; adcEX1; "\n" PRINT "\n" ENDFUNC 1 // メイン ------------------------------------------------------- // ADCピン設定 r = config_ADCPins() // センサ回路電源設定 r = config_SensorPowerSupply() // センサ回路ON r = enable_Sensors() ONEVENT EVTMR1 CALL get_ADC TimerStart(1, 3000, 1) WAITEVENT
3. 動作確認
以下の通り、チャンネルごとに多少ばらつきはあるが、ほぼ正しい値となっていることを確認した。
- AIN4
- 実測1: 4.55V、A/D変換値: 4.55V
- 実測2: 3.38V、A/D変換値: 3.39V --- 電池が消耗した場合を想定して低めの電圧の時の精度を確認。
- AIN5
- 実測: 2.956V, ADC: 3370=2.956V
- AIN6
- 実測: 2.247V, ADC: 2576=2.261V
※AIN7は、予備なので精度確認なし。
※上記の数値は、下の画像とは別のタイミングで取得。
まとめと今後の課題
本記事までで、I2C、BLEアドバタイズ、A/D変換のコーディング方法が確認できた。次回は、センサ計測値をBLEで飛ばせるようにしたい。