基本情報技術者 2017年 秋期 午前(科目A) 問04
問題文
図のような黒色で描かれた円に沿って車が走るように、左右の後輪に独立に取り付けられたモータL及びRの回転速度を制御する。センサL及びRは反射型光センサであり、センサが黒色に掛かる比率が大きいと出力値が小さくなり、黒色に掛かる比率が小さいと出力値が大きくなる。この車を円に沿って走行させるためのモータ回転速度の制御方法として、適切なものはどれか。ここで、二つのセンサの出力値が一致するときには、二つのモータの回転速度を初期値に戻すものとする。


選択肢
ア:
イ:(正解)
ウ:
エ:
円に沿って走行する車のモータ制御【午前2 解説】
要点まとめ
- 結論→ 左センサの出力が右より大きい(左が白寄り)ときは左車輪を速くして右へ旋回させる制御、選択肢イが正解です。
- 根拠→ 反射型光センサは黒で出力が小さく白で出力が大きい。左右の出力差から「線(黒帯)がどちら側にあるか」が分かるため、出力の大小に応じて左右モータを逆位相に変化させて復元します。
- 差がつくポイント→ 「出力が大きい=白側」を正しく理解し、回転速度を増やす側がどちらの曲がりを生むか(左右速度差と回転方向の関係)を直感的に把握することです。
正解の理由
正解は イ です。
反射型光センサは黒を多く検出すると出力値が小さく、白が多いと出力値が大きくなります。たとえば「センサL出力 > センサR出力」の場合、左は白寄りで右は黒寄り、つまり黒帯(線)は車体の右側に位置しています。このとき車体は線の左側にずれているため「右に向かって修正(右旋回)」する必要があります。右旋回は左車輪を速く/右車輪を遅くすることで実現できるため、イ(センサL>R のときモータL 上げる、モータR 下げる)が適切です。同様にセンサL<R のときは逆の操作を行います。
反射型光センサは黒を多く検出すると出力値が小さく、白が多いと出力値が大きくなります。たとえば「センサL出力 > センサR出力」の場合、左は白寄りで右は黒寄り、つまり黒帯(線)は車体の右側に位置しています。このとき車体は線の左側にずれているため「右に向かって修正(右旋回)」する必要があります。右旋回は左車輪を速く/右車輪を遅くすることで実現できるため、イ(センサL>R のときモータL 上げる、モータR 下げる)が適切です。同様にセンサL<R のときは逆の操作を行います。
よくある誤解
- センサ出力が大きい方=「黒を検出している」と誤解する。実際は「出力が小さい=黒を多く検出」なので読み替えをミスすると逆制御になります。
- 左右どちらを速くすればどちらに旋回するかを逆に覚えている。左車輪を速くすると車は右に曲がる点を明確にしておきます。
- 等価条件(両センサが一致)を無視して微小振動を放置すると、行ったり来たりで安定走行しないことがあります。初期値復帰や閾値処理が必要です。
解法ステップ
- センサ特性を確認:黒→出力小、白→出力大であることを確認する。
- 出力差から黒帯の位置を推定:「どちらのセンサがより黒を検出しているか」を判断する。
- 旋回方向を決定:線が右にある(右が黒)なら右旋回、線が左にあるなら左旋回。
- モータ制御へ落とし込む:右旋回=左車輪速く/右車輪遅く、左旋回=左車輪遅く/右車輪速く。
- 両センサ一致時は初期速度に戻す(与えられた条件)。
選択肢別の誤答解説
- ア:センサL>R のとき「モータL 上げる、モータR 下げる」としているが、表の下段(センサL<R のとき)も同じ操作になっており、左右の出力差で方向が逆転しない不整合があり、誤りです。
- イ:正解。センサ出力の大小を黒/白に正しく読み替え、速度増減で適切な旋回方向を作っています。
- ウ:センサL>R のとき左を下げ右を上げとしているが、これは「左が白で右が黒」のときに左車輪を遅くして左へ曲がるという逆操作であり、軌道から外れます。
- エ:表の両場合で「モータL 下げる、モータR 上げる」が統一されており、出力差が逆転しても操作が変わらないため適応できず誤りです。
補足コラム
実際のライントレースでは単純なオン/オフ(増減)制御でも動作しますが、振動やオーバーシュートを抑えるには比例(P)や微分(D)を利用した制御(PD/PID)が有効です。典型的には誤差を
と定義し、左右の目標速度を
のようにして連続的に調整します。ここで はゲインで、出力のスケールに応じて調整します。
簡単な制御の例(擬似コード、Python風)
# センサ値は0(黒)〜1(白)に正規化されているとする
V_base = 50.0 # 初期(直進)速度
k = 30.0 # ゲイン(実機で調整)
def update_motor(sensorL, sensorR):
e = sensorL - sensorR
vL = V_base + k * e
vR = V_base - k * e
# 両センサ一致(ほぼ0)の場合は初期値に戻す処理を入れてもよい
return clamp(vL, 0, 100), clamp(vR, 0, 100)
FAQ
Q1: なぜ「出力が大きい=白」かを逆に理解するとまずいですか?
A1: 出力と地色(黒/白)の対応を逆にすると、旋回方向が完全に逆になり、ラインを逸脱して追従できません。最初に仕様を正確に読むことが重要です。
A1: 出力と地色(黒/白)の対応を逆にすると、旋回方向が完全に逆になり、ラインを逸脱して追従できません。最初に仕様を正確に読むことが重要です。
Q2: 出力差が小さいときはどうするべきですか?
A2: 小さい差はノイズや振動の原因になります。デッドバンド(閾値)を設けるか、小さな差には比例ゲインを下げて応答を穏やかにするのが良いです。
A2: 小さい差はノイズや振動の原因になります。デッドバンド(閾値)を設けるか、小さな差には比例ゲインを下げて応答を穏やかにするのが良いです。
Q3: PID にするときの k の目安は?
A3: センサ値とモータ速度のスケールに依存します。まずは小さめの比例ゲインで試し、振動があれば D を追加、遅れが残る場合は I を検討します。実機で少しずつ増減して調整します。
A3: センサ値とモータ速度のスケールに依存します。まずは小さめの比例ゲインで試し、振動があれば D を追加、遅れが残る場合は I を検討します。実機で少しずつ増減して調整します。
関連キーワード: 反射型光センサ、差動駆動、ライントレース、フィードバック制御、出力差、比例制御、PID、モータデューティ比、閾値処理

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

