ホーム » スタッフ » 斉藤徹 » IchigoJamと光センサー

2024年7月
 123456
78910111213
14151617181920
21222324252627
28293031  

検索・リンク

IchigoJamと光センサー

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を入れ替える。
  • 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

急カーブ対策

ライントレースでは急なカーブがあるとコースから外れることもでてくる。こういう時は車体の大きく曲がらせるようにモータを制御すればいい。しかし大きく曲がるようにすると、車体が左右に頻繁に首を振る動きとなり、移動が遅くなってしまう。

こういう時は、どうすればいいだろうか?

「前回のセンサーの値」と「今回のセンサーの値」が、とかの場合。

「前回のセンサーの値」と「今回のセンサーの値」が、とかの場合。