
踏切の音は、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マイコンで、プラレールがより楽しくなりますね。






コメント