• ベストアンサー

ライントレーサ

ライントレーサで、黒色・灰色・白色をセンサ一つで識別するプログラムを教えてください。プログラミング言語は、Cです。センサの出力は32ビットで、実行ファイル形式です。ターゲット環境は、マイコンです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

>黒いラインの横長の円コースに、カーブの形をした灰色のラインと白色のラインが円の中にあります。ルールは、黒を1周→灰色のラインをトレースして1周→白のラインをトレースしてそれぞれ一周します。 そうすると、まず黒→灰色→白と一周ごとにトレースする色が切り替わるんですね。 だとすれば、次の機能をプログラミングする必要があります。 1.指定した閾値に近い明るさのラインをトレースする機能。 ※ 閾値ジャストの値だと誤差が有るとトレースに失敗する可能性があるので前後の値も同じ明るさだと認識する必要があります。 // s=センサ値 // t=今トレースしたい閾値 // w=閾値とみなす値の幅 // 閾値の範囲内なら左旋回 if( ((t-w)<s) && (s<=(t+w)) ) { turn_left();//左旋回 } else { turn_right();//右旋回 } 2.一周したことを検知する機能。→何らかの目印がありますか? それとも黒のラインと何らかの形で他の色のラインが丁度一周したあたりで交差していますか? 何も目印が無いと曲がった量の累積で一周の見当をつける必要があります。この場合は誤差で目標を誤る可能性が高いです。 // lc=左旋回の回数 // rc=右旋回の回数 // AROUND_THRESHOLD=一周したとみなす旋回回数 if( (lc-rc) >= AROUND_THRESHOLD ) { //たぶん一周したので閾値を変更する。あるいは停止。 } 3.一周したら検知する閾値の値を切り替える機能。 switch( t ) { case THRESHOLD://黒 t=THRESHOLD_1;//灰色 break; case THRESHOLD_1://灰色 t=THRESHOLD_2;//白 break; case THRESHOLD_2://白 //停止する。 break; }

masha2700
質問者

お礼

何度も丁寧な回答をしていただき本当にありがとうございました。 Cの基本的な部分から勉強し直したいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

いまいちトレースする円の状況が分らないので写真があったら欲しいですね。外側から白黒白灰白みたいな感じですか?で、ルールは黒だけをトレースとか灰色だけをトレースすると考えて良いですか?ルールもよく理解出来ていないんですよ。 >灰色と白色をうまく認識できませんでした。 どうダメだったか教えてください。 ・灰色と白色の区別が付かなかったのか? ・場所によってうまく行ったのか? ・黒と同じ動作したのか? ・それとも違う事なのか?どんな動作をしたのか? ・そもそも閾値は本当に妥当ですか?教えてもらったページの白と黒の閾値は500ですが。 >黒いラインをトレースした後に、同じラインをトレースしないようにするためには、どのようにプログラムを記述すればよいかわかりません。 まず、ルールを詳細に教えてください。その上で「黒いラインをトレースした後」ってのも言葉足らずなので教えてください。これは黒のラインを一周した後の事でしょうか? >それぞれを一周し計3周したらゴールするいう内容です。 素直に受け取ると黒→灰色→白の円のライン上をそれぞれ一周するんでしょうか?

masha2700
質問者

補足

写真はあるのですが、補足に添付できないので申し訳ありません。 黒いラインの横長の円コースに、カーブの形をした灰色のラインと白色のラインが円の中にあります。ルールは、黒を1周→灰色のラインをトレースして1周→白のラインをトレースしてそれぞれ一周します。 >黒と灰色の境目、黒と白の境目を無視して、黒色のラインを永遠とまわり続けている状態です。閾値は、ライン上で何度も確認したので妥当だと思います。 >zwiさんのおっしゃる通り、黒いラインをトレースした後の事です。 説明不足で本当申し訳ありません。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

閾値が決まっているなら、センサ値と比べるだけです。 簡単な書き方だと変数sにセンサ値が入っているとして、 if( s<=THRESHOLD ) {  //黒 } else {  if( s<THRESHOLD_2 ) {   // 灰色  } else {  // 白 } これはC言語の基本的な記述ですが、これを聞きたいのでしょうか? だとしたら、ちゃんとしたC言語の参考書を買い勉強なさることをお勧めします。もし違うなら、何を聞きたいのかとレゴマインドストームNXTのC言語関係の資料があるサイトを教えて下さい。レゴマインドストームの経験はまったく無いのでNXCDefs.hの内容とかライブラリにどんなのが有るのかさえも知らないので。 ちなみに、閾値と「センサの出力は32ビット」と言う値が余りにもかけ離れているので、これについても補足をお願いします。32ビットのとりうる値の最大値は2の32乗ですので4294967296です。

masha2700
質問者

補足

補足が遅れて大変申し訳ありません。zwiさんが教えてくださったのをヒントにプログラムを記述したのですが、黒のラインはうまくトレースしたのですが灰色と白色をうまく認識できませんでした。 if( s<=THRESHOLD ) {  //黒  turn_left(); } else {  if( s<THRESHOLD_2 ) {   // 灰色 turn_right();  } else {  // 白 turn_right(); } 黒いラインをトレースした後に、同じラインをトレースしないようにするためには、どのようにプログラムを記述すればよいかわかりません。 下記のサイトが、詳しく掲載されていました。説明不足で申し訳ありませんがよろしくお願いいたします。 http://kumikomizine.jp/article/detail/104

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

センサーとマイコンのインターフェイスの回路も知りたいですね。アナログなのかとか。32ビットと言っているのでアナログ?だとしたら無駄に分解能が高いですね。 もしプログラムチェック条件を簡単に書くとすると 0x00000000<=黒<0x40000000 0x40000000<=灰色<0xc0000000 0xc0000000<=白<=0xffffffff って感じですかね。白黒センサだとしての話ですが。 それに上の値は、大分とデタラメです。センサの感度調整でいくらでも変わりますから。 これをプログラムできないとするとそもそもCの技術的に問題だし、センサの読み込み部分のプログラムは回路図やCPUの素性も知らない他人が書ける訳も無く質問が大雑把ですね。 とりあえず、新しい質問に移らずに補足で最新の情報を返して下さい。

masha2700
質問者

補足

ライントレースロボットは、レゴマインドストームNXTを使用しています。コースは、O字型の中に灰色・白の曲線を2本追加したものです。プログラムは、それぞれを一周し計3周したらゴールするいう内容です。照度センサのしきい値を黒・灰色・白は、あらかじめ以下のように設定しています。 #include "NXCDefs.h" #define THRESHOLD 45  //黒 #define THRESHOLD_1 55 //灰色 #define THRESHOLD_2 65 //白 zwiさんからご指摘していただいたように、かなり未熟ものですが、補足内容を返信させていただきます。よろしくお願いします。

すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

・使用するコンパイラ ・センサーとマイコンの型番 ・プログラムを作る上で「何が」わからないのか 以上すべて補足してください。 なお最後については「全部」というのは無しです。

masha2700
質問者

お礼

丁寧な回答ありがとうございました。 もう少し調査してから質問し直したいと思います。

すると、全ての回答が全文表示されます。

関連するQ&A