marunomaruno-memo

marunomaruno-memo

11-12 月の IT 特講

2008年10月26日 | IT 特講
11-12 月の IT 特講

11/08(土) 13:00-17:30 Java でロボットを動かしてみよう

11/22(土) 16:00-18:30 データ・モデリング

11/23(日) 10:00-15:45 XML 入門

11/30(日) 10:00-12:30 Eclipse 入門 - Java 編

11/30(日) 13:15-15:45 Eclipse 入門 - Java Web アプリケーション編

12/06(土) 10:00-12:30 Eclipse 入門 - C / C++ 編

12/06(土) 13:15-15:45 Eclipse 入門 - PHP 編

12/27(土) 10:00-15:45 Struts入門

以上

iPhone のソフトウェアを 2.1 に更新

2008年10月26日 | iPhone
iPhone のソフトウェアを 2.1 に更新。けっこう時間がかかった。20分くらい。

バックアップをとっていたからか?
日時がリセット(?)。なんか、9月28日の22:00くらいになっていた。不思議。
というよりも、ファームの入れ替えで日時はリセットされないでほしいな。
まあ、メールや画像データがリセットされていないので、よかった。

LEGO MINDSTORMS NXTグレーブック―プログラムノツヅラ

2008年10月20日 | LEGO
LEGO MINDSTORMS NXTグレーブック―プログラムノツヅラ (単行本)
大庭 慎一郎 (著), 松原 拓也 (著)
http://journal.mycom.co.jp/news/2007/03/01/388.html
単行本: 207ページ
出版社: 毎日コミュニケーションズ (2007/02)
ISBN-10: 4839923019
ISBN-13: 978-4839923013
発売日: 2007/02
商品の寸法: 19.8 x 18.4 x 2.2 cm


Chapter1 NXT SOFTWARE
NXTソフトウェアによるプログラミング
1-1 NXTソフトウェアの基本
1-2 配列や便利な演算をマイブロック化
1-3 教示機能を使おう
1-4 配列・三角関数を使う

Chapter2 MULTIPLE NXT
複数のNXTで遊ぶ
2-1 複数のセットでできること
2-2 音がするほうを向くロボット
2-3 明るいほうに進むロボット
2-4 2つのタッチセンサーで3つの入力
2-5 ロータリーエンコーダーを作る
2-6 Bluetooth通信の基本
2-7 息の合ったダンスを踊るロボット
2-8 じゃんけんで対戦するロボット

Chapter3 UTILITIES
便利ツールを使いこなす
3-1 LEGOブロック用CADソフト「MLCad」
3-2 「LDView」で設計図を画像にする
3-3 「Wav2Rso」でオリジナルの音声ファイルを使う
3-4 「nxtRICedit」でオリジナルの画像ファイルを使う

Chapter4 NBC
NBCによるプログラミング
4-1 NBCとは?
4-2 プログラムの作成方法
4-3 センサーの入力に関する記述の方法
4-4 モーターの出力に関する記述の方法
4-5 ファイル管理に関する記述の方法

Chapter5 RCX
RCX用センサー/モーターを使う
5-1 RCXとは?
5-2 NXT用入出力ポートについて
5-3 変換ケーブルの自作1
5-4 変換ケーブルの自作2
5-5 新旧パーツ対抗玉蹴りマシン
5-6 NXTソフトウェアがRCX用パーツに対応

Chapter6 PC
PCとの通信プログラミング
6-1 プログラミング環境の入手
6-2 ダイレクトコマンドによるコントロール
6-3 インターネット経由でロボットを動かす

Chapter7 TWO-LEGGED
大型二足歩行ロボット
7-1 超大作! ベータレックス
7-2 ベータレックスの組み立て方
7-3 ベータレックスの動作原理
7-4 ベータレックスのプログラム
7-5 ベータレックスの動かし方

APPENDIX
巻末資料
A-1 LEGO MINDSTORMS NXT用オプション
A-2 LEGO MINDSTORMS NXTのプログラミング環境
A-3 ファームウェアのビルド方法

iPhone3G 8M を買う

2008年10月19日 | iPhone
iPhone3G 8M を買う

■ iPhone マニュアルのページ
http://support.apple.com/ja_JP/manuals/#iphone

iPhone ユーザガイド
iPhone_User_Guide_JP.pdf

■ BB Watch編集部ブログ: iPhone 3Gを便利に使う小技
http://bb.watch.impress.co.jp/blog/archives/2008/07/iphone_3g.html

■ 留守番電話のご利用方法
http://mb.softbank.jp/mb/support/3G/voice_mail/01-01.html

■ iPhoneのメモ・写真・音声をMac/Winと同期する「Evernote」
http://netafull.net/iphone-app/026606.html

■ iPhoneのカメラで撮影した写真をパソコンへ転送する
http://rik.skr.jp/archives/2008/08/iphone_24.html

■ iPhone または iPod touch とコンピュータの同期に関する概要
http://support.apple.com/kb/HT1386?viewlocale=ja_JP

■ iPhoneのスクリーンショットの撮り方

これは右上の電源ボタンを押したまま、下の HOME ボタンを押す。
一瞬画面が白くフラッシュして、スクリーンショットが撮れる。
撮った画像は写真の中のカメラロールの中に保存される。



LEGO MINDSTORMS NXT オレンジブック

2008年10月16日 | LEGO
LEGO MINDSTORMS NXT オレンジブック
http://book.mycom.co.jp/book/4-8399-2186-5/4-8399-2186-5.shtml
著者:五十川芳仁
単行本: 128ページ
出版社: 毎日コミュニケーションズ (2006/10)
ISBN-10: 4839921865
ISBN-13: 978-4839921866
発売日: 2006/10
商品の寸法: 20 x 18.2 x 1.4 cm


Chapter 1 Introduction
ロボットことはじめ
1 ロボットってなに?
2 そこでMINDSTORMS NXT !
3 電源付き頭脳・NXT
4 正確に回る・止まる・サーボモーター
5 感じる・4種類のセンサー
6 動力伝達・ギア・プーリー・シャフト
7 結合する・コネクタ・とめる・ブッシュ
8 いろいろな部品
9 動作の設計図・NXTソフトウェア

Chapter 2 Sensor
センサーいろいろ活用法
1 小さな力を感知する
2 前も後ろも感知する
3 切り替えスイッチ
4 回転式スイッチ
5 差し込み式スイッチ
6 フタの開閉を感知する
7 ゆれを感知する
8 拍手の間隔でスピード調節
9 拍手の回数で仕事を分岐
10 モーターで距離測定
11 レバーでスピードをコントロール
12 NXTのボタンをセンサーに
13 伝説の電子楽器を再現

Chapter 3 Motor
モーターぐるぐる活用法
1 かんたんシンプルな車
2 ギアでスピードとパワーを変える
3 ウォームギアでパワーアップ
4 いったりきたりの反復運動
5 完全なる直線反復運動
6 動いて止まって間欠動作
7 自由な方向に回転を伝える
8 ベルトで回転を伝える
9 ベルトで軸の方向を変える
10 ギアの中心はずし技
11 上向きの何かを回す車
12 前向きの何かを回す車
13 前はまっすぐ後ろは曲がる
14 しなやかサスペンション
15 体験!ディファレンシャルギア
16 きちんとステアリングする車
17 四輪駆動で走る
18 強引に腕を回して進む車
19 てけてけ走る車
20 なんちゃって2足歩行
21 NXT牽引4足歩行
22 6本の足で歩行する
23 振動で動く
24 ボールを発射する
25 ロー/ハイ変速機
26 4軸同時同方向回転の技
27 回転方向で別作業

Chapter 4 Motor & Sensor
モーター・センサー・合わせ技
1 テーブルの端で止まる車
2 音に反応する車
3 つかずはなれずの車
4 尺取り虫の動きをまねてみる車
5 ライントレーサー入門編
6 手をたたいてギアチェンジ
7 ウィンチで巻き上げ
8 いらっしゃいませ自動ドア
9 回転センサーで重さ比べ
10 首ふり扇風機
11 明るさで閉じたり開いたり
12 表情を変えるロボット

Point
充電池のススメ
もっといろいろギア
テクニックパーツあれこれ
普通のLEGOブロックとの互換性
部品がはずれないときは?
タイヤ・たいや・Tire
ゼンマイも楽しい!
輪ゴム?
LEGOシリーズのユニバーサルジョイント?
ハードで解決する? ソフトで解決する?
ばね? スプリング?
純正のディファレンシャルギア?

Column
ちょっと勉強! ギア比のはなし
書を捨てよ、街へ出よう
身近なシロモノ
引いて放せば走り出す


Lego Mindstoms NXT - leJOS - (13) Behavior (2)

2008年10月14日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (13) 振舞い(Behavior)と調停者(Arbitrator)


黒線で囲まれたところからロボットが出ずに、その中だけで障害物を避
けながらロボットを動かす」プログラムを前回は、lejos.subsumption
パッケージの API を使わずに作りました。


■lejos.subsumption をつかわない実装

再掲します。

------------------------------------------------------
import l.EscapeListener;
import lejos.navigation.Pilot;
import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.nxt.TouchSensor;

/**
 * まっすぐ走り、障害物にぶつかったら、少しバックして方向を換えて
 * また前に進む。または、黒線をまたいだら150度方向転換するプログラム。
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class Bumper12 {

    private static final int THRESHOLD = 40;    // 黒線を判断するしきい値

    public static void main(String [] args) {

        // ESCAPE ボタンを押すとプログラム停止する
        Button.ESCAPE.addButtonListener(new EscapeListener());    
        
        // トライボットのオブジェクトを生成する
        Pilot trybot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // タッチセンサーオブジェクトをポート1で生成する
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);

        // 光センサーオブジェクトをポート1で生成する
        LightSensor lightSensor = new LightSensor(SensorPort.S2);

        while (true) {
            trybot.forward();         // 直進する

            while (!touchSensor.isPressed() && (lightSensor.readValue() >= THRESHOLD));    // タッチされるか黒線を超えるまで待つ

            LCD.clear();
            LCD.drawString(touchSensor.isPressed() ? "true" : "false", 1, 1);
            LCD.drawInt(lightSensor.readValue(), 1, 2);

            if (touchSensor.isPressed()) {
                // 障害物にぶつかった場合
                trybot.backward();    // 後退する
                Sound.pause(500);
                trybot.rotate(90);    // 回転する

            } else {
                // 黒線を越えた場合
                trybot.stop();        // 停止する
                trybot.rotate(150);   // 回転する
            }
        }
    }
}
------------------------------------------------------


このプログラムは、
まっすぐ走る
障害物にぶつかったら少し後退して方向を換える
黒線をまたいだら、黒線をまたいだら 150 度回転して、進行方向
を逆にする
という 3 つの振舞いの複合になっており、まっすぐ走っている最中に、
障害物にぶつかる、黒線をまたぐ、といったイベントに対して、それぞ
れ、少し後退して方向を換える、150度回転する、といった振舞いを実
装しないといけないからです。

まだ、3つの振舞いだけであれば何とかなっても、ここに、別の振舞い
を入れると、プログラムのコードは飛躍的に難しくなります。


これを、上記の 3 つの振舞いを持ったオブジェクトに分解して、それ
ぞれのオブジェクトを制御する形でメインメソッドを作ると、プログラ
ムはけっこうすっきりした形になります。

このための API が、Behavior インターフェースと Arbitrator クラス
で提供されているのです。

Behavior インターフェースには、それを実装したオブジェクトの振舞
い(実行部)を記述する action メソッドと、実行すべきかどうかを判断
する条件部(takeControl メソッド)を記述します。また、他の振舞いに
制御が移るときに実行する suppress メソッドを記述します。

Arbitrator (調停者)クラスのオブジェクトは、そのコンストラクター
の引数に、Behavior オブジェクトの配列を指定して作ります。
Arbitrator クラスの start メソッドを実行することで、調停を開始し
ます。これは、ロボットの状態から、Behavior.takeControl メソッド
を実行して、ロボットの状態に合致する振舞いオブジェクトを選択し、
そのオブジェクトの action メソッドを実行します。


それでは、上記の3つの振舞いをそれぞれ
DriveForward (直進する)
HitWall (障害物にぶつかったときに後退して90度回転する)
DarkLine (黒線を超えたときに150度回転する)
クラスに記します。なお、これらのクラスは、 bhvr パッケージに入れ
ることにします。


■直進する振舞いを規定するクラス

------------------------------------------------------
package bhvr;

import lejos.navigation.Pilot;
import lejos.subsumption.Behavior;

/**
 * 直進する振舞いを規定するクラス
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class DriveForward implements Behavior {    // (1)

    private Pilot pilot;
    
    public DriveForward(Pilot pilot) {             // (2)
        this.pilot = pilot;
    }

    public boolean takeControl() {                 // (3)
        return true;
    }

    public void suppress() {                       // (4)
        pilot.stop();
    }

    public void action() {                         // (5)
        pilot.forward();
    }
}
------------------------------------------------------


□ public class DriveForward implements Behavior { // (1)

Behavior インターフェースを実装して、振舞いを規定します。


□ Behavior インターフェースのメソッド
---
void action()
ロボットの振舞い(実行するアクション)を記す。

void suppress()
このアクションが終わるときの振舞いを記す。

boolean takeControl()
action() を行うかどうかを判断する。
---


□ public DriveForward(Pilot pilot) { // (2)

Pilot オブジェクトを受け取るコンストラクター。


□ public boolean takeControl() { // (3)

action() を行うかどうかを判断します。ここでは、ひたすら直進する
だけなので、常に true を返します。


□ public void suppress() { // (4)

このアクションが終わるときの振舞いを記します。


□ public void action() { // (5)

ロボットが実行すべきアクションを記します。このオブジェクトはひた
すら直進するだけです。



■障害物にぶつかったときに後退して90度回転する振舞いを規定するクラス

------------------------------------------------------
package bhvr;

import lejos.navigation.Pilot;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.subsumption.Behavior;

/**
 * 障害物にぶつかったときに後退して90度回転する振舞いを規定するクラス
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class HitWall implements Behavior {

    private Pilot pilot;

    public HitWall(Pilot pilot) {
        this.pilot = pilot;
    }

    public boolean takeControl() {
        return SensorPort.S1.readBooleanValue();
    }

    public void suppress() {
        Sound.systemSound(true, 2);
        pilot.stop();
    }

    public void action() {
        pilot.backward();    // 後退する
        Sound.pause(500);
        
        pilot.rotate(90);    // 回転する
    }
}
------------------------------------------------------


□ takeControl メソッド

タッチセンサーを使って、タッチされたかどうかを判断します。タッチ
された場合、true を返し、これによって、action メソッドが動くこと
になります。


□ action メソッド

500ミリ秒後退して、90度回転します。



■ 黒線を超えたときに 150 度回転する振舞いを規定するクラス

------------------------------------------------------
package bhvr;

import lejos.navigation.Pilot;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.subsumption.Behavior;

/**
 * 黒線を超えたときに 150 度回転する振舞いを規定するクラス
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class DarkLine implements Behavior {

    private static final int THRESHOLD = 40;    // 黒線を判断するしきい値

    private Pilot pilot;
    
    private LightSensor lightSensor;

    public DarkLine(Pilot pilot) {
        this.pilot = pilot;
        lightSensor = new LightSensor(SensorPort.S2);
    }

    public boolean takeControl() {
        LCD.drawInt(lightSensor.readValue(), 1, 1);
        return lightSensor.readValue() < THRESHOLD;
    }

    public void suppress() {
        Sound.systemSound(true, 3);
        pilot.stop();
    }

    public void action() {
        pilot.stop();
        pilot.rotate(150);
    }
}
------------------------------------------------------


□ takeControl メソッド

光センサーを使って、黒線を超えたかどうかを判断します。超えた場合、
つまり、光度がしきい値(40)未満の場合は true を返し、これによって、
action メソッドが動くことになります。


□ action メソッド

ロボットを停止して、150 度回転します。



■黒線で書かれた枠の中で、障害物を避けながら走るプログラム

いよいよ、main メソッドを持つクラスです。
上記の3つの振舞いを持つオブジェクトを、Arbitrator クラスに渡して、
これらの振舞いを制御します。

------------------------------------------------------
package bhvr;

import l.EscapeListener;
import lejos.navigation.Pilot;
import lejos.nxt.Button;
import lejos.nxt.Motor;
import lejos.subsumption.Arbitrator;
import lejos.subsumption.Behavior;

/**
 * まっすぐ走る、
 * 障害物にぶつかったら少し後退して方向を換える、
 * 黒線をまたいだら、黒線をまたいだら360度回転して、進行方向を逆にする
 * 
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class Bumper21 {
    public static void main(String[] args) {

        // ESCAPE ボタンを押すとプログラム停止する
        Button.ESCAPE.addButtonListener(new EscapeListener());    

        // トライボットのオブジェクトを生成する
        Pilot trybot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        Behavior[] behaviors = {            // (1)
                new DriveForward(trybot),   // 直進する 
                new HitWall(trybot),        // 障害物にぶつかったときに後退して90度回転する
                new DarkLine(trybot),       // 黒線を超えたときに後退し、150度回転する
        };
        Arbitrator arbitrator = new Arbitrator(behaviors);   // (2)
        arbitrator.start();                                  // (3)
    }
}
------------------------------------------------------



□ Behavior[] behaviors = { // (1)
new DriveForward(trybot), // 直進する
new HitWall(trybot), // 障害物にぶつかったときに後退して90度回転する
new DarkLine(trybot), // 黒線を超えたときに150度回転する
};

振舞いを制御するオブジェクトを Behavior 配列に入れます。


□ Arbitrator arbitrator = new Arbitrator(behaviors); // (2)

Arbitrator は、このコンストラクタの引数で指定された振舞い制御オ
ブジェクトの配列の中から、現在のロボットの状態に合う振舞い制御オ
ブジェクトを選択し、それを実行します。
もし、2つの振舞いがこのロボットの状態に合う場合は、behaviors 配
列の添字の大きい方が優先されます。すなわち、ここでは
DarkLine (黒線を超えたときに150度回転する)
HitWall (障害物にぶつかったときに後退して90度回転する)
DriveForward (直進する)
オブジェクトの順になります。


□ Arbitrator クラスのコンストラクタ
---
Arbitrator(Behavior[] behaviors)
振舞いを制御するオブジェクトの配列を指定して、このインスタン
スを生成する。
---


□ arbitrator.start(); // (3)

指定された振舞いオブジェクトの調停を開始します。


□ Arbitrator クラスのメソッド
---
void start()
振舞いの制御を開始する。
---



以上


JudeファイルからからC++のスケルトン・ソースを生成する

2008年10月09日 | C / C++
JudeApi2Cpp
JudeファイルからからC++のスケルトン・ソースを生成する

http://www.vector.co.jp/soft/other/java/se463798.html

動作OS: 汎用
動作機種: 汎用 
ソフトの種類: フリーソフト
概要:
JudeApi2Cpp は、Jude プロジェクトのファイル (.jude) から 、C++ のCPP ファイル(クラス名.cpp) と ヘッダー・ファイル (クラス名.h) を指定されたディレクトリーの中へ生成します。
あわせて、makefile も作成します。
また、標準のセッターとゲッターを生成させることもできます。

Lego Mindstoms NXT - leJOS - (12) Behavior (1)

2008年10月07日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (12) Behavior と Arbitrator

複雑な動きをロボットにさせるときに、いままでのコーディングだと、
かなり難しくなります。
たとえば、黒線で囲まれたところからロボットが出ずに、その中だけで
障害物を避けながらロボットを動かす、というものです。
この複雑な動きを、単純な動きに分解して、これらを組み合わせること
で実現する API が leJOS にはあります。


■振舞い(Behavior)と調停者(Arbitrator)

lejOS には、ロボットの振舞いを規定する API があります。この
lejos.subsumption パッケージに入っている
Behavior インターフェース
Arbitrator クラス
がそうです。

ロボットに複数の振舞いをさせたいときには、それぞれの振舞いを
Behavior インターフェースを実装したオブジェクトとしてつくり、こ
れらを調停する Arbitrator クラスのオブジェクトに渡すことで、複雑
な振舞いを実現することができます。


■とりあえず、作ってみる

とりあえず、まっすぐ走り、障害物にぶつかったら、少しバックして方
向を換えてまた前に進む、というプログラムを考えます。これだけだと、
ロボットを止める手段がないので、Escape ボタンを押せばトライボッ
トは止まるようにしておきます。これは、前に作った EscapeListener
クラスを使うことにします。

ふつうに、何も考えずに main メソッドだけで作ると、こんな感じにな
ります。

------------------------------------------------------
import l.EscapeListener;
import lejos.navigation.Pilot;
import lejos.nxt.Button;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.nxt.TouchSensor;

/**
 * まっすぐ走り、障害物にぶつかったら、少しバックして方向を換えて
 * また前に進むプログラム
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class Bumper11 {
    public static void main(String [] args) {

        // ESCAPE ボタンを押すとプログラム停止する
        Button.ESCAPE.addButtonListener(new EscapeListener());    
        
        // トライボットのオブジェクトを生成する
        Pilot trybot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // タッチセンサーオブジェクトをポート1で生成する
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);

        while (true) {
            trybot.forward();    // 直進する

            while (!touchSensor.isPressed());    // タッチされるまで待つ
            trybot.backward();    // 後退する
            Sound.pause(500);
            trybot.rotate(90);    // 回転する
        }
    }
}
------------------------------------------------------



このプログラムには、とくに難しいところはないですね。わりと素直な
プログラムだと思います。


■黒い枠線の中からロボットが出ないように改造する

このプログラムに、さらに黒線をまたいだら 150 度回転して、進行方
向を逆にするように改良するとします。
まあ、黒線で囲まれた枠の中から出ないようにするということですね。

単純なつくりだと、かなりコードが厄介になってきたのがわかるでしょ
うか。

------------------------------------------------------
import l.EscapeListener;
import lejos.navigation.Pilot;
import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.nxt.TouchSensor;

/**
 * まっすぐ走り、障害物にぶつかったら、少しバックして方向を換えて
 * また前に進む。または、黒線をまたいだら150度方向転換するプログラム。
 * @author marunomaruno
 * @version 1.0, 2008/09/29
 * @since 1.0
 */
public class Bumper12 {

    private static final int THRESHOLD = 40;    // 黒線を判断するしきい値

    public static void main(String [] args) {

        // ESCAPE ボタンを押すとプログラム停止する
        Button.ESCAPE.addButtonListener(new EscapeListener());    
        
        // トライボットのオブジェクトを生成する
        Pilot trybot = new Pilot(5.6f, 13f, Motor.C, Motor.B);

        // タッチセンサーオブジェクトをポート1で生成する
        TouchSensor touchSensor = new TouchSensor(SensorPort.S1);

        // 光センサーオブジェクトをポート1で生成する
        LightSensor lightSensor = new LightSensor(SensorPort.S2);

        while (true) {
            trybot.forward();         // 直進する

            while (!touchSensor.isPressed() && (lightSensor.readValue() >= THRESHOLD));    // タッチされるか黒線を超えるまで待つ

            LCD.clear();
            LCD.drawString(touchSensor.isPressed() ? "true" : "false", 1, 1);
            LCD.drawInt(lightSensor.readValue(), 1, 2);

            if (touchSensor.isPressed()) {
                // 障害物にぶつかった場合
                trybot.backward();    // 後退する
                Sound.pause(500);
                trybot.rotate(90);    // 回転する

            } else {
                // 黒線を越えた場合
                trybot.stop();        // 停止する
                trybot.rotate(150);   // 回転する
            }
        }
    }
}
------------------------------------------------------


このプログラムは、
まっすぐ走る
障害物にぶつかったら少し後退して方向を換える
黒線をまたいだら、黒線をまたいだら 150 度回転して、進行方向
を逆にする
という 3 つの振舞いの複合になっており、まっすぐ走っている最中に、
障害物にぶつかる、黒線をまたぐ、といったイベントに対して、それぞ
れ、少し後退して方向を換える、150度回転する、といった振舞いを実
装しないといけないからです。

まだ、3 つの振舞いだけであれば何とかなっても、ここに、別の振舞い
を入れると、プログラムのコードは飛躍的に難しくなります。


これを、上記の 3 つの振舞いを持ったオブジェクトに分解して、それ
ぞれのオブジェクトを制御する形でメインメソッドを作ると、プログラ
ムはけっこうすっきりした形になります。

次回は、このための API が、Behavior インターフェースと
Arbitrator クラスをつかって作り直してみましょう。


以上