Shuichi Machida's Weblog

« # [Sun SPOT Demo(1)-... | メイン | [Sun SPOT でリモコンカーを作ろ... »

http://blogs.sun.com/machida/date/20080516 2008年 5月 16日 金曜日

[Sun SPOT Demo(7)] Sound Effects KIT を使って効果音を出してみる。

昨日家に帰った後、無性に効果音を出してみたくなったので、家に転がっていたキットを使って試してみました。

# ELEKIT の8色バトルサウンド。プラモデルやジオラマセットに組み込めば効果抜群(何の?)のようです。。


このキットはジャンパを差し替えることで8種類の効果音を再生可能で、DC2.5~5.0Vの電源とスピーカーを接続して、スイッチを押したときに音が出ます。今回は、Sun SPOTで効果音の再生と再生時間を制御するためにいくつか改造します。改造点は以下の1~3です:

 

改造したサウンド発生回路をSun SPOTに接続します。

  • 電池ボックスの5Vを Sun SPOTのVH、GNDを Sun SPOTのGNDに
  • サウンド発生回路の +5V を Sun SPOTのH0、GNDを Sun SPOTのGNDに
  • スピーカーをサウンド発生回路のスピーカ接続用ソケットに
# 完成図

 

プログラムでは、大電流出力ポート H0 をOn, Of することで、サウンドの発生と再生時間を制御します。また、今回はサウンド発生のトリガーとして Sun SPOTの照度センサーを使用し、周りが暗くなったら効果音を発生させるようにします。

 

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ILightSensor;
import com.sun.spot.sensorboard.peripheral.ILightSensorThresholdListener;
import com.sun.spot.util.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class SoundEffectsDemoSpot extends MIDlet {
    private final int LOW_VALUE = 20;   // 暗い
    private final int HIGH_VALUE = 60; // 明るい
            
    private SoundEffects sounds;
    private ILightSensor lightSensor;
    
    private boolean lastHigh = false;

    /** ここからスタート */
    protected void startApp() throws MIDletStateChangeException {
        new BootloaderListener().start();   // monitor the USB (if connected) and recognize commands from host
        Spot.getInstance().getSleepManager().disableDeepSleep();
        
        sounds = new SoundEffects(EDemoBoard.H0);

        initLightSensor();
    }

    private void initLightSensor() {
        lightSensor = EDemoBoard.getInstance().getLightSensor();
        
        /* 照度センサーの値がある一定の閾値(low, high)を超えたときに
           呼び出されるイベントリスナーを登録 */
        lightSensor.addILightSensorThresholdListener(new ILightSensorThresholdListener() {
            public void thresholdChanged(ILightSensor light, int low, int high) {
                System.out.println("thresholdChanged( low=" + low + ", high=" + high + " )" );
            }
            
            public void thresholdExceeded(ILightSensor light, int val) {
                if (val <= LOW_VALUE) {
                    // 暗くなった
                    System.out.println("It's dark now!: " + val);
                    if (isLastHigh()) {
                        play();
                        setLastHigh(false);
                    }                        
                } else {
                    // 明るくなった
                    System.out.println("It's bright now!: " + val);     
                    setLastHigh(true);
                }
                lightSensor.enableThresholdEvents(true);
            }
        });
        
        // 照度センサーに閾値を設定し、イベント処理を有効にする
        lightSensor.setThresholds(LOW_VALUE, HIGH_VALUE);  // low, high(明るさ)   
        lightSensor.enableThresholdEvents(true);
    }

    
    private boolean isLastHigh() {
        return this.lastHigh;
    }
    
    private void setLastHigh(boolean lastHigh) {
        this.lastHigh = lastHigh;
    }
    
    /** 効果音を生成する */
    private void play() {
        sounds.play();
    }

    
    protected void pauseApp() {
        // This will never be called by the Squawk VM
    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
        // Only called if startApp throws any exception other than MIDletStateChangeException
    }
}

 

package org.sunspotworld;

import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.io.IOutputPin;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.spot.util.Utils;

public class SoundEffects {
    private static final long DEFAULT_DURATION = 5000L;
    private long duration;
    
    private IOutputPin out;
    private ITriColorLED[] leds;
    
    public SoundEffects(int pinId) {
        this(pinId, DEFAULT_DURATION);
    }
    
    public SoundEffects(int pinId, long duration) {
        out = EDemoBoard.getInstance().getOutputPins()[pinId];
        initLeds();
        
        if (duration > 0) {
            this.duration = duration;
        } else {
            this.duration = DEFAULT_DURATION;
        }
    }
    
    /** 効果音を生成する */
    public void play() {
        // 効果音スタート
        updateLeds(true);
        out.setHigh();
        
        Utils.sleep(duration);
        
        // 効果音ストップ
        updateLeds(false);        
        out.setLow();            
    }

    
    private void initLeds() {
        leds = EDemoBoard.getInstance().getLEDs();
        for (int i = 0; i < leds.length; i++) {
            leds[i].setOff();
            leds[i].setColor(LEDColor.BLUE);
        }
    }
    
    private void updateLeds(boolean isOn) {
        for (int i = 0; i < leds.length; i++) {
            leds[i].setOn(isOn);
        }
    }
}

それでは実行してみます。

。。。。

# ♪☆×○★!! 

 

動画はこちらです↓ (注:音が出ます)




投稿されたコメント:

コメント
  • HTML文法 不許可

Valid HTML! Valid CSS!

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