naoki tanaka / Mbed 2 deprecated ScaleSpeed

Dependencies:   TextLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //*************************************************************************************************
00002 //
00003 //  スケールスピードメータプログラム
00004 //
00005 //  Projyect name   : ScaleSpeed
00006 //  Date            : 2015.04.08
00007 //  Target          : FRDM-KL25Z
00008 //
00009 //  仕様
00010 //  Start swich     : 計測開始ボタン
00011 //  Break switch    : 計測中止ボタン
00012 //  Distance switch : 計測距離設定ボタン
00013 //  Scale switch    : 縮尺切替ボタン
00014 //
00015 //  Start           : LED on green
00016 //  Senser1         : LED on Yelow
00017 //  Senser2         : LED on Blue              
00018 //
00019 //*************************************************************************************************
00020 #include "mbed.h"
00021 #include "TextLCD.h"
00022 #define ON  0
00023 #define OFF 1
00024 Serial pc(USBTX, USBRX);                // USB COMポート設定
00025 TextLCD lcd(A0, A1, A2, A3, A4, A5);    // TextLCD設定
00026 Timer timer;                            // タイマー計測初期化
00027 InterruptIn int1(D12);                  // 割込みピン設定(センサー1)
00028 InterruptIn int2(D11);                  // 割込みピン設定(センサー2)
00029 
00030 /* 三色LEDポート設定 */
00031 DigitalOut greenLed(LED_GREEN); // 緑
00032 DigitalOut redLed(LED_RED);     // 赤
00033 DigitalOut blueLed(LED_BLUE);   // 青
00034 
00035 
00036 /* スイッチポート設定 */
00037 DigitalIn startSW(D2);
00038 DigitalIn breakSW(D3);
00039 DigitalIn distanceSW(D4);
00040 DigitalIn scaleSW(D5);
00041 DigitalIn sence1(D12);
00042 DigitalIn sence2(D11);
00043 
00044 /* グローバル定義 */
00045 bool countFlag;     // 計測中フラッグ
00046 bool endFlag;       // 計測完了フラッグ
00047 bool changeFlag;    // 変化フラッグ
00048 
00049 uint8_t charCounter;    // 割込み文字カウンタ
00050 
00051 //*******************************************************
00052 //  Serial受信割り込みベクタ関数(キーボード割込み)
00053 //*******************************************************
00054 void pcRx(){
00055         char c;
00056         c = pc.getc();
00057         if (c == 0xa0) charCounter = 0;
00058         else{
00059             lcd.locate(charCounter,1);
00060             lcd.putc(c);
00061             charCounter++;
00062             if (charCounter > 10) charCounter = 0;
00063         }
00064 }
00065 
00066 //*******************************************************
00067 // センサー1割込み関数
00068 //*******************************************************
00069 void senser1(){
00070     if (countFlag){
00071         timer.start();
00072         redLed = 0;
00073     }
00074 }
00075 
00076 //*******************************************************
00077 // センサー2割込み関数
00078 //*******************************************************
00079 void senser2(){
00080     if (countFlag){
00081         timer.stop();
00082         redLed = 1;
00083         countFlag = 0;
00084         endFlag = 1;
00085         changeFlag = 1;
00086     }
00087 }
00088 
00089 //*******************************************************
00090 // Distance設定関数
00091 //*******************************************************
00092 uint32_t distanceConfig(int counter){
00093     
00094     /* Print distance */
00095     lcd.locate(2,0);
00096     switch(counter){
00097     case 0:
00098         lcd.printf("10mm");
00099         return 10000;
00100     case 1:
00101         lcd.printf("50mm");
00102         return 50000;
00103     case 2:
00104         lcd.printf("10cm");
00105         return 100000;
00106     case 3:
00107         lcd.printf("50cm");
00108         return 500000;
00109     case 4:
00110         lcd.printf("1.0m");
00111         return 1000000;
00112     case 5:
00113         lcd.printf("5.0m");
00114         return 5000000;
00115     default:
00116         return 0;
00117     }
00118 }
00119 
00120 //*******************************************************
00121 // LCD表示関数
00122 //*******************************************************
00123 uint16_t scaleConfig(int counter){
00124         
00125     /* Print scale */
00126     lcd.locate(11,0);
00127     switch(counter){
00128     case 0:
00129         lcd.printf("1/150");
00130         return 150;
00131     case 1:
00132         lcd.printf("1/120");
00133         return 120;
00134     case 2:
00135         lcd.printf("1/100");
00136         return 100;
00137     case 3:
00138         lcd.printf("1/87 ");
00139         return 87;
00140     case 4:
00141         lcd.printf("1/76 ");
00142         return 76;
00143     case 5:
00144         lcd.printf("1/48 ");
00145         return 48;
00146     case 6:
00147         lcd.printf("1/35 ");
00148         return 35;
00149     case 7:
00150         lcd.printf("1/30 ");
00151         return 30;
00152     case 8:
00153         lcd.printf("1/24 ");
00154         return 24;
00155     case 9:
00156         lcd.printf("1/20 ");
00157         return 20;
00158     case 10:
00159         lcd.printf("1/16 ");
00160         return 16;
00161     case 11:
00162         lcd.printf("1/12 ");
00163         return 12;
00164     case 12:
00165         lcd.printf("1/10 ");
00166         return 10;
00167     case 13:
00168         lcd.printf("1/8  ");
00169         return 8;
00170     case 14:
00171         lcd.printf("1/6  ");
00172         return 6;
00173     case 15:
00174         lcd.printf("1/4  ");
00175         return 4;
00176     case 16:
00177         lcd.printf("1/2  ");
00178         return 2;
00179     case 17:
00180         lcd.printf("1/1  ");
00181         return 1;
00182     default:
00183         return 0;    
00184     }
00185 }
00186 
00187 //*******************************************************
00188 // メイン関数
00189 //*******************************************************
00190 int main() {
00191     bool startFlag = 0;
00192     bool breakFlag = 0;
00193     bool distanceFlag = 0;
00194     bool scaleFlag = 0;
00195         
00196     uint8_t scaleCounter = 0;       // 縮尺設定番号
00197     uint8_t distanceCounter = 0;    // 計測距離設定番号
00198     
00199     uint32_t distance = 0;  // 距離(mm)
00200     uint16_t scale = 0;     // 縮尺比
00201     uint32_t speedSec;      // 秒速値
00202     uint32_t speedScale;    // 縮尺変換秒速値
00203     uint16_t speed;         // 速度データ(km/h)
00204     
00205     redLed = 1;
00206     greenLed = 1;
00207     blueLed = 1;
00208     
00209     /* Print start */
00210     wait(0.5);   
00211     lcd.printf("   FRDM-KL25Z");
00212     wait(0.5);   
00213     pc.printf("Start!\r\n");
00214     charCounter = 0;
00215     wait(1);
00216     
00217     /* Print LCD fixed charactor */
00218     lcd.cls();
00219     lcd.locate(0,0);
00220     lcd.printf("D=");    
00221     lcd.locate(7,0);
00222     lcd.printf("SCL=");
00223     lcd.locate(12,1);
00224     lcd.printf("km/h");
00225     lcd.locate(0,1);
00226     lcd.printf("1:  2:");
00227     changeFlag = 1;
00228     
00229     /* Enable interrupt */
00230     int1.fall(&senser1);
00231     int2.fall(&senser2);
00232     
00233 //*******************************************************
00234 // メインループ
00235 //*******************************************************
00236     while(1) {
00237         
00238         /* Recieve serial  */
00239         pc.attach(pcRx,Serial::RxIrq);
00240         
00241         /* Push start switch */
00242         if(!startSW && !startFlag){
00243             wait_ms(10);            // チャタリング防止
00244             if (!startSW){            
00245                 changeFlag = 1;
00246                 startFlag = 1;
00247                 endFlag = 0;
00248                 breakFlag = 0;
00249                 countFlag = 1;
00250                 timer.reset();
00251             }
00252         }
00253         else if (startFlag) startFlag = 0;
00254         
00255         /* Push break switch */
00256         if(!breakSW && !breakFlag){
00257             wait_ms(10);
00258             if (!breakSW){
00259                 changeFlag = 1;
00260                 breakFlag = 1;
00261                 countFlag = 0;
00262                 timer.stop();
00263                 speed = 0;
00264                 redLed = 1;
00265             }
00266         }
00267         else if (breakSW) breakFlag = 0;
00268         
00269         /* Push scale switch */
00270         if(!scaleSW && !scaleFlag){
00271             wait_ms(10);
00272             if (!scaleSW){
00273                 changeFlag = 1;
00274                 scaleFlag = 1;
00275                 scaleCounter++;
00276                 if (scaleCounter > 17) scaleCounter = 0;
00277             }
00278         }
00279         else if (scaleSW) scaleFlag = 0;
00280         
00281         /* Push distance switch */
00282         if(!distanceSW && !distanceFlag){
00283             wait_ms(10);
00284             if (!distanceSW){
00285                 changeFlag = 1;
00286                 distanceFlag = 1;
00287                 distanceCounter++;
00288                 if (distanceCounter > 5) distanceCounter = 0;
00289             }
00290         }
00291         else if (distanceSW) distanceFlag = 0;
00292         
00293         /* sence1 */
00294         lcd.locate(2,1);
00295         if (sence1) lcd.printf("H");
00296         else lcd.printf("L"); 
00297         
00298         /* sence2 */
00299         lcd.locate(6,1);
00300         if (sence2) lcd.printf("H");
00301         else lcd.printf("L");
00302         
00303         /* Set LED */
00304         if (countFlag) greenLed =0;
00305         else greenLed = 1;
00306         
00307         if (endFlag) blueLed = 0;
00308         else blueLed = 1;
00309         
00310         /* 速度計算と表示 */
00311         if (changeFlag){
00312             changeFlag = 0;
00313             
00314             /* 距離設定 */
00315             distance = distanceConfig(distanceCounter);
00316             
00317             /* 縮尺設定 */
00318             scale = scaleConfig(scaleCounter);
00319             
00320             /* 速度計算 */
00321             speedSec = distance / timer.read_ms();  // 速度(mm/sec) = 距離 / 時間
00322             speedScale = speedSec * scale;          // 縮尺速度 = 秒速 × 縮尺
00323             speed = (speedScale * 36) / 10000;  // 時速km/h = 縮尺速度 × 3600sec(1h) / 1000000
00324     
00325             /* 速度表示 */
00326             lcd.locate(8,1);
00327             if (speed < 10000) lcd.printf("%4d",speed);
00328             else lcd.printf("----");
00329             pc.printf("%d",speed); // For debug
00330         }
00331     }
00332 }
00333 /* End of main */