質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

arduino センサーを3つ使ってサーボモーターを制御

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 407

赤外線センサーを3つ使ってサーボモーターを制御させたいです。(ライントレース)
・赤外線センサー:ELEGOOについているもの
・サーボモーター:SANWA RS-991(販売終了)  

一つの赤外線センサーでしかサーボモーターを制御できません。残り二つのセンサーでもサーボモーターを制御させるにはどうすればいいでしょうか。残りの2つはif文を使えばいいのでしょうか?教えてください!
{右(左)は黒線を認識したらサーボモーターを左(右)に~度傾ける。真ん中は黒線を認識している間、直進するというようなプログラムにしようと思ってます!}

↓一つのセンサーで動くプログラムです

include <Servo.h>

Servo myservo;  
int potpin = 0; 
int val;    

void setup() {
myservo.attach(9); 
}

void loop() {
if(val)
val = analogRead(potpin);            
val = map(val, 0, 1023, 0, 270);     
myservo.write(val);             
delay(200);        }       

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

ライントレースロボットで、床に描かれたラインを検出するための赤外線センサーを3つ(右、中央、左)持ち、操舵輪の方向を制御する事で右左折するものであろうと推測して回答します。

赤外線センサーは、
・ロボットの中央にラインがある時には、中央のセンサーがラインを検知。
・ロボットがラインから左に外れた時には、右のセンサーがラインを検知。
・ロボットがラインから右に外れた時には、左のセンサーがラインを検知。
というように動作する。(途中で、どのセンサーもラインを検知しない事もありうる)

操舵輪の方向はサーボモーターで制御。駆動輪が回っている(ロボットは動いている)とすれば、
・サーボモータを右に回すと、タイヤが右に曲がってロボットは右方向にカーブする。
・サーボモータを左に回すと、タイヤが左に曲がってロボットは左方向にカーブする。
・サーボモータを中央に回すと、タイヤが真っすぐを向いてロボットは直進する。
(ゆるやかにカーブするか、きつくカーブするかは、タイヤの向き(サーボモーターの向き)次第で変わる)

整理すると、入力は3つの赤外線センサーの検知結果、出力はサーボモータの向き。

そうすると、プログラムは、以下のような感じになると思われます。

# サーボ
Servo myservo; 
# 赤外線センサで調べた結果(センサは3個あるので、その検知結果を入れる変数も3つ)
int senseRight;
int senseCenter;
int senseLeft;

void setup() {
    #サーボモータの準備
    myservo.attach(9); 
}

void loop() {
#赤外線センサの出力を取得 (ラインを検知したら1,それ以外は0が出力されると仮定)
   senseRight = digitalRead(sensePin_R);
   senseCenter = digitalRead(sensePin_C);
   senseLeft = digitalRead(sensePin_L);

   if (senseCenter=1){ #中央のセンサの下にラインがあるのだから、ロボットはライン上にある。
       myservo.write(90); #操舵輪をまっすぐ
   } elseif (senseRight=1) { #右のセンサがラインをとらえたのだから、ロボットは左にずれている
       myservo.write(45); #操舵輪を右45度に曲げる
   } elseif (senseLeft=1) { #左のセンサがラインをとらえたのだから、ロボットは右にずれている
       myservo.write(135);  #操舵輪を左45度に曲げる
   } else { # どのセンサもラインを検知していない場合
   # 何もしない
   }
   delay(200);
}

質問のプログラムにある
「val = analogRead(potpin); 」以降の3行は、ロボットから可変抵抗(ポテンショメータ)に電線が伸びていて、ポテンショメータを変化させることで操舵輪を動かすものだと思われます。
人がロボットを見ながらポテンショメータで操作するのであれば、センサなんて要りませんよね。

滑らかにロボットを走らせるには、ロボットの慣性とかを考えて、操舵輪の操作もスムーズなものにする等の工夫が必要です。
上に書いたプログラムでも動くかもしれませんが、そうとうギクシャクした動きになるだろうと思います(急に45度曲げるなんてことしてますから)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/25 22:38

    書き込みをしようとしたところ、stray ’/350’ in program/とエラー出て、調べても350のものは出てきませんでした。(「/」は反対のスラッシュです。キーボードで打てなかったです)

    キャンセル

  • 2019/12/26 08:48

    そういうのはロボットのマニュアルか、ロボットを販売している会社に問い合わせるのでは? プログラムの問題ではないですよね。

    キャンセル

  • 2019/12/26 09:19

    全角文字とか入ってるんじゃないですかね?

    キャンセル

  • 2019/12/27 08:47

    確かめてみます!

    キャンセル

0

そのif文が意味不明ですが。。

3軸分順番に書いとけばいいんじゃないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/25 10:35

    やってみます。

    キャンセル

  • 2019/12/25 10:39

    で、そのそれぞれの値を判断してサーボモータを回すということで。

    キャンセル

  • 2019/12/25 21:48

    valを3つにしたところ 3つともセンサーは反応しました!
    後は角度等を決めるだけになりました。 いろいろと教えていただきありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る