jikken mode1 test

Dependencies:   QEI USBHost mbed

Committer:
neoqased
Date:
Mon Oct 20 11:14:01 2014 +0000
Revision:
0:03192f690bc2
jikken mode1 test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neoqased 0:03192f690bc2 1 #include "mbed.h"
neoqased 0:03192f690bc2 2 #include "QEI.h"
neoqased 0:03192f690bc2 3
neoqased 0:03192f690bc2 4 #define PULSE_PER_REVOLUTION 200
neoqased 0:03192f690bc2 5
neoqased 0:03192f690bc2 6 /**************************入出力ポート設定**************************/
neoqased 0:03192f690bc2 7 DigitalOut led1(LED1); //mbed上LED出力4つ
neoqased 0:03192f690bc2 8 DigitalOut led2(LED2);
neoqased 0:03192f690bc2 9 DigitalOut led3(LED3);
neoqased 0:03192f690bc2 10 DigitalOut led4(LED4);
neoqased 0:03192f690bc2 11 DigitalIn dip1(p5); //DIPスイッチの入力4つ
neoqased 0:03192f690bc2 12 DigitalIn dip2(p6);
neoqased 0:03192f690bc2 13 DigitalIn dip3(p7);
neoqased 0:03192f690bc2 14 DigitalIn dip4(p8);
neoqased 0:03192f690bc2 15 DigitalIn startsw(p9); //スタートスイッチ入力
neoqased 0:03192f690bc2 16 DigitalOut buzzer(p18); //電子ブザー用デジタル出力
neoqased 0:03192f690bc2 17 AnalogIn volume(p20); //ポテンショメータ入力(アナログ)
neoqased 0:03192f690bc2 18 PwmOut pwm(p21); //モータへのPWM出力
neoqased 0:03192f690bc2 19
neoqased 0:03192f690bc2 20 Serial pc(USBTX, USBRX); //PCとのシリアル通信設定
neoqased 0:03192f690bc2 21 QEI encoder(p25, p25, NC, PULSE_PER_REVOLUTION, QEI::X2_ENCODING); //QEIの設定.エンコーダ出力がA相しかないのでどちらもp25
neoqased 0:03192f690bc2 22 Timer timer; //タイマー
neoqased 0:03192f690bc2 23
neoqased 0:03192f690bc2 24 /**************************プロトタイプ宣言**************************/
neoqased 0:03192f690bc2 25 int Init();
neoqased 0:03192f690bc2 26 int DipLed();
neoqased 0:03192f690bc2 27 int GetDipValue();
neoqased 0:03192f690bc2 28 int SW();
neoqased 0:03192f690bc2 29 int Buzzer(int buzvar);
neoqased 0:03192f690bc2 30
neoqased 0:03192f690bc2 31 /**************************main文**************************/
neoqased 0:03192f690bc2 32 int main() {
neoqased 0:03192f690bc2 33 //初期化
neoqased 0:03192f690bc2 34 Init(); //初期化関数
neoqased 0:03192f690bc2 35 int flag = 0; //フラグ用変数
neoqased 0:03192f690bc2 36 float vol = 0; //ポテンショメータからの入力値を受け取る変数
neoqased 0:03192f690bc2 37 float rpm = 0; //rpmを格納するための変数
neoqased 0:03192f690bc2 38 float t = 0; //時間計測のための変数
neoqased 0:03192f690bc2 39 //メインループ
neoqased 0:03192f690bc2 40 while(1){
neoqased 0:03192f690bc2 41 SW(); //スタートスイッチの入力を待つ
neoqased 0:03192f690bc2 42 flag = GetDipValue(); //DIPスイッチの入力を見る
neoqased 0:03192f690bc2 43 DipLed(); //DIPスイッチのHLでLEDを光らせる
neoqased 0:03192f690bc2 44 Buzzer(1); //ブザーを鳴らす.
neoqased 0:03192f690bc2 45 switch (flag){ //実験モード切り替えのswitch文.ここにcase0~15を書き足せばモードが追加できる.
neoqased 0:03192f690bc2 46 case 0: //DIPスイッチの入力なしで何もしない
neoqased 0:03192f690bc2 47 break;
neoqased 0:03192f690bc2 48 case 1:{ //モード1はポテンショメータからの入力で直接PWMのデューティ比を変更する.約1秒ごとにPCに値を出力する.このモードは時間で終了せず永遠に続く.終了するにはmbedのresetボタンを押す.
neoqased 0:03192f690bc2 49 int i1 = 0;
neoqased 0:03192f690bc2 50 timer.start();
neoqased 0:03192f690bc2 51 while(1){
neoqased 0:03192f690bc2 52 vol = 1 - volume;
neoqased 0:03192f690bc2 53 pwm = vol;
neoqased 0:03192f690bc2 54 if(i1 >= 20){
neoqased 0:03192f690bc2 55 timer.stop();
neoqased 0:03192f690bc2 56 t = timer.read();
neoqased 0:03192f690bc2 57 rpm = encoder.getRevolutions() * 60.0 / t;
neoqased 0:03192f690bc2 58 pc.printf("Duty Ratio = %.2f , %5d RPM\n", vol, (int)rpm);
neoqased 0:03192f690bc2 59 encoder.reset();
neoqased 0:03192f690bc2 60 i1 = 0;
neoqased 0:03192f690bc2 61 timer.reset();
neoqased 0:03192f690bc2 62 timer.start();
neoqased 0:03192f690bc2 63 }
neoqased 0:03192f690bc2 64 wait_ms(50);
neoqased 0:03192f690bc2 65 i1++;
neoqased 0:03192f690bc2 66 }
neoqased 0:03192f690bc2 67 break;
neoqased 0:03192f690bc2 68 }
neoqased 0:03192f690bc2 69 case 2: //モード2はモータの応答を調べる.デューティ比1でモータを回転させ,経過時間とRPMをUSBメモリのcsvファイルに出力する.15秒で終了する.
neoqased 0:03192f690bc2 70 break;
neoqased 0:03192f690bc2 71 case 3: //モード3はモータの応答を調べる.PID制御をかけ,経過時間とRPMをUSBメモリのcsvファイルに出力する.15秒で終了する.
neoqased 0:03192f690bc2 72 break;
neoqased 0:03192f690bc2 73 default: //0と上以外でなにもなし
neoqased 0:03192f690bc2 74 break;
neoqased 0:03192f690bc2 75 }
neoqased 0:03192f690bc2 76 }
neoqased 0:03192f690bc2 77 }
neoqased 0:03192f690bc2 78
neoqased 0:03192f690bc2 79 /**************************関数たち**************************/
neoqased 0:03192f690bc2 80 int Init(){ //初期化関数
neoqased 0:03192f690bc2 81 pc.baud(57600);
neoqased 0:03192f690bc2 82 encoder.reset();
neoqased 0:03192f690bc2 83 timer.reset();
neoqased 0:03192f690bc2 84 pwm.period_us(100);
neoqased 0:03192f690bc2 85 DipLed();
neoqased 0:03192f690bc2 86 return 0;
neoqased 0:03192f690bc2 87 }
neoqased 0:03192f690bc2 88
neoqased 0:03192f690bc2 89 int DipLed(){ //DIPスイッチの状態によってledを光らせる関数
neoqased 0:03192f690bc2 90 if(dip1 == 1) led1 = 1; else led1 = 0; //DIPスイッチの1がHならLEDを光らせる,Lなら光らせない
neoqased 0:03192f690bc2 91 if(dip2 == 1) led2 = 1; else led2 = 0;
neoqased 0:03192f690bc2 92 if(dip3 == 1) led3 = 1; else led3 = 0;
neoqased 0:03192f690bc2 93 if(dip4 == 1) led4 = 1; else led4 = 0;
neoqased 0:03192f690bc2 94 return 0;
neoqased 0:03192f690bc2 95 }
neoqased 0:03192f690bc2 96
neoqased 0:03192f690bc2 97 int GetDipValue(){ //DIPスイッチの値を取得し,値を返す関数
neoqased 0:03192f690bc2 98 int Dip1 = dip1, Dip2 = dip2, Dip3 = dip3, Dip4 = dip4; //DIPスイッチの値を取得
neoqased 0:03192f690bc2 99 if(Dip1 == 0){
neoqased 0:03192f690bc2 100 if(Dip2 == 0){
neoqased 0:03192f690bc2 101 if(Dip3 == 0){
neoqased 0:03192f690bc2 102 if(Dip4 == 0) return 0; else return 1; //DIPスイッチが0000の場合0を返す.0001なら1
neoqased 0:03192f690bc2 103 }else{
neoqased 0:03192f690bc2 104 if(Dip4 == 0) return 2; else return 3;
neoqased 0:03192f690bc2 105 }
neoqased 0:03192f690bc2 106 }else{
neoqased 0:03192f690bc2 107 if(Dip3 == 0){
neoqased 0:03192f690bc2 108 if(Dip4 == 0) return 4; else return 5;
neoqased 0:03192f690bc2 109 }else{
neoqased 0:03192f690bc2 110 if(Dip4 == 0) return 6; else return 7;
neoqased 0:03192f690bc2 111 }
neoqased 0:03192f690bc2 112 }
neoqased 0:03192f690bc2 113 }else{
neoqased 0:03192f690bc2 114 if(Dip2 == 0){
neoqased 0:03192f690bc2 115 if(Dip3 == 0){
neoqased 0:03192f690bc2 116 if(Dip4 == 0) return 8; else return 9;
neoqased 0:03192f690bc2 117 }else{
neoqased 0:03192f690bc2 118 if(Dip4 == 0) return 10; else return 11;
neoqased 0:03192f690bc2 119 }
neoqased 0:03192f690bc2 120 }else{
neoqased 0:03192f690bc2 121 if(Dip3 == 0){
neoqased 0:03192f690bc2 122 if(Dip4 == 0) return 12; else return 13;
neoqased 0:03192f690bc2 123 }else{
neoqased 0:03192f690bc2 124 if(Dip4 == 0) return 14; else return 15;
neoqased 0:03192f690bc2 125 }
neoqased 0:03192f690bc2 126 }
neoqased 0:03192f690bc2 127 }
neoqased 0:03192f690bc2 128 }
neoqased 0:03192f690bc2 129
neoqased 0:03192f690bc2 130 int SW(){ //スタートスイッチ用関数,押して離したらスタート
neoqased 0:03192f690bc2 131 int i = 0, j = 0;
neoqased 0:03192f690bc2 132 while(i < 3){ //チャタリング除去,15msにわたってスタートスイッチが押されていればbreak
neoqased 0:03192f690bc2 133 if(startsw == 1) i++;
neoqased 0:03192f690bc2 134 else i = 0;
neoqased 0:03192f690bc2 135 DipLed();
neoqased 0:03192f690bc2 136 wait_ms(5);
neoqased 0:03192f690bc2 137 }
neoqased 0:03192f690bc2 138 while(j < 3){ //上に同じ,スタートスイッチが離されたことを検知
neoqased 0:03192f690bc2 139 if(startsw == 0) j++;
neoqased 0:03192f690bc2 140 else j = 0;
neoqased 0:03192f690bc2 141 DipLed();
neoqased 0:03192f690bc2 142 wait_ms(5);
neoqased 0:03192f690bc2 143 }
neoqased 0:03192f690bc2 144 return 0;
neoqased 0:03192f690bc2 145 }
neoqased 0:03192f690bc2 146
neoqased 0:03192f690bc2 147 int Buzzer(int buzvar){ //電子ブザーを鳴らす関数
neoqased 0:03192f690bc2 148 switch (buzvar){
neoqased 0:03192f690bc2 149 /**************エラーを知らせるbeep**************/
neoqased 0:03192f690bc2 150 case -1: //error * - - - -
neoqased 0:03192f690bc2 151 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 152 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:03192f690bc2 153 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:03192f690bc2 154 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:03192f690bc2 155 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:03192f690bc2 156 break;
neoqased 0:03192f690bc2 157 /**************エラーここまで**************/
neoqased 0:03192f690bc2 158 case 0: //サウンドなし
neoqased 0:03192f690bc2 159 buzzer = 0;
neoqased 0:03192f690bc2 160 break;
neoqased 0:03192f690bc2 161 /**************状態を知らせるためのbeep**************/
neoqased 0:03192f690bc2 162 case 1: // *(短)
neoqased 0:03192f690bc2 163 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:03192f690bc2 164 break;
neoqased 0:03192f690bc2 165 case 2: // * *
neoqased 0:03192f690bc2 166 buzzer = 1; wait(0.1); buzzer = 0; wait(0.05);
neoqased 0:03192f690bc2 167 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:03192f690bc2 168 break;
neoqased 0:03192f690bc2 169 case 3: // -(長)
neoqased 0:03192f690bc2 170 buzzer = 1; wait(0.3); buzzer = 0;
neoqased 0:03192f690bc2 171 break;
neoqased 0:03192f690bc2 172 case 4: // - -
neoqased 0:03192f690bc2 173 buzzer = 1; wait(0.3); buzzer = 0; wait(0.3);
neoqased 0:03192f690bc2 174 buzzer = 1; wait(0.3); buzzer = 0;
neoqased 0:03192f690bc2 175 break;
neoqased 0:03192f690bc2 176 case 5: // ---
neoqased 0:03192f690bc2 177 buzzer = 1; wait(0.9); buzzer = 0;
neoqased 0:03192f690bc2 178 break;
neoqased 0:03192f690bc2 179 case 6: // * * * * * * * * * *
neoqased 0:03192f690bc2 180 for(int i = 0; i < 3; i++){
neoqased 0:03192f690bc2 181 for(int j = 0; j < 3; j++){
neoqased 0:03192f690bc2 182 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 183 }
neoqased 0:03192f690bc2 184 wait(0.2);
neoqased 0:03192f690bc2 185 }
neoqased 0:03192f690bc2 186 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:03192f690bc2 187 break;
neoqased 0:03192f690bc2 188 case 7: // **-* ** -* ** *** **** "finish"
neoqased 0:03192f690bc2 189 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 190 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 191 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 192 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 193 wait(0.2);
neoqased 0:03192f690bc2 194 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 195 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 196 wait(0.2);
neoqased 0:03192f690bc2 197 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 198 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 199 wait(0.2);
neoqased 0:03192f690bc2 200 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 201 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 202 wait(0.2);
neoqased 0:03192f690bc2 203 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 204 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 205 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 206 wait(0.2);
neoqased 0:03192f690bc2 207 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 208 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 209 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 210 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:03192f690bc2 211 break;
neoqased 0:03192f690bc2 212 case 8: // *-*** -*- --* "オワリ"
neoqased 0:03192f690bc2 213 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 214 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 215 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 216 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 217 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 218 wait(0.2);
neoqased 0:03192f690bc2 219 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 220 buzzer = 1; wait(0.1); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 221 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 222 wait(0.2);
neoqased 0:03192f690bc2 223 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 224 buzzer = 1; wait(0.3); buzzer = 0; wait(0.1);
neoqased 0:03192f690bc2 225 buzzer = 1; wait(0.1); buzzer = 0;
neoqased 0:03192f690bc2 226 break;
neoqased 0:03192f690bc2 227 /**************状態を知らせるためのbeepここまで**************/
neoqased 0:03192f690bc2 228 default: //no sound
neoqased 0:03192f690bc2 229 buzzer = 0;
neoqased 0:03192f690bc2 230 break;
neoqased 0:03192f690bc2 231 }
neoqased 0:03192f690bc2 232 return 0;
neoqased 0:03192f690bc2 233 }