7/31(水) 18:30~20:00 風邪のため
8/17(土) 09:30〜12:00
光センサーの機能
光センサーを GND=MapleSylupのGND, VCC=MapleSylupのVCC=5V, D0=IN2 に接続。
IN1 は BTN につながっているので、入力に接続するときは IN2, IN3, IN4 などを使うこと。
まずは電圧を測ってみよう。
MapleSylup V+ = 5.03V 白テーブルの時 D0 = 0.19V 黒線 の時 D0 = 4.96V
このような状態にならないのであれば、光センサー中央の青い調節ボリュームを動かして、黒線の上でだけ 4V を超えるように調整をする。
IchigoJam で光センサーを読み取る
IN() 関数は、指定した入力ポートが High=1 か Low=0 かを読み取る。
ANA() 関数は、指定した入力ポートの電圧を 0〜1023 の値で読み取る。0Vで0, 3.3Vで1023となる。黒線の上だと電圧が4.9V なので 1023 となる。
((( 黒線 ))) PRINT IN(2) 1 PRINT ANA(2) 1023 ((( 白線 ))) PRINT IN(2) 0 PRINT ANA(2) 61
IN命令は、ポート番号を指定しない IN() で呼び出すと、IN1,IN2,IN3,IN4 の値を IN1=1,IN2=2,IN3=4,IN4=8 の和で返す。(2進数の考え方)
2進数の各けたが次のような意味になっている。
8 4 2 1 IN4,IN3,IN2,IN1
ロボットを動かす最初の実験
最初のロボット制御の実験として、車体を進ませて、黒線の所まで走ったら停止させてみよう。
- 車体を前進させるためのポート (OUT1,OUT2) 左モーター, (OUT5,OUT6) 右モーター をつなぐ。
- 「 OUT ‘010001 」 で車体が前に動くか確認する。
- OUT1=1,OUT2=0 , OUT5=1,OUT6=0
- 回転方向が揃っていないと車体が回転するので、方向が違っていたらモータの+端子,-端子を入れ替える。配線を直さないのなら、OUT1,OUT2などの1,0を入れ替える。
- 「 OUT ‘010001 」 で車体が前に動くか確認する。
- IN2 左光センサー、IN3 右光センサーにつなぐ。
<<の部分には何を書けばいい?>> 10 OUT <<前進>> 20 IF IN(2) = <<白>> THEN GOTO 10 30 OUT <<停止>>
車体をゆっくり動かす
ここまで説明した方法だと、車体が速く動きすぎるかもしれない。ゆっくり動かすにはどうしたらいいだろうか?
直流モータをゆっくり動かすには、モータに加える電圧を下げればいい。ただし、モーターの中身の電磁石はただの電線。電気がたくさん流れるのであまり良い方法ではない。
ゆっくりうごかすには、ちょっと動かして、ちょっと止める…を繰り返せばいい。
10 OUT <<前進>> : WAIT 1 20 OUT <<停止>> : WAIT 1 30 GOTO 10
車体を曲がらせる
車体の進行方向を曲げたかったら、片方を止めて、もう一方を動かせばいい。
- 停止OUT1=0,OUT2=0 , 前進OUT5=1,OUT6=0
でも、これだと左タイヤを中心に回転してしまう。少しづつ左にまがるようにするにはどうすればいいだろうか?
2つの光センサーの扱い
ポートを指定しないIN()命令をつかうと、IN1,IN2,IN3,IN4 の値をまとめて読むことができる。今回の実験では、IN2,IN3に光センサーを接続する。この場合 IN() で読み込むと、以下のような値が読み込める。
左 | 右 | IN() | 値 |
---|---|---|---|
黒 | 黒 | IN4,IN3,IN2,IN1 = 0110 | 6 |
黒 | 白 | IN4,IN3,IN2,IN1 = 0010 | 2 |
白 | 黒 | IN4,IN3,IN2,IN1 = 0100 | 4 |
白 | 白 | IN4,IN3,IN2,IN1 = 0000 | 0 |
しかし IN()では IN1,IN4 の値も読み込んでしまい、IN1,IN4には何もつながない状態であっても、他の電圧などの影響でIN1=1,IN4=1といった値になる場合もあるため、IN1,IN4の値が1であっても強制的に0に変化させたい。
2進数での論理積 &
論理積演算命令 x & y は、2進数の各桁が 両方とも1 の所だけ 1 になる計算命令。
x = `0101 IN()=`1110 y = `0011 `0110 x & y = `0001 `0110
このことから、IN()&6 (6=`0110)を使えば、IN2,IN3 の値だけを取り出すことができる。
ライントレース処理
光センサー1個で、白黒の境界を走る。
光センサー2個で、黒線の上を走る。
10 A=IN()&6 20 IF A=6 THEN OUT <<<前進>>> 30 IF A=2 THEN OUT <<左前進>> 40 IF A=4 THEN OUT <<右前進>> 50 IF A=0 THEN OUT <<止まる>> 60 GOTO 10
急カーブ対策
ライントレースでは急なカーブがあるとコースから外れることもでてくる。こういう時は車体の大きく曲がらせるようにモータを制御すればいい。しかし大きく曲がるようにすると、車体が左右に頻繁に首を振る動きとなり、移動が遅くなってしまう。
こういう時は、どうすればいいだろうか?
「前回のセンサーの値」と「今回のセンサーの値」が、白黒とか黒白の場合。
「前回のセンサーの値」と「今回のセンサーの値」が、黒黒とか白白の場合。