交差点の信号と、横断歩道の信号を1つのマイコンで再現しました。

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* 車両用信号機3つと歩行者用信号機1つを再現するプログラムです   */
00002 /* 信号機1と信号機2で交差点の信号を再現し、                   */
00003 /* 信号機3と信号機4で横断歩道の信号を再現しています            */
00004 /* timingの{}の中を変えることで赤黄青の点灯時間を変更できます   */
00005 /* 自由に改編して楽しんでください this program is public domain */
00006 /* May.1.2018 kohacraft.com */
00007 #include "mbed.h"
00008 #define BLUE 0
00009 #define YELLOW 1
00010 #define RED 2
00011 
00012 DigitalOut singo1Led[] = {
00013     DigitalOut(dp1),    //信号機1 青LED
00014     DigitalOut(dp2),    //信号機1 黄LED
00015     DigitalOut(dp4)     //信号機1 赤LED
00016 };
00017 
00018 DigitalOut singo2Led[] = {
00019     DigitalOut(dp9),    //信号機2 青LED
00020     DigitalOut(dp10),    //信号機2 黄LED
00021     DigitalOut(dp11)     //信号機2 赤LED
00022 };
00023 
00024 DigitalOut singo3Led[] = {
00025     DigitalOut(dp28),   //信号機3 青LED
00026     DigitalOut(dp26),   //信号機3 黄LED
00027     DigitalOut(dp25)    //信号機3 赤LED
00028 };
00029 
00030 DigitalOut singo4Led[] = {
00031     DigitalOut(dp18),   //信号機4(歩行者用) 青LED
00032     DigitalOut(dp17),   //ダミー(赤と同じdpを指定する)
00033     DigitalOut(dp17)    //信号機4(歩行者用) 赤LED
00034 };
00035 
00036 DigitalOut singo5Led[] = {
00037     DigitalOut(dp16),   //信号機5 青LED
00038     DigitalOut(dp15),   //信号機5 黄LED
00039     DigitalOut(dp14)    //信号機5 赤LED
00040 };
00041 
00042 
00043 DigitalOut sp(dp27);    //スピーカー接続
00044 
00045 /* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/
00046 /* 1は1.5秒 */
00047 int timing1[] = { 1 , 4 , 2 , 7 }; //信号機1の点灯時間の設定
00048 int timing2[] = { 8 , 4 , 2 , 0 }; //信号機2の点灯時間の設定
00049 int timing3[] = { 1 , 6 , 2 , 7 }; //信号機3の点灯時間の設定
00050 int timing4[] = { 1 , 3 , 2 , 10 }; //信号機4の点灯時間の設定
00051 int timing5[] = { 10 , 4 , 2 , 0 }; //信号機5の点灯時間の設定
00052 
00053 Ticker timer;   //歩行者用信号の点滅のためのタイマー
00054 
00055 int shingo1mode , shingo2mode , shingo3mode , shingo4mode , shingo5mode;  //現在の点灯している色(赤:0・青:1・黄:2・赤:3) 
00056 int shingo1counter , shingo2counter , shingo3counter , shingo4counter , shingo5counter;  //次の色に変わるまでの残り時間 
00057 
00058 //使用する関数の宣言
00059 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] );
00060 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] );
00061 void sound();
00062 
00063 //割り込みによる信号機4の点滅処理
00064 void flip() {
00065     singo4Led[BLUE] = !singo4Led[BLUE];
00066 }
00067 
00068 int main() {
00069     
00070     //初期化
00071     shingo1mode = 0;    shingo2mode = 0;    shingo3mode = 0;
00072     shingo4mode = 0;    shingo5mode = 0;
00073     shingo1counter = timing1[0];
00074     shingo2counter = timing2[0];
00075     shingo3counter = timing3[0];
00076     shingo4counter = timing4[0];
00077     shingo5counter = timing5[0];
00078     singo1Led[BLUE] = 0;   singo1Led[YELLOW] = 0;   singo1Led[RED] = 1;
00079     singo2Led[BLUE] = 0;   singo2Led[YELLOW] = 0;   singo2Led[RED] = 1;
00080     singo3Led[BLUE] = 0;   singo3Led[YELLOW] = 0;   singo3Led[RED] = 1;
00081     singo4Led[BLUE] = 0;   singo4Led[RED] = 1;
00082     singo5Led[BLUE] = 0;   singo5Led[YELLOW] = 0;   singo5Led[RED] = 1;
00083 
00084     //無限ループ
00085     while(1) {
00086         singo( singo1Led , &shingo1mode , &shingo1counter , timing1 );    //信号機1の処理
00087         singo( singo2Led , &shingo2mode , &shingo2counter , timing2 );    //信号機2の処理
00088         singo( singo3Led , &shingo3mode , &shingo3counter , timing3 );    //信号機3の処理
00089         hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 );  //信号機4の処理
00090         singo( singo5Led , &shingo5mode , &shingo5counter , timing5 );    //信号機5の処理
00091         
00092         //歩行者用信号が青の時カッコーを鳴らす
00093         if( shingo4mode == 1 && singo4Led[BLUE])
00094             sound();
00095         else
00096             wait(1.5);    //それ以外はウェイトで待つ
00097     }
00098 }
00099 
00100 //車両用信号の点灯を制御する
00101 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] )
00102 {   
00103 
00104     //カウンターが0以下になったら点灯するLEDを変更する
00105     if( *counter <= 0 ){
00106         
00107         //modeを一つ増やす 3を超えたら0に戻す
00108         *mode = *mode +1 ;
00109         if( *mode > 3 )
00110             *mode = 0;
00111 
00112         //もし点灯時間が0ならば次のmodeに遷移する
00113         if( timeing[*mode] == 0 )
00114         *mode = *mode +1 ;
00115         if( *mode > 3 )
00116             *mode = 0;        
00117         
00118         //次の色の点灯時間をカウンターにセット
00119         *counter = timeing[*mode];
00120         
00121         //点灯するLEDを変更する
00122         switch( *mode ) {
00123             case 0 :    //赤を点灯
00124                 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
00125                 break;
00126             case 1 :    //青を点灯
00127                 led[BLUE] = 1; led[YELLOW] = 0; led[RED] = 0;
00128                 break;
00129             case 2 :    //黄色を点灯
00130                 led[BLUE] = 0; led[YELLOW] = 1; led[RED] = 0;
00131                 break;
00132             case 3 :    //赤を点灯
00133                 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
00134                 break;
00135             default : 
00136                 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
00137                 break;
00138         }
00139     }     
00140     *counter = *counter -1;
00141     
00142 }
00143     
00144 //歩行者用信号の点灯を制御する
00145 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] )
00146 {
00147     //カウンターが0以下になったら点灯するLEDを変更する
00148     if( *counter <= 0 ){
00149         
00150         //modeを一つ増やす 3を超えたら0に戻す
00151         *mode = *mode +1 ;
00152         if( *mode > 3 )
00153             *mode = 0;
00154         
00155         //もし点灯時間が0ならば次のmodeに遷移する
00156         if( timeing[*mode] == 0 )
00157         *mode = *mode +1 ;
00158         if( *mode > 3 )
00159             *mode = 0;        
00160         
00161         //次の色の点灯時間をカウンターにセット
00162         *counter = timeing[*mode];
00163         
00164         //点灯するLEDを変更する
00165         switch( *mode ) {
00166             case 0 :    //赤を点灯
00167                 led[BLUE] = 0; led[RED] = 1;
00168                 break;
00169             case 1 :    //青を点灯
00170                 led[BLUE] = 1; led[RED] = 0;
00171                 break;
00172             case 2 :    //青を点滅
00173                 led[BLUE] = 1; led[RED] = 0;
00174                 timer.attach(&flip, 0.25);  //点滅用タイマー割り込み開始
00175                 break;
00176             case 3 :    //赤を点灯
00177                 timer.detach(); //点滅用タイマー割り込み停止
00178                 led[BLUE] = 0; led[RED] = 1;
00179                 break;
00180             default : 
00181                 led[BLUE] = 0; led[RED] = 1;
00182                 break;
00183         }
00184     }     
00185     *counter = *counter -1;
00186      
00187 }
00188 
00189 //カッコーの音
00190 void sound()
00191 {
00192     //ミの音を鳴らす
00193     for( int i=0 ; i<300 ; i++ )
00194     {
00195         sp = 1;   //スピーカーをON OFF させて音を作る
00196         wait(1.0/880.00/4); //1オクターブ上のミ 880*2Hz
00197         sp = 0;
00198         wait(1.0/880.00/4);
00199     
00200     }
00201     sp = 1; //スピーカーをオフする
00202     wait(0.2);
00203     
00204     //ドの音を鳴らす
00205     for( int i=0 ; i<700 ; i++ )
00206     {
00207     
00208         sp = 1;
00209         wait(1.0/698.45/4); //1オクターブ上のド 698.45*2Hz
00210         sp = 0;
00211         wait(1.0/698.45/4);
00212     
00213     }
00214     sp = 1;
00215     wait(0.5);
00216 }
00217