理解のためにarduinoを使って何か作ってみます。やはり動く物がいいだろうから、障害物を回避して動くような自動車を作ってみます。
いきなりですが、ほぼ完成形は以下の写真になります。arduinoと超音波センサーはいずれ他に流用したいのでソケット実装です。電池パック(単三NiHの5直)は4+1の変速形で親ガメの上に1セル乗せてます。
フロント超音波センサーで障害物との距離を測定して、回避動作をしながら走行します。車の起動と停止は、ArduinoでWiーFiアクセスポイントに接続して、割り当てられたIPアドレス経由ブラウザで行います。
P.S. 2022/3
Wi-Fi接続環境がないとブラウザから使えないのは不便なので、APモードで動作するように変更しました。
APに接続後のIPアドレスは192.168.4.1のデフォルトアドレスを使っています。
実施内容から、シングルタスクでは実現できないのでマルチタスク前提でFreeRTOSを使います。RTOSと言っても、arduinoの場合には拡張モジュールの一つに過ぎないので、個別に作成した機能をタスク化するだけで実現できます。タスク間通信はqueueを使います。タスクの関連図は以下に示す通りです。
<主な使用部品>
・Arduino :MKR WiFi 1010
https://www.switch-science.com/catalog/7384/
・DCモーター:6V定格
同じ電圧を指定しても2個のモーターの回転数は同じにはならないので、必要ならチューニング。デフォルト円運動で便利といえば便利ですが。
・モータードライバー:L298Nモータードライバモジュール
ヒートシンク見ると、もっと大きなモーターも駆動できそうです。
モーターの速度を可変するためには、PWMで実質的に駆動電圧を可変しますが、PWMが使えるピンには制限があります。
・超音波距離センサー:URM37 V4.0
定番が生産終息なので代替えと言ってはなんですが。機能的には距離センサー以外の機能もあるようです。
https://akizukidenshi.com/catalog/g/gM-12450/
・ステッピングモーター
3個セットの残りがあったのでサーボモーターの代わりに使用。
・タミヤボールキャスター
リアの追従用です。形式としては三輪車です。
https://www.tamiya.com/japan/products/70144/index.html
<ライブラリサポート>
・WiFiNINA.h:webサーバー用
・Stepper.h:ステッピングモーター用
・FreeRTOS_SAMD21.h:FreeRTOS
<ソースコード>
以下のGitHubにあります。ほとんど流用のコードなので、クレジットとかあってもそのままです。
3Dプリンタ用のstlファイルも同じ場所にアップされてます。
@2022/3/16 : wifi接続モード以外に、Access Pointモードも用意しました。wi-fi環境がない場所でも使えるように。
以下のファイルでwifi_ap.inoが該当ファイルになります。
https://github.com/chateight/arduino/tree/master/smart_car_RTOS
<3Dプリンタで作成したパーツ>
2. 上下のブリッジ(その一)
パーツ4に2と3を差し込んで接着しています。
3. 上下のブリッジ(その二)
4. arduinoドライバ基板とステッピングモーター搭載用
基板の配線およびリード飛び出し分浮かせて装着します。
5. 超音波センサーの搭載用
ステッピングモーターの軸に差し込んで固定します。
P.S. 2022/5/19
圧電スピーカー使ってサウンド機能(立ち上げ完了とバック時に音を出す)とスピーカーのマウンタ作成しました。
コードやstlファイルのリンクは以下から、
https://github.com/chateight/arduino/tree/master/smart_car_RTOS
バックするときにブザーを鳴らすために、タスクを一個追加していますが、標準のtone()関数ではうまく動かない(なぜか一度バックすると次以降の前進モードで左側のモーターが回らない)ので、時間を外部で決めて音の周波数を設定しています。標準関数はスレッドセーフではないということなのでしょう。
外見はこんな感じになりました。『傘』で中の基盤が直接見えないようにしています。