名称 |
MIRS1205 トラブルシューティング01 |
番号 |
MIRS1205-TRBL-0001 |
最終更新日:2013.02.15
版数 |
最終更新日 |
作成 |
承認 |
改訂記事 |
A01 |
2013.02.15 |
佐野 |
牛丸教員 |
初版 |
目次
1.はじめに
-
本ドキュメントは、MIRS1205についてのトラブルとその対策に関して記したドキュメントである。
ただし、記されている対策は1205機で行われたものであり、根本的な解決とはなっていないものや、他機に対しては適切でないものを含んでいる。
2.トラブル
- 各トラブルの項目を以下に示す。
メカ
タイヤ
エンコーダ
前タッチセンサ
エレキ
基盤導通
ソフト
I/Oエラー
カーネルパニック
アボート
セグメンテーション違反
エンコーダ
無線アダプタ
回転
白線
数字認識プログラムのバグ
uss_getプログラムのバグ
デバイスドライバのバグ
3.内容と対策
各トラブルの、解決済・対策済・未解決の分類と、詳細を以下に示す。
メカ
タイヤの動き出しが合わない--対策済 参考写真
→個体差と、各ネジの緩みのため発生する。(調整から時間が経っていると頻発)
個体差に対してはソフトで対応するしかない。
緩む可能性のあるネジは多いため、走行前に確認する必要がある。また、ギアのネジは金具から外してから締める必要がある。(矢印のネジを外す)
車体を引きずっての移動をやめ、下段シャーシを毎回持ち上げて移動することが防止策となる。
エンコーダの読み取りがおかしくなる--解決済 参考写真
→輪ゴム、虫ゴムが劣化しているため発生する。(調整から時間が経っていると頻発)
新品への変更や調整を行うことで改善する。
前タッチセンサに大きな衝撃が加わり、本体に影響が出る--対策済 参考写真
→正面からのタッチは大きな力が本体に加わるため発生する。(ロータリーの支柱にあたる際に頻発)
スポンジを使用して衝撃を抑え、浮いている板にセンサが反応するように金属板を曲げる。
エレキ
基盤が導通してしまう--対策済
→複数の原因が考えられる。
1.基盤加工機のミリングの高さ設定が浅すぎる。
2.基板加工の際の削りカスが溝に入りこんでる。→古歯ブラシを使用してカスを取り除く。
3.電源ボードの裏に配線が接触している。
4.電源ボードの裏のネジやナットが影響してしまう。→ガムテープで防ぐ(参考写真)
I/Oエラーが発生する--対策済
→配線の接触不良であることが多い。
コネクタ部分の変更と半田の直付によって対策をした。→MIRS1205 ドータボード設計書参照
ソフト
I/Oエラーが発生する--対策済
→モーターへの入力が失敗しているため発生する。詳細な原因は分かっていないが、モーターへの入力後のsleep時間が短すぎると発生することが多くなる。
また超音波を読み取りながら走行制御を行うとI/Oエラーが起きやすくなることも分かっている。解決策は見つかっていないのでI/Oエラーから復帰する方法を以下に示す。
1.s1=motor_send_control_packet(fd1,……);、s2=motor_send_control_packet(fd2,……);とする。
2.s1かs2に"-1"が返されたことを検出する。(I/Oエラー)
3.I/Oエラーが発生したら、スレッドを終了させる。(オープンしたfd1などをクローズする)
4.system("./motor_restart");としてmotor_restartを実行する。
[1205班]1205班では、モーターを動かすスレッド内で適度に関数io_check()を呼び出している。
関数io_check()は、I/Oエラーが発生したかどうかを確認し、エラーが発生した場合フラグを立て、すべてのスレッドを終了さてている。
その後、プログラムはスレッドを作った関数(create類)をでる。
I/Oエラーが起こりうる関数(モータースレッドを作る関数)の後で関数io_restart()を呼び出している。
関数io_restart()はフラグが立っている場合にシステムコールでmotor_restartを実行し、s1とs2を初期化する。
カーネルパニックが発生する--未解決
→原因不明(不定期)
本体の電源をおとし、再起動する必要がある。OSの問題だと思われるため、コンパクトフラッシュを入れ替えることが防止策となるが完璧ではない。
アボートが発生する--未解決
→原因不明(OpenCV内)
カメラが原因だと考えられるが、詳細な原因は不明である。
セグメンテーション違反が発生する--未解決
→原因不明(不定期)
プログラムが終了してしまうため、再度プログラムを実行する必要がある。
具体的な対策は見つかっていない
エンコーダの値を取得できなくなる--解決済
→原因不明(長時間走行後に頻発)
MIRSMG3D モータ制御ボード改良プロジェクトを参照しintegration.hexを変更した。
無線アダプタが点灯する(点滅が止まる)--未解決
→原因不明(不定期)
ノートパソコンからの遠隔操作が効かなくなる。本体の電源をおとし、再起動する必要がある。
その場での回転中に、壁に引っかかり止まってしまう--対策済
→標準のmotor_rotate()は、入力された角度だけ走行をしない限り終了しないため発生する。
1.motor_rotate内に、現在と直前のエンコーダの値を取得する変数を定義する。
2.エンコーダの値に一定回数変化がない場合に停止する。
3.その後、少し直進をして回転を再開する。
プログラムの実行後にスタート位置に移動する際、白線を検知してしてしまう。--対策済
→光の加減で白線を誤検知してしまうため発生する。
プログラムの実行後に、前のタッチセンサをタッチすることで動き出すようにした。(タッチするまでは待機状態である。)
数字認識プログラムのバグ(牛丸先生のメール引用)--解決済
標準の数字認識プログラムに重大なバグがあることがわかりました。
7を4と誤認識する原因もこのバグが原因でした。
num_detect.c の 287 〜 290 行目
num_detect2.c の 296 〜 299 行目
の下記の部分を
if(counter > max_value){
location_row[row - 1] = i;
}
次のように変更する必要があります。(下記の2行目と5行目を追加)
if(counter > max_value){
max_value = counter;
//信号の長さの代表値の更新
location_row[row - 1] = i;
length[row - 1] = max_value;
}
uss_getプログラムのバグ(牛丸先生のメール、出川先生の追加修正)--解決済
uss_getの関数の最初の部分を以下のように修正する。
int uss_get(int uss_num){
unsigned char rs_rbuffer[2];
unsigned char rs_sbuffer[1];
int c,x;
int data = 99999;
int i=0;
struct termios oldtio;
if(uss_num < 0 || uss_num > 4) return(-1);
rs_sbuffer[0]=(char)uss_num;
……