マイクロマウス研修~お掃除マウス編~(岩本)

マイクロマウス研修 ~お掃除マウス編~ Part9 ADCしてみる。

マイクロマウス研修~お掃除マウス編~(岩本)

こんにちは。岩本です。今週もマウスやっていきます。
今回はESP32のADC機能を使ってみたいと思います。
ADC機能を使えば、バッテリの残量の監視やセンサの電圧監視ができるみたいです。
今回は、とりあえず電圧が測定できるのかを確認していきます。

参考サイト

ESP32マウスPart.31 ADCでバッテリ電圧を計測

使用部品

今回はちゃんと計測できているかの確認なので、身近にあった抵抗と可変抵抗を使いました。本番ではセンサーに置き換えます。
・抵抗10kΩ
可変抵抗10kΩ

確認方法

今回抵抗の変化に伴う電圧を測定したいため、分圧して電圧を測りたいと思います。なお、R1に可変抵抗を入れています。

プログラム

参考サイトのものをお借りしてテスト用に修正しました。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
 
#define DEFAULT_VREF 1100 // eFuseメモリのVrefを使うため、このデフォルト値は使用されない
 
// 公式マニュアル:
// https://docs.espressif.com/projects/esp-idf/en/stable/api-reference/peripherals/adc.html
 
void app_main()
{
    // ADC1_CH0はSENSOR_VPピンの機能
    static const adc_unit_t         unit = ADC_UNIT_1;
    static const adc_channel_t      channel = ADC_CHANNEL_0;
    // 11dB減衰を設定。フルスケールレンジは3.9V
    // マニュアルより、
    //   6dBで正確な値が取れる電圧範囲は0.15 ~ 1.75V
    //   11dBで正確な値が取れる電圧範囲は0.15 ~ 2.45V
    // よって、11dB減衰を設定する
    static const adc_atten_t        atten = ADC_ATTEN_DB_11;
    // ADCの分解能を12bit (0~4095)に設定
    static const adc_bits_width_t   width = ADC_WIDTH_BIT_12;
 
    // ADCのユニットとチャンネルの設定
    adc1_config_width(width);
    adc1_config_channel_atten(channel, atten);
 
    // ADCの特性を設定
    esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
    esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
 
    while (1) {
        uint32_t adc_reading = 0;
        static const int NO_OF_SAMPLES = 64; // 平均値を求めるためのサンプル数
 
        // ADCの変換結果のばらつきを抑えるため、
        // 結果を複数回取得して、平均値を求める
        for (int i = 0; i < NO_OF_SAMPLES; i++) {
            adc_reading += adc1_get_raw((adc1_channel_t)channel);
        }
        adc_reading /= NO_OF_SAMPLES;
 
        // ADCの変換結果(0 ~ 4095)を電圧値 mV に変換
        uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
        // 

        float sensor_voltage = voltage ;
        float original_voltage = 3300 ;
        float resistanceB = 10 ;
        float resistanceA = (( original_voltage / sensor_voltage) *  resistanceB) - resistanceB ;
        printf("Raw: %d\tVoltage: %dmV\tResistance: %fkΩ\n",
                adc_reading, voltage, resistanceA);
 
        // 1秒待機
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

結果

結果、下図のようにいい感じに電圧測定できました。後はセンサーを買うだけ。。。

以上本日はここまで。

タイトルとURLをコピーしました