kohacraft Lab
/
kc_humikiriSensor2
本物の踏切っぽい音が鳴る踏切のプログラムです
main.cpp@0:1927c2db569e, 2021-06-29 (annotated)
- Committer:
- kohacraft
- Date:
- Tue Jun 29 07:17:08 2021 +0000
- Revision:
- 0:1927c2db569e
ver.1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | } |