PR 記事には広告が含まれています
スポンサーリンク
Translate

mbedで作ったプラレール用踏切の音をもっとリアルにしてみました

スポンサーリンク

踏切の音は、700Hzと750Hzの2種類の音を組み合わせた音になっているようです。そこで、以前作ったmbedの踏切のサウンドをこの音に置き換えてみました。

以前作った踏切はこちらです。

スポンサーリンク

プログラム

/* 踏切を再現するプログラム */
#include "mbed.h"
PwmOut sp(dp1);     //スピーカーをつなぐピンをPWM出力に設定
DigitalIn sw(dp2);      //スイッチをつなぐピンを入力に設定
DigitalOut led1(dp14);  //LED1をつなぐピンを出力に設定
DigitalOut led2(dp18);  //LED2をつなぐピンを出力に設定

const int humikiriMax = 5;  //スイッチが反応してから踏切が終わるまでの長さ

Ticker sound_ticker;    //サウンドのためのタイマー割り込み

//カーンカーンの音の発生
void sound() {
    static int counter_0 = 0;
    static int counter_1 = 0;
    
    static int envelope = 0;
    
    float out = 0;
    int sin1 = (((counter_0 >> 15) & 1) * 2) - 1;
    int sin2 = (((counter_1 >> 15) & 1) * 2) - 1;
    out = sin1 * ((float)(sin2 + 1) / 2) * ((float)((~envelope >> 16) & 0xff) / 255);   //波形を生成
    sp.write((out * 0.5) + 0.5);
    
    counter_0 += 700 * 256 * 256 / 10000;   //700Hzの音を発生
    counter_1 += 750 * 256 * 256 / 10000;   //750Hzの音を発生
    envelope += 130 / 60 * 256 * 256 * 256 / 10000; //60秒間に130回音を鳴らす
}

int main() {
    sp.period_us(10);   //スピーカーのPWMを100KHzに設定
        
    int count = 0;  //踏切がなり終わるまでのカウント 0になったら鳴り終わる
    while(1) {
        
        //両方のLEDを消す
        led1 = 0;
        led2 = 0;

        //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
        if( sw == 0 )
        {
            count = humikiriMax;
            sound_ticker.attach_us(&sound, 100);//100us = 10KHz タイマー割り込み開始
        }
        
        //踏切がなり終わるまでのカウントが0以上ならば踏切が鳴る
        while(count > 0)
        {
            //片方のLEDだけを点灯
            led1 = 1;
            led2 = 0;

            for( int i=0 ; i<5 ; i++ )  //5回繰り返す
            {        
                //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
                if( sw == 0 )
                {
                    count = humikiriMax;
                }
                wait(0.1);  //0.1秒待つ
            }
            
            //もう片方のLEDだけを点灯
            led1 = 0;
            led2 = 1;

            for( int i=0 ; i<5 ; i++ )  //5回繰り返す
            {   
                //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
                if( sw == 0 )
                {
                    count = humikiriMax;
                }
                wait (0.1); //0.1秒待つ
            }
            
            count--;    //カウンタを1減らす
        }
        sound_ticker.detach();  //タイマー割り込み終了
        sp.write(0);    //スピーカーをオフ
    }
}

700Hzと750Hzのリングオシレータという仕組みでサウンドを発生させています。PWMで音量を徐々に下げることで、「カーン」という音に仕上げています。

プログラムはこちらよりインポートできます。

こちらが、mbedマイコンで生成した踏切の音です。

カーンカーンと、以前よりもより踏切っぽい音になっています。

スポンサーリンク

作り方

作り方は、以前の物と全く同じです。こちらを参考にLPC1114と電子部品とを配線してください。

プログラムは、先どのこれをコンパイルして書き込んでください。

スポンサーリンク

完成!

より、踏切らしい音になりました。mbedマイコンで、プラレールがより楽しくなりますね。