機械工学実験1作業用

Dependencies:   PID QEI USBHost mbed

Committer:
neoqased
Date:
Mon Oct 20 11:15:26 2014 +0000
Revision:
0:d7629adcea6d
Child:
1:36385b59d183
??????1???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neoqased 0:d7629adcea6d 1 //※重要※ 日本語コメントアウトはmbedのBeta-japaneseに登録すると使えるようになる(2014年現在)
neoqased 0:d7629adcea6d 2 //めんどくさいからファイル分割しないよ.熱意がある人はやって頂戴 by小林2014-9-12
neoqased 0:d7629adcea6d 3 #include "mbed.h" //updateのマークが出ていてもupdateしないように.なんか仕様が変わってるっぽいからエラー吐くようになる
neoqased 0:d7629adcea6d 4 #include "QEI.h"
neoqased 0:d7629adcea6d 5 //#include "USBHostMSD.h" //updateのマークが出ていてもupdateしないように.なんか仕様が変わってるっぽいからエラー吐くようになる
neoqased 0:d7629adcea6d 6 #include "PID.h"
neoqased 0:d7629adcea6d 7 #include "setting.h"
neoqased 0:d7629adcea6d 8
neoqased 0:d7629adcea6d 9 //1回転あたりのパルス
neoqased 0:d7629adcea6d 10 #define PULSE_PER_REVOLUTION 200
neoqased 0:d7629adcea6d 11 //PIDのウェイト ミリ秒
neoqased 0:d7629adcea6d 12 #define PID_RATE 10
neoqased 0:d7629adcea6d 13
neoqased 0:d7629adcea6d 14 /**************************入出力ポート設定**************************/
neoqased 0:d7629adcea6d 15 DigitalOut led1(LED1); //mbed上LED出力4つ
neoqased 0:d7629adcea6d 16 DigitalOut led2(LED2);
neoqased 0:d7629adcea6d 17 DigitalOut led3(LED3);
neoqased 0:d7629adcea6d 18 DigitalOut led4(LED4);
neoqased 0:d7629adcea6d 19 DigitalIn dip1(p5); //DIPスイッチの入力4つ
neoqased 0:d7629adcea6d 20 DigitalIn dip2(p6);
neoqased 0:d7629adcea6d 21 DigitalIn dip3(p7);
neoqased 0:d7629adcea6d 22 DigitalIn dip4(p8);
neoqased 0:d7629adcea6d 23 DigitalIn startsw(p9); //スタートスイッチ入力
neoqased 0:d7629adcea6d 24 DigitalOut buzzer(p18); //電子ブザー用デジタル出力
neoqased 0:d7629adcea6d 25 AnalogIn volume(p20); //ポテンショメータ入力(アナログ)
neoqased 0:d7629adcea6d 26 PwmOut pwm(p25); //モータへのPWM出力
neoqased 0:d7629adcea6d 27
neoqased 0:d7629adcea6d 28 Serial pc(USBTX, USBRX); //PCとのシリアル通信設定
neoqased 0:d7629adcea6d 29 QEI encoder(p30, p29, NC, PULSE_PER_REVOLUTION, QEI::X2_ENCODING); //QEIの設定.
neoqased 0:d7629adcea6d 30 Timer timer; //タイマー
neoqased 0:d7629adcea6d 31
neoqased 0:d7629adcea6d 32 typedef struct{ //時間tとその時のrpmを記録するための構造体
neoqased 0:d7629adcea6d 33 float t;
neoqased 0:d7629adcea6d 34 float rpm;
neoqased 0:d7629adcea6d 35 } result;
neoqased 0:d7629adcea6d 36
neoqased 0:d7629adcea6d 37 /**************************プロトタイプ宣言**************************/
neoqased 0:d7629adcea6d 38 int Init();
neoqased 0:d7629adcea6d 39 int DipLed();
neoqased 0:d7629adcea6d 40 int GetDipValue();
neoqased 0:d7629adcea6d 41 int SW();
neoqased 0:d7629adcea6d 42 int Buzzer(int buzvar);
neoqased 0:d7629adcea6d 43 int find_header(FILE *fp, char keyword[]);
neoqased 0:d7629adcea6d 44 void rm_right_space(char str[]);
neoqased 0:d7629adcea6d 45
neoqased 0:d7629adcea6d 46 /**************************main文**************************/
neoqased 0:d7629adcea6d 47 int main() {
neoqased 0:d7629adcea6d 48 //初期化
neoqased 0:d7629adcea6d 49 Buzzer(2);
neoqased 0:d7629adcea6d 50 //USBHostMSD msd("usb");
neoqased 0:d7629adcea6d 51 LocalFileSystem local("local");
neoqased 0:d7629adcea6d 52 Init(); //初期化関数
neoqased 0:d7629adcea6d 53 int flag = 0; //フラグ用変数
neoqased 0:d7629adcea6d 54 //float vol = 0; //ポテンショメータからの入力値を受け取る変数
neoqased 0:d7629adcea6d 55 //float rpm = 0; //rpmを格納するための変数
neoqased 0:d7629adcea6d 56 //float t = 0; //時間計測のための変数
neoqased 0:d7629adcea6d 57 //result exp2[(int)(15*1000/PID_RATE+1)] = {}; //モード2用の構造体
neoqased 0:d7629adcea6d 58 //result exp3[(int)(15*1000/PID_RATE+1)] = {}; //モード3用の構造体
neoqased 0:d7629adcea6d 59 result exp[(int)(15*1000/PID_RATE+1)] = {};
neoqased 0:d7629adcea6d 60 //メインループ
neoqased 0:d7629adcea6d 61 while(1){
neoqased 0:d7629adcea6d 62 Init();
neoqased 0:d7629adcea6d 63 for(int i = 0; i <= 15*1000/PID_RATE; i++){
neoqased 0:d7629adcea6d 64 exp[i].t = 0;
neoqased 0:d7629adcea6d 65 exp[i].rpm = 0;
neoqased 0:d7629adcea6d 66 }
neoqased 0:d7629adcea6d 67 SW(); //スタートスイッチの入力を待つ
neoqased 0:d7629adcea6d 68 flag = GetDipValue(); //DIPスイッチの入力を見る
neoqased 0:d7629adcea6d 69 DipLed(); //DIPスイッチのHLでLEDを光らせる
neoqased 0:d7629adcea6d 70 Buzzer(1); //ブザーを鳴らす.
neoqased 0:d7629adcea6d 71 switch (flag){ //実験モード切り替えのswitch文.ここにcase0~15を書き足せばモードが追加できる.
neoqased 0:d7629adcea6d 72 case 0: //DIPスイッチの入力なしで何もしない
neoqased 0:d7629adcea6d 73 break;
neoqased 0:d7629adcea6d 74 case 1:{ //モード1はポテンショメータからの入力で直接PWMのデューティ比を変更する.約1秒ごとにPCに値を出力する.このモードは時間で終了せず永遠に続く.終了するにはmbedのresetボタンを押す.
neoqased 0:d7629adcea6d 75 //初期化
neoqased 0:d7629adcea6d 76 float vol = 0; //ポテンショメータからの入力値を受け取る変数
neoqased 0:d7629adcea6d 77 float rpm = 0; //rpmを格納するための変数
neoqased 0:d7629adcea6d 78 float t = 0; //時間計測のための変数
neoqased 0:d7629adcea6d 79 int i1 = 0;
neoqased 0:d7629adcea6d 80 encoder.reset();
neoqased 0:d7629adcea6d 81 timer.reset();
neoqased 0:d7629adcea6d 82 timer.start();
neoqased 0:d7629adcea6d 83 //ループ(抜け出せない)
neoqased 0:d7629adcea6d 84 while(1){
neoqased 0:d7629adcea6d 85 vol = 1 - volume;
neoqased 0:d7629adcea6d 86 pwm = vol;
neoqased 0:d7629adcea6d 87 if(i1 >= 20){
neoqased 0:d7629adcea6d 88 t = timer.read();
neoqased 0:d7629adcea6d 89 rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / t * 2; //減速比2
neoqased 0:d7629adcea6d 90 pc.printf("Duty Ratio = %.3f , %6d RPM\n", vol, (int)rpm);
neoqased 0:d7629adcea6d 91 encoder.reset();
neoqased 0:d7629adcea6d 92 i1 = 0;
neoqased 0:d7629adcea6d 93 timer.reset();
neoqased 0:d7629adcea6d 94 }
neoqased 0:d7629adcea6d 95 wait_ms(50);
neoqased 0:d7629adcea6d 96 i1++;
neoqased 0:d7629adcea6d 97 }
neoqased 0:d7629adcea6d 98 break;
neoqased 0:d7629adcea6d 99 }
neoqased 0:d7629adcea6d 100 case 2:{ //モード2はモータの応答を調べる.デューティ比1でモータを回転させ,100msごとの経過時間とRPMをUSBメモリのcsvファイルに出力する.約15秒で終了する.
neoqased 0:d7629adcea6d 101 //result exp2[(int)(15*1000/PID_RATE+1)] = {};
neoqased 0:d7629adcea6d 102 //初期化
neoqased 0:d7629adcea6d 103 exp[0].t = 0;
neoqased 0:d7629adcea6d 104 exp[0].rpm = 0;
neoqased 0:d7629adcea6d 105 encoder.reset();
neoqased 0:d7629adcea6d 106 timer.reset();
neoqased 0:d7629adcea6d 107 timer.start();
neoqased 0:d7629adcea6d 108 pwm = 1; //モータ回転開始!!
neoqased 0:d7629adcea6d 109 //ループ(約15秒で終了)
neoqased 0:d7629adcea6d 110 for(int i = 0; i < 15*1000/PID_RATE; i++){ //10msごとに時間とrpmの取得
neoqased 0:d7629adcea6d 111 wait_ms(PID_RATE);
neoqased 0:d7629adcea6d 112 exp[i+1].t = timer.read();
neoqased 0:d7629adcea6d 113 exp[i+1].rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / (exp[i+1].t - exp[i].t) * 2; //減速比2
neoqased 0:d7629adcea6d 114 encoder.reset();
neoqased 0:d7629adcea6d 115 }
neoqased 0:d7629adcea6d 116 for(int i = 100; i >= 0; i--){ //ゆるやかに減速
neoqased 0:d7629adcea6d 117 pwm = (float)i / 100;
neoqased 0:d7629adcea6d 118 wait_ms(20);
neoqased 0:d7629adcea6d 119 }
neoqased 0:d7629adcea6d 120 pwm = 0; //回転を止める
neoqased 0:d7629adcea6d 121 wait(1);
neoqased 0:d7629adcea6d 122 FILE * fp = fopen("/local/exp2.csv","w");
neoqased 0:d7629adcea6d 123 if(fp == NULL){ //ファイルオープンエラー
neoqased 0:d7629adcea6d 124 Buzzer(-1); //エラーコード-1のブザーを鳴らす
neoqased 0:d7629adcea6d 125 break; //終了
neoqased 0:d7629adcea6d 126 }
neoqased 0:d7629adcea6d 127 fprintf(fp,"Time , RPM\n");
neoqased 0:d7629adcea6d 128 for(int i = 0; i <= 15*1000/PID_RATE; i++){
neoqased 0:d7629adcea6d 129 fprintf(fp,"%f , %f\n", exp[i].t, exp[i].rpm); //ファイルに実験データの書き込み
neoqased 0:d7629adcea6d 130 }
neoqased 0:d7629adcea6d 131 fclose(fp);
neoqased 0:d7629adcea6d 132 Buzzer(4); //終了を知らせる
neoqased 0:d7629adcea6d 133 break;
neoqased 0:d7629adcea6d 134 }
neoqased 0:d7629adcea6d 135 case 3:{ //モード3はモータの応答を調べる.PID制御をかけ,経過時間とRPMをUSBメモリのcsvファイルに出力する.約15秒で終了する.
neoqased 0:d7629adcea6d 136 //result exp3[(int)(15*1000/PID_RATE+1)] = {};
neoqased 0:d7629adcea6d 137 float kp = 0, ki = 0, kd = 0, max_rpm = 0, target_rpm = 0, reduction = 0;
neoqased 0:d7629adcea6d 138 //int pulse[15*1000/PID_RATE+2] = {};
neoqased 0:d7629adcea6d 139 //int j = 0;
neoqased 0:d7629adcea6d 140 //float times = 0;
neoqased 0:d7629adcea6d 141 encoder.reset();
neoqased 0:d7629adcea6d 142 timer.reset();
neoqased 0:d7629adcea6d 143 /*
neoqased 0:d7629adcea6d 144 -----PID制御の係数設定ファイルpid.txtの書き方-----
neoqased 0:d7629adcea6d 145 #kp
neoqased 0:d7629adcea6d 146 1.0
neoqased 0:d7629adcea6d 147
neoqased 0:d7629adcea6d 148 #ki
neoqased 0:d7629adcea6d 149 1.0
neoqased 0:d7629adcea6d 150
neoqased 0:d7629adcea6d 151 #kd
neoqased 0:d7629adcea6d 152 0.0
neoqased 0:d7629adcea6d 153
neoqased 0:d7629adcea6d 154 #max_rpm
neoqased 0:d7629adcea6d 155 10000
neoqased 0:d7629adcea6d 156 エンコーダで読めるモータのrpmの最大値.これを超えないように制御を行う.
neoqased 0:d7629adcea6d 157
neoqased 0:d7629adcea6d 158 #target_rpm
neoqased 0:d7629adcea6d 159 3000
neoqased 0:d7629adcea6d 160 http://denki.nara-edu.ac.jp/~yabu/soft/header.htmlを参考にしました
neoqased 0:d7629adcea6d 161 */
neoqased 0:d7629adcea6d 162
neoqased 0:d7629adcea6d 163 /*FILE *fppid = fopen("/local/pid.txt","r");
neoqased 0:d7629adcea6d 164 if(fppid == NULL){
neoqased 0:d7629adcea6d 165 Buzzer(-2);
neoqased 0:d7629adcea6d 166 break;
neoqased 0:d7629adcea6d 167 }*/
neoqased 0:d7629adcea6d 168 //fscanf(fppid,"%f %f %f %f %f", &kp, &ki, &kd, &max_rpm, &target_rpm);
neoqased 0:d7629adcea6d 169 //fclose(fppid);
neoqased 0:d7629adcea6d 170 //find_header(fppid,"# kp"); //PID制御用の係数の読み込み
neoqased 0:d7629adcea6d 171 //fscanf(fppid,"%f",&kp);
neoqased 0:d7629adcea6d 172 //find_header(fppid,"# ki");
neoqased 0:d7629adcea6d 173 //fscanf(fppid,"%f",&ki);
neoqased 0:d7629adcea6d 174 //find_header(fppid,"# kd");
neoqased 0:d7629adcea6d 175 //fscanf(fppid,"%f",&kd);
neoqased 0:d7629adcea6d 176 //find_header(fppid,"# max_rpm");
neoqased 0:d7629adcea6d 177 //fscanf(fppid,"%f",&max_rpm);
neoqased 0:d7629adcea6d 178 //find_header(fppid,"# target_rpm");
neoqased 0:d7629adcea6d 179 //fscanf(fppid,"%f",&target_rpm);
neoqased 0:d7629adcea6d 180 //fclose(fppid);
neoqased 0:d7629adcea6d 181
neoqased 0:d7629adcea6d 182 kp = KP;
neoqased 0:d7629adcea6d 183 ki = KI;
neoqased 0:d7629adcea6d 184 kd = KD;
neoqased 0:d7629adcea6d 185 max_rpm = MAX_RPM;
neoqased 0:d7629adcea6d 186 target_rpm = TARGET_RPM;
neoqased 0:d7629adcea6d 187
neoqased 0:d7629adcea6d 188 PID pid(kp, ki, kd, PID_RATE); //PIDの設定
neoqased 0:d7629adcea6d 189 pid.setInputLimits(0.0, max_rpm);
neoqased 0:d7629adcea6d 190 pid.setOutputLimits(0.0, 1.0);
neoqased 0:d7629adcea6d 191 pid.setMode(AUTO_MODE);
neoqased 0:d7629adcea6d 192 pid.setSetPoint(target_rpm);
neoqased 0:d7629adcea6d 193
neoqased 0:d7629adcea6d 194 exp[0].t = 0;
neoqased 0:d7629adcea6d 195 exp[0].rpm = 0;
neoqased 0:d7629adcea6d 196 timer.start();
neoqased 0:d7629adcea6d 197 for(int i = 0; i < 15*1000/PID_RATE; i++){ //15秒間実行する
neoqased 0:d7629adcea6d 198 exp[i+1].t = timer.read();
neoqased 0:d7629adcea6d 199 exp[i+1].rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / (exp[i+1].t - exp[i].t) * 2;
neoqased 0:d7629adcea6d 200 pid.setProcessValue(exp[i+1].rpm);
neoqased 0:d7629adcea6d 201 pwm = pid.compute();
neoqased 0:d7629adcea6d 202 encoder.reset();
neoqased 0:d7629adcea6d 203 //pulse[i+1] = encoder.getPulses() / 2.0;
neoqased 0:d7629adcea6d 204 //pid.setProcessValue((float)(pulse[i+1] - pulse[i]) / PULSE_PER_REVOLUTION * 60 / (timer.read() - times) * 2);
neoqased 0:d7629adcea6d 205 //times = timer.read();
neoqased 0:d7629adcea6d 206 //if((i % (int)(100 / PID_RATE) == 0) && (i != 0)){ //100ms毎に時間とrpmを読み込む
neoqased 0:d7629adcea6d 207 //j++;
neoqased 0:d7629adcea6d 208 //exp3[j].t = timer.read();
neoqased 0:d7629adcea6d 209 //exp3[j].rpm = (float)(pulse[i+1] - pulse[i+1-(int)(100/PID_RATE)]) / PULSE_PER_REVOLUTION * 60 / (exp3[j].t - exp3[j-1].t) * 2;
neoqased 0:d7629adcea6d 210 //}
neoqased 0:d7629adcea6d 211 wait_ms(PID_RATE);
neoqased 0:d7629adcea6d 212 }
neoqased 0:d7629adcea6d 213 reduction = pwm.read();
neoqased 0:d7629adcea6d 214 for(int i = 0; i <= 100; i++){
neoqased 0:d7629adcea6d 215 pwm = pwm.read() - reduction / 100;
neoqased 0:d7629adcea6d 216 wait_ms(20);
neoqased 0:d7629adcea6d 217 }
neoqased 0:d7629adcea6d 218 pwm = 0;
neoqased 0:d7629adcea6d 219 wait(1);
neoqased 0:d7629adcea6d 220 FILE *fp = fopen("/local/exp3.csv","w");
neoqased 0:d7629adcea6d 221 if(fp == NULL){ //ファイルオープンエラー
neoqased 0:d7629adcea6d 222 Buzzer(-1); //エラーコード-1のブザーを鳴らす
neoqased 0:d7629adcea6d 223 break; //終了
neoqased 0:d7629adcea6d 224 }
neoqased 0:d7629adcea6d 225 fprintf(fp,"kp = %f ki = %f kd = %f\n",kp, ki, kd);
neoqased 0:d7629adcea6d 226 fprintf(fp,"Time , RPM\n");
neoqased 0:d7629adcea6d 227 for(int i = 0; i <= 15*1000/PID_RATE; i++){
neoqased 0:d7629adcea6d 228 fprintf(fp,"%f , %f\n", exp[i].t, exp[i].rpm); //ファイルに実験データの書き込み
neoqased 0:d7629adcea6d 229 }
neoqased 0:d7629adcea6d 230 fclose(fp);
neoqased 0:d7629adcea6d 231 Buzzer(5); //終了を知らせる
neoqased 0:d7629adcea6d 232 break;
neoqased 0:d7629adcea6d 233 }
neoqased 0:d7629adcea6d 234 default: //0と上記以外でなにもなし
neoqased 0:d7629adcea6d 235 break;
neoqased 0:d7629adcea6d 236 }
neoqased 0:d7629adcea6d 237 }
neoqased 0:d7629adcea6d 238 }
neoqased 0:d7629adcea6d 239
neoqased 0:d7629adcea6d 240 /**************************関数たち**************************/
neoqased 0:d7629adcea6d 241 int Init(){ //初期化関数
neoqased 0:d7629adcea6d 242 pwm = 0;
neoqased 0:d7629adcea6d 243 led1 = 0;
neoqased 0:d7629adcea6d 244 led2 = 0;
neoqased 0:d7629adcea6d 245 led3 = 0;
neoqased 0:d7629adcea6d 246 led4 = 0;
neoqased 0:d7629adcea6d 247 buzzer = 0;
neoqased 0:d7629adcea6d 248 pc.baud(9600);
neoqased 0:d7629adcea6d 249 encoder.reset();
neoqased 0:d7629adcea6d 250 timer.reset();
neoqased 0:d7629adcea6d 251 pwm.period_us(25); //40kHz
neoqased 0:d7629adcea6d 252 DipLed();
neoqased 0:d7629adcea6d 253 return 0;
neoqased 0:d7629adcea6d 254 }
neoqased 0:d7629adcea6d 255
neoqased 0:d7629adcea6d 256 int DipLed(){ //DIPスイッチの状態によってledを光らせる関数
neoqased 0:d7629adcea6d 257 if(dip1 == 1) led1 = 1; else led1 = 0; //DIPスイッチの1がHならLEDを光らせる,Lなら光らせない
neoqased 0:d7629adcea6d 258 if(dip2 == 1) led2 = 1; else led2 = 0;
neoqased 0:d7629adcea6d 259 if(dip3 == 1) led3 = 1; else led3 = 0;
neoqased 0:d7629adcea6d 260 if(dip4 == 1) led4 = 1; else led4 = 0;
neoqased 0:d7629adcea6d 261 return 0;
neoqased 0:d7629adcea6d 262 }
neoqased 0:d7629adcea6d 263
neoqased 0:d7629adcea6d 264 int GetDipValue(){ //DIPスイッチの値を取得し,値を返す関数
neoqased 0:d7629adcea6d 265 int Dip1 = dip1, Dip2 = dip2, Dip3 = dip3, Dip4 = dip4; //DIPスイッチの値を取得
neoqased 0:d7629adcea6d 266 if(Dip1 == 0){
neoqased 0:d7629adcea6d 267 if(Dip2 == 0){
neoqased 0:d7629adcea6d 268 if(Dip3 == 0){
neoqased 0:d7629adcea6d 269 if(Dip4 == 0) return 0; else return 1; //DIPスイッチが0000の場合0を返す.0001なら1
neoqased 0:d7629adcea6d 270 }else{
neoqased 0:d7629adcea6d 271 if(Dip4 == 0) return 2; else return 3;
neoqased 0:d7629adcea6d 272 }
neoqased 0:d7629adcea6d 273 }else{
neoqased 0:d7629adcea6d 274 if(Dip3 == 0){
neoqased 0:d7629adcea6d 275 if(Dip4 == 0) return 4; else return 5;
neoqased 0:d7629adcea6d 276 }else{
neoqased 0:d7629adcea6d 277 if(Dip4 == 0) return 6; else return 7;
neoqased 0:d7629adcea6d 278 }
neoqased 0:d7629adcea6d 279 }
neoqased 0:d7629adcea6d 280 }else{
neoqased 0:d7629adcea6d 281 if(Dip2 == 0){
neoqased 0:d7629adcea6d 282 if(Dip3 == 0){
neoqased 0:d7629adcea6d 283 if(Dip4 == 0) return 8; else return 9;
neoqased 0:d7629adcea6d 284 }else{
neoqased 0:d7629adcea6d 285 if(Dip4 == 0) return 10; else return 11;
neoqased 0:d7629adcea6d 286 }
neoqased 0:d7629adcea6d 287 }else{
neoqased 0:d7629adcea6d 288 if(Dip3 == 0){
neoqased 0:d7629adcea6d 289 if(Dip4 == 0) return 12; else return 13;
neoqased 0:d7629adcea6d 290 }else{
neoqased 0:d7629adcea6d 291 if(Dip4 == 0) return 14; else return 15;
neoqased 0:d7629adcea6d 292 }
neoqased 0:d7629adcea6d 293 }
neoqased 0:d7629adcea6d 294 }
neoqased 0:d7629adcea6d 295 }
neoqased 0:d7629adcea6d 296
neoqased 0:d7629adcea6d 297 int SW(){ //スタートスイッチ用関数,押して離したらスタート
neoqased 0:d7629adcea6d 298 int i = 0, j = 0;
neoqased 0:d7629adcea6d 299 while(i < 3){ //チャタリング除去,15msにわたってスタートスイッチが押されていればbreak
neoqased 0:d7629adcea6d 300 if(startsw == 1) i++;
neoqased 0:d7629adcea6d 301 else i = 0;
neoqased 0:d7629adcea6d 302 DipLed();
neoqased 0:d7629adcea6d 303 wait_ms(5);
neoqased 0:d7629adcea6d 304 }
neoqased 0:d7629adcea6d 305 while(j < 3){ //上に同じ,スタートスイッチが離されたことを検知
neoqased 0:d7629adcea6d 306 if(startsw == 0) j++;
neoqased 0:d7629adcea6d 307 else j = 0;
neoqased 0:d7629adcea6d 308 DipLed();
neoqased 0:d7629adcea6d 309 wait_ms(5);
neoqased 0:d7629adcea6d 310 }
neoqased 0:d7629adcea6d 311 return 0;
neoqased 0:d7629adcea6d 312 }
neoqased 0:d7629adcea6d 313
neoqased 0:d7629adcea6d 314 int Buzzer(int buzvar){ //電子ブザーを鳴らす関数
neoqased 0:d7629adcea6d 315 switch (buzvar){
neoqased 0:d7629adcea6d 316 /**************エラーを知らせるbeep**************/
neoqased 0:d7629adcea6d 317 case -3: //error * - -
neoqased 0:d7629adcea6d 318 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 319 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 320 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 321 break;
neoqased 0:d7629adcea6d 322 case -2: //error * - - -
neoqased 0:d7629adcea6d 323 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 324 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 325 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 326 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 327 break;
neoqased 0:d7629adcea6d 328 case -1: //error * - - - -
neoqased 0:d7629adcea6d 329 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 330 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 331 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 332 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 333 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 334 break;
neoqased 0:d7629adcea6d 335 /**************エラーここまで**************/
neoqased 0:d7629adcea6d 336 case 0: //サウンドなし
neoqased 0:d7629adcea6d 337 buzzer = 0;
neoqased 0:d7629adcea6d 338 break;
neoqased 0:d7629adcea6d 339 /**************状態を知らせるためのbeep**************/
neoqased 0:d7629adcea6d 340 case 1: // *(短)
neoqased 0:d7629adcea6d 341 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:d7629adcea6d 342 break;
neoqased 0:d7629adcea6d 343 case 2: // * *
neoqased 0:d7629adcea6d 344 buzzer = 1; wait(0.1); buzzer = 0; wait(0.05);
neoqased 0:d7629adcea6d 345 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:d7629adcea6d 346 break;
neoqased 0:d7629adcea6d 347 case 3: // -(長)
neoqased 0:d7629adcea6d 348 buzzer = 1; wait(0.3); buzzer = 0;
neoqased 0:d7629adcea6d 349 break;
neoqased 0:d7629adcea6d 350 case 4: // - -
neoqased 0:d7629adcea6d 351 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:d7629adcea6d 352 buzzer = 1; wait(0.3); buzzer = 0;
neoqased 0:d7629adcea6d 353 break;
neoqased 0:d7629adcea6d 354 case 5: // ---
neoqased 0:d7629adcea6d 355 buzzer = 1; wait(0.9); buzzer = 0;
neoqased 0:d7629adcea6d 356 break;
neoqased 0:d7629adcea6d 357 case 6: // * * * * * * * * * *
neoqased 0:d7629adcea6d 358 for(int i = 0; i < 3; i++){
neoqased 0:d7629adcea6d 359 for(int j = 0; j < 3; j++){
neoqased 0:d7629adcea6d 360 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 361 }
neoqased 0:d7629adcea6d 362 wait(0.2);
neoqased 0:d7629adcea6d 363 }
neoqased 0:d7629adcea6d 364 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:d7629adcea6d 365 break;
neoqased 0:d7629adcea6d 366 case 7: // **-* ** -* ** *** **** "finish"
neoqased 0:d7629adcea6d 367 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 368 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 369 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 370 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 371 wait(0.2);
neoqased 0:d7629adcea6d 372 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 373 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 374 wait(0.2);
neoqased 0:d7629adcea6d 375 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 376 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 377 wait(0.2);
neoqased 0:d7629adcea6d 378 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 379 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 380 wait(0.2);
neoqased 0:d7629adcea6d 381 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 382 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 383 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 384 wait(0.2);
neoqased 0:d7629adcea6d 385 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 386 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 387 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 388 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:d7629adcea6d 389 break;
neoqased 0:d7629adcea6d 390 case 8: // *-*** -*- --* "オワリ"
neoqased 0:d7629adcea6d 391 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 392 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 393 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 394 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 395 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 396 wait(0.2);
neoqased 0:d7629adcea6d 397 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 398 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 399 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 400 wait(0.2);
neoqased 0:d7629adcea6d 401 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 402 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:d7629adcea6d 403 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:d7629adcea6d 404 break;
neoqased 0:d7629adcea6d 405 /**************状態を知らせるためのbeepここまで**************/
neoqased 0:d7629adcea6d 406 default: //no sound
neoqased 0:d7629adcea6d 407 buzzer = 0;
neoqased 0:d7629adcea6d 408 break;
neoqased 0:d7629adcea6d 409 }
neoqased 0:d7629adcea6d 410 return 0;
neoqased 0:d7629adcea6d 411 }
neoqased 0:d7629adcea6d 412
neoqased 0:d7629adcea6d 413
neoqased 0:d7629adcea6d 414 int find_header(FILE *fp, char keyword[])
neoqased 0:d7629adcea6d 415 /*
neoqased 0:d7629adcea6d 416 入力 fp ファイルポインタ
neoqased 0:d7629adcea6d 417 keyword キーワード
neoqased 0:d7629adcea6d 418 戻り値 1 : ヘッダを見つけた 0 ヘッダが見つからなかった
neoqased 0:d7629adcea6d 419 */
neoqased 0:d7629adcea6d 420 {
neoqased 0:d7629adcea6d 421 char char_buf[256];
neoqased 0:d7629adcea6d 422 char keyword_buf[256];
neoqased 0:d7629adcea6d 423 char *condition;
neoqased 0:d7629adcea6d 424 int len,i;
neoqased 0:d7629adcea6d 425
neoqased 0:d7629adcea6d 426 strcpy(keyword_buf,keyword);
neoqased 0:d7629adcea6d 427 rm_right_space(keyword_buf); /* 右側の空白を取り除く */
neoqased 0:d7629adcea6d 428
neoqased 0:d7629adcea6d 429 rewind(fp);
neoqased 0:d7629adcea6d 430 for(;;){
neoqased 0:d7629adcea6d 431 condition = fgets(char_buf,BUFSIZ,fp);
neoqased 0:d7629adcea6d 432 if ( condition == NULL ) break;
neoqased 0:d7629adcea6d 433 rm_right_space(char_buf); /* 右側の空白と改行記号を取り除く */
neoqased 0:d7629adcea6d 434 len = strlen(char_buf);
neoqased 0:d7629adcea6d 435 if ( len == 0 ) continue; /* この文はなくてもよい */
neoqased 0:d7629adcea6d 436 for ( i = 0 ; i < len ; i++ ){ /* 左側の空白を取り除く */
neoqased 0:d7629adcea6d 437 if ( char_buf[i] != ' ' ) break;
neoqased 0:d7629adcea6d 438 }
neoqased 0:d7629adcea6d 439 if ( strcmp(&char_buf[i],keyword_buf)==0){
neoqased 0:d7629adcea6d 440 return(1);
neoqased 0:d7629adcea6d 441 break;
neoqased 0:d7629adcea6d 442 }
neoqased 0:d7629adcea6d 443 }
neoqased 0:d7629adcea6d 444 fprintf(stderr,"cannot find header. key word : |%s|\n",keyword);
neoqased 0:d7629adcea6d 445 Buzzer(-3);
neoqased 0:d7629adcea6d 446 return(0);
neoqased 0:d7629adcea6d 447 }
neoqased 0:d7629adcea6d 448
neoqased 0:d7629adcea6d 449 /* 文字列の右側の空白を削除する 改行記号がある場合はそれも除去する */
neoqased 0:d7629adcea6d 450
neoqased 0:d7629adcea6d 451 void rm_right_space(char str[])
neoqased 0:d7629adcea6d 452 {
neoqased 0:d7629adcea6d 453 int i;
neoqased 0:d7629adcea6d 454
neoqased 0:d7629adcea6d 455 i = strlen(str)-1;
neoqased 0:d7629adcea6d 456 if ( str[i] == '\n' ) i--;
neoqased 0:d7629adcea6d 457
neoqased 0:d7629adcea6d 458 while(i>=0){
neoqased 0:d7629adcea6d 459 if ( str[i] != ' ') break;
neoqased 0:d7629adcea6d 460 i--;
neoqased 0:d7629adcea6d 461 }
neoqased 0:d7629adcea6d 462 str[i+1] = '\0';
neoqased 0:d7629adcea6d 463 }