本物の踏切っぽい音が鳴る踏切のプログラムです

Dependencies:   mbed

Committer:
kohacraft
Date:
Tue Jun 29 07:17:08 2021 +0000
Revision:
0:1927c2db569e
ver.1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kohacraft 0:1927c2db569e 1 #include "mbed.h"
kohacraft 0:1927c2db569e 2
kohacraft 0:1927c2db569e 3 /* 踏切を再現するプログラム */
kohacraft 0:1927c2db569e 4 /* 作り方 */
kohacraft 0:1927c2db569e 5 /* https://kohacraft.com/archives/202106291603.html */
kohacraft 0:1927c2db569e 6 /* https://kohacraft.com/archives/202106150823.html */
kohacraft 0:1927c2db569e 7 /* https://kohacraft.com/archives/1035056914.html */
kohacraft 0:1927c2db569e 8
kohacraft 0:1927c2db569e 9 PwmOut sp(dp1); //スピーカーをつなぐピンをPWM出力に設定
kohacraft 0:1927c2db569e 10 DigitalIn sw(dp2); //スイッチをつなぐピンを入力に設定
kohacraft 0:1927c2db569e 11 DigitalOut led1(dp14); //LED1をつなぐピンを出力に設定
kohacraft 0:1927c2db569e 12 DigitalOut led2(dp18); //LED2をつなぐピンを出力に設定
kohacraft 0:1927c2db569e 13
kohacraft 0:1927c2db569e 14 const int humikiriMax = 5; //スイッチが反応してから踏切が終わるまでの長さ
kohacraft 0:1927c2db569e 15
kohacraft 0:1927c2db569e 16 Ticker sound_ticker; //サウンドのためのタイマー割り込み
kohacraft 0:1927c2db569e 17
kohacraft 0:1927c2db569e 18 //カーンカーンの音の発生
kohacraft 0:1927c2db569e 19 void sound() {
kohacraft 0:1927c2db569e 20 static int counter_0 = 0;
kohacraft 0:1927c2db569e 21 static int counter_1 = 0;
kohacraft 0:1927c2db569e 22
kohacraft 0:1927c2db569e 23 static int envelope = 0;
kohacraft 0:1927c2db569e 24
kohacraft 0:1927c2db569e 25 float out = 0;
kohacraft 0:1927c2db569e 26 int sin1 = (((counter_0 >> 15) & 1) * 2) - 1;
kohacraft 0:1927c2db569e 27 int sin2 = (((counter_1 >> 15) & 1) * 2) - 1;
kohacraft 0:1927c2db569e 28 out = sin1 * ((float)(sin2 + 1) / 2) * ((float)((~envelope >> 16) & 0xff) / 255); //波形を生成
kohacraft 0:1927c2db569e 29 sp.write((out * 0.5) + 0.5);
kohacraft 0:1927c2db569e 30
kohacraft 0:1927c2db569e 31 counter_0 += 700 * 256 * 256 / 10000; //700Hzの音を発生
kohacraft 0:1927c2db569e 32 counter_1 += 750 * 256 * 256 / 10000; //750Hzの音を発生
kohacraft 0:1927c2db569e 33
kohacraft 0:1927c2db569e 34 envelope += 130 / 60 * 256 * 256 * 256 / 10000; //60秒間に130回音を鳴らす
kohacraft 0:1927c2db569e 35 }
kohacraft 0:1927c2db569e 36
kohacraft 0:1927c2db569e 37 int main() {
kohacraft 0:1927c2db569e 38 sp.period_us(10); //スピーカーのPWMを100KHzに設定
kohacraft 0:1927c2db569e 39
kohacraft 0:1927c2db569e 40 int count = 0; //踏切がなり終わるまでのカウント 0になったら鳴り終わる
kohacraft 0:1927c2db569e 41 while(1) {
kohacraft 0:1927c2db569e 42
kohacraft 0:1927c2db569e 43 //両方のLEDを消す
kohacraft 0:1927c2db569e 44 led1 = 0;
kohacraft 0:1927c2db569e 45 led2 = 0;
kohacraft 0:1927c2db569e 46
kohacraft 0:1927c2db569e 47 //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
kohacraft 0:1927c2db569e 48 if( sw == 0 )
kohacraft 0:1927c2db569e 49 {
kohacraft 0:1927c2db569e 50 count = humikiriMax;
kohacraft 0:1927c2db569e 51 sound_ticker.attach_us(&sound, 100);//100us = 10KHz タイマー割り込み開始
kohacraft 0:1927c2db569e 52 }
kohacraft 0:1927c2db569e 53
kohacraft 0:1927c2db569e 54 //踏切がなり終わるまでのカウントが0以上ならば踏切が鳴る
kohacraft 0:1927c2db569e 55 while(count > 0)
kohacraft 0:1927c2db569e 56 {
kohacraft 0:1927c2db569e 57 //片方のLEDだけを点灯
kohacraft 0:1927c2db569e 58 led1 = 1;
kohacraft 0:1927c2db569e 59 led2 = 0;
kohacraft 0:1927c2db569e 60
kohacraft 0:1927c2db569e 61 for( int i=0 ; i<5 ; i++ ) //5回繰り返す
kohacraft 0:1927c2db569e 62 {
kohacraft 0:1927c2db569e 63 //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
kohacraft 0:1927c2db569e 64 if( sw == 0 )
kohacraft 0:1927c2db569e 65 {
kohacraft 0:1927c2db569e 66 count = humikiriMax;
kohacraft 0:1927c2db569e 67 }
kohacraft 0:1927c2db569e 68 wait(0.1); //0.1秒待つ
kohacraft 0:1927c2db569e 69 }
kohacraft 0:1927c2db569e 70
kohacraft 0:1927c2db569e 71 //もう片方のLEDだけを点灯
kohacraft 0:1927c2db569e 72 led1 = 0;
kohacraft 0:1927c2db569e 73 led2 = 1;
kohacraft 0:1927c2db569e 74
kohacraft 0:1927c2db569e 75 for( int i=0 ; i<5 ; i++ ) //5回繰り返す
kohacraft 0:1927c2db569e 76 {
kohacraft 0:1927c2db569e 77 //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
kohacraft 0:1927c2db569e 78 if( sw == 0 )
kohacraft 0:1927c2db569e 79 {
kohacraft 0:1927c2db569e 80 count = humikiriMax;
kohacraft 0:1927c2db569e 81 }
kohacraft 0:1927c2db569e 82 wait (0.1); //0.1秒待つ
kohacraft 0:1927c2db569e 83 }
kohacraft 0:1927c2db569e 84
kohacraft 0:1927c2db569e 85 count--; //カウンタを1減らす
kohacraft 0:1927c2db569e 86 }
kohacraft 0:1927c2db569e 87 sound_ticker.detach(); //タイマー割り込み終了
kohacraft 0:1927c2db569e 88 sp.write(0); //スピーカーをオフ
kohacraft 0:1927c2db569e 89 }
kohacraft 0:1927c2db569e 90 }