この一連の記事ではスマート卓上ファンを作ってみます。このファンにはSTマイクロエレクトロニクスのToF(Time-of-Flight)測距センサを使っています。一部のToF測距センサはst.comで提供されるスマート人感検出(以下SPD:Smart Presence Detection)を使うことで高度な人感センサとして動作します。このSPDの結果を使い、羽の回転や左右の首振りを制御します。
前の記事へのリンク
前回までの記事では機構やモータ制御を考えるところからスタートしました。その次にSTM32H533のプロジェクトにSPDを移植しました。一つ前の記事ではファン制御のアルゴリズムを入れました。この記事ではToFセンサやSPDプロジェクトのデバッグをしていきます!
6 動きません!
ここまで作ってきてコンパイルが通って、すぐに動いた!となれば素晴らしいですが、私の場合は動きませんでした。ToF測距センサが動かないときは以下のチェックポイントを順番に確認していきます。
6.1 初期化ができているか?
main.cのinit_vl53lmz_sensor()
でToF測距センサの初期化処理をしています。返り値であるstatusを確認します。以下のようにエラー処理に入っている場合には初期化でエラーが起こっています。ボードのI2CやGPIOの接続と、ソフトウェアの設定が正しく対応しているかを確認しましょう。
/* Enable Power */
HAL_GPIO_WritePin(PWR_EN_C_GPIO_Port, PWR_EN_C_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(PWR_EN_C_GPIO_Port, PWR_EN_C_Pin, GPIO_PIN_SET);
HAL_Delay(100);
うまく初期化ができている場合には以下のようにバージョン情報がUARTターミナルから出力されます。
6.2 測距が開始されているか?
SPDのコードではCommandData.enable=1;
により、測距が始まります。このサンプルのようにボタンと連動している場合には、enableが1にされているかを確認します。まずは初期化のコードの後で、これをenableにするのもありだと思います。
正しくenable=1になると、メインループの以下のコードに入っていきます。
6.3 Interruptが受け取れているか?
enableが正しく行われると、定期的にVL53L7CXから割り込み用の信号が送られます。まずEXTI1_IRQHandler()
が正しく呼ばれていることを確認します。そこからHAL_GPIO_EXTI_Falling_Callback()が呼ばれていて、IntCountがインクリメントされているかを確認します。
私はPB1のGPIO modeの「External Interrupt Mode with Rising edge trigger detection」になっていて、「External Interrupt Mode with Falling edge trigger detection」にしたら、HAL_GPIO_EXTI_Falling_Callback()が呼ばれるようになりました。
6.4 動きました!、、、けど
ついに動きました。人がくると動き出し、人の動きに合わせて、左右に首を振り、人がいなくなると止まる扇風機ができました。ここまで来るのに、配線のトラブルやうまく制御できないGPIOにも少し悩まされました。兎にも角にも動いたのは良かったです。けれど、どうも動きはそこまでスムーズではありません。
まずは対象物の接近を検知して、送風を開始します。どうも初めに認識した後にむかって左の方に対象物を検知するくせのようなものがあるようです。その後、中央に戻ってきますが、首振りの最中はSPDの検知を動かしていないので、修正が遅いです。
中央に戻ってきた後に対象物をむかって右の方に動かすと、右の方にファンが向いていきます。そして中央に戻すと、中央に戻っていきます。
今回はデバッグして動くようになりました。ただ動きが少しおかしいところもありました。次回、最後の記事では、より正確に動くようにさまざまな調整をしてきます。次の記事につづきます!