STM32資料 基礎編 5

赤外線を検出してみよう

赤外線は目には見えないが、制御や誘導などで非常に便利である

そこで今回は、フォトトランジスタとAD変換という手法を使って赤外線を検出してみよう

今回やること

作業の流れ

ピンの割り当て

今回はADCという機能を使います

(プロジェクト名).iocからPA0を選択し、ADC1_IN0を割り当てよう

左側のAnalogからADC1を選択し、IN0にチェックを入れよう

回路

フォトトランジスタとSTM32をジャンパー線を使ってつなぐ

回路が少し複雑なので、気を付けてつけてね

配線図

フォトトランジスタと10kΩの抵抗を使ってね

プログラム

今回はADCのスタートとストップ、変換待機と読み取りの4つの関数を使います

ADCのスタート

指定したADCを起動するための関数

HAL_ADC_Start(&hadcx);

この関数の引数

引数名 変数型 内容
&hadcx ADC_HandleTypeDef* ADCのポインタ(xはADCの番号)

AD変換の待機

指定したADCを起動するための関数

HAL_ADC_PollForConversion(&hadcx, Time)

この関数の引数

引数名 変数型 内容
&hadcx ADC_HandleTypeDef* ADCのポインタ(xはADCの番号)
Time uint32_t 待機する最大時間

値の読み取り

変換した値を読み取るための関数

Value = HAL_ADC_GetValue(&hadcx);

この関数の引数

引数名 変数型 内容
&hadcx ADC_HandleTypeDef* ADCのポインタ(xはADCの番号)

この関数の戻り値

戻り値名 変数型 内容
Value uint16_t ADCをした値(0~4095)

ADCのストップ

指定したADCを停止するための関数

HAL_ADC_Stop(&hadcx);

この関数の引数

引数名 変数型 内容
&hadcx ADC_HandleTypeDef* ADCのポインタ(xはADCの番号)

サンプルコード

実際にAD変換を行い、その値をシリアル通信で送信するプログラムを作成した

蛍光灯や日光にあてて値の変化を読み取ってみよう

#include "wrapper.hpp"
#include "adc.h"
#include "usart.h"
#include "string"

uint16_t ADC_Value = 0;

void init(){
    
    HAL_Delay(500);     
}
        
void loop(){

    //ADCのスタート
    HAL_ADC_Start(&hadc1);
    
    //変換を待機
    if(HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK ){

        //値の読み取り
        ADC_Value = HAL_ADC_GetValue(&hadc1);

        //値の送信
        std::string str = "ADC_Value:" + std::to_string(ADC_Value) + "\n";
        HAL_UART_Transmit(&huart2, (uint8_t *)str.c_str(),str.length(),100);
    }

    //ADCのストップ
    HAL_ADC_Stop(&hadc1);

    //ちょっと待機
    HAL_Delay(100);
}

終わりに

今回は、AD変換を使って赤外線を読み取ってみた

色々な場面で使えるので、ぜひ覚えておこう

リンク

・メインページ

・前のページ

・次のページ