shotaTweetこんにちは、shotaです。前回の記事ではADCを使ってバッテリ電圧を計測しました。今回はADCとGPIOを使って、物体検出センサ(いわゆる壁センサ)を動かします。ブロクで書いたサンプルコードはGitHubに公開しています。Especialプログラムを書く前の下準備プログラムを書く前に、Especialの回路図やESP32モジュールのデータシートを読み、情報を集めます。物体検出センサ回路の回路図を確認まずはじめに、Especialの回路図を確認します。↓Especialの回路図はこちらです。物体検出センサ回路]今回必要なところは、物体検出センサ回路です。発光部分と受光部分に分かれます。発光部分では、IRLED_R_FLとIRLED_L_FRで4つの赤外線LEDを点灯させます。(なぜ2つの端子で4つのLEDを点灯させる回路になったのかは、上に貼ったブログ記事を参照してください。ESP32回路ブロックを見ると、IRLED_R_FLはIO4に、IRLED_L_FRはIO2に接続されています。受光部分では、AN_IRLED_FL、AN_IRLED_L、AN_IRLED_R、AN_IRLED_FRで電圧値を取得します。ESP32回路ブロックを見ると、AN_IRLED_FLはSENSOR_VNに、AN_IRLED_LはIO34に、AN_IRLED_RはIO35に、AN_IRLED_FRはIO32に接続されています。3.3Vに変化するので、その値をADCで読み取ります。(実際には、フォトトランジスタのCE間にも電圧がかかるので、3.3Vには達しません)これで必要な情報がそろいました。GPIO機能を使って、IO4とIO2経由でLEDを点灯せさます。ADC機能を使って、SENSOR_VN、IO34、IO35、IO32経由でセンサ値を取得します。ADCのチャンネルを確認つぎに、ESP32モジュールのデータシートを読み、SENSOR_VN、IO34、IO35、IO32で使えるADCのチャンネルを確認します。Definitionsより、各ピンで使えるADCチャンネルはつぎのとおりです。1ユニットのチャンネル3)AN_IRLED_LのIO34ピンは、ADC1_CH6AN_IRLED_RのIO35ピンは、ADC1_CH7AN_IRLED_FRのIO32ピンは、ADC1_CH4プログラムの作成それではプログラムを作成します。これまでに作ったLED点灯プログラムと、ADCでバッテリ電圧を読み取るプログラムを組み合わせます。バッテリ電圧取得サンプルコード作成したプログラムがこちらです。}}GitHubにも公開してます。https://github.com/ShotaAk/especial/blob/master/examples/3_object_detector/main/main.cそれでは、必要なところを解説します。プログラムの解説app_main関数の上部では、GPIOとADCの設定をしています。GPIOの設定はつぎのとおりです。IO2とIO4を出力ピンに設定しているだけです。gpio_config(&io_conf);ADCの設定はつぎのとおりです。ADCは4チャンネル使うので、enumと配列CHANNELSを使っているところが重要です。その他の設定は前回のプログラムと同じです。adc_chars);実際にセンサ値を取得しているのはwhileの中です。ここでは、次の動作を実行しています。msec待機この動作の中で、オフセットを用いているところが重要です。赤外線を発光していないときも、フォトリフレクタには何らかの光が入るため、センサ信号を出力します。