kohacraft Lab
/
kc_shingo2
交差点の信号と、横断歩道の信号を1つのマイコンで再現しました。
main.cpp@1:1943a21b781b, 2018-05-01 (annotated)
- Committer:
- kohacraft
- Date:
- Tue May 01 01:16:45 2018 +0000
- Revision:
- 1:1943a21b781b
- Parent:
- 0:dff00c5f274e
ver2.0 add one signal and kakko sound.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kohacraft | 0:dff00c5f274e | 1 | /* 車両用信号機3つと歩行者用信号機1つを再現するプログラムです */ |
kohacraft | 0:dff00c5f274e | 2 | /* 信号機1と信号機2で交差点の信号を再現し、 */ |
kohacraft | 0:dff00c5f274e | 3 | /* 信号機3と信号機4で横断歩道の信号を再現しています */ |
kohacraft | 0:dff00c5f274e | 4 | /* timingの{}の中を変えることで赤黄青の点灯時間を変更できます */ |
kohacraft | 0:dff00c5f274e | 5 | /* 自由に改編して楽しんでください this program is public domain */ |
kohacraft | 1:1943a21b781b | 6 | /* May.1.2018 kohacraft.com */ |
kohacraft | 0:dff00c5f274e | 7 | #include "mbed.h" |
kohacraft | 0:dff00c5f274e | 8 | #define BLUE 0 |
kohacraft | 0:dff00c5f274e | 9 | #define YELLOW 1 |
kohacraft | 0:dff00c5f274e | 10 | #define RED 2 |
kohacraft | 0:dff00c5f274e | 11 | |
kohacraft | 0:dff00c5f274e | 12 | DigitalOut singo1Led[] = { |
kohacraft | 0:dff00c5f274e | 13 | DigitalOut(dp1), //信号機1 青LED |
kohacraft | 0:dff00c5f274e | 14 | DigitalOut(dp2), //信号機1 黄LED |
kohacraft | 0:dff00c5f274e | 15 | DigitalOut(dp4) //信号機1 赤LED |
kohacraft | 0:dff00c5f274e | 16 | }; |
kohacraft | 0:dff00c5f274e | 17 | |
kohacraft | 0:dff00c5f274e | 18 | DigitalOut singo2Led[] = { |
kohacraft | 0:dff00c5f274e | 19 | DigitalOut(dp9), //信号機2 青LED |
kohacraft | 0:dff00c5f274e | 20 | DigitalOut(dp10), //信号機2 黄LED |
kohacraft | 0:dff00c5f274e | 21 | DigitalOut(dp11) //信号機2 赤LED |
kohacraft | 0:dff00c5f274e | 22 | }; |
kohacraft | 0:dff00c5f274e | 23 | |
kohacraft | 0:dff00c5f274e | 24 | DigitalOut singo3Led[] = { |
kohacraft | 0:dff00c5f274e | 25 | DigitalOut(dp28), //信号機3 青LED |
kohacraft | 0:dff00c5f274e | 26 | DigitalOut(dp26), //信号機3 黄LED |
kohacraft | 0:dff00c5f274e | 27 | DigitalOut(dp25) //信号機3 赤LED |
kohacraft | 0:dff00c5f274e | 28 | }; |
kohacraft | 0:dff00c5f274e | 29 | |
kohacraft | 0:dff00c5f274e | 30 | DigitalOut singo4Led[] = { |
kohacraft | 0:dff00c5f274e | 31 | DigitalOut(dp18), //信号機4(歩行者用) 青LED |
kohacraft | 0:dff00c5f274e | 32 | DigitalOut(dp17), //ダミー(赤と同じdpを指定する) |
kohacraft | 0:dff00c5f274e | 33 | DigitalOut(dp17) //信号機4(歩行者用) 赤LED |
kohacraft | 0:dff00c5f274e | 34 | }; |
kohacraft | 0:dff00c5f274e | 35 | |
kohacraft | 1:1943a21b781b | 36 | DigitalOut singo5Led[] = { |
kohacraft | 1:1943a21b781b | 37 | DigitalOut(dp16), //信号機5 青LED |
kohacraft | 1:1943a21b781b | 38 | DigitalOut(dp15), //信号機5 黄LED |
kohacraft | 1:1943a21b781b | 39 | DigitalOut(dp14) //信号機5 赤LED |
kohacraft | 1:1943a21b781b | 40 | }; |
kohacraft | 1:1943a21b781b | 41 | |
kohacraft | 1:1943a21b781b | 42 | |
kohacraft | 1:1943a21b781b | 43 | DigitalOut sp(dp27); //スピーカー接続 |
kohacraft | 1:1943a21b781b | 44 | |
kohacraft | 0:dff00c5f274e | 45 | /* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/ |
kohacraft | 1:1943a21b781b | 46 | /* 1は1.5秒 */ |
kohacraft | 1:1943a21b781b | 47 | int timing1[] = { 1 , 4 , 2 , 7 }; //信号機1の点灯時間の設定 |
kohacraft | 1:1943a21b781b | 48 | int timing2[] = { 8 , 4 , 2 , 0 }; //信号機2の点灯時間の設定 |
kohacraft | 1:1943a21b781b | 49 | int timing3[] = { 1 , 6 , 2 , 7 }; //信号機3の点灯時間の設定 |
kohacraft | 1:1943a21b781b | 50 | int timing4[] = { 1 , 3 , 2 , 10 }; //信号機4の点灯時間の設定 |
kohacraft | 1:1943a21b781b | 51 | int timing5[] = { 10 , 4 , 2 , 0 }; //信号機5の点灯時間の設定 |
kohacraft | 0:dff00c5f274e | 52 | |
kohacraft | 0:dff00c5f274e | 53 | Ticker timer; //歩行者用信号の点滅のためのタイマー |
kohacraft | 0:dff00c5f274e | 54 | |
kohacraft | 1:1943a21b781b | 55 | int shingo1mode , shingo2mode , shingo3mode , shingo4mode , shingo5mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3) |
kohacraft | 1:1943a21b781b | 56 | int shingo1counter , shingo2counter , shingo3counter , shingo4counter , shingo5counter; //次の色に変わるまでの残り時間 |
kohacraft | 0:dff00c5f274e | 57 | |
kohacraft | 0:dff00c5f274e | 58 | //使用する関数の宣言 |
kohacraft | 0:dff00c5f274e | 59 | void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] ); |
kohacraft | 0:dff00c5f274e | 60 | void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] ); |
kohacraft | 1:1943a21b781b | 61 | void sound(); |
kohacraft | 0:dff00c5f274e | 62 | |
kohacraft | 0:dff00c5f274e | 63 | //割り込みによる信号機4の点滅処理 |
kohacraft | 0:dff00c5f274e | 64 | void flip() { |
kohacraft | 0:dff00c5f274e | 65 | singo4Led[BLUE] = !singo4Led[BLUE]; |
kohacraft | 0:dff00c5f274e | 66 | } |
kohacraft | 0:dff00c5f274e | 67 | |
kohacraft | 0:dff00c5f274e | 68 | int main() { |
kohacraft | 0:dff00c5f274e | 69 | |
kohacraft | 0:dff00c5f274e | 70 | //初期化 |
kohacraft | 1:1943a21b781b | 71 | shingo1mode = 0; shingo2mode = 0; shingo3mode = 0; |
kohacraft | 1:1943a21b781b | 72 | shingo4mode = 0; shingo5mode = 0; |
kohacraft | 0:dff00c5f274e | 73 | shingo1counter = timing1[0]; |
kohacraft | 0:dff00c5f274e | 74 | shingo2counter = timing2[0]; |
kohacraft | 0:dff00c5f274e | 75 | shingo3counter = timing3[0]; |
kohacraft | 0:dff00c5f274e | 76 | shingo4counter = timing4[0]; |
kohacraft | 1:1943a21b781b | 77 | shingo5counter = timing5[0]; |
kohacraft | 0:dff00c5f274e | 78 | singo1Led[BLUE] = 0; singo1Led[YELLOW] = 0; singo1Led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 79 | singo2Led[BLUE] = 0; singo2Led[YELLOW] = 0; singo2Led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 80 | singo3Led[BLUE] = 0; singo3Led[YELLOW] = 0; singo3Led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 81 | singo4Led[BLUE] = 0; singo4Led[RED] = 1; |
kohacraft | 1:1943a21b781b | 82 | singo5Led[BLUE] = 0; singo5Led[YELLOW] = 0; singo5Led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 83 | |
kohacraft | 0:dff00c5f274e | 84 | //無限ループ |
kohacraft | 0:dff00c5f274e | 85 | while(1) { |
kohacraft | 0:dff00c5f274e | 86 | singo( singo1Led , &shingo1mode , &shingo1counter , timing1 ); //信号機1の処理 |
kohacraft | 0:dff00c5f274e | 87 | singo( singo2Led , &shingo2mode , &shingo2counter , timing2 ); //信号機2の処理 |
kohacraft | 0:dff00c5f274e | 88 | singo( singo3Led , &shingo3mode , &shingo3counter , timing3 ); //信号機3の処理 |
kohacraft | 0:dff00c5f274e | 89 | hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 ); //信号機4の処理 |
kohacraft | 1:1943a21b781b | 90 | singo( singo5Led , &shingo5mode , &shingo5counter , timing5 ); //信号機5の処理 |
kohacraft | 1:1943a21b781b | 91 | |
kohacraft | 1:1943a21b781b | 92 | //歩行者用信号が青の時カッコーを鳴らす |
kohacraft | 1:1943a21b781b | 93 | if( shingo4mode == 1 && singo4Led[BLUE]) |
kohacraft | 1:1943a21b781b | 94 | sound(); |
kohacraft | 1:1943a21b781b | 95 | else |
kohacraft | 1:1943a21b781b | 96 | wait(1.5); //それ以外はウェイトで待つ |
kohacraft | 0:dff00c5f274e | 97 | } |
kohacraft | 0:dff00c5f274e | 98 | } |
kohacraft | 0:dff00c5f274e | 99 | |
kohacraft | 0:dff00c5f274e | 100 | //車両用信号の点灯を制御する |
kohacraft | 0:dff00c5f274e | 101 | void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] ) |
kohacraft | 0:dff00c5f274e | 102 | { |
kohacraft | 0:dff00c5f274e | 103 | |
kohacraft | 0:dff00c5f274e | 104 | //カウンターが0以下になったら点灯するLEDを変更する |
kohacraft | 0:dff00c5f274e | 105 | if( *counter <= 0 ){ |
kohacraft | 0:dff00c5f274e | 106 | |
kohacraft | 0:dff00c5f274e | 107 | //modeを一つ増やす 3を超えたら0に戻す |
kohacraft | 0:dff00c5f274e | 108 | *mode = *mode +1 ; |
kohacraft | 0:dff00c5f274e | 109 | if( *mode > 3 ) |
kohacraft | 0:dff00c5f274e | 110 | *mode = 0; |
kohacraft | 1:1943a21b781b | 111 | |
kohacraft | 1:1943a21b781b | 112 | //もし点灯時間が0ならば次のmodeに遷移する |
kohacraft | 1:1943a21b781b | 113 | if( timeing[*mode] == 0 ) |
kohacraft | 1:1943a21b781b | 114 | *mode = *mode +1 ; |
kohacraft | 1:1943a21b781b | 115 | if( *mode > 3 ) |
kohacraft | 1:1943a21b781b | 116 | *mode = 0; |
kohacraft | 0:dff00c5f274e | 117 | |
kohacraft | 0:dff00c5f274e | 118 | //次の色の点灯時間をカウンターにセット |
kohacraft | 0:dff00c5f274e | 119 | *counter = timeing[*mode]; |
kohacraft | 0:dff00c5f274e | 120 | |
kohacraft | 0:dff00c5f274e | 121 | //点灯するLEDを変更する |
kohacraft | 0:dff00c5f274e | 122 | switch( *mode ) { |
kohacraft | 0:dff00c5f274e | 123 | case 0 : //赤を点灯 |
kohacraft | 0:dff00c5f274e | 124 | led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 125 | break; |
kohacraft | 0:dff00c5f274e | 126 | case 1 : //青を点灯 |
kohacraft | 0:dff00c5f274e | 127 | led[BLUE] = 1; led[YELLOW] = 0; led[RED] = 0; |
kohacraft | 0:dff00c5f274e | 128 | break; |
kohacraft | 0:dff00c5f274e | 129 | case 2 : //黄色を点灯 |
kohacraft | 0:dff00c5f274e | 130 | led[BLUE] = 0; led[YELLOW] = 1; led[RED] = 0; |
kohacraft | 0:dff00c5f274e | 131 | break; |
kohacraft | 0:dff00c5f274e | 132 | case 3 : //赤を点灯 |
kohacraft | 0:dff00c5f274e | 133 | led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 134 | break; |
kohacraft | 0:dff00c5f274e | 135 | default : |
kohacraft | 0:dff00c5f274e | 136 | led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 137 | break; |
kohacraft | 0:dff00c5f274e | 138 | } |
kohacraft | 0:dff00c5f274e | 139 | } |
kohacraft | 0:dff00c5f274e | 140 | *counter = *counter -1; |
kohacraft | 0:dff00c5f274e | 141 | |
kohacraft | 0:dff00c5f274e | 142 | } |
kohacraft | 0:dff00c5f274e | 143 | |
kohacraft | 0:dff00c5f274e | 144 | //歩行者用信号の点灯を制御する |
kohacraft | 0:dff00c5f274e | 145 | void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] ) |
kohacraft | 0:dff00c5f274e | 146 | { |
kohacraft | 0:dff00c5f274e | 147 | //カウンターが0以下になったら点灯するLEDを変更する |
kohacraft | 0:dff00c5f274e | 148 | if( *counter <= 0 ){ |
kohacraft | 0:dff00c5f274e | 149 | |
kohacraft | 0:dff00c5f274e | 150 | //modeを一つ増やす 3を超えたら0に戻す |
kohacraft | 0:dff00c5f274e | 151 | *mode = *mode +1 ; |
kohacraft | 0:dff00c5f274e | 152 | if( *mode > 3 ) |
kohacraft | 0:dff00c5f274e | 153 | *mode = 0; |
kohacraft | 0:dff00c5f274e | 154 | |
kohacraft | 1:1943a21b781b | 155 | //もし点灯時間が0ならば次のmodeに遷移する |
kohacraft | 1:1943a21b781b | 156 | if( timeing[*mode] == 0 ) |
kohacraft | 1:1943a21b781b | 157 | *mode = *mode +1 ; |
kohacraft | 1:1943a21b781b | 158 | if( *mode > 3 ) |
kohacraft | 1:1943a21b781b | 159 | *mode = 0; |
kohacraft | 1:1943a21b781b | 160 | |
kohacraft | 0:dff00c5f274e | 161 | //次の色の点灯時間をカウンターにセット |
kohacraft | 0:dff00c5f274e | 162 | *counter = timeing[*mode]; |
kohacraft | 0:dff00c5f274e | 163 | |
kohacraft | 0:dff00c5f274e | 164 | //点灯するLEDを変更する |
kohacraft | 0:dff00c5f274e | 165 | switch( *mode ) { |
kohacraft | 0:dff00c5f274e | 166 | case 0 : //赤を点灯 |
kohacraft | 0:dff00c5f274e | 167 | led[BLUE] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 168 | break; |
kohacraft | 0:dff00c5f274e | 169 | case 1 : //青を点灯 |
kohacraft | 0:dff00c5f274e | 170 | led[BLUE] = 1; led[RED] = 0; |
kohacraft | 0:dff00c5f274e | 171 | break; |
kohacraft | 0:dff00c5f274e | 172 | case 2 : //青を点滅 |
kohacraft | 0:dff00c5f274e | 173 | led[BLUE] = 1; led[RED] = 0; |
kohacraft | 0:dff00c5f274e | 174 | timer.attach(&flip, 0.25); //点滅用タイマー割り込み開始 |
kohacraft | 0:dff00c5f274e | 175 | break; |
kohacraft | 0:dff00c5f274e | 176 | case 3 : //赤を点灯 |
kohacraft | 0:dff00c5f274e | 177 | timer.detach(); //点滅用タイマー割り込み停止 |
kohacraft | 0:dff00c5f274e | 178 | led[BLUE] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 179 | break; |
kohacraft | 0:dff00c5f274e | 180 | default : |
kohacraft | 0:dff00c5f274e | 181 | led[BLUE] = 0; led[RED] = 1; |
kohacraft | 0:dff00c5f274e | 182 | break; |
kohacraft | 0:dff00c5f274e | 183 | } |
kohacraft | 0:dff00c5f274e | 184 | } |
kohacraft | 0:dff00c5f274e | 185 | *counter = *counter -1; |
kohacraft | 0:dff00c5f274e | 186 | |
kohacraft | 0:dff00c5f274e | 187 | } |
kohacraft | 1:1943a21b781b | 188 | |
kohacraft | 1:1943a21b781b | 189 | //カッコーの音 |
kohacraft | 1:1943a21b781b | 190 | void sound() |
kohacraft | 1:1943a21b781b | 191 | { |
kohacraft | 1:1943a21b781b | 192 | //ミの音を鳴らす |
kohacraft | 1:1943a21b781b | 193 | for( int i=0 ; i<300 ; i++ ) |
kohacraft | 1:1943a21b781b | 194 | { |
kohacraft | 1:1943a21b781b | 195 | sp = 1; //スピーカーをON OFF させて音を作る |
kohacraft | 1:1943a21b781b | 196 | wait(1.0/880.00/4); //1オクターブ上のミ 880*2Hz |
kohacraft | 1:1943a21b781b | 197 | sp = 0; |
kohacraft | 1:1943a21b781b | 198 | wait(1.0/880.00/4); |
kohacraft | 1:1943a21b781b | 199 | |
kohacraft | 1:1943a21b781b | 200 | } |
kohacraft | 1:1943a21b781b | 201 | sp = 1; //スピーカーをオフする |
kohacraft | 1:1943a21b781b | 202 | wait(0.2); |
kohacraft | 1:1943a21b781b | 203 | |
kohacraft | 1:1943a21b781b | 204 | //ドの音を鳴らす |
kohacraft | 1:1943a21b781b | 205 | for( int i=0 ; i<700 ; i++ ) |
kohacraft | 1:1943a21b781b | 206 | { |
kohacraft | 1:1943a21b781b | 207 | |
kohacraft | 1:1943a21b781b | 208 | sp = 1; |
kohacraft | 1:1943a21b781b | 209 | wait(1.0/698.45/4); //1オクターブ上のド 698.45*2Hz |
kohacraft | 1:1943a21b781b | 210 | sp = 0; |
kohacraft | 1:1943a21b781b | 211 | wait(1.0/698.45/4); |
kohacraft | 1:1943a21b781b | 212 | |
kohacraft | 1:1943a21b781b | 213 | } |
kohacraft | 1:1943a21b781b | 214 | sp = 1; |
kohacraft | 1:1943a21b781b | 215 | wait(0.5); |
kohacraft | 1:1943a21b781b | 216 | } |
kohacraft | 1:1943a21b781b | 217 |