ESP32でミニカーを作る #5 走行中に障害物を検知する(おおたfab 電子工作初心者勉強会)

ESP32

おおたfabさんでは電子工作初心者勉強会を定期的に開催しています。

前回はESP32ミニカーのマイコンに接続した超音波センサーを使用して距離を表示しました。しかし1秒間隔でしか距離が測れませんので障害物に気づくのが遅れてしまいます。今回はこの点を改良し、ミニカーを動かしながらリアルタイムで距離を計測できるようにします。これで障害物を避けることができます。

リアルタイムで距離を計測する

前回までのプログラムは1秒間隔で距離を測って表示することしかできないので実用的ではありません。もう少し工夫をする必要があります。ここでは2通りの方法を試してみました。

カウンタを使う方法

なぜ1秒間隔でしか計測できないのかは、メインループにdelay(500)が2か所あるので、この0.5秒×2回の間は何もできないためです。このため以下のように1秒に1回しか距離が測れません。

  1. 左側に曲がるようにモーターを回す
  2. 0.5秒待つ
  3. 右側に曲がるようにモーターを回す
  4. 0.5秒待つ
  5. 距離を測る ←つまり、1秒に1回しか実行されない
  6. 1.に戻る

ここで距離を測るタイミングを短くするためにメインループをもっと速くまわすようにします。この例ではループを1ミリ秒に1回とし、ループ回数をカウントする変数を用意して、その変数が特定の値になったら処理を実行することで、上記とほぼ同じ処理を実現します。

  1. カウンタ変数を0に初期化する
  2. カウンタ変数が0の場合は、左側に曲がるようにモーターを回す
  3. カウンタ変数が500の場合は、右側に曲がるようにモーターを回す
  4. カウンタ変数が333で割り切れたら距離を測る ←ここでは、333, 666, 999の3回で距離を測ります。
  5. 1ミリ秒待つ
  6. カウンタ変数に1加算する。1000になったら1.に戻る。
  7. 2.に戻る

なお、距離を測る部分の処理時間を短くするためにデバック用の出力やインチの計算部分は削除しました。

ソースコードはこちら(esp32_mouse5_dest_loop.ino)

このプログラムを実行させたところモーターを動かしながら、リアルタイムで距離の表示が行えるように改善されました。動画では確認しにくいですが、ジグザグに走行しつつ、刻々と距離の値が変わっています。

Tickerライブラリを使う方法

もう一つの方法としてTickerというライブラリを使用することで設定した時間ごとにあらかじめ設定した関数を呼び出すことができます。いわゆるタイマー割り込みです。

サンプルプログラムが用意されているのでそれを試してからサンプルプログラムの内容を組み込んでみます。

Tickerのサンプルプログラムを動かしてみる

TickerのサンプルプログラムはArduino IDEのファイル→スケッチ例→XIAO ESP32 C6のスケッチ例→Ticker→TickerBasicにあります。

このサンプルプログラム TickerBasic.ino ではsetup()で0.3秒ごとにflip()を呼び出すように設定したあとは、loop()を無限ループの状態としています。

実際に動作させるとLEDの点滅が始まり、20回点滅したあとは0.1秒ごとにflip()を呼び出すように再設定し、さらに120回点滅したあとは点滅を停止させる処理を行っています。詳細はソースコードを参照してください。

Tickerライブラリを組み込んでみる

TickerライブラリをTickerBasic.inoを参考にしながらミニカーのプログラムに組み込んでみました。今回は距離を求めて表示する部分を0.3秒ごとに呼び出すことにします。また、求めた距離をグローバル変数に置くことでloop()の中からいつでも最新の距離を参照できるようにしました。

ソースコードはこちら(esp32_mouse5_dest_ticker.ino)

このプログラムを実行させたところカウンタのときと同様にリアルタイムで距離が表示されるように改善されました。

障害物を検知してみる

応用例として障害物との距離が10cm以下になったら停止するようにしました。ソースコードの変更箇所はloop()に距離の判断を加え、STOP()という関数を新しく作りモーターを止めるようにしています。

このプログラムでのテスト走行の動画です。ジグザグで走っているところに障害物を置いてみます。

直前で停止してくれました。かなりギリギリなので停止する距離やモーターの速度などは調整する必要がありそうです。また、このコードは確実に停止するように一回STOPしたらその後は無限ループとしています。

次回

これまではジグザグに前進するだけでしたが、距離センサーの値を使って障害物を避けながらあちこち動き回る車に拡張することを試してみます。

タイトルとURLをコピーしました