naoki tanaka / Mbed 2 deprecated ScaleSpeed

Dependencies:   TextLCD mbed

Committer:
frisk
Date:
Sat Apr 11 01:57:01 2015 +0000
Revision:
0:b3dbca741ae4
Scale speed mater

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frisk 0:b3dbca741ae4 1 //*************************************************************************************************
frisk 0:b3dbca741ae4 2 //
frisk 0:b3dbca741ae4 3 // スケールスピードメータプログラム
frisk 0:b3dbca741ae4 4 //
frisk 0:b3dbca741ae4 5 // Projyect name : ScaleSpeed
frisk 0:b3dbca741ae4 6 // Date : 2015.04.08
frisk 0:b3dbca741ae4 7 // Target : FRDM-KL25Z
frisk 0:b3dbca741ae4 8 //
frisk 0:b3dbca741ae4 9 // 仕様
frisk 0:b3dbca741ae4 10 // Start swich : 計測開始ボタン
frisk 0:b3dbca741ae4 11 // Break switch : 計測中止ボタン
frisk 0:b3dbca741ae4 12 // Distance switch : 計測距離設定ボタン
frisk 0:b3dbca741ae4 13 // Scale switch : 縮尺切替ボタン
frisk 0:b3dbca741ae4 14 //
frisk 0:b3dbca741ae4 15 // Start : LED on green
frisk 0:b3dbca741ae4 16 // Senser1 : LED on Yelow
frisk 0:b3dbca741ae4 17 // Senser2 : LED on Blue
frisk 0:b3dbca741ae4 18 //
frisk 0:b3dbca741ae4 19 //*************************************************************************************************
frisk 0:b3dbca741ae4 20 #include "mbed.h"
frisk 0:b3dbca741ae4 21 #include "TextLCD.h"
frisk 0:b3dbca741ae4 22 #define ON 0
frisk 0:b3dbca741ae4 23 #define OFF 1
frisk 0:b3dbca741ae4 24 Serial pc(USBTX, USBRX); // USB COMポート設定
frisk 0:b3dbca741ae4 25 TextLCD lcd(A0, A1, A2, A3, A4, A5); // TextLCD設定
frisk 0:b3dbca741ae4 26 Timer timer; // タイマー計測初期化
frisk 0:b3dbca741ae4 27 InterruptIn int1(D12); // 割込みピン設定(センサー1)
frisk 0:b3dbca741ae4 28 InterruptIn int2(D11); // 割込みピン設定(センサー2)
frisk 0:b3dbca741ae4 29
frisk 0:b3dbca741ae4 30 /* 三色LEDポート設定 */
frisk 0:b3dbca741ae4 31 DigitalOut greenLed(LED_GREEN); // 緑
frisk 0:b3dbca741ae4 32 DigitalOut redLed(LED_RED); // 赤
frisk 0:b3dbca741ae4 33 DigitalOut blueLed(LED_BLUE); // 青
frisk 0:b3dbca741ae4 34
frisk 0:b3dbca741ae4 35
frisk 0:b3dbca741ae4 36 /* スイッチポート設定 */
frisk 0:b3dbca741ae4 37 DigitalIn startSW(D2);
frisk 0:b3dbca741ae4 38 DigitalIn breakSW(D3);
frisk 0:b3dbca741ae4 39 DigitalIn distanceSW(D4);
frisk 0:b3dbca741ae4 40 DigitalIn scaleSW(D5);
frisk 0:b3dbca741ae4 41 DigitalIn sence1(D12);
frisk 0:b3dbca741ae4 42 DigitalIn sence2(D11);
frisk 0:b3dbca741ae4 43
frisk 0:b3dbca741ae4 44 /* グローバル定義 */
frisk 0:b3dbca741ae4 45 bool countFlag; // 計測中フラッグ
frisk 0:b3dbca741ae4 46 bool endFlag; // 計測完了フラッグ
frisk 0:b3dbca741ae4 47 bool changeFlag; // 変化フラッグ
frisk 0:b3dbca741ae4 48
frisk 0:b3dbca741ae4 49 uint8_t charCounter; // 割込み文字カウンタ
frisk 0:b3dbca741ae4 50
frisk 0:b3dbca741ae4 51 //*******************************************************
frisk 0:b3dbca741ae4 52 // Serial受信割り込みベクタ関数(キーボード割込み)
frisk 0:b3dbca741ae4 53 //*******************************************************
frisk 0:b3dbca741ae4 54 void pcRx(){
frisk 0:b3dbca741ae4 55 char c;
frisk 0:b3dbca741ae4 56 c = pc.getc();
frisk 0:b3dbca741ae4 57 if (c == 0xa0) charCounter = 0;
frisk 0:b3dbca741ae4 58 else{
frisk 0:b3dbca741ae4 59 lcd.locate(charCounter,1);
frisk 0:b3dbca741ae4 60 lcd.putc(c);
frisk 0:b3dbca741ae4 61 charCounter++;
frisk 0:b3dbca741ae4 62 if (charCounter > 10) charCounter = 0;
frisk 0:b3dbca741ae4 63 }
frisk 0:b3dbca741ae4 64 }
frisk 0:b3dbca741ae4 65
frisk 0:b3dbca741ae4 66 //*******************************************************
frisk 0:b3dbca741ae4 67 // センサー1割込み関数
frisk 0:b3dbca741ae4 68 //*******************************************************
frisk 0:b3dbca741ae4 69 void senser1(){
frisk 0:b3dbca741ae4 70 if (countFlag){
frisk 0:b3dbca741ae4 71 timer.start();
frisk 0:b3dbca741ae4 72 redLed = 0;
frisk 0:b3dbca741ae4 73 }
frisk 0:b3dbca741ae4 74 }
frisk 0:b3dbca741ae4 75
frisk 0:b3dbca741ae4 76 //*******************************************************
frisk 0:b3dbca741ae4 77 // センサー2割込み関数
frisk 0:b3dbca741ae4 78 //*******************************************************
frisk 0:b3dbca741ae4 79 void senser2(){
frisk 0:b3dbca741ae4 80 if (countFlag){
frisk 0:b3dbca741ae4 81 timer.stop();
frisk 0:b3dbca741ae4 82 redLed = 1;
frisk 0:b3dbca741ae4 83 countFlag = 0;
frisk 0:b3dbca741ae4 84 endFlag = 1;
frisk 0:b3dbca741ae4 85 changeFlag = 1;
frisk 0:b3dbca741ae4 86 }
frisk 0:b3dbca741ae4 87 }
frisk 0:b3dbca741ae4 88
frisk 0:b3dbca741ae4 89 //*******************************************************
frisk 0:b3dbca741ae4 90 // Distance設定関数
frisk 0:b3dbca741ae4 91 //*******************************************************
frisk 0:b3dbca741ae4 92 uint32_t distanceConfig(int counter){
frisk 0:b3dbca741ae4 93
frisk 0:b3dbca741ae4 94 /* Print distance */
frisk 0:b3dbca741ae4 95 lcd.locate(2,0);
frisk 0:b3dbca741ae4 96 switch(counter){
frisk 0:b3dbca741ae4 97 case 0:
frisk 0:b3dbca741ae4 98 lcd.printf("10mm");
frisk 0:b3dbca741ae4 99 return 10000;
frisk 0:b3dbca741ae4 100 case 1:
frisk 0:b3dbca741ae4 101 lcd.printf("50mm");
frisk 0:b3dbca741ae4 102 return 50000;
frisk 0:b3dbca741ae4 103 case 2:
frisk 0:b3dbca741ae4 104 lcd.printf("10cm");
frisk 0:b3dbca741ae4 105 return 100000;
frisk 0:b3dbca741ae4 106 case 3:
frisk 0:b3dbca741ae4 107 lcd.printf("50cm");
frisk 0:b3dbca741ae4 108 return 500000;
frisk 0:b3dbca741ae4 109 case 4:
frisk 0:b3dbca741ae4 110 lcd.printf("1.0m");
frisk 0:b3dbca741ae4 111 return 1000000;
frisk 0:b3dbca741ae4 112 case 5:
frisk 0:b3dbca741ae4 113 lcd.printf("5.0m");
frisk 0:b3dbca741ae4 114 return 5000000;
frisk 0:b3dbca741ae4 115 default:
frisk 0:b3dbca741ae4 116 return 0;
frisk 0:b3dbca741ae4 117 }
frisk 0:b3dbca741ae4 118 }
frisk 0:b3dbca741ae4 119
frisk 0:b3dbca741ae4 120 //*******************************************************
frisk 0:b3dbca741ae4 121 // LCD表示関数
frisk 0:b3dbca741ae4 122 //*******************************************************
frisk 0:b3dbca741ae4 123 uint16_t scaleConfig(int counter){
frisk 0:b3dbca741ae4 124
frisk 0:b3dbca741ae4 125 /* Print scale */
frisk 0:b3dbca741ae4 126 lcd.locate(11,0);
frisk 0:b3dbca741ae4 127 switch(counter){
frisk 0:b3dbca741ae4 128 case 0:
frisk 0:b3dbca741ae4 129 lcd.printf("1/150");
frisk 0:b3dbca741ae4 130 return 150;
frisk 0:b3dbca741ae4 131 case 1:
frisk 0:b3dbca741ae4 132 lcd.printf("1/120");
frisk 0:b3dbca741ae4 133 return 120;
frisk 0:b3dbca741ae4 134 case 2:
frisk 0:b3dbca741ae4 135 lcd.printf("1/100");
frisk 0:b3dbca741ae4 136 return 100;
frisk 0:b3dbca741ae4 137 case 3:
frisk 0:b3dbca741ae4 138 lcd.printf("1/87 ");
frisk 0:b3dbca741ae4 139 return 87;
frisk 0:b3dbca741ae4 140 case 4:
frisk 0:b3dbca741ae4 141 lcd.printf("1/76 ");
frisk 0:b3dbca741ae4 142 return 76;
frisk 0:b3dbca741ae4 143 case 5:
frisk 0:b3dbca741ae4 144 lcd.printf("1/48 ");
frisk 0:b3dbca741ae4 145 return 48;
frisk 0:b3dbca741ae4 146 case 6:
frisk 0:b3dbca741ae4 147 lcd.printf("1/35 ");
frisk 0:b3dbca741ae4 148 return 35;
frisk 0:b3dbca741ae4 149 case 7:
frisk 0:b3dbca741ae4 150 lcd.printf("1/30 ");
frisk 0:b3dbca741ae4 151 return 30;
frisk 0:b3dbca741ae4 152 case 8:
frisk 0:b3dbca741ae4 153 lcd.printf("1/24 ");
frisk 0:b3dbca741ae4 154 return 24;
frisk 0:b3dbca741ae4 155 case 9:
frisk 0:b3dbca741ae4 156 lcd.printf("1/20 ");
frisk 0:b3dbca741ae4 157 return 20;
frisk 0:b3dbca741ae4 158 case 10:
frisk 0:b3dbca741ae4 159 lcd.printf("1/16 ");
frisk 0:b3dbca741ae4 160 return 16;
frisk 0:b3dbca741ae4 161 case 11:
frisk 0:b3dbca741ae4 162 lcd.printf("1/12 ");
frisk 0:b3dbca741ae4 163 return 12;
frisk 0:b3dbca741ae4 164 case 12:
frisk 0:b3dbca741ae4 165 lcd.printf("1/10 ");
frisk 0:b3dbca741ae4 166 return 10;
frisk 0:b3dbca741ae4 167 case 13:
frisk 0:b3dbca741ae4 168 lcd.printf("1/8 ");
frisk 0:b3dbca741ae4 169 return 8;
frisk 0:b3dbca741ae4 170 case 14:
frisk 0:b3dbca741ae4 171 lcd.printf("1/6 ");
frisk 0:b3dbca741ae4 172 return 6;
frisk 0:b3dbca741ae4 173 case 15:
frisk 0:b3dbca741ae4 174 lcd.printf("1/4 ");
frisk 0:b3dbca741ae4 175 return 4;
frisk 0:b3dbca741ae4 176 case 16:
frisk 0:b3dbca741ae4 177 lcd.printf("1/2 ");
frisk 0:b3dbca741ae4 178 return 2;
frisk 0:b3dbca741ae4 179 case 17:
frisk 0:b3dbca741ae4 180 lcd.printf("1/1 ");
frisk 0:b3dbca741ae4 181 return 1;
frisk 0:b3dbca741ae4 182 default:
frisk 0:b3dbca741ae4 183 return 0;
frisk 0:b3dbca741ae4 184 }
frisk 0:b3dbca741ae4 185 }
frisk 0:b3dbca741ae4 186
frisk 0:b3dbca741ae4 187 //*******************************************************
frisk 0:b3dbca741ae4 188 // メイン関数
frisk 0:b3dbca741ae4 189 //*******************************************************
frisk 0:b3dbca741ae4 190 int main() {
frisk 0:b3dbca741ae4 191 bool startFlag = 0;
frisk 0:b3dbca741ae4 192 bool breakFlag = 0;
frisk 0:b3dbca741ae4 193 bool distanceFlag = 0;
frisk 0:b3dbca741ae4 194 bool scaleFlag = 0;
frisk 0:b3dbca741ae4 195
frisk 0:b3dbca741ae4 196 uint8_t scaleCounter = 0; // 縮尺設定番号
frisk 0:b3dbca741ae4 197 uint8_t distanceCounter = 0; // 計測距離設定番号
frisk 0:b3dbca741ae4 198
frisk 0:b3dbca741ae4 199 uint32_t distance = 0; // 距離(mm)
frisk 0:b3dbca741ae4 200 uint16_t scale = 0; // 縮尺比
frisk 0:b3dbca741ae4 201 uint32_t speedSec; // 秒速値
frisk 0:b3dbca741ae4 202 uint32_t speedScale; // 縮尺変換秒速値
frisk 0:b3dbca741ae4 203 uint16_t speed; // 速度データ(km/h)
frisk 0:b3dbca741ae4 204
frisk 0:b3dbca741ae4 205 redLed = 1;
frisk 0:b3dbca741ae4 206 greenLed = 1;
frisk 0:b3dbca741ae4 207 blueLed = 1;
frisk 0:b3dbca741ae4 208
frisk 0:b3dbca741ae4 209 /* Print start */
frisk 0:b3dbca741ae4 210 wait(0.5);
frisk 0:b3dbca741ae4 211 lcd.printf(" FRDM-KL25Z");
frisk 0:b3dbca741ae4 212 wait(0.5);
frisk 0:b3dbca741ae4 213 pc.printf("Start!\r\n");
frisk 0:b3dbca741ae4 214 charCounter = 0;
frisk 0:b3dbca741ae4 215 wait(1);
frisk 0:b3dbca741ae4 216
frisk 0:b3dbca741ae4 217 /* Print LCD fixed charactor */
frisk 0:b3dbca741ae4 218 lcd.cls();
frisk 0:b3dbca741ae4 219 lcd.locate(0,0);
frisk 0:b3dbca741ae4 220 lcd.printf("D=");
frisk 0:b3dbca741ae4 221 lcd.locate(7,0);
frisk 0:b3dbca741ae4 222 lcd.printf("SCL=");
frisk 0:b3dbca741ae4 223 lcd.locate(12,1);
frisk 0:b3dbca741ae4 224 lcd.printf("km/h");
frisk 0:b3dbca741ae4 225 lcd.locate(0,1);
frisk 0:b3dbca741ae4 226 lcd.printf("1: 2:");
frisk 0:b3dbca741ae4 227 changeFlag = 1;
frisk 0:b3dbca741ae4 228
frisk 0:b3dbca741ae4 229 /* Enable interrupt */
frisk 0:b3dbca741ae4 230 int1.fall(&senser1);
frisk 0:b3dbca741ae4 231 int2.fall(&senser2);
frisk 0:b3dbca741ae4 232
frisk 0:b3dbca741ae4 233 //*******************************************************
frisk 0:b3dbca741ae4 234 // メインループ
frisk 0:b3dbca741ae4 235 //*******************************************************
frisk 0:b3dbca741ae4 236 while(1) {
frisk 0:b3dbca741ae4 237
frisk 0:b3dbca741ae4 238 /* Recieve serial */
frisk 0:b3dbca741ae4 239 pc.attach(pcRx,Serial::RxIrq);
frisk 0:b3dbca741ae4 240
frisk 0:b3dbca741ae4 241 /* Push start switch */
frisk 0:b3dbca741ae4 242 if(!startSW && !startFlag){
frisk 0:b3dbca741ae4 243 wait_ms(10); // チャタリング防止
frisk 0:b3dbca741ae4 244 if (!startSW){
frisk 0:b3dbca741ae4 245 changeFlag = 1;
frisk 0:b3dbca741ae4 246 startFlag = 1;
frisk 0:b3dbca741ae4 247 endFlag = 0;
frisk 0:b3dbca741ae4 248 breakFlag = 0;
frisk 0:b3dbca741ae4 249 countFlag = 1;
frisk 0:b3dbca741ae4 250 timer.reset();
frisk 0:b3dbca741ae4 251 }
frisk 0:b3dbca741ae4 252 }
frisk 0:b3dbca741ae4 253 else if (startFlag) startFlag = 0;
frisk 0:b3dbca741ae4 254
frisk 0:b3dbca741ae4 255 /* Push break switch */
frisk 0:b3dbca741ae4 256 if(!breakSW && !breakFlag){
frisk 0:b3dbca741ae4 257 wait_ms(10);
frisk 0:b3dbca741ae4 258 if (!breakSW){
frisk 0:b3dbca741ae4 259 changeFlag = 1;
frisk 0:b3dbca741ae4 260 breakFlag = 1;
frisk 0:b3dbca741ae4 261 countFlag = 0;
frisk 0:b3dbca741ae4 262 timer.stop();
frisk 0:b3dbca741ae4 263 speed = 0;
frisk 0:b3dbca741ae4 264 redLed = 1;
frisk 0:b3dbca741ae4 265 }
frisk 0:b3dbca741ae4 266 }
frisk 0:b3dbca741ae4 267 else if (breakSW) breakFlag = 0;
frisk 0:b3dbca741ae4 268
frisk 0:b3dbca741ae4 269 /* Push scale switch */
frisk 0:b3dbca741ae4 270 if(!scaleSW && !scaleFlag){
frisk 0:b3dbca741ae4 271 wait_ms(10);
frisk 0:b3dbca741ae4 272 if (!scaleSW){
frisk 0:b3dbca741ae4 273 changeFlag = 1;
frisk 0:b3dbca741ae4 274 scaleFlag = 1;
frisk 0:b3dbca741ae4 275 scaleCounter++;
frisk 0:b3dbca741ae4 276 if (scaleCounter > 17) scaleCounter = 0;
frisk 0:b3dbca741ae4 277 }
frisk 0:b3dbca741ae4 278 }
frisk 0:b3dbca741ae4 279 else if (scaleSW) scaleFlag = 0;
frisk 0:b3dbca741ae4 280
frisk 0:b3dbca741ae4 281 /* Push distance switch */
frisk 0:b3dbca741ae4 282 if(!distanceSW && !distanceFlag){
frisk 0:b3dbca741ae4 283 wait_ms(10);
frisk 0:b3dbca741ae4 284 if (!distanceSW){
frisk 0:b3dbca741ae4 285 changeFlag = 1;
frisk 0:b3dbca741ae4 286 distanceFlag = 1;
frisk 0:b3dbca741ae4 287 distanceCounter++;
frisk 0:b3dbca741ae4 288 if (distanceCounter > 5) distanceCounter = 0;
frisk 0:b3dbca741ae4 289 }
frisk 0:b3dbca741ae4 290 }
frisk 0:b3dbca741ae4 291 else if (distanceSW) distanceFlag = 0;
frisk 0:b3dbca741ae4 292
frisk 0:b3dbca741ae4 293 /* sence1 */
frisk 0:b3dbca741ae4 294 lcd.locate(2,1);
frisk 0:b3dbca741ae4 295 if (sence1) lcd.printf("H");
frisk 0:b3dbca741ae4 296 else lcd.printf("L");
frisk 0:b3dbca741ae4 297
frisk 0:b3dbca741ae4 298 /* sence2 */
frisk 0:b3dbca741ae4 299 lcd.locate(6,1);
frisk 0:b3dbca741ae4 300 if (sence2) lcd.printf("H");
frisk 0:b3dbca741ae4 301 else lcd.printf("L");
frisk 0:b3dbca741ae4 302
frisk 0:b3dbca741ae4 303 /* Set LED */
frisk 0:b3dbca741ae4 304 if (countFlag) greenLed =0;
frisk 0:b3dbca741ae4 305 else greenLed = 1;
frisk 0:b3dbca741ae4 306
frisk 0:b3dbca741ae4 307 if (endFlag) blueLed = 0;
frisk 0:b3dbca741ae4 308 else blueLed = 1;
frisk 0:b3dbca741ae4 309
frisk 0:b3dbca741ae4 310 /* 速度計算と表示 */
frisk 0:b3dbca741ae4 311 if (changeFlag){
frisk 0:b3dbca741ae4 312 changeFlag = 0;
frisk 0:b3dbca741ae4 313
frisk 0:b3dbca741ae4 314 /* 距離設定 */
frisk 0:b3dbca741ae4 315 distance = distanceConfig(distanceCounter);
frisk 0:b3dbca741ae4 316
frisk 0:b3dbca741ae4 317 /* 縮尺設定 */
frisk 0:b3dbca741ae4 318 scale = scaleConfig(scaleCounter);
frisk 0:b3dbca741ae4 319
frisk 0:b3dbca741ae4 320 /* 速度計算 */
frisk 0:b3dbca741ae4 321 speedSec = distance / timer.read_ms(); // 速度(mm/sec) = 距離 / 時間
frisk 0:b3dbca741ae4 322 speedScale = speedSec * scale; // 縮尺速度 = 秒速 × 縮尺
frisk 0:b3dbca741ae4 323 speed = (speedScale * 36) / 10000; // 時速km/h = 縮尺速度 × 3600sec(1h) / 1000000
frisk 0:b3dbca741ae4 324
frisk 0:b3dbca741ae4 325 /* 速度表示 */
frisk 0:b3dbca741ae4 326 lcd.locate(8,1);
frisk 0:b3dbca741ae4 327 if (speed < 10000) lcd.printf("%4d",speed);
frisk 0:b3dbca741ae4 328 else lcd.printf("----");
frisk 0:b3dbca741ae4 329 pc.printf("%d",speed); // For debug
frisk 0:b3dbca741ae4 330 }
frisk 0:b3dbca741ae4 331 }
frisk 0:b3dbca741ae4 332 }
frisk 0:b3dbca741ae4 333 /* End of main */