jikken mode1 test
Dependencies: QEI USBHost mbed
main.cpp@0:03192f690bc2, 2014-10-20 (annotated)
- Committer:
- neoqased
- Date:
- Mon Oct 20 11:14:01 2014 +0000
- Revision:
- 0:03192f690bc2
jikken mode1 test
Who changed what in which revision?
User | Revision | Line number | New 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 | } |