Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 */
Generated on Tue Jul 26 2022 20:27:02 by
1.7.2