• ベストアンサー

ライントレーサ

ライントレーサで、黒色・灰色・白色をセンサ一つで識別するプログラムを教えてください。プログラミング言語は、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

  • ライントレーサ

    ライントレーサで、黒色・灰色・白色をセンサ一つで識別するプログラムを教えてください。プログラミング言語は、Cです。

  • PICでライントレーサー(C言語)count

    c言語初心者です。 c言語の勉強で、ライントレーサーを作っています。 センサーは3つあります。 ライン上を走行、十字路で停止というところまではできました。 今度は一つ目の十字路を通過、2つ目の十字路で停止という動作をさせようと思っています。 十字路のカウントにはcountを使うということまでは分かりますが、書き方が分かりません。 もしセンサーが0x00(すべて黒=十字路)になったら、一つ目の十字路ではモーターを0x90(直進)に、二つ目の十字路ではモーターを0x00(停止)にする、というふうにしたいので if(sensor==0x00) { 一つ目はmotor=0x90; 二つ目はmotor=0x00; } となると思いますが、真ん中の部分のプログラムを教えてください。 どのような情報が必要なのか私には分からないので、もし足りない情報がありましたら言っていただければ補足します。 解答お願いします。

  • ライントレース アルゴリズム

    LEGO社のmindstormsを用いてライントレーサを作っています。センサは前方に1つで前輪2つで後輪が1つ。 アルゴリズムは if(センサの色が黒){    左側の車輪を動かす  }else{    右側の車輪を動かす } としますとぎこちない走りになります。 どのようなアルゴリズムがいいのか教えていただけないでしょうか? また点線を走るアルゴリズムも教えてください。 ヒントだけでもお願いします。

  • フォトセンサ(フォトインタラプタ)について

    お世話になります。 シンプルなロボット作成をすることになっています。 その機能の一つとして、色を識別する必要があり、フォトセンサ(またはフォトインタラプタ)を使用することになっています。 フォトセンサと一言で言ってもいろいろあると思いますが、今回目をつけているのは「RPR220(ROHM社)」で、ネットで調べてみたところ、照射する対象物が黒だった場合はアナログ電圧の出力なし、白だった場合は出力ありとなってました。 識別する色が白か黒かという状況なら良いのですが、例えば「白」と「白以外」という場合になると、どこまでを「白以外」とセンサが判断するのか分かりません。または、中間色の場合は中間の電圧が出力されるのでしょうか?もしそうなった場合、A/Dを使わないと区別できないと思うのですが、そうするとプログラムも少々複雑になってしまいそうですよね。 かなり想像が入っているので全然違うかもしれませんが、詳しい方いらっしゃいましたら、ご回答頂けると有難いです。

  • 歯磨き粉アパガードの磨き汁の色

    汚い話ですみません。 アパガードを使っています。この歯磨き粉自体は白色なのですが、磨いた後の汁の色が汚い灰色です。何故でしょうか? 日によって薄めの灰色のときと濃いめの灰色のときがありますが、いずれにしても城が肺になるには黒が加わらなくてはいけませんが、口の中に黒があったとは思えず、不思議です。なぜ灰色になるのでしょうね?

  • 遺伝子についての問題がよくわかりません…

    遺伝子についての問題がよくわかりません… ≪問題≫  ハツカネズミの毛の色には灰色、黒色、白色がある。この毛の色には2組の独立に遺伝する対立遺伝子(B,gとG,g)が関係しており、B,Gはそれぞれb、gに対して優性で、表現型を〔 〕で表すと、毛の色は、〔BG〕の場合は灰色、〔Bg〕の場合は黒色であり、それ以外の〔bG〕、〔bg〕の場合は白色になることがわかっている。  ある灰色の個体Aについて、遺伝子型がbbggである白色の個体と交配させる場合、灰色のこと黒色の子は生まれるが白色の子は生まれないことがわかっている。この交配により灰色の子が生まれた場合、個体Aと、灰色の子の遺伝子型をそれぞれ正しく示しているのはどれか。   個体A   灰色の子 1.BBGg    BBGg 2.BBGg    BbGg 3.BbGG    BbGG 4.BbGg    BBGg 5.BbGg    BbGg の5択で、正解は2なのですが、なぜ2になるのかわかりません…。 どなたか教えてください!!よろしくお願いします。

  • 初めてのマイコン

    こんにちは。 都内の理系の高校に通っている高校一年生です。 マイコンを使った電子工作ができるようになりたいと思います。 しかし、どこから勉強を始めていいものかさっぱりわかりません… ディジタル回路やアナログ回路は使ったことが何度もあるので、少々のことはできるのですが、 プログラミングの必要なマイコンについては、まったくわかりません… PICのようなマイコンが一般的なようですが、 他にも非常に多くの種類があると思います。 初心者が入るのにもっともとっつきやすく、 他のマイコンに対しても応用が利くマイコンって何でしょうか? (たとえば構造が似ているので、プログラムの大幅な変更が不要など) 教えてください。 また、参考になるサイトを教えてください。 初めてのマイコン という感じのキーワードで検索してみるのですが、 いまいちしっくり来るものがありません… マイコンについては何もわからないもので、 なんで、ひとつのピンが入力にも出力にもなるのでしょうか? ↑というレベルです… また、プログラミング言語は、まったくわかりません C言語が高校の一年で必修なのでそのうちやるのですが(たぶん2学期後半) それまでには少しくらいわかるようにはなっていたいです。 マイコンについての本も買ってみたいと思います。 本屋でいくつか立ち読みしてみたのですが… また、最近ではUSBに直接接続することのできるマイコンもあるようですね… そのようなものは、少々値が張りますが、 やはり使いやすいのでしょうか…? 長文失礼しました・・・

  • 絵の具の配合のことを、化学っぽくいうとどうなるの?

    「黒色の絵の具」と「白色の絵の具」とを混ぜたら、  その結果「灰色の絵の具」になります。  このことを、なんというのでしょうか?  たとえば、「化学反応」とか、  なにか呼び名がありますよね?  その正式名称を教えて下さい。  宜しくお願い致します。

  • 散布図の背景色(ExcelVBA)

    画像で灰色(グレー)の部分を透明にするコード例 同じく灰色(グレー)の部分を白色にするコード例 画像全体の枠内(画像では白色の範囲を黄色)にするコード例 同じく全体の枠内(画像では白色の範囲を緑色)にするコード例 画像の外枠の四角い黒色のマーカーを表現させないコード例 ご存知の方、ご教授ください。

  • 画像の白と黒のドットを数えたい

    例えば白と黒だけで描かれたビットマップ画像を用意し(白黒であればbmpでなくてもどんな形式でも良い)、縦のラインで白は幾つあるか、黒は幾つあるかを画像全体に関して求めるにはどうすればいいでしょうか。 例えばWindowsのペイントでペンツールだけで適当に絵を描いた大きさ640×384のビットマップ画像の場合、ある縦のラインでは白は120、黒は264あり、その隣の縦のラインでは白は124、黒は260あり、、、とこれを640回繰り返して画像の縦のラインでの白値と黒値の値を順次求めていってくれるような機能のあるソフトはあるでしょうか。 それともやはりC言語等のプログラミングで求めていくしかないでしょうか。 画像処理に詳しい方お願いします。

専門家に質問してみよう