2008年 5月 16日 金曜日
[Sun SPOT Demo(7)] Sound Effects KIT を使って効果音を出してみる。
昨日家に帰った後、無性に効果音を出してみたくなったので、家に転がっていたキットを使って試してみました。
# ELEKIT の8色バトルサウンド。プラモデルやジオラマセットに組み込めば効果抜群(何の?)のようです。。
このキットはジャンパを差し替えることで8種類の効果音を再生可能で、DC2.5~5.0Vの電源とスピーカーを接続して、スイッチを押したときに音が出ます。今回は、Sun SPOTで効果音の再生と再生時間を制御するためにいくつか改造します。改造点は以下の1~3です:
改造したサウンド発生回路をSun SPOTに接続します。
プログラムでは、大電流出力ポート 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); } } } |
それでは実行してみます。
。。。。
# ♪☆×○★!!
動画はこちらです↓ (注:音が出ます)
Posted at 12:42午後 5 16, 2008 by Shuichi Machida in SunSPOT | 投稿されたコメント[0]