SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaでレゴロボットを動かしてみよう!(AD)

Javaでレゴロボットを動かしてみよう! 3-応用編

マルチスレッドによるレゴロボットの制御

  • X ポスト
  • このエントリーをはてなブックマークに追加

今回はサンプルプログラムをいくつか紹介します。前回までに、モーター制御や光サンサーを使ったプログラムを作りました。他にもいろいろなことができますので、機能を組み合わせて使うとさらに楽しくなると思います。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 皆さん、こんにちは! いよいよ連載の最後となりました。今回はサンプルプログラムをいくつか紹介します。前回までに、モーター制御や光サンサーを使ったプログラムを作りました。他にもいろいろなことができますので、機能を組み合わせて使うとさらに楽しくなると思います。

前回までの連載記事

スレッドを使ったプログラム

 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: }
  1. 14行目
  2. 光センサーで値を取得し音を鳴らす機能をスレッドとし、インスタンスを生成します。
     
  3. 15行目
  4. start()でスレッドを開始します。
     
  5. 18~33行目
  6. モーターの制御を行います。20~21行目で左に進み、23行目でモーターを動かしたまま2000ミリ秒処理を待ちます。27~28行目で右に進み、30行目でモーターを動かしたまま2000ミリ秒処理を待ちます。結果、2秒間隔でジグザグに進みます。

 光センサーで値を取得し音を鳴らすスレッドです。

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:  }
  1. 43~44行目
  2. 光センサーの設定を行います。
     
  3. 46~58行目
  4. 光センサーで取得した値により音を変えます。48~49行目で黒と判定しビープ音、50~51行目で白と判定しブザー音を鳴らします。
     
  5. 55行目
  6. 2000ミリ秒処理を待つことにより、2秒間隔で光センサーによる値取得を行います。
黒の図
黒の図
白の図
白の図

ボタン操作のプログラム

 AWTやSwingを使ったGUIでは、ユーザーがボタンを押したりマウスでドラッグしたりといったアクションに応じて処理を記述する、イベント駆動のプログラミングを行いますが、レゴロボットのボタン操作も同様です。以下はボタン操作の簡単なプログラムです。

 Viewボタンを押すとディスプレイに”VIEW”と表示するプログラム

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: }
  1. 14行目~24行目
  2. ボタンリスナーのインスタンスを生成し、メソッドを実装します。
     
  3. 16行目
  4. ButtonListenerインターフェイスで定義しているbuttonReleased()を実装します。ここでは何もしません。
     
  5. 19~23行目
  6. ButtonListenerインターフェイスで定義しているbuttonPressed()を実装します。20行目で押されたボタンをチェックし、Viewボタンの場合は21行目でディスプレイに「VIEW」を表示しています。文字列のディスプレイへの表示は、TextLCDクラスのprint()を使用します。
     
  7. 27行目
  8. addButtonListener()でViewボタンのリスナーを登録します。
     
  9. 29~35行目
  10. whileループでボタンが押されるのを待ちます。32行目で500ミリ秒処理を待たせることにより、ビジーループを避けています(今回はループ処理を抜ける事は考慮していません)。

 ビジーループとは、ループ中で何の処理も行わず、CPUの使用率を高めてしまうループのことです。このような場合はsleep()を入れ、使用率を抑えます。

次のページ
赤外線通信のプログラム

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaでレゴロボットを動かしてみよう!連載記事一覧

もっと読む

この記事の著者

ちば やちよ(チバ ヤチヨ)

ソフト開発によるジプシー生活を経験後、エンジニア育成に力を注ぐ。組込みの世界にJavaが普及する事を切に願っている。ロッテ・大塚明選手の応援振り付けがまだ半人前の為、日々精進している。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2314 2009/04/02 17:30

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング