こんにちは。koraです。
今回は光センサを設定します。
光センサの動作確認
STM32のADC
光センサとバッテリー電圧の読み取りにSTM32のADC (アナログ・デジタル・コンバータ)を使用します。STM32F732にはADCモジュールが3つあり、今回使用するのはADC1です。
配線は次のようになっています。
- 右前光センサ: ADC1_IN0
- 右光センサ: ADC1_IN1
- 左光センサ: ADC1_IN2
- 左前光センサ: ADC1_IN3
- バッテリー電圧: ADC1_IN4
CubeMXの設定
ADC_Settings
- Scan Conversion Mode: Enabled … 複数のチャンネルを変換するためEnabledにします。
- Continuous Conversion Mode: Disabled … 連続で変換するわけではなく、光センサのLEDの発光と同期させる必要があるのでDisableにします。
- Discontinuous Conversion Mode: Enabled … ADCを開始後、下のNumber of Discontinuous Conversionで指定する数のチャンネルだけ変換してADCが停止するようになります。
- Number of Discontinuous Conversion: 1にします。
Scan Conversion Modeでは、変換する順番を指定します。
各光センサは、LED消灯時に1回、LED点灯時に1回、ADCを実行し、その差分を取るようにします。バッテリー電圧は1回だけにします。つまり、①右前LED消灯時、②右前LED点灯時、③右LED消灯時、④右LED点灯時、⑤左LED消灯時、⑥左LED点灯時、⑦左前LED消灯時、⑧左前LED点灯時、⑨バッテリー電圧、という順でADCを行います。
ADC_Regular_ConversionModeを次のように変更します。
- Number of Conversion: 9にします。
- Rank: 1
- Channel: Channel 0 … 一番最初に読み取りたいチャンネルを指定します。0を指定するとADC1_IN0が読み込まれます。
- Rank: 2
- Channel: Channel 0 … 二番目に読み取りたいチャンネルを指定します。
- 以下略
光センサ用のモジュール
光センサ(とバッテリー電圧監視)用のモジュールを作ります。以前作成したジャイロ用のモジュールと同様に、Srcフォルダにphoto.cを、Incフォルダにphoto.hを作ります。
光センサの変更
作ったプログラムをCubeProgrammerでマウスに書き込み、光センサの出力をTeraTermで確認してみました。しかし、壁の前に置いてもほとんど反応しません。オシロスコープで電圧を確認してみても、数十mVほどしか出力されていませんでした。
自作マウスには赤外線センサOP265FAAとフォトダイオードLTR-4206を使用する設計にしていたのですが、どうやら基板上の抵抗と値が合っていなかったようです。抵抗を選定しなおすことも考えましたが、実績のあるHM-StarterKitのフォトリフレクタLBR-127HLDと交換することにしました。
作り直した基板で値を再度テストすると、ちゃんとセンサが反応することを確認できました。
次回
何とか光センサが使えるようになりました。次はタイマ割り込みの実装に入りたいと思います。