概要
BL652ブレイクアウトボードで、アナログ出力のセンサの値をA/D変換して読み取ってみた。
背景と目的
前回のI2C通信に引き続き、BL652ブレイクアウトボードでの実用を想定して、アナログ接続のセンサからA/D変換で値を読み取ってみる。
詳細
0. 実施環境と参考情報
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で飛ばせるようにしたい。