こんにちは!はしもとです。
以前投稿したときはまだまだ寒い冬でしたが、気づいたら暖かい季節になりましたね😊
自分は、四季のなかでちょうどいい気温の春と秋が好きなので、暖かくなって嬉しいです。
それでは久しぶりの投稿ですが、引き続き頑張っていきます〜!
前回は、ESP32を使ってSTM32のWiFi通信についてまとめました。
今回は、STM32F446を使って、壁センサであるフォトトランジスタの値の確認を行っていきます。
壁センサでは、上図のように、車体に取り付けられたLEDの光を迷路の壁に反射させ、その反射光の強さをもとに壁との距離を計測します。
使用するセンサ
今回使用するフォトトランジスタは、Lite-On Inc.のLTR-4206Eです。
回路
フォトトランジスタには、下写真のように足が長いほうと短いほうがあります。データシートを確認すると、足が長い方はコレクタ(+)、短い方はエミッタ(−)と記載されています。配線するときは、+−が反対にならないように注意しましょう。
またフォトトランジスタは、受光する光の強さによって出力する電流が変化する素子です。
一方、電流はAD変換できないため、マイコン側はセンサ値がどれくらい変化しているかわかりません。
そこで、IV変換(抵抗に電流が流れると電圧が発生する)するため負荷抵抗を使います。
今回は10kΩの抵抗を使用しました。
配線してみた結果は以下のとおりです。
ピン機能を設定
今回は、PA0ピンをAD変換用のピンに設定しました。
図中のADC1_IN0のADCは、Analog to Digital Converterの略です。
その他のピン配置は以前のLチカを行ったブログと同じです。
最後にコードを自動生成し、次のステップに進みます。
コード
自動生成されたコードにセンサ値をAD変換し、出力する処理を追加します。
13~16行では、以下の処理を行っています。
1. HAL_ADC_Start関数でAD変換を開始する
2. HAL_ADC_PollForConversion関数で変換終了を待つ
3. HAL_ADC_GetValue関数でセンサ値の読み出しを行う
最後に、センサ値が1以上であればUART通信を使ってPCにセンサ値を送るとともに、
NucleoのLEDも点灯するようにしています。
/* USER CODE BEGIN 2 */ uint8_t msg[] = "Get Phototransistor Value \n\r"; char msg_[30]; uint32_t adc_val; int Timeout = 100; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ HAL_UART_Transmit(&huart2, msg, strlen((char*)msg), Timeout); while (1) { /* AD-conversion */ HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 1000); adc_val = HAL_ADC_GetValue(&hadc1); if(adc_val > 1) { sprintf(msg_, "Recieved message: %d \n\r", adc_val); HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_UART_Transmit(&huart2, msg_, strlen((char*)msg_), Timeout); HAL_Delay(100); } } /* USER CODE END WHILE */
動作確認
フォトトランジスタが正常に動作しているか確認するため、明るい場所、暗い場所でセンサ値に変化が見られるか確認してみました。
明るい場所(上写真)ではセンサ値が180~190くらいですが、暗い場所(下写真)では10~25くらいなので無事動作確認できました。
まとめ
今回は、フォトトランジスタを使ってセンサ値の確認を行いました。
これでマウスの前方に壁があるかないかを判断したり、マウスと横壁の距離がどれくらいあいているかを求めることができます。
今回は以上です、それでは〜!!