NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

ラジコンをArduinoで自動運転!その18(バグ取り②)

イメージ 1
ラジコンの自動運転化装置を制御するプログラムからバグ取り中です
 前回迄の記事でバグ①②③⑦⑧は解決済みですが、⑧の解決方法が納得いかず作り直しました! 残すは⑤⑥のバグと減っていません
 

1. バグ

1.1 ④~⑥は進展なし
④ラジコンがバックしない⁉(半分解決!)
症状:モーターアンプでモーターが逆転しない
原因:恐らくサーボライブラリの.attach関数の初期設定が微妙(調査中)
   もしくはモーターアンプ内で急にバック出来ない様に制御されている?
対策:バックする前にスロットルをニュートラルにしderay(500);」した後バックした所バック可能になりました!・・・手動運転でバックしません、恐らくニュートラル時もデータがばらついて止まっているとみなされないのでしょう・・・。

⑤電源ONでラジコンが走る⁉(調整中)
症状:電源を入れると全部のサーボが思いっきり動く
原因:volatile int Val = {0,0,0,0};・・・初期値全部”0”
対策: volatile int Val = {24,94,94,94};に
Setup中で
LpOut.write(94);
RsOut.write(94);
ThOut.write(94);
FsOut.write(94);
した後、割り込みの初期値を無視する為に
deray(1000);
しましたがうまくいきません
プルアップが原因か!?

荷台がラジコン本体に食い込む(調整中)
症状:荷台サーボの動作角度が100°位と想定の90°より多い
原因:そういうもの・・・

1.2 進展有り!
⑧サーボが激しくブルブルする時が有る(前回解決したが納得いかず作り直し!)
症状:センサーから距離30±1cmに障害物が有る時ブルブルが発生する。
原因:測距センサーの値は30cmの時に±1cm程度のバラつきが有り、制御が切り替わるポイント(30cm)に障害物が有るとデータのバラつきで超高速にサーボの角度が切り替わりサーボがブルブルする。
対策1:制御が切り替わる特定距離±3cm位の時に制御を変更させない様にする。if文沢山使った10行以上のプログラムになりそう・・・。
対策2:反応が早すぎたのが原因でしたのでメインループ内で「deray(200);」した所サーボのブルブルは解決しました!

結果:対策2では、ブルブルは収まりましたが、反応が遅くなり車速を上げたら壁に衝突しました!・・・残念!楽するとだめですね
と言う事で大変ですが対策1の何もさせない領域を作りました!
 

2. プログラム

 と言う事でメインループ内のderay(200);」を削除し、「State()」関数を大幅に修正しました。※修正前2.1 修正後2.2
 効果の程は・・・絶大です!走行が非常にスムーズかつ高レスポンスな自動運転に早変わりしました!もちろん壁に衝突する事は皆無です!

2.1 修正前
byte State(){  //3つのセンサーの状態から動作パターン番号を返す関数
  int L=0, S=0, R=0, i=0;
  byte A=115, B=175, C=176;
  for(byte i=0;i<50;i++){                   //測距センサーの値を50回読み平均値を出す
    L=L+analogRead(0);S=S+analogRead(1);R=R+analogRead(2);}
    L=L/50,S=S/50,R=R/50,i=0;
  if(A<=L && L<=B){i=i+9;}if(C<=L){i=i+18;}   //左センサーの状況判断
  if(A<=S && S<=B){i=i+3;}if(C<=S){i=i+6;}    //正面センサーの状況判断
  if(A<=R && R<=B){i=i+1;}if(C<=R){i=i+2;}   //右センサーの状況判断
  return i;
}
イメージ 1
図1:プログラム例

 

2.2 修正後
volatile byte Lval, Sval, Rval;
byte State(){  //3つのセンサーの状態から動作パターン番号を返す関数
  int L=0, S=0, R=0 ;
  byte A=115, B=175, C=176, D=510;  //A:50cm BC:30cm D:20cm
  for(byte i=0;i<50;i++){                   //測距センサーの値を50回読み平均値を出す
    L=L+analogRead(0);S=S+analogRead(1);R=R+analogRead(2);}
    L=L/50,S=S/50,R=R/50;
  if(A-5<=L && L<=A+5){}else{if(B-5<=L && L<=C+5){}else{Lval=0;if(A<=L && L<=B){Lval=Lval+9;}if(C<=L){Lval=Lval+18;}}} //左センサーの状況判断
  if(A-5<=S && S<=A+5){}else{if(B-5<=S && S<=C+5){}else{Sval=0;if(A<=S && S<=B){Sval=Sval+3;}if(C<=S){Sval=Sval+6;}}} //正面センサーの状況判断
  if(A-5<=R && R<=A+5){}else{if(B-5<=R && R<=C+5){}else{Rval=0;if(A<=R && R<=B){Rval=Rval+1;}if(C<=R){Rval=Rval+2;}}} //右センサーの状況判断
  if(D<L || D<S || D<R){return 26;}else{return Lval+ Sval+ Rval;}
}
イメージ 1
図1:プログラム例

 

3. まとめ

 今日の修正で自動運転のレベルが一気にUPしました!
 ハイレスポンスとスムーズさって大事ですね、前のプログラムは仮免運転練習中の様な危なっかしさが有りましたが今回の修正で消えました!
 今は免許取り立てペーパードライバー位ですね!
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ラジコンをArduinoで自動運転!】目次に戻る