Shuichi Machida's Weblog

« [Sun SPOT でリモコンカーを作ろ... | メイン | [Sun SPOT(24)] SDC... »

http://blogs.sun.com/machida/date/20080521 2008年 5月 21日 水曜日

[Sun SPOT Demo(8)] 反射型フォトセンサー(Photo Reflector)を使ってみる。

ライントレーサを Sun SPOTで作ってみたくなり、その前段階として反射型フォトセンサー(RPR-220)を試してみることにしました。

# 反射型フォトセンサー

反射型フォトセンサーは発光部(赤外線LED)と受光部(フォトトランジスタ)で構成されており、発光部に電流を流してLEDを発光させ、近距離(6mm程度)の物体からの反射光を受光するとトランジスタに電流が流れます。下図のような回路(抵抗値は、今回4mA程度LEDに電流を流すことを想定して、データシートの特性から算出しています)を組むと受信した反射光の量に応じた出力(電圧値)の変化を検出できます。

 

 ライントレーサは白地に引かれた黒いラインをロボットカーでトレースするもので、ラインを逸れたことを検出するために白と黒を判別する必要があります。物体が黒い場合、反射光が少なく電流があまり流れず、R2 部分であまり電圧降下がおこりません。一方、物体が白い場合は反射光が多くなり、多くの電流が流れて R2 での電圧降下が大きくなります。つまり、ざっくり言ってしまえば、「出力電圧が閾値より大きければ黒、小さければ白」というような判別ができます。

。。。

といことで、上図の回路を作成してみました。

 

 # 少し拡大。

 

今回は単純に、白黒の縞模様のボードを用意して、フォトセンサーを横切らせてみることにしました。プログラムでは、白を検出したときに Sun SPOT上のLEDを白く光らせます。

# 簡単なプログラム↓

 package org.sunspotworld;

import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.spot.util.*;
import java.io.IOException;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
 * PhotoReflectorDemoSpot:
 * 反射型フォトセンサーを使って物体の白黒を判別してLED表示する
 * Sun SPOTアプリケーション
 */
public class PhotoReflectorDemoSpot extends MIDlet {
    private PhotoReflector photoReflector;    // 反射型フォトセンサー制御用クラス
    private ITriColorLED[] leds;      // LED
    
    /** アプリケーション起動時にVMによって最初に呼び出されるメソッド */    
    protected void startApp() throws MIDletStateChangeException {
        new BootloaderListener().start();

        // 反射型フォトセンサー制御用クラスのインスタンスを生成
        // ここでは、アナログ入力ポート A0を指定
        try {
            photoReflector = new PhotoReflector(EDemoBoard.A0);
        } catch (IOException ex) {
            System.out.println("Error initializing the PhotoReflector!!" );
            ex.printStackTrace();
            notifyDestroyed();
        }
        
        // LEDを初期化
        leds = EDemoBoard.getInstance().getLEDs();
        initLeds();
        
        while (true) {
            try {
                if (photoReflector.isWhite()) {
                    // 白の場合LEDをOn
                    ledsOn(true);
                } else {
                    // 黒の場合LEDをOff
                    ledsOn(false);                    
                }

            } catch (IOException ex) {
                ex.printStackTrace();
            } catch (Exception ex) {
                ex.printStackTrace();
                notifyDestroyed();
            }
            Utils.sleep(200L);
        }
    }
    
    private void ledsOn(boolean on) {
        for (int i = 0; i < leds.length; i++) {
            leds[i].setOn(on);
        }
    }
    
    /* LEDを青色に初期化する */
    private void initLeds() {
        for (int i = 0; i < leds.length; i++) {
            leds[i].setOff();
            leds[i].setColor(LEDColor.WHITE);
        }
    }
    
    protected void pauseApp() {
    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
    }
}

 

 package org.sunspotworld;

import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.io.IScalarInput;
import com.sun.spot.util.Utils;
import java.io.IOException;

/**
 * PhotoReflector:
 * 反射型フォトセンサー(RPR-220)制御用クラス
 */
public class PhotoReflector {
    private IScalarInput input;    // アナログ入力
    private int threshold;         // 白黒判別の閾値
    
    /**
     * PhotoReflector のインスタンスを生成
     * @param pinId    センサーが使用するアナログ入力ポートのID
     */
    public PhotoReflector(int pinId) throws IOException {
        // アナログ入力ポートにアクセスするための参照を取得
        input = EDemoBoard.getInstance().getScalarInputs()[pinId];
    
        // 閾値を計算。ここでは単純に、電流がほとんど流れない状態(黒)の
        // 80%まで電圧が降下したときに白と判定する
        threshold = (int)(input.getRange() * 0.8);
    }

    /** 白の場合 true */
    public boolean isWhite() throws IOException {
        int value = input.getValue();
        System.out.println("value=" + value);
        return (value < threshold) ? true : false;
    }

    
    /** 黒の場合 true */
    public boolean isBlack() throws IOException {
        return !isWhite();
    }
}

 

プログラムを Sun SPOTにインストールして、実行してみます。。

。。。。

どうやら上手くいったようです ;-)

# 動画↓


次は、この反射型フォトセンサーを2つ使ってサーボカーをライントレーサ化してみようと思います。

投稿されたコメント:

コメント
  • HTML文法 不許可

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.