GPSロボットカーのソフトウェア
ハードなしで考え得るプログラムの基本形がおおかたできました. ジャイロもエンコーダも使わなければ,GPSロボットカーは見えないラインを トレースするライントレースロボット? あとは,ウェイポイントをLCDで確認しながら入力できるインターフェースの 作成と,ハードを作って走行させながらパラメータ調整.その後ジャイロや エンコーダの補正を作ってみます. 全部マイコン上で組めるので,つくばチャレンジの時にあれこれ協調を考え ながら作ったのより開発はかなり楽かも.
速度とステアの角度とデータ更新のタイミングと考え出すとキリがないが,基本 はライントレースのイメージとそう違わない...と思う. 一番シンプルな形で,ウェイポイントの方向と進行方向の偏差でステアリングを 調整して,目的地から指定距離内に入ったらウェイポイントを更新するプログラム が出来た. 意味不明の暴走で結構手間取ったが,原因解決できた. (マイコンのメモリ不足・スタック不足?とLCD表示のタイミングと,符号に 関する見逃しとか...) あとは,テストプログラムを削除してメモリを空けて,走行アルゴリズムをいろい ろ工夫してみる.
ケーブル足りないけど,ありあわせのケーブルをつないで自立走行させてみました. プログラムは,モータに最低パワーを加えて前進し,エンコーダでカウントしながら 指定距離走ったら停止. 上手く動いたので,自律ロボットカーのハードウェア完成です. 命名「阿蘇不知火2号」 ちなみに1号が,つくばチャレンジに出したやつ,3号は八代キャンパスのI先生 が製作済みなので,欠番だった2号にします. 後はソフト.残り少ないメモリでどれだけ細かい制御がかけるでしょうか. 2m進んだら自動停止する動画
超音波センサで衝突回避の動画 直進走行中,50cm以内に障害物を見つけたら停止するプログラムです. パターン走行テストの動画 1m進み,右旋回しながらジャイロで角度をモニタ,指定角度でステアを戻して 1m走行停止.スピードが速くて止まりきれてませんが,ソフト通りの動きができ ました. でも,新たな問題発生. バッテリーがフル充電の時の最低速度設定でバッテリーが弱ってくると止まって しまいます.バッテリーが弱ってても走る速度設定でバッテリーがフル充電の時は スピードが速すぎて制御が難しい.なので,エンコーダのカウントから速度制御を 入れないと安定した走りはできないようです.
GPSロボットカーの速度制御ができました. エンコーダのカウントアップする間の時間をタイマーAで測ったカウント値を そのまま速度として制御に用いています. 下のリストはIRQ割込みを使ったエンコーダカウント. この中の spR=cspR; cspR=0; でエンコーダがカウントアップする毎に速度(spR)を更新します. void int_irq2(void){ // 右前輪エンコーダ処理 DI; IRR1.BIT.IRRI2=0; IENR1.BIT.IEN2=0; // IRQ2割込み禁止 encR++; // エンコーダカウントアップ spR=cspR; cspR=0; // スピードのカウント値を保管 IENR1.BIT.IEN2=1; // IRQ2割込み許可 EI; } cspRはエンコーダがカウントアップする間の時間をタイマーAでカウントしています. 得られる値は速度の逆数の次元になりますが,計算量を増やさないためそのまま 使います. 3000カウントで約0.5秒,エンコーダがカウントアップせずに,タイマーAで 3000カウントになれば停止状態になります. void int_timera(void) { // タイマーA割込み関数 ・・・ // スピード計測のためのカウンタ if (cspR<3000) cspR++; else spR=3000; if (cspL<3000) cspL++; else spL=3000; ・・・ } 次が指定速度で指定距離走行する関数,指定速度より上か下かでアンプに与える パルス幅を2段階に切り替えています.POSH一定で2m/s位になりますので, いまのところこれで十分. // 指定速度で走行停止(引数:距離,スピード) void testrun_sp(unsigned int i, unsigned int j){ encR=0; encL=0; pos1=POSC; while(encR< i){ if (spR >j) pos2=POSH; else pos2=POSL; } } 次はいよいよ実地走行.実地走行
GPSを使った走行をしました. 北に5m,そこから東に5m,更に南に5m,最初の場所に戻る設定ですが, ずいぶん原点がずれて戻ってきました. 最初なので,ウェイポイントの許容差を2mと大きく設定して走行しました. グラウンドのほうが抵抗が大きいので室内で速度設定したときよりは速度を上げて 良さそうなのと,比例制御でステアリングを切っているはずですが,比例係数が 大きすぎるようで蛇行してます. 次はもう少しスムーズに走るようにパラメータ調整してみます. 動画はこちら. ここまで作ったソースも参考までに以下からダウンロードできます. 開発環境はGDL(GCC Developer Lite,ベストテクノロジー). ただし,LCD表示関係のヘッダーファイルはオリジナルでないのでのせません. 適当に探したり作ったりしてください. GPSロボットカーのソース(H8-3664)
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |