000000 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

ソフトウェア

GPSロボットカーのソフトウェア


ハードなしで考え得るプログラムの基本形がおおかたできました.
ジャイロもエンコーダも使わなければ,GPSロボットカーは見えないラインをトレースするライントレースロボット?
あとは,ウェイポイントをLCDで確認しながら入力できるインターフェースの作成と,ハードを作って走行させながらパラメータ調整.その後ジャイロやエンコーダの補正を作ってみます.
全部マイコン上で組めるので,つくばチャレンジの時にあれこれ協調を考えながら作ったのより開発はかなり楽かも.

----------------------------

速度とステアの角度とデータ更新のタイミングと考え出すとキリがないが,基本はライントレースのイメージとそう違わない...と思う.
一番シンプルな形で,ウェイポイントの方向と進行方向の偏差でステアリングを調整して,目的地から指定距離内に入ったらウェイポイントを更新するプログラムが出来た.
意味不明の暴走で結構手間取ったが,原因解決できた.
(マイコンのメモリ不足・スタック不足?とLCD表示のタイミングと,符号に関する見逃しとか...)
あとは,テストプログラムを削除してメモリを空けて,走行アルゴリズムをいろいろ工夫してみる.

----------------------------

ケーブル足りないけど,ありあわせのケーブルをつないで自立走行させてみました.
プログラムは,モータに最低パワーを加えて前進し,エンコーダでカウントしながら
指定距離走ったら停止.
上手く動いたので,自律ロボットカーのハードウェア完成です.
命名「阿蘇不知火2号」
ちなみに1号が,つくばチャレンジに出したやつ,3号は八代キャンパスのI先生が製作済みなので,欠番だった2号にします.
後はソフト.残り少ないメモリでどれだけ細かい制御がかけるでしょうか.

DSC02637.JPG

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)


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.