はじめに
皆さん、こんにちは! 前回は簡単なプログラムで、コンパイルから実行までの一通りの流れを体験し、モーターの制御を行いました。今回は光センサーも使い、もう少し組込みらしいプログラムを作ってみましょう。
前回までの連載記事
光センサーとは
これが光センサーで、その名の通り明るさを検知するセンサーです。赤い部分が発光ダイオードで、白い部分が受光素子です。発光ダイオードから発せられた光の反射光を受光素子が検知します。今回は明るさをパーセントで取得しますが、値は明るいほど100に近くなり、暗いほど0に近くなります。
黒いラインを見つけたら止まるプログラム
それでは、早速やってみましょう!
光センサーから明るさを読み取り、黒いラインを見つけたら止まるプログラムです。
1: import josx.platform.rcx.*; 2: 3: /**
4: * BlackStop.java
5: *
6: * 黒いラインを見つけたら止まる
7: *
8: */ 9: 10: public class BlackStop { 11: public static void main(String[] args) { 12: 13: //光センサーで,Percent値を取得するように設定する。 14: Sensor.S2.setTypeAndMode(3, 0x80); ←(1) 15: Sensor.S2.activate(); ←(2) 16: 17: //前進 18: Motor.A.forward(); ←(3) 19: Motor.C.forward(); 20: 21: //光センサーで値を取得し続ける 22: while(true) { ←(4) 23: //黒と判定した場合ループを抜ける 24: if(Sensor.S2.readValue() < 45) { 25: break; 26: } 27: } 28: 29: //止まる 30: Motor.A.stop(); ←(5) 31: Motor.C.stop(); 32: 33: } 34: }
- 14行目:
- 15行目:
- 18~19行目:
- 22~27行目:
- 30~31行目:
Sensor.S2
は、光センサーを接続しているポートを意味します。setTypeAndMode()
で、光センサーが明るさをパーセント値で取得するように設定しています。activate()
を記述します。Sensor.S2.readValue()
で光センサーの値を取得します。値が45より小さい場合は黒と判断し、ループを抜けます。stop()
で止めます。プログラムの実行
前回と同様に、コンパイルできたらRCXにクラスファイルを転送します。
実行してみましょう。
C:\>lejosc BlackStop.java C:\>lejos BlackStop 100% C:\>
おおぉ! 動きましたーーーっ!!(動画でお伝えできないのが残念です)
黒いラインをはみ出ているように見えますが、センサーは黒いラインで止まっています。
このプログラムでは白と黒の閾値(しきいち)を「明るさ45%」としましたが、実際は部屋の明るさなど環境によって閾値は異なりますので、本格的に開発する際には、こういうことも考慮してプログラムを組む必要があります。
黒いラインを走るプログラム
それでは今やったことを応用して、もう少し組込みらしいプログラムにしてみます。黒いライン上を走るプログラムを考えてみましょう。
どのようにすれば良いでしょうか?
ここでは、光センサーが読み取った値が45より小さい場合を黒、大きい場合を白と判断しています。今回の場合、黒だったら右に曲がる、白だったら左に曲がるというプログラムにすれば、結果としてラインの右縁をジグザグに走ることになりそうです。
1: import josx.platform.rcx.*; 2: 3: /**
4: * LineTrace.java
5: *
6: * 黒いラインを走る
7: *
8: */ 9: 10: public class LineTrace { 11: public static void main(String[] args) { 12: 13: //光センサーで,Percent値を取得するように設定する 14: Sensor.S2.setTypeAndMode(3, 0x80); 15: Sensor.S2.activate(); 16: 17: //前進 18: Motor.A.forward(); 19: Motor.C.forward(); 20: 21: //光センサーで値を取得し続ける 22: while(true) { 23: //黒と判定したら右へ曲がる 24: if(Sensor.S2.readValue() < 45) { ←(1) 25: Motor.A.forward(); ←(2) 26: Motor.C.stop(); 27: //白と判定したら左へ曲がる 28: } else { ←(3) 29: Motor.A.stop(); ←(4) 30: Motor.C.forward(); 31: } 32: } 33: 34: } 35: }
先ほどと違うのは、22~32行目です(今回は止まることを考慮していません)。
- 24行目:
- 25~26行目:
- 28行目:
- 29~30行目:
Sensor.S2.readValue()
で光センサーの値を取得します。値が45より小さい場合は黒と判断します。Motor.A.forward()
で左のタイヤを動かすモーターを順回転させ、Motor.C.stop()
で右のタイヤを動かすモーターを止めると、右へ曲がります。Motor.A.stop()
で左のタイヤを動かすモーターを止め、Motor.C.forward()
で右のタイヤを動かすモーターを順回転させると、左へ曲がります。コンパイルできたらRCXにクラスファイルを転送します。
C:\>lejosc LineTrace.java C:\>lejos LineTrace 100% C:\>
実行してみましょう。
おおぉ! 動きましたーーーっ!!(動画でお伝えできないのが残念です)
どうでしょう。組込みっぽくなってきたでしょうか。
次回は応用編として、スレッド、ボタン操作、赤外線通信などのプログラミングを紹介します。