![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
CatPot for defence on RoboCup in 2015 winter
Dependencies: AQM0802A HMC6352 MultiSerial PID Servo mbed
main.cpp@1:e3248f278663, 2015-01-27 (annotated)
- Committer:
- lilac0112_1
- Date:
- Tue Jan 27 14:03:48 2015 +0000
- Revision:
- 1:e3248f278663
- Parent:
- 0:d35efbf4d62e
- Child:
- 2:39135c67083d
Added a function
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lilac0112_1 | 0:d35efbf4d62e | 1 | /*********************************** |
lilac0112_1 | 0:d35efbf4d62e | 2 | *RoboCupJunior Soccer B Open 2014 |
lilac0112_1 | 0:d35efbf4d62e | 3 | *Koshinestu progrum |
lilac0112_1 | 0:d35efbf4d62e | 4 | * |
lilac0112_1 | 0:d35efbf4d62e | 5 | *このプログラムでは以下の処理をする. |
lilac0112_1 | 0:d35efbf4d62e | 6 | * LPC1114FN28/102からI2Cを用いて各種センサデータを収集 |
lilac0112_1 | 0:d35efbf4d62e | 7 | * |
lilac0112_1 | 0:d35efbf4d62e | 8 | * データからロボットの移動やキッカー等のモータの動作を決定する処理を行う |
lilac0112_1 | 0:d35efbf4d62e | 9 | * |
lilac0112_1 | 0:d35efbf4d62e | 10 | * MotorDriverにmaxonに命令 |
lilac0112_1 | 0:d35efbf4d62e | 11 | * |
lilac0112_1 | 0:d35efbf4d62e | 12 | * ServoMotorでステアリング |
lilac0112_1 | 0:d35efbf4d62e | 13 | * |
lilac0112_1 | 0:d35efbf4d62e | 14 | * LCDでデバック |
lilac0112_1 | 0:d35efbf4d62e | 15 | * |
lilac0112_1 | 0:d35efbf4d62e | 16 | * スイッチ4つとスタートスイッチで処理を実行 |
lilac0112_1 | 0:d35efbf4d62e | 17 | * |
lilac0112_1 | 0:d35efbf4d62e | 18 | * キッカー用のDigitalOutがどこかに入る |
lilac0112_1 | 0:d35efbf4d62e | 19 | * |
lilac0112_1 | 0:d35efbf4d62e | 20 | ************************* |
lilac0112_1 | 0:d35efbf4d62e | 21 | * |
lilac0112_1 | 0:d35efbf4d62e | 22 | *Pin Map |
lilac0112_1 | 0:d35efbf4d62e | 23 | * |
lilac0112_1 | 0:d35efbf4d62e | 24 | * p5,p6,p7,p29,p30 >> SPI >>Stepping |
lilac0112_1 | 0:d35efbf4d62e | 25 | * |
lilac0112_1 | 0:d35efbf4d62e | 26 | * p9,p10 >> I2C orSerial >> LPC1114FN28/102 read |
lilac0112_1 | 0:d35efbf4d62e | 27 | * |
lilac0112_1 | 0:d35efbf4d62e | 28 | * p13,p14 >> Serial >> Motor |
lilac0112_1 | 0:d35efbf4d62e | 29 | * |
lilac0112_1 | 0:d35efbf4d62e | 30 | * p22~p26 >> DebugSw and StartSw |
lilac0112_1 | 0:d35efbf4d62e | 31 | * |
lilac0112_1 | 0:d35efbf4d62e | 32 | * p27,p28 >> I2C >> DebugLCD |
lilac0112_1 | 0:d35efbf4d62e | 33 | * |
lilac0112_1 | 1:e3248f278663 | 34 | * p21 >> Kick |
lilac0112_1 | 1:e3248f278663 | 35 | * |
lilac0112_1 | 1:e3248f278663 | 36 | * p22 >> ServoMotor |
lilac0112_1 | 0:d35efbf4d62e | 37 | * |
lilac0112_1 | 0:d35efbf4d62e | 38 | ******************************/ |
lilac0112_1 | 0:d35efbf4d62e | 39 | |
lilac0112_1 | 0:d35efbf4d62e | 40 | |
lilac0112_1 | 0:d35efbf4d62e | 41 | /* |
lilac0112_1 | 0:d35efbf4d62e | 42 | |
lilac0112_1 | 0:d35efbf4d62e | 43 | ****以下IRはNighは距離が近いものとする. |
lilac0112_1 | 0:d35efbf4d62e | 44 | |
lilac0112_1 | 0:d35efbf4d62e | 45 | */ |
lilac0112_1 | 0:d35efbf4d62e | 46 | |
lilac0112_1 | 0:d35efbf4d62e | 47 | |
lilac0112_1 | 0:d35efbf4d62e | 48 | |
lilac0112_1 | 0:d35efbf4d62e | 49 | |
lilac0112_1 | 0:d35efbf4d62e | 50 | |
lilac0112_1 | 0:d35efbf4d62e | 51 | |
lilac0112_1 | 0:d35efbf4d62e | 52 | #include "mbed.h" |
lilac0112_1 | 0:d35efbf4d62e | 53 | #include "PID.h" |
lilac0112_1 | 0:d35efbf4d62e | 54 | #include "AQM0802A.h" |
lilac0112_1 | 0:d35efbf4d62e | 55 | #include "HMC6352.h" |
lilac0112_1 | 0:d35efbf4d62e | 56 | #include "Servo.h" |
lilac0112_1 | 0:d35efbf4d62e | 57 | |
lilac0112_1 | 1:e3248f278663 | 58 | #include "def.h" |
lilac0112_1 | 1:e3248f278663 | 59 | |
lilac0112_1 | 0:d35efbf4d62e | 60 | #include <math.h> |
lilac0112_1 | 0:d35efbf4d62e | 61 | #include <sstream> |
lilac0112_1 | 0:d35efbf4d62e | 62 | |
lilac0112_1 | 0:d35efbf4d62e | 63 | |
lilac0112_1 | 0:d35efbf4d62e | 64 | |
lilac0112_1 | 0:d35efbf4d62e | 65 | BusIn Sw(p22,p23,p24,p25,p26); |
lilac0112_1 | 0:d35efbf4d62e | 66 | DigitalOut Led[4] = {LED1,LED2,LED3,LED4}; |
lilac0112_1 | 0:d35efbf4d62e | 67 | |
lilac0112_1 | 0:d35efbf4d62e | 68 | I2C Sensor(p9,p10);//sda,scl |
lilac0112_1 | 0:d35efbf4d62e | 69 | HMC6352 hmc6352(p9,p10); |
lilac0112_1 | 0:d35efbf4d62e | 70 | AQM0802A Lcd(p28,p27);//sda,scl |
lilac0112_1 | 0:d35efbf4d62e | 71 | |
lilac0112_1 | 1:e3248f278663 | 72 | Servo Servo(p21); |
lilac0112_1 | 0:d35efbf4d62e | 73 | |
lilac0112_1 | 0:d35efbf4d62e | 74 | Serial Motor(p13,p14);//tx,rx |
lilac0112_1 | 0:d35efbf4d62e | 75 | Serial pc(USBTX,USBRX); |
lilac0112_1 | 0:d35efbf4d62e | 76 | |
lilac0112_1 | 1:e3248f278663 | 77 | DigitalOut Kick(p22); |
lilac0112_1 | 0:d35efbf4d62e | 78 | |
lilac0112_1 | 0:d35efbf4d62e | 79 | extern string StringFIN; |
lilac0112_1 | 0:d35efbf4d62e | 80 | extern void array(int,int,int,int); |
lilac0112_1 | 0:d35efbf4d62e | 81 | |
lilac0112_1 | 1:e3248f278663 | 82 | int speed[4] = {0}; |
lilac0112_1 | 1:e3248f278663 | 83 | |
lilac0112_1 | 1:e3248f278663 | 84 | /*Ir*/ |
lilac0112_1 | 1:e3248f278663 | 85 | uint8_t IrNum;//場所によるirの数を表したもの0~11まではボールがある状態12はボールがない状態 |
lilac0112_1 | 0:d35efbf4d62e | 86 | |
lilac0112_1 | 0:d35efbf4d62e | 87 | typedef enum {FRONT = 1, RIGHT, BACK, LEFT, NA} Direction; |
lilac0112_1 | 0:d35efbf4d62e | 88 | |
lilac0112_1 | 0:d35efbf4d62e | 89 | /*SensorData回収↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ |
lilac0112_1 | 0:d35efbf4d62e | 90 | unsigned int IrReceiveR(){ |
lilac0112_1 | 0:d35efbf4d62e | 91 | /*順位解析版 |
lilac0112_1 | 0:d35efbf4d62e | 92 | Slave側はIRを要求した場合IRのみを返してくるとする. |
lilac0112_1 | 0:d35efbf4d62e | 93 | irは値が大きいほうが近いと仮定する |
lilac0112_1 | 0:d35efbf4d62e | 94 | |
lilac0112_1 | 0:d35efbf4d62e | 95 | |
lilac0112_1 | 0:d35efbf4d62e | 96 | */ |
lilac0112_1 | 0:d35efbf4d62e | 97 | char data_r[3],data_l[3]; |
lilac0112_1 | 0:d35efbf4d62e | 98 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 99 | Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか |
lilac0112_1 | 0:d35efbf4d62e | 100 | |
lilac0112_1 | 0:d35efbf4d62e | 101 | val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信 |
lilac0112_1 | 0:d35efbf4d62e | 102 | Led[0] = val; |
lilac0112_1 | 0:d35efbf4d62e | 103 | wait_ms(5); |
lilac0112_1 | 0:d35efbf4d62e | 104 | val = Sensor.read(ADDRESS_L|1, data_l, 3); |
lilac0112_1 | 0:d35efbf4d62e | 105 | Led[0] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 106 | |
lilac0112_1 | 0:d35efbf4d62e | 107 | if((data_r[0] == 0)||(data_l[0] == 0)){/*ボールを検知しているかチェック*/ |
lilac0112_1 | 0:d35efbf4d62e | 108 | if((data_r[0] == 0)&&(data_l[0] == 0)){ |
lilac0112_1 | 0:d35efbf4d62e | 109 | return 12; |
lilac0112_1 | 0:d35efbf4d62e | 110 | } |
lilac0112_1 | 0:d35efbf4d62e | 111 | if(data_r[0] == 0){ |
lilac0112_1 | 0:d35efbf4d62e | 112 | return (data_l[0]/6+6)*12*12 + (data_l[0]%6+6)*12 + data_r[0]/6; |
lilac0112_1 | 0:d35efbf4d62e | 113 | } |
lilac0112_1 | 0:d35efbf4d62e | 114 | return data_r[0]/6*12*12 + (data_r[0]%6)*12 + data_l[0]/6+6; |
lilac0112_1 | 0:d35efbf4d62e | 115 | |
lilac0112_1 | 0:d35efbf4d62e | 116 | } |
lilac0112_1 | 0:d35efbf4d62e | 117 | |
lilac0112_1 | 0:d35efbf4d62e | 118 | if(data_r[2]>data_l[2]){ |
lilac0112_1 | 0:d35efbf4d62e | 119 | if(data_r[2]>data_l[1]){ |
lilac0112_1 | 0:d35efbf4d62e | 120 | return data_r[0]/6*12*12 + (data_r[0]%6)*12 + data_l[0]/6+6; |
lilac0112_1 | 0:d35efbf4d62e | 121 | } |
lilac0112_1 | 0:d35efbf4d62e | 122 | |
lilac0112_1 | 0:d35efbf4d62e | 123 | return data_r[0]/6*12*12 +(data_l[0]/6+6)*12+ data_r[0]%6; |
lilac0112_1 | 0:d35efbf4d62e | 124 | |
lilac0112_1 | 0:d35efbf4d62e | 125 | }else{ |
lilac0112_1 | 0:d35efbf4d62e | 126 | if(data_l[2]>data_r[1]){ |
lilac0112_1 | 0:d35efbf4d62e | 127 | return (data_l[0]/6+6)*12*12 + (data_l[0]%6+6)*12 + data_r[0]/6; |
lilac0112_1 | 0:d35efbf4d62e | 128 | } |
lilac0112_1 | 0:d35efbf4d62e | 129 | |
lilac0112_1 | 0:d35efbf4d62e | 130 | return (data_l[0]/6+6)*12*12 +(data_r[0]/6)*12+ (data_l[0]%6+6); |
lilac0112_1 | 0:d35efbf4d62e | 131 | } |
lilac0112_1 | 0:d35efbf4d62e | 132 | |
lilac0112_1 | 0:d35efbf4d62e | 133 | } |
lilac0112_1 | 0:d35efbf4d62e | 134 | |
lilac0112_1 | 0:d35efbf4d62e | 135 | uint8_t IrReceiveS(){ |
lilac0112_1 | 0:d35efbf4d62e | 136 | /*単純解析版 一番大きい位置だけ返す |
lilac0112_1 | 0:d35efbf4d62e | 137 | |
lilac0112_1 | 0:d35efbf4d62e | 138 | Slave側はIRを要求した場合IRのみを返してくるとする. |
lilac0112_1 | 0:d35efbf4d62e | 139 | irは値が大きいほうが近いと仮定する |
lilac0112_1 | 0:d35efbf4d62e | 140 | |
lilac0112_1 | 0:d35efbf4d62e | 141 | */ |
lilac0112_1 | 0:d35efbf4d62e | 142 | char data_r[3],data_l[3]; |
lilac0112_1 | 0:d35efbf4d62e | 143 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 144 | Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか |
lilac0112_1 | 0:d35efbf4d62e | 145 | |
lilac0112_1 | 0:d35efbf4d62e | 146 | val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信 |
lilac0112_1 | 0:d35efbf4d62e | 147 | Led[0] = val; |
lilac0112_1 | 0:d35efbf4d62e | 148 | wait_ms(5); |
lilac0112_1 | 0:d35efbf4d62e | 149 | val = Sensor.read(ADDRESS_L|1, data_l, 3); |
lilac0112_1 | 0:d35efbf4d62e | 150 | Led[0] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 151 | |
lilac0112_1 | 0:d35efbf4d62e | 152 | if((data_r[0] == 0)||(data_l[0] == 0)){/*ボールを検知しているかチェック*/ |
lilac0112_1 | 0:d35efbf4d62e | 153 | if((data_r[0] == 0)&&(data_l[0] == 0)){ |
lilac0112_1 | 0:d35efbf4d62e | 154 | return 12; |
lilac0112_1 | 0:d35efbf4d62e | 155 | } |
lilac0112_1 | 0:d35efbf4d62e | 156 | if(data_r[0] == 0){ |
lilac0112_1 | 0:d35efbf4d62e | 157 | return data_l[0]/6+6; |
lilac0112_1 | 0:d35efbf4d62e | 158 | } |
lilac0112_1 | 0:d35efbf4d62e | 159 | return data_r[0]/6; |
lilac0112_1 | 0:d35efbf4d62e | 160 | } |
lilac0112_1 | 0:d35efbf4d62e | 161 | |
lilac0112_1 | 0:d35efbf4d62e | 162 | if(data_r[2]>data_l[2]){ |
lilac0112_1 | 0:d35efbf4d62e | 163 | return data_r[0]/6; |
lilac0112_1 | 0:d35efbf4d62e | 164 | } |
lilac0112_1 | 0:d35efbf4d62e | 165 | return data_l[0]/6+6; |
lilac0112_1 | 0:d35efbf4d62e | 166 | |
lilac0112_1 | 0:d35efbf4d62e | 167 | } |
lilac0112_1 | 0:d35efbf4d62e | 168 | uint8_t IrReceiveM(){ |
lilac0112_1 | 0:d35efbf4d62e | 169 | /*値解析版 一番近い場所の値を返す(位置はとりあえずない) |
lilac0112_1 | 0:d35efbf4d62e | 170 | Slave側はIRを要求した場合IRのみを返してくるとする. |
lilac0112_1 | 0:d35efbf4d62e | 171 | irは値が大きいほうが近いと仮定する |
lilac0112_1 | 0:d35efbf4d62e | 172 | |
lilac0112_1 | 0:d35efbf4d62e | 173 | |
lilac0112_1 | 0:d35efbf4d62e | 174 | */ |
lilac0112_1 | 0:d35efbf4d62e | 175 | char data_r[3],data_l[3]; |
lilac0112_1 | 0:d35efbf4d62e | 176 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 177 | Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか |
lilac0112_1 | 0:d35efbf4d62e | 178 | |
lilac0112_1 | 0:d35efbf4d62e | 179 | val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信 |
lilac0112_1 | 0:d35efbf4d62e | 180 | Led[0] = val; |
lilac0112_1 | 0:d35efbf4d62e | 181 | wait_ms(5); |
lilac0112_1 | 0:d35efbf4d62e | 182 | val = Sensor.read(ADDRESS_L|1, data_l, 3); |
lilac0112_1 | 0:d35efbf4d62e | 183 | Led[0] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 184 | |
lilac0112_1 | 0:d35efbf4d62e | 185 | if((data_r[0] == 0)||(data_l[0] == 0)){/*ボールを検知しているかチェック*/ |
lilac0112_1 | 0:d35efbf4d62e | 186 | if((data_r[0] == 0)&&(data_l[0] == 0)){ |
lilac0112_1 | 0:d35efbf4d62e | 187 | return 255; |
lilac0112_1 | 0:d35efbf4d62e | 188 | } |
lilac0112_1 | 0:d35efbf4d62e | 189 | if(data_r[0] == 0){ |
lilac0112_1 | 0:d35efbf4d62e | 190 | return data_l[1]; |
lilac0112_1 | 0:d35efbf4d62e | 191 | } |
lilac0112_1 | 0:d35efbf4d62e | 192 | return data_r[1]; |
lilac0112_1 | 0:d35efbf4d62e | 193 | } |
lilac0112_1 | 0:d35efbf4d62e | 194 | |
lilac0112_1 | 0:d35efbf4d62e | 195 | |
lilac0112_1 | 0:d35efbf4d62e | 196 | if(data_r[2]>data_l[2]){ |
lilac0112_1 | 0:d35efbf4d62e | 197 | return data_r[1]; |
lilac0112_1 | 0:d35efbf4d62e | 198 | |
lilac0112_1 | 0:d35efbf4d62e | 199 | } |
lilac0112_1 | 0:d35efbf4d62e | 200 | |
lilac0112_1 | 0:d35efbf4d62e | 201 | return data_l[1]; |
lilac0112_1 | 0:d35efbf4d62e | 202 | |
lilac0112_1 | 0:d35efbf4d62e | 203 | } |
lilac0112_1 | 0:d35efbf4d62e | 204 | unsigned int IrReceiveSM(){//16bit() |
lilac0112_1 | 0:d35efbf4d62e | 205 | /*値解析版 一番大きい値とその位置を返す |
lilac0112_1 | 0:d35efbf4d62e | 206 | Slave側はIRを要求した場合IRのみを返してくるとする. |
lilac0112_1 | 0:d35efbf4d62e | 207 | irは値が大きいほうが近いと仮定する |
lilac0112_1 | 0:d35efbf4d62e | 208 | |
lilac0112_1 | 0:d35efbf4d62e | 209 | |
lilac0112_1 | 0:d35efbf4d62e | 210 | */ |
lilac0112_1 | 0:d35efbf4d62e | 211 | char data_r[3],data_l[3]; |
lilac0112_1 | 0:d35efbf4d62e | 212 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 213 | Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか |
lilac0112_1 | 0:d35efbf4d62e | 214 | |
lilac0112_1 | 0:d35efbf4d62e | 215 | val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信 |
lilac0112_1 | 0:d35efbf4d62e | 216 | Led[0] = val; |
lilac0112_1 | 0:d35efbf4d62e | 217 | wait_ms(5); |
lilac0112_1 | 0:d35efbf4d62e | 218 | val = Sensor.read(ADDRESS_L|1, data_l, 3); |
lilac0112_1 | 0:d35efbf4d62e | 219 | Led[0] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 220 | |
lilac0112_1 | 0:d35efbf4d62e | 221 | if((data_r[0] == 0)||(data_l[0] == 0)){/*ボールを検知しているかチェック*/ |
lilac0112_1 | 0:d35efbf4d62e | 222 | if((data_r[0] == 0)&&(data_l[0] == 0)){ |
lilac0112_1 | 1:e3248f278663 | 223 | return (12<<8)+255; |
lilac0112_1 | 0:d35efbf4d62e | 224 | } |
lilac0112_1 | 0:d35efbf4d62e | 225 | if(data_r[0] == 0){ |
lilac0112_1 | 0:d35efbf4d62e | 226 | return (data_l[0]/6+6)<<8 + data_l[1]; |
lilac0112_1 | 0:d35efbf4d62e | 227 | } |
lilac0112_1 | 0:d35efbf4d62e | 228 | return data_r[0]/6<<8 + data_r[1]; |
lilac0112_1 | 0:d35efbf4d62e | 229 | } |
lilac0112_1 | 0:d35efbf4d62e | 230 | |
lilac0112_1 | 0:d35efbf4d62e | 231 | |
lilac0112_1 | 0:d35efbf4d62e | 232 | if(data_r[2]>data_l[2]){ |
lilac0112_1 | 0:d35efbf4d62e | 233 | return data_r[0]/6<<8 + data_r[1]; |
lilac0112_1 | 0:d35efbf4d62e | 234 | |
lilac0112_1 | 0:d35efbf4d62e | 235 | } |
lilac0112_1 | 0:d35efbf4d62e | 236 | return ((data_l[0]/6)+6) <<8 + data_l[1]; |
lilac0112_1 | 0:d35efbf4d62e | 237 | |
lilac0112_1 | 0:d35efbf4d62e | 238 | |
lilac0112_1 | 0:d35efbf4d62e | 239 | } |
lilac0112_1 | 0:d35efbf4d62e | 240 | uint8_t LineReceive(){ |
lilac0112_1 | 0:d35efbf4d62e | 241 | //先に要求しない場合はLineの状況を送信すること.//4bit //前ー右ー後ろー左 |
lilac0112_1 | 0:d35efbf4d62e | 242 | char data_r[2],data_l[2]; |
lilac0112_1 | 0:d35efbf4d62e | 243 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 244 | //example val = slave.read(address,data,length,repeat); |
lilac0112_1 | 0:d35efbf4d62e | 245 | val = Sensor.read(ADDRESS_R|1, data_r, 1); |
lilac0112_1 | 0:d35efbf4d62e | 246 | Led[1] = val; |
lilac0112_1 | 0:d35efbf4d62e | 247 | wait_ms(5); |
lilac0112_1 | 0:d35efbf4d62e | 248 | val = Sensor.read(ADDRESS_L|1, data_l, 1); |
lilac0112_1 | 0:d35efbf4d62e | 249 | Led[1] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 250 | |
lilac0112_1 | 0:d35efbf4d62e | 251 | |
lilac0112_1 | 0:d35efbf4d62e | 252 | return data_r[0]<<2 + data_l[0]; |
lilac0112_1 | 0:d35efbf4d62e | 253 | |
lilac0112_1 | 0:d35efbf4d62e | 254 | |
lilac0112_1 | 0:d35efbf4d62e | 255 | } |
lilac0112_1 | 0:d35efbf4d62e | 256 | |
lilac0112_1 | 0:d35efbf4d62e | 257 | |
lilac0112_1 | 0:d35efbf4d62e | 258 | void PingReceiveRL(char ping[]){//ping[0]==Right,ping[1]==Left |
lilac0112_1 | 0:d35efbf4d62e | 259 | char ReadSelect[1] = {READ_PING}; |
lilac0112_1 | 0:d35efbf4d62e | 260 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 261 | val = Sensor.write(ADDRESS_R|0, ReadSelect , 1); |
lilac0112_1 | 0:d35efbf4d62e | 262 | Led[2] = val; |
lilac0112_1 | 0:d35efbf4d62e | 263 | val = Sensor.read(ADDRESS_R|1, ping, 2); |
lilac0112_1 | 0:d35efbf4d62e | 264 | Led[2] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 265 | |
lilac0112_1 | 0:d35efbf4d62e | 266 | |
lilac0112_1 | 0:d35efbf4d62e | 267 | } |
lilac0112_1 | 0:d35efbf4d62e | 268 | |
lilac0112_1 | 0:d35efbf4d62e | 269 | void PingReceiveFB(char ping[]){//ping[0]==FRONT,ping[1]==BACK |
lilac0112_1 | 0:d35efbf4d62e | 270 | char ReadSelect[1] = {READ_PING}; |
lilac0112_1 | 0:d35efbf4d62e | 271 | bool val; |
lilac0112_1 | 0:d35efbf4d62e | 272 | val = Sensor.write(ADDRESS_L|0, ReadSelect , 1); |
lilac0112_1 | 0:d35efbf4d62e | 273 | Led[2] = val; |
lilac0112_1 | 0:d35efbf4d62e | 274 | val = Sensor.read(ADDRESS_L|1, ping, 2); |
lilac0112_1 | 0:d35efbf4d62e | 275 | Led[2] = !val; |
lilac0112_1 | 0:d35efbf4d62e | 276 | |
lilac0112_1 | 0:d35efbf4d62e | 277 | |
lilac0112_1 | 0:d35efbf4d62e | 278 | } |
lilac0112_1 | 0:d35efbf4d62e | 279 | |
lilac0112_1 | 0:d35efbf4d62e | 280 | /*SensorData回収↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ |
lilac0112_1 | 0:d35efbf4d62e | 281 | |
lilac0112_1 | 0:d35efbf4d62e | 282 | /*モーター駆動処理↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ |
lilac0112_1 | 0:d35efbf4d62e | 283 | |
lilac0112_1 | 0:d35efbf4d62e | 284 | void move(int vr, int vl){ |
lilac0112_1 | 0:d35efbf4d62e | 285 | double pwm[4] = {0}; |
lilac0112_1 | 0:d35efbf4d62e | 286 | uint8_t i = 0; |
lilac0112_1 | 1:e3248f278663 | 287 | pwm[0] = -vr; |
lilac0112_1 | 1:e3248f278663 | 288 | pwm[1] = 0; |
lilac0112_1 | 0:d35efbf4d62e | 289 | pwm[2] = 0; |
lilac0112_1 | 1:e3248f278663 | 290 | pwm[3] = vl; |
lilac0112_1 | 0:d35efbf4d62e | 291 | |
lilac0112_1 | 0:d35efbf4d62e | 292 | for(i = 0; i < 4; i++){ |
lilac0112_1 | 0:d35efbf4d62e | 293 | if(pwm[i] > 100){ |
lilac0112_1 | 0:d35efbf4d62e | 294 | pwm[i] = 100; |
lilac0112_1 | 0:d35efbf4d62e | 295 | }else if(pwm[i] < -100){ |
lilac0112_1 | 0:d35efbf4d62e | 296 | pwm[i] = -100; |
lilac0112_1 | 0:d35efbf4d62e | 297 | } |
lilac0112_1 | 0:d35efbf4d62e | 298 | speed[i] = pwm[i]; |
lilac0112_1 | 0:d35efbf4d62e | 299 | } |
lilac0112_1 | 0:d35efbf4d62e | 300 | } |
lilac0112_1 | 0:d35efbf4d62e | 301 | |
lilac0112_1 | 0:d35efbf4d62e | 302 | void ControlRobo0(int *CompassDef)//LeftFront 11時 |
lilac0112_1 | 1:e3248f278663 | 303 | { |
lilac0112_1 | 1:e3248f278663 | 304 | |
lilac0112_1 | 1:e3248f278663 | 305 | } |
lilac0112_1 | 0:d35efbf4d62e | 306 | void ControlRobo1(int *CompassDef)//Front 12時 |
lilac0112_1 | 0:d35efbf4d62e | 307 | { |
lilac0112_1 | 0:d35efbf4d62e | 308 | /*前にボールがある場合の動作*/ |
lilac0112_1 | 0:d35efbf4d62e | 309 | int Compass; |
lilac0112_1 | 0:d35efbf4d62e | 310 | char Ping[2]; |
lilac0112_1 | 0:d35efbf4d62e | 311 | uint8_t Line,LineIr; |
lilac0112_1 | 0:d35efbf4d62e | 312 | unsigned int IrNumMax; |
lilac0112_1 | 0:d35efbf4d62e | 313 | |
lilac0112_1 | 0:d35efbf4d62e | 314 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 315 | if(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 316 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 317 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 318 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 319 | } |
lilac0112_1 | 0:d35efbf4d62e | 320 | return; |
lilac0112_1 | 0:d35efbf4d62e | 321 | } |
lilac0112_1 | 0:d35efbf4d62e | 322 | if(IrReceiveM()<=150){//適当な150 |
lilac0112_1 | 0:d35efbf4d62e | 323 | /*ステッピングを正面に設定*/ |
lilac0112_1 | 0:d35efbf4d62e | 324 | /*busy_wait()*/ |
lilac0112_1 | 0:d35efbf4d62e | 325 | /*モーターを前進*/ |
lilac0112_1 | 0:d35efbf4d62e | 326 | return; |
lilac0112_1 | 0:d35efbf4d62e | 327 | } |
lilac0112_1 | 0:d35efbf4d62e | 328 | PingReceiveRL(Ping); |
lilac0112_1 | 0:d35efbf4d62e | 329 | if((Ping[0]>90)&&(Ping[1]>40)){//数値は適当 |
lilac0112_1 | 0:d35efbf4d62e | 330 | /*ステッピングを少しだけ傾ける*/ |
lilac0112_1 | 0:d35efbf4d62e | 331 | /*モーターを左右差つけて回す(ロボットは少し傾く)*/ |
lilac0112_1 | 0:d35efbf4d62e | 332 | /*busy_wait()*/ |
lilac0112_1 | 0:d35efbf4d62e | 333 | /*モーターを前進*/ |
lilac0112_1 | 0:d35efbf4d62e | 334 | while(1){ |
lilac0112_1 | 0:d35efbf4d62e | 335 | Line = LineReceive(); |
lilac0112_1 | 0:d35efbf4d62e | 336 | |
lilac0112_1 | 0:d35efbf4d62e | 337 | if(Line){ //ラインを検知していないか |
lilac0112_1 | 0:d35efbf4d62e | 338 | LineIr = Line & (IrReceiveS()/3 + 1);//計算により方位を合わせる。 |
lilac0112_1 | 0:d35efbf4d62e | 339 | while(LineIr){ |
lilac0112_1 | 0:d35efbf4d62e | 340 | move(0,0);// |
lilac0112_1 | 0:d35efbf4d62e | 341 | Led[1] = Led[2] = Led[3] = 1; |
lilac0112_1 | 0:d35efbf4d62e | 342 | |
lilac0112_1 | 0:d35efbf4d62e | 343 | LineIr = LineReceive() & (IrReceiveS()/3 + 1); |
lilac0112_1 | 0:d35efbf4d62e | 344 | } |
lilac0112_1 | 0:d35efbf4d62e | 345 | Led[1] = Led[2] = Led[3] = 0; |
lilac0112_1 | 0:d35efbf4d62e | 346 | |
lilac0112_1 | 0:d35efbf4d62e | 347 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 348 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 349 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 350 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 351 | } |
lilac0112_1 | 0:d35efbf4d62e | 352 | return; |
lilac0112_1 | 0:d35efbf4d62e | 353 | } |
lilac0112_1 | 0:d35efbf4d62e | 354 | Kick = 1; |
lilac0112_1 | 0:d35efbf4d62e | 355 | wait_ms(200); |
lilac0112_1 | 0:d35efbf4d62e | 356 | Kick = 0; |
lilac0112_1 | 0:d35efbf4d62e | 357 | |
lilac0112_1 | 0:d35efbf4d62e | 358 | IrNumMax = IrReceiveSM();//位置と大きさ |
lilac0112_1 | 0:d35efbf4d62e | 359 | |
lilac0112_1 | 0:d35efbf4d62e | 360 | if(!((IrNumMax&0x00)>>8) == 1){//この1はボールの関数の1を表す. |
lilac0112_1 | 0:d35efbf4d62e | 361 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 362 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 363 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 364 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 365 | } |
lilac0112_1 | 0:d35efbf4d62e | 366 | return; |
lilac0112_1 | 0:d35efbf4d62e | 367 | } |
lilac0112_1 | 0:d35efbf4d62e | 368 | |
lilac0112_1 | 0:d35efbf4d62e | 369 | if((IrNumMax&0x00FF)<150){ |
lilac0112_1 | 0:d35efbf4d62e | 370 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 371 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 372 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 373 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 374 | } |
lilac0112_1 | 0:d35efbf4d62e | 375 | return; |
lilac0112_1 | 0:d35efbf4d62e | 376 | } |
lilac0112_1 | 0:d35efbf4d62e | 377 | |
lilac0112_1 | 0:d35efbf4d62e | 378 | } |
lilac0112_1 | 0:d35efbf4d62e | 379 | |
lilac0112_1 | 0:d35efbf4d62e | 380 | }else if((Ping[0]>40)&&(Ping[1]>90)){ |
lilac0112_1 | 0:d35efbf4d62e | 381 | |
lilac0112_1 | 0:d35efbf4d62e | 382 | }else{ |
lilac0112_1 | 0:d35efbf4d62e | 383 | |
lilac0112_1 | 0:d35efbf4d62e | 384 | } |
lilac0112_1 | 0:d35efbf4d62e | 385 | |
lilac0112_1 | 0:d35efbf4d62e | 386 | } |
lilac0112_1 | 0:d35efbf4d62e | 387 | void ControlRobo2(int *CompassDef)//RightFront 1時 |
lilac0112_1 | 0:d35efbf4d62e | 388 | { |
lilac0112_1 | 0:d35efbf4d62e | 389 | |
lilac0112_1 | 0:d35efbf4d62e | 390 | int Compass; |
lilac0112_1 | 0:d35efbf4d62e | 391 | char Ir[2] ={0};//1, 1,2位, 1位の大きさ |
lilac0112_1 | 0:d35efbf4d62e | 392 | char ir_num,line;//わかりやすい名前 |
lilac0112_1 | 0:d35efbf4d62e | 393 | |
lilac0112_1 | 0:d35efbf4d62e | 394 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 395 | if(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 396 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 397 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 398 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 399 | } |
lilac0112_1 | 0:d35efbf4d62e | 400 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 401 | return; |
lilac0112_1 | 0:d35efbf4d62e | 402 | } |
lilac0112_1 | 1:e3248f278663 | 403 | |
lilac0112_1 | 0:d35efbf4d62e | 404 | /*irデータ取得 1,2位の場所、一位の距離*/ |
lilac0112_1 | 0:d35efbf4d62e | 405 | if(!(Ir[0]%13 ==2)){ |
lilac0112_1 | 0:d35efbf4d62e | 406 | return; |
lilac0112_1 | 0:d35efbf4d62e | 407 | } |
lilac0112_1 | 1:e3248f278663 | 408 | |
lilac0112_1 | 0:d35efbf4d62e | 409 | |
lilac0112_1 | 0:d35efbf4d62e | 410 | if(Ir[1]>=100){//近い場合 |
lilac0112_1 | 0:d35efbf4d62e | 411 | //2位を含んだ計算 |
lilac0112_1 | 0:d35efbf4d62e | 412 | /*motorset*/ |
lilac0112_1 | 0:d35efbf4d62e | 413 | /*stepset*/ |
lilac0112_1 | 0:d35efbf4d62e | 414 | return; |
lilac0112_1 | 0:d35efbf4d62e | 415 | } |
lilac0112_1 | 0:d35efbf4d62e | 416 | |
lilac0112_1 | 0:d35efbf4d62e | 417 | /*2位を含んだ計算*/ |
lilac0112_1 | 0:d35efbf4d62e | 418 | /*計算された分stepmove*/ |
lilac0112_1 | 1:e3248f278663 | 419 | |
lilac0112_1 | 0:d35efbf4d62e | 420 | move(20,20); |
lilac0112_1 | 0:d35efbf4d62e | 421 | |
lilac0112_1 | 0:d35efbf4d62e | 422 | |
lilac0112_1 | 0:d35efbf4d62e | 423 | /*line,ir get*/ |
lilac0112_1 | 0:d35efbf4d62e | 424 | do{ |
lilac0112_1 | 0:d35efbf4d62e | 425 | if(line){ |
lilac0112_1 | 0:d35efbf4d62e | 426 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 427 | return; |
lilac0112_1 | 0:d35efbf4d62e | 428 | } |
lilac0112_1 | 0:d35efbf4d62e | 429 | |
lilac0112_1 | 0:d35efbf4d62e | 430 | /*line,ir get*/ |
lilac0112_1 | 0:d35efbf4d62e | 431 | }while(ir_num == 2); |
lilac0112_1 | 0:d35efbf4d62e | 432 | |
lilac0112_1 | 0:d35efbf4d62e | 433 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 434 | |
lilac0112_1 | 0:d35efbf4d62e | 435 | |
lilac0112_1 | 0:d35efbf4d62e | 436 | |
lilac0112_1 | 0:d35efbf4d62e | 437 | } |
lilac0112_1 | 0:d35efbf4d62e | 438 | void ControlRobo3(int *CompassDef)//RightFront 2時 |
lilac0112_1 | 0:d35efbf4d62e | 439 | { |
lilac0112_1 | 0:d35efbf4d62e | 440 | int Compass; |
lilac0112_1 | 0:d35efbf4d62e | 441 | char Ir[2] ={0};//1, 1,2位, 1位の大きさ |
lilac0112_1 | 0:d35efbf4d62e | 442 | char ir_num,line;//わかりやすい名前 |
lilac0112_1 | 0:d35efbf4d62e | 443 | |
lilac0112_1 | 0:d35efbf4d62e | 444 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 445 | if(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 446 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 447 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 448 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 449 | } |
lilac0112_1 | 0:d35efbf4d62e | 450 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 451 | return; |
lilac0112_1 | 0:d35efbf4d62e | 452 | } |
lilac0112_1 | 1:e3248f278663 | 453 | |
lilac0112_1 | 0:d35efbf4d62e | 454 | /*irデータ取得 1,2位の場所、一位の距離*/ |
lilac0112_1 | 0:d35efbf4d62e | 455 | if(!(Ir[0]%13 ==3)){ |
lilac0112_1 | 0:d35efbf4d62e | 456 | return; |
lilac0112_1 | 0:d35efbf4d62e | 457 | } |
lilac0112_1 | 1:e3248f278663 | 458 | |
lilac0112_1 | 0:d35efbf4d62e | 459 | |
lilac0112_1 | 0:d35efbf4d62e | 460 | if(Ir[1] >= 100){ |
lilac0112_1 | 0:d35efbf4d62e | 461 | /*2位を含めた計算*/ |
lilac0112_1 | 0:d35efbf4d62e | 462 | /*move()*/ |
lilac0112_1 | 0:d35efbf4d62e | 463 | /*Stepset*/ |
lilac0112_1 | 0:d35efbf4d62e | 464 | return; |
lilac0112_1 | 0:d35efbf4d62e | 465 | } |
lilac0112_1 | 0:d35efbf4d62e | 466 | /*2位を含めた計算*/ |
lilac0112_1 | 0:d35efbf4d62e | 467 | /*Stepsetting 距離等により角度が変わる*/ |
lilac0112_1 | 1:e3248f278663 | 468 | |
lilac0112_1 | 0:d35efbf4d62e | 469 | move(-20,-20); |
lilac0112_1 | 0:d35efbf4d62e | 470 | /*ir,line check*/ |
lilac0112_1 | 0:d35efbf4d62e | 471 | do{ |
lilac0112_1 | 0:d35efbf4d62e | 472 | if(line){ |
lilac0112_1 | 0:d35efbf4d62e | 473 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 474 | return; |
lilac0112_1 | 0:d35efbf4d62e | 475 | } |
lilac0112_1 | 0:d35efbf4d62e | 476 | /*line,ir check*/ |
lilac0112_1 | 0:d35efbf4d62e | 477 | }while(ir_num == 3); |
lilac0112_1 | 0:d35efbf4d62e | 478 | |
lilac0112_1 | 0:d35efbf4d62e | 479 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 480 | |
lilac0112_1 | 0:d35efbf4d62e | 481 | |
lilac0112_1 | 0:d35efbf4d62e | 482 | } |
lilac0112_1 | 0:d35efbf4d62e | 483 | void ControlRobo4(int *CompassDef)//Right 3時 |
lilac0112_1 | 0:d35efbf4d62e | 484 | { |
lilac0112_1 | 0:d35efbf4d62e | 485 | int a = 50; |
lilac0112_1 | 0:d35efbf4d62e | 486 | unsigned int ir_sm; |
lilac0112_1 | 0:d35efbf4d62e | 487 | double value = 0; |
lilac0112_1 | 0:d35efbf4d62e | 488 | double v = 50;/* cm/s */ |
lilac0112_1 | 0:d35efbf4d62e | 489 | double x = 20;/*モーターを回す割合,今は適当*/ |
lilac0112_1 | 0:d35efbf4d62e | 490 | |
lilac0112_1 | 0:d35efbf4d62e | 491 | ir_sm = IrReceiveSM(); |
lilac0112_1 | 0:d35efbf4d62e | 492 | if(ir_sm&0xF00>>8 == 4){ |
lilac0112_1 | 0:d35efbf4d62e | 493 | return; |
lilac0112_1 | 0:d35efbf4d62e | 494 | } |
lilac0112_1 | 0:d35efbf4d62e | 495 | a = 300 - ir_sm&0x00FF ;//適当な計算//300は勘 |
lilac0112_1 | 0:d35efbf4d62e | 496 | value = 10 * a * SHORT_LEN + 3*(a * a + SHORT_LEN * SHORT_LEN); |
lilac0112_1 | 0:d35efbf4d62e | 497 | value = PI *(3 * ( a + SHORT_LEN) - sqrt(value))/4/v; |
lilac0112_1 | 0:d35efbf4d62e | 498 | |
lilac0112_1 | 0:d35efbf4d62e | 499 | if(300 - ir_sm&0x00FF >200){ |
lilac0112_1 | 1:e3248f278663 | 500 | //Step.Step(-10);//適当 |
lilac0112_1 | 1:e3248f278663 | 501 | |
lilac0112_1 | 0:d35efbf4d62e | 502 | } |
lilac0112_1 | 0:d35efbf4d62e | 503 | |
lilac0112_1 | 0:d35efbf4d62e | 504 | /*SetPerm() |
lilac0112_1 | 0:d35efbf4d62e | 505 | *valueに応じた何かを計算する |
lilac0112_1 | 0:d35efbf4d62e | 506 | *ACCまたはMAX_SPEEDをいじればいい気がする |
lilac0112_1 | 0:d35efbf4d62e | 507 | * |
lilac0112_1 | 0:d35efbf4d62e | 508 | */ |
lilac0112_1 | 1:e3248f278663 | 509 | //Step.Step(kakudo+10); |
lilac0112_1 | 0:d35efbf4d62e | 510 | |
lilac0112_1 | 0:d35efbf4d62e | 511 | /*x = v*何か*/ |
lilac0112_1 | 0:d35efbf4d62e | 512 | move(-x,-x); |
lilac0112_1 | 0:d35efbf4d62e | 513 | |
lilac0112_1 | 0:d35efbf4d62e | 514 | |
lilac0112_1 | 0:d35efbf4d62e | 515 | } |
lilac0112_1 | 0:d35efbf4d62e | 516 | void ControlRobo5(int *CompassDef)//RightBack 4時 |
lilac0112_1 | 0:d35efbf4d62e | 517 | { |
lilac0112_1 | 0:d35efbf4d62e | 518 | int Compass; |
lilac0112_1 | 0:d35efbf4d62e | 519 | char Ir[2] ={0};//1, 1,2位, 1位の大きさ |
lilac0112_1 | 0:d35efbf4d62e | 520 | char ir_num,line;//わかりやすい名前 |
lilac0112_1 | 0:d35efbf4d62e | 521 | |
lilac0112_1 | 0:d35efbf4d62e | 522 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 523 | if(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 524 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 525 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 526 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 527 | } |
lilac0112_1 | 0:d35efbf4d62e | 528 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 529 | return; |
lilac0112_1 | 0:d35efbf4d62e | 530 | } |
lilac0112_1 | 0:d35efbf4d62e | 531 | Servo.position(HOME); |
lilac0112_1 | 0:d35efbf4d62e | 532 | |
lilac0112_1 | 0:d35efbf4d62e | 533 | /*irデータ取得 1,2位の場所、一位の距離*/ |
lilac0112_1 | 0:d35efbf4d62e | 534 | if(!(Ir[0]%13 == 5)){ |
lilac0112_1 | 0:d35efbf4d62e | 535 | return; |
lilac0112_1 | 0:d35efbf4d62e | 536 | } |
lilac0112_1 | 0:d35efbf4d62e | 537 | |
lilac0112_1 | 0:d35efbf4d62e | 538 | |
lilac0112_1 | 0:d35efbf4d62e | 539 | if(Ir[1] >=100){//近い |
lilac0112_1 | 0:d35efbf4d62e | 540 | /*計算*/ |
lilac0112_1 | 0:d35efbf4d62e | 541 | |
lilac0112_1 | 1:e3248f278663 | 542 | Servo.position(ONE); |
lilac0112_1 | 0:d35efbf4d62e | 543 | move(-20,-20); |
lilac0112_1 | 0:d35efbf4d62e | 544 | /*Step.setpaaa |
lilac0112_1 | 0:d35efbf4d62e | 545 | Step.move();-180+初期位置 |
lilac0112_1 | 0:d35efbf4d62e | 546 | */ |
lilac0112_1 | 0:d35efbf4d62e | 547 | /*ir,linecheck*/ |
lilac0112_1 | 0:d35efbf4d62e | 548 | do{ |
lilac0112_1 | 0:d35efbf4d62e | 549 | if(line){ |
lilac0112_1 | 0:d35efbf4d62e | 550 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 551 | return; |
lilac0112_1 | 0:d35efbf4d62e | 552 | } |
lilac0112_1 | 0:d35efbf4d62e | 553 | if(!(ir_num >1 && ir_num <=5)){ |
lilac0112_1 | 0:d35efbf4d62e | 554 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 555 | return; |
lilac0112_1 | 0:d35efbf4d62e | 556 | } |
lilac0112_1 | 0:d35efbf4d62e | 557 | /*ir,line check*/ |
lilac0112_1 | 0:d35efbf4d62e | 558 | }while(1); |
lilac0112_1 | 0:d35efbf4d62e | 559 | } |
lilac0112_1 | 0:d35efbf4d62e | 560 | //遠い |
lilac0112_1 | 0:d35efbf4d62e | 561 | |
lilac0112_1 | 0:d35efbf4d62e | 562 | /*計算*/ |
lilac0112_1 | 0:d35efbf4d62e | 563 | |
lilac0112_1 | 1:e3248f278663 | 564 | Servo.position(FOUR); |
lilac0112_1 | 0:d35efbf4d62e | 565 | |
lilac0112_1 | 0:d35efbf4d62e | 566 | move(-20,-20); |
lilac0112_1 | 0:d35efbf4d62e | 567 | |
lilac0112_1 | 0:d35efbf4d62e | 568 | /*ir,linecheck*/ |
lilac0112_1 | 0:d35efbf4d62e | 569 | do{ |
lilac0112_1 | 0:d35efbf4d62e | 570 | if(line){ |
lilac0112_1 | 0:d35efbf4d62e | 571 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 572 | return; |
lilac0112_1 | 0:d35efbf4d62e | 573 | } |
lilac0112_1 | 0:d35efbf4d62e | 574 | if(!(ir_num >1 && ir_num <=5)){ |
lilac0112_1 | 0:d35efbf4d62e | 575 | move(0,0); |
lilac0112_1 | 0:d35efbf4d62e | 576 | } |
lilac0112_1 | 0:d35efbf4d62e | 577 | /*ir,line check*/ |
lilac0112_1 | 0:d35efbf4d62e | 578 | }while(1); |
lilac0112_1 | 0:d35efbf4d62e | 579 | |
lilac0112_1 | 0:d35efbf4d62e | 580 | |
lilac0112_1 | 0:d35efbf4d62e | 581 | } |
lilac0112_1 | 0:d35efbf4d62e | 582 | void ControlRobo6(int *CompassDef)//BackRight 5時 |
lilac0112_1 | 0:d35efbf4d62e | 583 | { |
lilac0112_1 | 0:d35efbf4d62e | 584 | |
lilac0112_1 | 0:d35efbf4d62e | 585 | |
lilac0112_1 | 0:d35efbf4d62e | 586 | } |
lilac0112_1 | 0:d35efbf4d62e | 587 | void ControlRobo7(int *CompassDef)//Back 6時 |
lilac0112_1 | 0:d35efbf4d62e | 588 | { |
lilac0112_1 | 0:d35efbf4d62e | 589 | /***** |
lilac0112_1 | 0:d35efbf4d62e | 590 | * this function is drawing a semicircle. |
lilac0112_1 | 0:d35efbf4d62e | 591 | * semicircle manipulated ir_data&ping_data. |
lilac0112_1 | 0:d35efbf4d62e | 592 | * |
lilac0112_1 | 0:d35efbf4d62e | 593 | * 変数名は後から変えるためにわかりやすい名前にしておく |
lilac0112_1 | 0:d35efbf4d62e | 594 | **/ |
lilac0112_1 | 0:d35efbf4d62e | 595 | uint8_t ir_num; |
lilac0112_1 | 0:d35efbf4d62e | 596 | uint8_t pingl,pingr; |
lilac0112_1 | 0:d35efbf4d62e | 597 | |
lilac0112_1 | 0:d35efbf4d62e | 598 | /* |
lilac0112_1 | 0:d35efbf4d62e | 599 | ir(1位,2位,必要なら距離も)と超音波のデータを取得 |
lilac0112_1 | 0:d35efbf4d62e | 600 | */ |
lilac0112_1 | 0:d35efbf4d62e | 601 | if(ir_num==7){//一致しているかどうか念のため |
lilac0112_1 | 0:d35efbf4d62e | 602 | return ; |
lilac0112_1 | 0:d35efbf4d62e | 603 | } |
lilac0112_1 | 0:d35efbf4d62e | 604 | if(pingr<pingl){//本当ならば壁と垂直かどうか、確認すべき。コンパスや超音波の合計を見れば可能 |
lilac0112_1 | 0:d35efbf4d62e | 605 | /*軌道の計算、楕円の半分見たいな感じの軌道がベスト*/ |
lilac0112_1 | 0:d35efbf4d62e | 606 | /*半円なのであらかじめステッピングを回転させる必要がある*/ |
lilac0112_1 | 0:d35efbf4d62e | 607 | /*モーター設定*/ |
lilac0112_1 | 0:d35efbf4d62e | 608 | /*ステッピング設定*/ |
lilac0112_1 | 0:d35efbf4d62e | 609 | return; |
lilac0112_1 | 0:d35efbf4d62e | 610 | } |
lilac0112_1 | 0:d35efbf4d62e | 611 | /*軌道の計算、楕円の半分見たいな感じの軌道がベスト*/ |
lilac0112_1 | 0:d35efbf4d62e | 612 | /*半円なのであらかじめステッピングを回転させる必要がある*/ |
lilac0112_1 | 0:d35efbf4d62e | 613 | /*モーター設定*/ |
lilac0112_1 | 0:d35efbf4d62e | 614 | /*ステッピング設定*/ |
lilac0112_1 | 0:d35efbf4d62e | 615 | |
lilac0112_1 | 0:d35efbf4d62e | 616 | |
lilac0112_1 | 0:d35efbf4d62e | 617 | } |
lilac0112_1 | 0:d35efbf4d62e | 618 | void ControlRobo8(int *CompassDef)//BackLeft 7時 |
lilac0112_1 | 1:e3248f278663 | 619 | { |
lilac0112_1 | 1:e3248f278663 | 620 | Servo.position(FOUR); |
lilac0112_1 | 1:e3248f278663 | 621 | } |
lilac0112_1 | 0:d35efbf4d62e | 622 | void ControlRobo9(int *CompassDef)//LeftBack 8時 |
lilac0112_1 | 1:e3248f278663 | 623 | { |
lilac0112_1 | 1:e3248f278663 | 624 | Servo.position(FIVE); |
lilac0112_1 | 1:e3248f278663 | 625 | } |
lilac0112_1 | 0:d35efbf4d62e | 626 | void ControlRobo10(int *CompassDef)//Left 9時 |
lilac0112_1 | 1:e3248f278663 | 627 | { |
lilac0112_1 | 1:e3248f278663 | 628 | Servo.position(SIX); |
lilac0112_1 | 1:e3248f278663 | 629 | } |
lilac0112_1 | 0:d35efbf4d62e | 630 | void ControlRobo11(int *CompassDef)//LeftFront 10時 |
lilac0112_1 | 1:e3248f278663 | 631 | { |
lilac0112_1 | 1:e3248f278663 | 632 | Servo.position(NINE); |
lilac0112_1 | 1:e3248f278663 | 633 | } |
lilac0112_1 | 0:d35efbf4d62e | 634 | void GoHome(int *CompassDef)//Ball is not found. |
lilac0112_1 | 0:d35efbf4d62e | 635 | { |
lilac0112_1 | 0:d35efbf4d62e | 636 | /*line検知をしないバージョン*/ |
lilac0112_1 | 0:d35efbf4d62e | 637 | int Compass; |
lilac0112_1 | 0:d35efbf4d62e | 638 | char ping[2] = {0}; |
lilac0112_1 | 0:d35efbf4d62e | 639 | |
lilac0112_1 | 0:d35efbf4d62e | 640 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 641 | if(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 642 | while(!((Compass>=150)&&(Compass<=210))){ |
lilac0112_1 | 0:d35efbf4d62e | 643 | move(20,-20);//適当な回転。 |
lilac0112_1 | 0:d35efbf4d62e | 644 | Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 645 | } |
lilac0112_1 | 0:d35efbf4d62e | 646 | /*return;してもいいかもしれない*/ |
lilac0112_1 | 0:d35efbf4d62e | 647 | } |
lilac0112_1 | 1:e3248f278663 | 648 | |
lilac0112_1 | 1:e3248f278663 | 649 | |
lilac0112_1 | 0:d35efbf4d62e | 650 | |
lilac0112_1 | 0:d35efbf4d62e | 651 | PingReceiveFB(ping); |
lilac0112_1 | 0:d35efbf4d62e | 652 | if(ping[1] >=60){//後ろからの距離60cm |
lilac0112_1 | 0:d35efbf4d62e | 653 | while(ping[1] >=60){ |
lilac0112_1 | 0:d35efbf4d62e | 654 | move(-20,-20); |
lilac0112_1 | 0:d35efbf4d62e | 655 | PingReceiveFB(ping); |
lilac0112_1 | 0:d35efbf4d62e | 656 | } |
lilac0112_1 | 0:d35efbf4d62e | 657 | } |
lilac0112_1 | 0:d35efbf4d62e | 658 | |
lilac0112_1 | 0:d35efbf4d62e | 659 | move(0,0);//stop |
lilac0112_1 | 0:d35efbf4d62e | 660 | |
lilac0112_1 | 0:d35efbf4d62e | 661 | } |
lilac0112_1 | 0:d35efbf4d62e | 662 | /*モーター駆動処理↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ |
lilac0112_1 | 0:d35efbf4d62e | 663 | |
lilac0112_1 | 0:d35efbf4d62e | 664 | uint8_t SwRead(){ |
lilac0112_1 | 0:d35efbf4d62e | 665 | /****** |
lilac0112_1 | 0:d35efbf4d62e | 666 | *返却値はスイッチの状況 |
lilac0112_1 | 0:d35efbf4d62e | 667 | *参照元::aaaaa |
lilac0112_1 | 0:d35efbf4d62e | 668 | * |
lilac0112_1 | 0:d35efbf4d62e | 669 | *Calibration = 0x01; |
lilac0112_1 | 0:d35efbf4d62e | 670 | *Kicker = 0x02; |
lilac0112_1 | 0:d35efbf4d62e | 671 | *Debug1 = 0x04; |
lilac0112_1 | 0:d35efbf4d62e | 672 | *Debug2 = 0x08; |
lilac0112_1 | 0:d35efbf4d62e | 673 | *StartS = 0x10; |
lilac0112_1 | 0:d35efbf4d62e | 674 | * |
lilac0112_1 | 0:d35efbf4d62e | 675 | *****/ |
lilac0112_1 | 0:d35efbf4d62e | 676 | uint8_t i,temp,temp2; |
lilac0112_1 | 0:d35efbf4d62e | 677 | temp = Sw; |
lilac0112_1 | 0:d35efbf4d62e | 678 | if(!(temp == Calibration |
lilac0112_1 | 0:d35efbf4d62e | 679 | ||temp == Kicker |
lilac0112_1 | 0:d35efbf4d62e | 680 | ||temp == Debug1 |
lilac0112_1 | 0:d35efbf4d62e | 681 | ||temp == Debug2 |
lilac0112_1 | 0:d35efbf4d62e | 682 | ||temp == StartS)) return 0;/*スイッチは押されていない状況*/ |
lilac0112_1 | 0:d35efbf4d62e | 683 | if(temp !=0x00){ |
lilac0112_1 | 0:d35efbf4d62e | 684 | for(i = 0; i < 50; i++); |
lilac0112_1 | 0:d35efbf4d62e | 685 | temp2 = Sw; |
lilac0112_1 | 0:d35efbf4d62e | 686 | if(temp == temp2){ |
lilac0112_1 | 0:d35efbf4d62e | 687 | return temp; |
lilac0112_1 | 0:d35efbf4d62e | 688 | } |
lilac0112_1 | 0:d35efbf4d62e | 689 | } |
lilac0112_1 | 0:d35efbf4d62e | 690 | return 0; |
lilac0112_1 | 0:d35efbf4d62e | 691 | } |
lilac0112_1 | 0:d35efbf4d62e | 692 | |
lilac0112_1 | 0:d35efbf4d62e | 693 | //通信(モータ用) |
lilac0112_1 | 0:d35efbf4d62e | 694 | void tx_motor(){ |
lilac0112_1 | 0:d35efbf4d62e | 695 | array(speed[0],speed[1],speed[3],speed[2]); |
lilac0112_1 | 0:d35efbf4d62e | 696 | Motor.printf("%s",StringFIN.c_str()); |
lilac0112_1 | 0:d35efbf4d62e | 697 | } |
lilac0112_1 | 0:d35efbf4d62e | 698 | |
lilac0112_1 | 0:d35efbf4d62e | 699 | void SetUp(int *compass_def){ |
lilac0112_1 | 0:d35efbf4d62e | 700 | /*初期化*/ |
lilac0112_1 | 0:d35efbf4d62e | 701 | Kick = 0; |
lilac0112_1 | 0:d35efbf4d62e | 702 | Sw.mode(PullUp); |
lilac0112_1 | 0:d35efbf4d62e | 703 | Motor.baud(115200); //ボーレート設定 |
lilac0112_1 | 0:d35efbf4d62e | 704 | Motor.printf("1F0002F0003F0004F000\r\n"); //モータ停止 |
lilac0112_1 | 0:d35efbf4d62e | 705 | Motor.attach(&tx_motor,Serial::TxIrq); //送信空き割り込み(モータ用) |
lilac0112_1 | 1:e3248f278663 | 706 | //move(0,0);//停止 |
lilac0112_1 | 0:d35efbf4d62e | 707 | |
lilac0112_1 | 0:d35efbf4d62e | 708 | //Step.Resets(); |
lilac0112_1 | 0:d35efbf4d62e | 709 | //Step.ReleseSW(0,1); |
lilac0112_1 | 0:d35efbf4d62e | 710 | |
lilac0112_1 | 1:e3248f278663 | 711 | Servo.calibrate(0.0006, 120.0); |
lilac0112_1 | 0:d35efbf4d62e | 712 | Servo.position(HOME);//タイヤを前に向ける |
lilac0112_1 | 0:d35efbf4d62e | 713 | |
lilac0112_1 | 1:e3248f278663 | 714 | /* |
lilac0112_1 | 0:d35efbf4d62e | 715 | hmc6352.setOpMode(HMC6352_CONTINUOUS, 1, 20); |
lilac0112_1 | 0:d35efbf4d62e | 716 | *compass_def = (hmc6352.sample() / 10); |
lilac0112_1 | 0:d35efbf4d62e | 717 | |
lilac0112_1 | 0:d35efbf4d62e | 718 | Lcd.cls(); |
lilac0112_1 | 1:e3248f278663 | 719 | */ |
lilac0112_1 | 0:d35efbf4d62e | 720 | /*初期化終了*/ |
lilac0112_1 | 0:d35efbf4d62e | 721 | |
lilac0112_1 | 0:d35efbf4d62e | 722 | |
lilac0112_1 | 0:d35efbf4d62e | 723 | } |
lilac0112_1 | 0:d35efbf4d62e | 724 | void StartLoop(){ |
lilac0112_1 | 0:d35efbf4d62e | 725 | /* |
lilac0112_1 | 0:d35efbf4d62e | 726 | *スイッチが押されるまでロボットはスタートしない. |
lilac0112_1 | 0:d35efbf4d62e | 727 | * |
lilac0112_1 | 0:d35efbf4d62e | 728 | *待っている間にほかのスイッチが押された場合は押されている間その動作をする等. |
lilac0112_1 | 0:d35efbf4d62e | 729 | * |
lilac0112_1 | 0:d35efbf4d62e | 730 | *switch割り当て |
lilac0112_1 | 0:d35efbf4d62e | 731 | *1.コンパスのキャリブレーション実行スイッチ |
lilac0112_1 | 0:d35efbf4d62e | 732 | *2.キッカーのキック(check用) |
lilac0112_1 | 0:d35efbf4d62e | 733 | *3,4.自由 |
lilac0112_1 | 0:d35efbf4d62e | 734 | *5.StartSw |
lilac0112_1 | 0:d35efbf4d62e | 735 | */ |
lilac0112_1 | 0:d35efbf4d62e | 736 | uint8_t State = 0; |
lilac0112_1 | 0:d35efbf4d62e | 737 | |
lilac0112_1 | 0:d35efbf4d62e | 738 | while(1){ |
lilac0112_1 | 0:d35efbf4d62e | 739 | |
lilac0112_1 | 0:d35efbf4d62e | 740 | State = SwRead(); |
lilac0112_1 | 0:d35efbf4d62e | 741 | if(State == 0) continue; |
lilac0112_1 | 0:d35efbf4d62e | 742 | |
lilac0112_1 | 0:d35efbf4d62e | 743 | if(State == Calibration){ |
lilac0112_1 | 0:d35efbf4d62e | 744 | /*calibration command enter... |
lilac0112_1 | 0:d35efbf4d62e | 745 | * |
lilac0112_1 | 0:d35efbf4d62e | 746 | * |
lilac0112_1 | 0:d35efbf4d62e | 747 | */ |
lilac0112_1 | 0:d35efbf4d62e | 748 | continue; |
lilac0112_1 | 0:d35efbf4d62e | 749 | } |
lilac0112_1 | 0:d35efbf4d62e | 750 | if(State == Kicker){ |
lilac0112_1 | 0:d35efbf4d62e | 751 | /* |
lilac0112_1 | 0:d35efbf4d62e | 752 | *kicker check |
lilac0112_1 | 0:d35efbf4d62e | 753 | * |
lilac0112_1 | 0:d35efbf4d62e | 754 | * |
lilac0112_1 | 0:d35efbf4d62e | 755 | */ |
lilac0112_1 | 0:d35efbf4d62e | 756 | continue; |
lilac0112_1 | 0:d35efbf4d62e | 757 | } |
lilac0112_1 | 0:d35efbf4d62e | 758 | if(State == Debug1){ |
lilac0112_1 | 0:d35efbf4d62e | 759 | /* debug command free |
lilac0112_1 | 0:d35efbf4d62e | 760 | * |
lilac0112_1 | 0:d35efbf4d62e | 761 | *display out to selected 3 menus. compass, ir, ping, line,etc... |
lilac0112_1 | 0:d35efbf4d62e | 762 | * |
lilac0112_1 | 0:d35efbf4d62e | 763 | **/ |
lilac0112_1 | 0:d35efbf4d62e | 764 | |
lilac0112_1 | 0:d35efbf4d62e | 765 | } |
lilac0112_1 | 0:d35efbf4d62e | 766 | if(State == Debug2){ |
lilac0112_1 | 0:d35efbf4d62e | 767 | /* debug command free |
lilac0112_1 | 0:d35efbf4d62e | 768 | * |
lilac0112_1 | 0:d35efbf4d62e | 769 | * decide movement of the beginning. |
lilac0112_1 | 0:d35efbf4d62e | 770 | * |
lilac0112_1 | 0:d35efbf4d62e | 771 | * |
lilac0112_1 | 0:d35efbf4d62e | 772 | **/ |
lilac0112_1 | 0:d35efbf4d62e | 773 | |
lilac0112_1 | 0:d35efbf4d62e | 774 | } |
lilac0112_1 | 0:d35efbf4d62e | 775 | if(State == StartS){ |
lilac0112_1 | 0:d35efbf4d62e | 776 | /*game start...*/ |
lilac0112_1 | 0:d35efbf4d62e | 777 | return; |
lilac0112_1 | 0:d35efbf4d62e | 778 | } |
lilac0112_1 | 0:d35efbf4d62e | 779 | |
lilac0112_1 | 0:d35efbf4d62e | 780 | } |
lilac0112_1 | 0:d35efbf4d62e | 781 | |
lilac0112_1 | 0:d35efbf4d62e | 782 | } |
lilac0112_1 | 1:e3248f278663 | 783 | |
lilac0112_1 | 1:e3248f278663 | 784 | |
lilac0112_1 | 1:e3248f278663 | 785 | void ClockPointing(int to_st, int power){ |
lilac0112_1 | 1:e3248f278663 | 786 | |
lilac0112_1 | 1:e3248f278663 | 787 | /* |
lilac0112_1 | 1:e3248f278663 | 788 | to_st 時計において何時の方向にサーボを動かしたいか |
lilac0112_1 | 1:e3248f278663 | 789 | power タイヤのモータのパワー.絶対値. |
lilac0112_1 | 1:e3248f278663 | 790 | |
lilac0112_1 | 1:e3248f278663 | 791 | from_stで現在のサーボ状態保存.(初期がHOMEであること前提) |
lilac0112_1 | 1:e3248f278663 | 792 | これを利用して,3時⇔9時の移動のみサーボを動かさずにタイヤの駆動方向の反転のみで状態遷移可能. |
lilac0112_1 | 1:e3248f278663 | 793 | |
lilac0112_1 | 1:e3248f278663 | 794 | 改善の余地としてはワンショットタイマーを加えて |
lilac0112_1 | 1:e3248f278663 | 795 | 割り込み関数が作動するまでサーボ駆動時のタイヤの高出力を控え, |
lilac0112_1 | 1:e3248f278663 | 796 | 割り込み関数で引数の通りの出力でタイヤを駆動するというものがある. |
lilac0112_1 | 1:e3248f278663 | 797 | しかし場合によってはサーボの移動距離が短いときネックになることがある. |
lilac0112_1 | 1:e3248f278663 | 798 | 使うときはサーボの移動距離に応じて処理を変えるなどの工夫が必要になる. |
lilac0112_1 | 1:e3248f278663 | 799 | */ |
lilac0112_1 | 1:e3248f278663 | 800 | static int from_st = TWELFTH; |
lilac0112_1 | 1:e3248f278663 | 801 | static int qb=0; |
lilac0112_1 | 1:e3248f278663 | 802 | |
lilac0112_1 | 1:e3248f278663 | 803 | int TireDir[] = {1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1};//1時、2時、3時、4時…12時//タイヤの駆動方向 |
lilac0112_1 | 1:e3248f278663 | 804 | float ClockDir[]={ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE};//サーボの方向 |
lilac0112_1 | 1:e3248f278663 | 805 | |
lilac0112_1 | 1:e3248f278663 | 806 | //想定外の引数が来た時の対処 |
lilac0112_1 | 1:e3248f278663 | 807 | if( |
lilac0112_1 | 1:e3248f278663 | 808 | (to_st > TWELFTH) |
lilac0112_1 | 1:e3248f278663 | 809 | || (to_st < FIRST) |
lilac0112_1 | 1:e3248f278663 | 810 | |
lilac0112_1 | 1:e3248f278663 | 811 | || (from_st > TWELFTH) |
lilac0112_1 | 1:e3248f278663 | 812 | || (from_st < FIRST) |
lilac0112_1 | 1:e3248f278663 | 813 | |
lilac0112_1 | 1:e3248f278663 | 814 | ) return; |
lilac0112_1 | 1:e3248f278663 | 815 | |
lilac0112_1 | 1:e3248f278663 | 816 | |
lilac0112_1 | 1:e3248f278663 | 817 | if( |
lilac0112_1 | 1:e3248f278663 | 818 | (from_st == THIRD || from_st == NINTH) |
lilac0112_1 | 1:e3248f278663 | 819 | && (to_st == THIRD || to_st == NINTH) |
lilac0112_1 | 1:e3248f278663 | 820 | && (from_st != to_st) |
lilac0112_1 | 1:e3248f278663 | 821 | ){ |
lilac0112_1 | 1:e3248f278663 | 822 | qb = !qb; |
lilac0112_1 | 1:e3248f278663 | 823 | if(qb) for(int i=0; i<12; i++) TireDir[i] = TireDir[i]*(-1);//タイヤの駆動方向反転 |
lilac0112_1 | 1:e3248f278663 | 824 | } |
lilac0112_1 | 1:e3248f278663 | 825 | else{ |
lilac0112_1 | 1:e3248f278663 | 826 | qb=0; |
lilac0112_1 | 1:e3248f278663 | 827 | Servo.position(ClockDir[to_st]);//サーボの方向転換 |
lilac0112_1 | 1:e3248f278663 | 828 | } |
lilac0112_1 | 1:e3248f278663 | 829 | |
lilac0112_1 | 1:e3248f278663 | 830 | move(abs(power)*TireDir[to_st], abs(power)*TireDir[to_st]);//タイヤの出力 |
lilac0112_1 | 1:e3248f278663 | 831 | |
lilac0112_1 | 1:e3248f278663 | 832 | from_st = to_st;//状態(サーボの)のプログラム上の遷移 |
lilac0112_1 | 1:e3248f278663 | 833 | |
lilac0112_1 | 1:e3248f278663 | 834 | } |
lilac0112_1 | 1:e3248f278663 | 835 | |
lilac0112_1 | 0:d35efbf4d62e | 836 | int main() { |
lilac0112_1 | 0:d35efbf4d62e | 837 | |
lilac0112_1 | 0:d35efbf4d62e | 838 | /*Ir*/ |
lilac0112_1 | 1:e3248f278663 | 839 | //uint8_t IrNum;//場所によるirの数を表したもの0~11まではボールがある状態12はボールがない状態 |
lilac0112_1 | 1:e3248f278663 | 840 | //→global変数 |
lilac0112_1 | 0:d35efbf4d62e | 841 | |
lilac0112_1 | 0:d35efbf4d62e | 842 | /*Line*/ |
lilac0112_1 | 0:d35efbf4d62e | 843 | uint8_t Line; |
lilac0112_1 | 0:d35efbf4d62e | 844 | |
lilac0112_1 | 0:d35efbf4d62e | 845 | /*Compass*/ |
lilac0112_1 | 0:d35efbf4d62e | 846 | int CompassDef = 0, Compass = 0; |
lilac0112_1 | 0:d35efbf4d62e | 847 | |
lilac0112_1 | 0:d35efbf4d62e | 848 | /*State */ |
lilac0112_1 | 0:d35efbf4d62e | 849 | //Direction LineIr = NA;//方位設定奴...エラーでてめんどくさいので後でまたやることにする。 |
lilac0112_1 | 0:d35efbf4d62e | 850 | uint8_t LineIr = NA; |
lilac0112_1 | 0:d35efbf4d62e | 851 | |
lilac0112_1 | 0:d35efbf4d62e | 852 | |
lilac0112_1 | 0:d35efbf4d62e | 853 | |
lilac0112_1 | 0:d35efbf4d62e | 854 | /*関数ポインタ*/ |
lilac0112_1 | 0:d35efbf4d62e | 855 | void (*ControlRobo[13])(int *);//irの位置による分岐 |
lilac0112_1 | 0:d35efbf4d62e | 856 | ControlRobo[0] = ControlRobo0; |
lilac0112_1 | 0:d35efbf4d62e | 857 | ControlRobo[1] = ControlRobo1; |
lilac0112_1 | 0:d35efbf4d62e | 858 | ControlRobo[2] = ControlRobo2; |
lilac0112_1 | 0:d35efbf4d62e | 859 | ControlRobo[3] = ControlRobo3; |
lilac0112_1 | 0:d35efbf4d62e | 860 | ControlRobo[4] = ControlRobo4; |
lilac0112_1 | 0:d35efbf4d62e | 861 | ControlRobo[5] = ControlRobo5; |
lilac0112_1 | 0:d35efbf4d62e | 862 | ControlRobo[6] = ControlRobo6; |
lilac0112_1 | 0:d35efbf4d62e | 863 | ControlRobo[7] = ControlRobo7; |
lilac0112_1 | 0:d35efbf4d62e | 864 | ControlRobo[8] = ControlRobo8; |
lilac0112_1 | 0:d35efbf4d62e | 865 | ControlRobo[9] = ControlRobo9; |
lilac0112_1 | 0:d35efbf4d62e | 866 | ControlRobo[10] = ControlRobo10; |
lilac0112_1 | 0:d35efbf4d62e | 867 | ControlRobo[11] = ControlRobo11; |
lilac0112_1 | 0:d35efbf4d62e | 868 | ControlRobo[12] = GoHome; |
lilac0112_1 | 0:d35efbf4d62e | 869 | |
lilac0112_1 | 0:d35efbf4d62e | 870 | |
lilac0112_1 | 0:d35efbf4d62e | 871 | SetUp(&CompassDef);/*set up routine*/ |
lilac0112_1 | 0:d35efbf4d62e | 872 | |
lilac0112_1 | 1:e3248f278663 | 873 | //StartLoop(); /*loop stat, switch push end*/ |
lilac0112_1 | 0:d35efbf4d62e | 874 | |
lilac0112_1 | 0:d35efbf4d62e | 875 | /* |
lilac0112_1 | 0:d35efbf4d62e | 876 | 前を向くように設定をするべき |
lilac0112_1 | 0:d35efbf4d62e | 877 | アウトオブバウンズからの復帰時に反対を向けてスタートなので必要。 |
lilac0112_1 | 0:d35efbf4d62e | 878 | */ |
lilac0112_1 | 1:e3248f278663 | 879 | while(0){//前を向かせるwhile |
lilac0112_1 | 0:d35efbf4d62e | 880 | Compass = ((hmc6352.sample() / 10) + 540 - CompassDef) % 360; |
lilac0112_1 | 0:d35efbf4d62e | 881 | if(Compass == 3) break;//前を向いたら抜ける。 |
lilac0112_1 | 0:d35efbf4d62e | 882 | } |
lilac0112_1 | 0:d35efbf4d62e | 883 | while(0) { |
lilac0112_1 | 0:d35efbf4d62e | 884 | |
lilac0112_1 | 0:d35efbf4d62e | 885 | Line = LineReceive(); |
lilac0112_1 | 0:d35efbf4d62e | 886 | |
lilac0112_1 | 0:d35efbf4d62e | 887 | if(Line){ //ラインを検知していないか |
lilac0112_1 | 0:d35efbf4d62e | 888 | LineIr = Line & (IrReceiveS()/3 + 1);//計(lineとirの方位を合わせる。 |
lilac0112_1 | 0:d35efbf4d62e | 889 | while(LineIr){ |
lilac0112_1 | 0:d35efbf4d62e | 890 | move(0,0);// |
lilac0112_1 | 0:d35efbf4d62e | 891 | Led[1] = Led[2] = Led[3] = 1; |
lilac0112_1 | 0:d35efbf4d62e | 892 | |
lilac0112_1 | 0:d35efbf4d62e | 893 | LineIr = LineReceive() & (IrReceiveS()/3 + 1); |
lilac0112_1 | 0:d35efbf4d62e | 894 | } |
lilac0112_1 | 0:d35efbf4d62e | 895 | Led[1] = Led[2] = Led[3] = 0; |
lilac0112_1 | 0:d35efbf4d62e | 896 | continue; |
lilac0112_1 | 0:d35efbf4d62e | 897 | |
lilac0112_1 | 0:d35efbf4d62e | 898 | } |
lilac0112_1 | 0:d35efbf4d62e | 899 | |
lilac0112_1 | 0:d35efbf4d62e | 900 | |
lilac0112_1 | 0:d35efbf4d62e | 901 | IrNum = IrReceiveS(); |
lilac0112_1 | 0:d35efbf4d62e | 902 | |
lilac0112_1 | 0:d35efbf4d62e | 903 | (*ControlRobo[IrNum])(&CompassDef);//irの位置によったループ等の処理に移る。 |
lilac0112_1 | 0:d35efbf4d62e | 904 | |
lilac0112_1 | 0:d35efbf4d62e | 905 | //wait_ms(0); |
lilac0112_1 | 0:d35efbf4d62e | 906 | } |
lilac0112_1 | 0:d35efbf4d62e | 907 | |
lilac0112_1 | 1:e3248f278663 | 908 | |
lilac0112_1 | 1:e3248f278663 | 909 | move(0,0); |
lilac0112_1 | 1:e3248f278663 | 910 | Servo.position(HOME); |
lilac0112_1 | 1:e3248f278663 | 911 | uint8_t clock[]={TWELFTH, THIRD, SIXTH, NINTH}; |
lilac0112_1 | 1:e3248f278663 | 912 | uint8_t clock2[]={FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH, TENTH, ELEVENTH, TWELFTH}; |
lilac0112_1 | 1:e3248f278663 | 913 | Servo.position(HOME); |
lilac0112_1 | 0:d35efbf4d62e | 914 | while(1){ |
lilac0112_1 | 0:d35efbf4d62e | 915 | |
lilac0112_1 | 0:d35efbf4d62e | 916 | |
lilac0112_1 | 1:e3248f278663 | 917 | /*デモプログラム |
lilac0112_1 | 1:e3248f278663 | 918 | * |
lilac0112_1 | 1:e3248f278663 | 919 | *正方形の軌道 |
lilac0112_1 | 1:e3248f278663 | 920 | * |
lilac0112_1 | 1:e3248f278663 | 921 | *円軌道 |
lilac0112_1 | 1:e3248f278663 | 922 | * |
lilac0112_1 | 1:e3248f278663 | 923 | *反復横跳び |
lilac0112_1 | 1:e3248f278663 | 924 | * |
lilac0112_1 | 1:e3248f278663 | 925 | *関数ClockPointingを活用することで少しだけ楽に以上の動きを実現できる. |
lilac0112_1 | 1:e3248f278663 | 926 | */ |
lilac0112_1 | 1:e3248f278663 | 927 | for(int i=0; i < 4; i++){ |
lilac0112_1 | 1:e3248f278663 | 928 | |
lilac0112_1 | 1:e3248f278663 | 929 | ClockPointing(clock[i], 20); |
lilac0112_1 | 1:e3248f278663 | 930 | |
lilac0112_1 | 1:e3248f278663 | 931 | wait(2); |
lilac0112_1 | 1:e3248f278663 | 932 | |
lilac0112_1 | 1:e3248f278663 | 933 | } |
lilac0112_1 | 0:d35efbf4d62e | 934 | |
lilac0112_1 | 1:e3248f278663 | 935 | for(int i=0; i < 12; i++){ |
lilac0112_1 | 1:e3248f278663 | 936 | |
lilac0112_1 | 1:e3248f278663 | 937 | ClockPointing(clock2[i], 20); |
lilac0112_1 | 1:e3248f278663 | 938 | |
lilac0112_1 | 1:e3248f278663 | 939 | wait(1); |
lilac0112_1 | 1:e3248f278663 | 940 | |
lilac0112_1 | 1:e3248f278663 | 941 | } |
lilac0112_1 | 1:e3248f278663 | 942 | |
lilac0112_1 | 1:e3248f278663 | 943 | for(int i=0; i < 4; i++){ |
lilac0112_1 | 1:e3248f278663 | 944 | |
lilac0112_1 | 1:e3248f278663 | 945 | ClockPointing(THIRD, 20); |
lilac0112_1 | 1:e3248f278663 | 946 | |
lilac0112_1 | 1:e3248f278663 | 947 | wait(2); |
lilac0112_1 | 1:e3248f278663 | 948 | |
lilac0112_1 | 1:e3248f278663 | 949 | ClockPointing(NINTH, 20); |
lilac0112_1 | 1:e3248f278663 | 950 | |
lilac0112_1 | 1:e3248f278663 | 951 | wait(2); |
lilac0112_1 | 1:e3248f278663 | 952 | } |
lilac0112_1 | 1:e3248f278663 | 953 | |
lilac0112_1 | 0:d35efbf4d62e | 954 | } |
lilac0112_1 | 0:d35efbf4d62e | 955 | |
lilac0112_1 | 0:d35efbf4d62e | 956 | } |