🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

4036閲覧

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

reikisoraarosir

総合スコア9

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/12/24 08:51

赤外線センサーを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); }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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 08:06

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reikisoraarosir

2019/12/25 13:38

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

2019/12/25 23:48

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

2019/12/26 00:19

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

0

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

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

投稿2019/12/24 09:01

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reikisoraarosir

2019/12/24 09:33

valを3つ作るってことですか?(?)
y_waiwai

2019/12/24 09:40

そうですね val1、val2、val3 とつくればいいんじゃないでしょうか
y_waiwai

2019/12/25 01:39

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

2019/12/25 12:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問