はじめに
皆さん、こんにちは! いよいよ連載の最後となりました。今回はサンプルプログラムをいくつか紹介します。前回までに、モーター制御や光サンサーを使ったプログラムを作りました。他にもいろいろなことができますので、機能を組み合わせて使うとさらに楽しくなると思います。
前回までの連載記事
スレッドを使ったプログラム
Javaの開発経験がある方ならば、Javaでマルチスレッドプログラミングができることをご存知だと思います。組込み機器では、例えば携帯電話でテレビを見ている最中でもメールが来たら受信するというように、マルチスレッドは製品として欠かせない機能です。以下にマルチスレッドを実現したプログラムを紹介します。
2秒間隔でジグザグに進み、床面の明るさに応じて鳴らす音を変えるプログラムです。
1: import josx.platform.rcx.*; 2: 3: /**
4: * ThreadSample.java
5: *
6: * 2秒間隔でジグザグに進み明るさにより音を鳴らす
7: *
8: */ 9: 10: public class ThreadSample { 11: public static void main(String[] args) { 12: 13: //光センサーで値を取得し音を鳴らすスレッド 14: BeepThread beepThread = new BeepThread(); ←(1) 15: beepThread.start(); ←(2) 16: 17: //モーター制御 18: while(true) { ←(3) 19: //左に進む 20: Motor.A.stop(); 21: Motor.C.forward(); 22: try { 23: Thread.sleep(2000); 24: } catch(InterruptedException e) { 25: } 26: //右に進む 27: Motor.A.forward(); 28: Motor.C.stop(); 29: try { 30: Thread.sleep(2000); 31: } catch(InterruptedException e) { 32: } 33: } 34: 35: } 36: }
- 14行目:
- 15行目:
- 18~33行目:
start()
でスレッドを開始します。光センサーで値を取得し音を鳴らすスレッドです。
37: 38: //光センサーで値を取得し音を鳴らすスレッド 39: class BeepThread extends Thread { 40: public void run() { 41: 42: //光センサーで,Percent値を取得するように設定する。 43: Sensor.S2.setTypeAndMode(3, 0x80); ←(4) 44: Sensor.S2.activate(); 45: 46: while(true) { ←(5) 47: //黒と判定したらビープ音 48: if(Sensor.S2.readValue() < 45) { 49: Sound.beep(); 50: //白と判定したらブザー音 51: } else { 52: Sound.buzz(); 53: } 54: try { 55: Thread.sleep(2000); ←(6) 56: } catch(InterruptedException e) { 57: } 58: } 59: 60: } 61: }
- 43~44行目:
- 46~58行目:
- 55行目:
ボタン操作のプログラム
AWTやSwingを使ったGUIでは、ユーザーがボタンを押したりマウスでドラッグしたりといったアクションに応じて処理を記述する、イベント駆動のプログラミングを行いますが、レゴロボットのボタン操作も同様です。以下はボタン操作の簡単なプログラムです。
Viewボタンを押すとディスプレイに”VIEW”と表示するプログラム
1: import josx.platform.rcx.*; 2: 3: /**
4: * ViewPrint.java
5: *
6: * Viewボタンを押すとディスプレイに"VIEW"と表示する
7: *
8: */ 9: 10: public class ViewPrint { 11: public static void main(String[] args) { 12: 13: //ボタンリスナーの処理 14: ButtonListener listener = new ButtonListener() { ←(1) 15: //ボタンを離した場合は何もしない 16: public void buttonReleased(Button button) {} ←(2) 17: 18: //ボタンを押した場合はディスプレイに"VIEW"と表示 19: public void buttonPressed(Button button) { ←(3) 20: if (button.equals(Button.VIEW)) { 21: TextLCD.print("VIEW"); 22: } 23: } 24: }; 25: 26: //Viewボタンのリスナー登録 27: Button.VIEW.addButtonListener(listener); ←(4) 28: 29: while(true) { ←(5) 30: //500ミリ秒スリープさせる 31: try { 32: Thread.sleep(500); 33: } catch(InterruptedException e) { 34: } 35: } 36: 37: } 38: }
- 14行目~24行目:
- 16行目:
- 19~23行目:
- 27行目:
- 29~35行目:
ButtonListener
インターフェイスで定義しているbuttonReleased()
を実装します。ここでは何もしません。ButtonListener
インターフェイスで定義しているbuttonPressed()
を実装します。20行目で押されたボタンをチェックし、Viewボタンの場合は21行目でディスプレイに「VIEW」を表示しています。文字列のディスプレイへの表示は、TextLCD
クラスのprint()
を使用します。addButtonListener()
でViewボタンのリスナーを登録します。 ビジーループとは、ループ中で何の処理も行わず、CPUの使用率を高めてしまうループのことです。このような場合はsleep()
を入れ、使用率を抑えます。