CatPot 2015-2016 / Mbed 2 deprecated CatPot_Main_F

Dependencies:   AQM0802A HMC6352 L6470_lib PID mbed

Fork of CatPot_Main_ver1 by CatPot 2015-2016

Committer:
ryuna
Date:
Mon Dec 29 07:24:37 2014 +0000
Revision:
4:8444360f08e2
Parent:
3:8d718ddb84c9
Child:
5:3d68334aab20
add etc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryuna 0:ae08e2e1d82d 1 /***********************************
ryuna 0:ae08e2e1d82d 2 *RoboCupJunior Soccer B Open 2014
ryuna 0:ae08e2e1d82d 3 *Koshinestu progrum
ryuna 0:ae08e2e1d82d 4 *
ryuna 0:ae08e2e1d82d 5 *このプログラムでは以下の処理をする.
ryuna 0:ae08e2e1d82d 6 * LPC1114FN28/102からI2Cを用いて各種センサデータを収集
ryuna 0:ae08e2e1d82d 7 * 
ryuna 0:ae08e2e1d82d 8 * データからロボットの移動やキッカー等のモータの動作を決定する処理を行う
ryuna 0:ae08e2e1d82d 9 *
ryuna 1:7d4921b5d638 10 * MotorDriverにmaxonに命令
ryuna 0:ae08e2e1d82d 11 * 
ryuna 0:ae08e2e1d82d 12 * SteppingMotorDriverにステアリング命令
ryuna 0:ae08e2e1d82d 13 * 
ryuna 0:ae08e2e1d82d 14 * LCDでデバック
ryuna 0:ae08e2e1d82d 15 *
ryuna 0:ae08e2e1d82d 16 * スイッチ4つとスタートスイッチで処理を実行
ryuna 1:7d4921b5d638 17 *
ryuna 1:7d4921b5d638 18 * キッカーのスイッチがどこかに入る
ryuna 0:ae08e2e1d82d 19 *
ryuna 0:ae08e2e1d82d 20 *************************
ryuna 0:ae08e2e1d82d 21 *
ryuna 0:ae08e2e1d82d 22 *Pin Map
ryuna 0:ae08e2e1d82d 23 *
ryuna 1:7d4921b5d638 24 * p5,p6,p7,p29,p30 >> SPI >>Stepping
ryuna 0:ae08e2e1d82d 25 *
ryuna 0:ae08e2e1d82d 26 * p9,p10 >> I2C orSerial >> LPC1114FN28/102 read
ryuna 0:ae08e2e1d82d 27 *
ryuna 0:ae08e2e1d82d 28 * p13,p14 >> Serial >> Motor
ryuna 0:ae08e2e1d82d 29 *
ryuna 0:ae08e2e1d82d 30 * p22~p26 >> DebugSw and StartSw
ryuna 0:ae08e2e1d82d 31 *
ryuna 0:ae08e2e1d82d 32 * p27,p28 >> I2C >> DebugLCD
ryuna 0:ae08e2e1d82d 33 *
ryuna 0:ae08e2e1d82d 34 *
ryuna 0:ae08e2e1d82d 35 *
ryuna 0:ae08e2e1d82d 36 ******************************/
ryuna 0:ae08e2e1d82d 37
ryuna 2:054444aa1990 38
ryuna 2:054444aa1990 39 /*
ryuna 2:054444aa1990 40
ryuna 2:054444aa1990 41 ****以下IRはNighは距離が近いものとする.
ryuna 2:054444aa1990 42
ryuna 2:054444aa1990 43 */
ryuna 2:054444aa1990 44
ryuna 2:054444aa1990 45
ryuna 2:054444aa1990 46
ryuna 2:054444aa1990 47
ryuna 2:054444aa1990 48
ryuna 2:054444aa1990 49
ryuna 0:ae08e2e1d82d 50 #include "mbed.h"
ryuna 0:ae08e2e1d82d 51 #include "L6470.h"
ryuna 0:ae08e2e1d82d 52 #include "PID.h"
ryuna 0:ae08e2e1d82d 53 #include "AQM0802A.h"
ryuna 3:8d718ddb84c9 54 #include "HMC6352.h"
ryuna 0:ae08e2e1d82d 55 #include <math.h>
ryuna 0:ae08e2e1d82d 56 #include <sstream>
ryuna 0:ae08e2e1d82d 57
ryuna 4:8444360f08e2 58 /*回り込みの計算用*/
ryuna 4:8444360f08e2 59 #define PI 3.141593/*割と早めにきってある*/
ryuna 4:8444360f08e2 60 #define SHORT_LEN 15 /*cm換算 楕円のB辺の長さを定義しておく*/
ryuna 4:8444360f08e2 61
ryuna 2:054444aa1990 62 #define ADDRESS_R 0xA0
ryuna 2:054444aa1990 63 #define ADDRESS_L 0xC0
ryuna 2:054444aa1990 64
ryuna 4:8444360f08e2 65 /*BusIn sw 入力値*/
ryuna 4:8444360f08e2 66 #define Calibration 0x01
ryuna 4:8444360f08e2 67 #define Kicker 0x02
ryuna 4:8444360f08e2 68 #define Debug1 0x04
ryuna 4:8444360f08e2 69 #define Debug2 0x08
ryuna 4:8444360f08e2 70 #define StartS 0x10
ryuna 4:8444360f08e2 71
ryuna 3:8d718ddb84c9 72 #define READ_IR 0x01 //送る物指定
ryuna 3:8d718ddb84c9 73 #define READ_PING 0x02
ryuna 3:8d718ddb84c9 74
ryuna 2:054444aa1990 75
ryuna 4:8444360f08e2 76
ryuna 4:8444360f08e2 77 BusIn Sw(p22,p23,p24,p25,p26);
ryuna 1:7d4921b5d638 78 DigitalOut Led[4] = {LED1,LED2,LED3,LED4};
ryuna 0:ae08e2e1d82d 79
ryuna 1:7d4921b5d638 80 I2C Sensor(p9,p10);//sda,scl
ryuna 3:8d718ddb84c9 81 HMC6352 hmc6352(p9,p10);
ryuna 1:7d4921b5d638 82 AQM0802A Lcd(p28,p27);//sda,scl
ryuna 1:7d4921b5d638 83 L6470 Step(p5,p6,p7,p29,p30);//mosi,miso,sck,#cs,busy(PullUp)
ryuna 1:7d4921b5d638 84 Serial Motor(p13,p14);//tx,rx
ryuna 1:7d4921b5d638 85 Serial pc(USBTX,USBRX);
ryuna 0:ae08e2e1d82d 86
ryuna 3:8d718ddb84c9 87 DigitalOut Kick(p21);
ryuna 0:ae08e2e1d82d 88
ryuna 0:ae08e2e1d82d 89 extern string StringFIN;
ryuna 0:ae08e2e1d82d 90 extern void array(int,int,int,int);
ryuna 0:ae08e2e1d82d 91
ryuna 0:ae08e2e1d82d 92 int speed[4] = {0};
ryuna 0:ae08e2e1d82d 93
ryuna 3:8d718ddb84c9 94 typedef enum {FRONT = 1, RIGHT, BACK, LEFT, NA} Direction;
ryuna 0:ae08e2e1d82d 95
ryuna 3:8d718ddb84c9 96
ryuna 4:8444360f08e2 97 unsigned int IrReceiveR(){
ryuna 3:8d718ddb84c9 98 /*順位解析版
ryuna 2:054444aa1990 99 Slave側はIRを要求した場合IRのみを返してくるとする.
ryuna 2:054444aa1990 100 irは値が大きいほうが近いと仮定する
ryuna 2:054444aa1990 101
ryuna 2:054444aa1990 102
ryuna 2:054444aa1990 103 */
ryuna 3:8d718ddb84c9 104 char data_r[3],data_l[3];
ryuna 2:054444aa1990 105 bool val;
ryuna 2:054444aa1990 106 Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか
ryuna 2:054444aa1990 107
ryuna 3:8d718ddb84c9 108 val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信
ryuna 2:054444aa1990 109 Led[0] = val;
ryuna 2:054444aa1990 110 wait_ms(5);
ryuna 3:8d718ddb84c9 111 val = Sensor.read(ADDRESS_L|1, data_l, 3);
ryuna 2:054444aa1990 112 Led[0] = !val;
ryuna 2:054444aa1990 113
ryuna 2:054444aa1990 114 if(data_r[2]>data_l[2]){
ryuna 2:054444aa1990 115 if(data_r[2]>data_l[1]){
ryuna 3:8d718ddb84c9 116 return data_r[0]/6*12*12 + (data_r[0]%6)*12 + data_l[0]/6+6;
ryuna 2:054444aa1990 117 }else{
ryuna 3:8d718ddb84c9 118 return data_r[0]/6*12*12 +(data_l[0]/6+6)*12+ data_r[0]%6;
ryuna 2:054444aa1990 119 }
ryuna 2:054444aa1990 120 }else{
ryuna 2:054444aa1990 121 if(data_l[2]>data_r[1]){
ryuna 3:8d718ddb84c9 122 return (data_l[0]/6+6)*12*12 + (data_l[0]%6+6)*12 + data_r[0]/6;
ryuna 2:054444aa1990 123 }else{
ryuna 3:8d718ddb84c9 124 return (data_l[0]/6+6)*12*12 +(data_r[0]/6)*12+ (data_l[0]%6+6);
ryuna 2:054444aa1990 125 }
ryuna 2:054444aa1990 126
ryuna 2:054444aa1990 127 }
ryuna 2:054444aa1990 128
ryuna 2:054444aa1990 129 }
ryuna 2:054444aa1990 130
ryuna 3:8d718ddb84c9 131 uint8_t IrReceiveS(){
ryuna 3:8d718ddb84c9 132 /*単純解析版 一番大きい位置だけ返す
ryuna 3:8d718ddb84c9 133
ryuna 3:8d718ddb84c9 134 Slave側はIRを要求した場合IRのみを返してくるとする.
ryuna 3:8d718ddb84c9 135 irは値が大きいほうが近いと仮定する
ryuna 3:8d718ddb84c9 136
ryuna 3:8d718ddb84c9 137
ryuna 3:8d718ddb84c9 138 */
ryuna 3:8d718ddb84c9 139 char data_r[3],data_l[3];
ryuna 3:8d718ddb84c9 140 bool val;
ryuna 3:8d718ddb84c9 141 Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか
ryuna 3:8d718ddb84c9 142
ryuna 3:8d718ddb84c9 143 val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信
ryuna 3:8d718ddb84c9 144 Led[0] = val;
ryuna 3:8d718ddb84c9 145 wait_ms(5);
ryuna 3:8d718ddb84c9 146 val = Sensor.read(ADDRESS_L|1, data_l, 3);
ryuna 3:8d718ddb84c9 147 Led[0] = !val;
ryuna 3:8d718ddb84c9 148
ryuna 3:8d718ddb84c9 149 if(data_r[2]>data_l[2]){
ryuna 3:8d718ddb84c9 150 return data_r[0]/6;
ryuna 3:8d718ddb84c9 151
ryuna 3:8d718ddb84c9 152 }else{
ryuna 3:8d718ddb84c9 153 return data_l[0]/6+6;
ryuna 3:8d718ddb84c9 154 }
ryuna 3:8d718ddb84c9 155
ryuna 3:8d718ddb84c9 156 }
ryuna 3:8d718ddb84c9 157 uint8_t IrReceiveM(){
ryuna 3:8d718ddb84c9 158 /*値解析版 一番大きい場所の値を返す(位置はとりあえずない)
ryuna 3:8d718ddb84c9 159 Slave側はIRを要求した場合IRのみを返してくるとする.
ryuna 3:8d718ddb84c9 160 irは値が大きいほうが近いと仮定する
ryuna 3:8d718ddb84c9 161
ryuna 3:8d718ddb84c9 162
ryuna 3:8d718ddb84c9 163 */
ryuna 3:8d718ddb84c9 164 char data_r[3],data_l[3];
ryuna 3:8d718ddb84c9 165 bool val;
ryuna 3:8d718ddb84c9 166 Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか
ryuna 3:8d718ddb84c9 167
ryuna 3:8d718ddb84c9 168 val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信
ryuna 3:8d718ddb84c9 169 Led[0] = val;
ryuna 3:8d718ddb84c9 170 wait_ms(5);
ryuna 3:8d718ddb84c9 171 val = Sensor.read(ADDRESS_L|1, data_l, 3);
ryuna 3:8d718ddb84c9 172 Led[0] = !val;
ryuna 3:8d718ddb84c9 173
ryuna 3:8d718ddb84c9 174 if(data_r[2]>data_l[2]){
ryuna 3:8d718ddb84c9 175 return data_r[1];
ryuna 3:8d718ddb84c9 176
ryuna 3:8d718ddb84c9 177 }else{
ryuna 3:8d718ddb84c9 178 return data_l[1];
ryuna 3:8d718ddb84c9 179
ryuna 3:8d718ddb84c9 180 }
ryuna 3:8d718ddb84c9 181
ryuna 3:8d718ddb84c9 182 }
ryuna 3:8d718ddb84c9 183 unsigned int IrReceiveSM(){
ryuna 3:8d718ddb84c9 184 /*値解析版 一番大きい値とその位置を返す
ryuna 3:8d718ddb84c9 185 Slave側はIRを要求した場合IRのみを返してくるとする.
ryuna 3:8d718ddb84c9 186 irは値が大きいほうが近いと仮定する
ryuna 3:8d718ddb84c9 187
ryuna 3:8d718ddb84c9 188
ryuna 3:8d718ddb84c9 189 */
ryuna 3:8d718ddb84c9 190 char data_r[3],data_l[3];
ryuna 3:8d718ddb84c9 191 bool val;
ryuna 3:8d718ddb84c9 192 Sensor.write(READ_IR);//一斉送信のつもり//コンパスへの影響はどのくらいですか
ryuna 3:8d718ddb84c9 193
ryuna 3:8d718ddb84c9 194 val = Sensor.read(ADDRESS_R|1, data_r, 3);// IRデータを受信
ryuna 3:8d718ddb84c9 195 Led[0] = val;
ryuna 3:8d718ddb84c9 196 wait_ms(5);
ryuna 3:8d718ddb84c9 197 val = Sensor.read(ADDRESS_L|1, data_l, 3);
ryuna 3:8d718ddb84c9 198 Led[0] = !val;
ryuna 3:8d718ddb84c9 199
ryuna 3:8d718ddb84c9 200 if(data_r[2]>data_l[2]){
ryuna 3:8d718ddb84c9 201 return data_r[0]/6<<8 + data_r[1];
ryuna 3:8d718ddb84c9 202
ryuna 3:8d718ddb84c9 203 }else{
ryuna 3:8d718ddb84c9 204 return ((data_l[0]/6)+6) <<8 + data_l[1];
ryuna 3:8d718ddb84c9 205
ryuna 3:8d718ddb84c9 206 }
ryuna 3:8d718ddb84c9 207
ryuna 3:8d718ddb84c9 208 }
ryuna 3:8d718ddb84c9 209 uint8_t LineReceive(){
ryuna 3:8d718ddb84c9 210 //先に要求しない場合はLineの状況を送信すること.//4bit //前ー右ー後ろー左 
ryuna 2:054444aa1990 211 char data_r[2],data_l[2];
ryuna 2:054444aa1990 212 bool val;
ryuna 3:8d718ddb84c9 213 //example val = slave.read(address,data,length,repeat);
ryuna 2:054444aa1990 214 val = Sensor.read(ADDRESS_R|1, data_r, 1);
ryuna 2:054444aa1990 215 Led[1] = val;
ryuna 2:054444aa1990 216 wait_ms(5);
ryuna 2:054444aa1990 217 val = Sensor.read(ADDRESS_L|1, data_l, 1);
ryuna 2:054444aa1990 218 Led[1] = !val;
ryuna 2:054444aa1990 219
ryuna 3:8d718ddb84c9 220
ryuna 3:8d718ddb84c9 221 return data_r[0]<<2 + data_l[0];
ryuna 2:054444aa1990 222
ryuna 2:054444aa1990 223
ryuna 2:054444aa1990 224 }
ryuna 3:8d718ddb84c9 225
ryuna 3:8d718ddb84c9 226
ryuna 3:8d718ddb84c9 227 void PingReceiveRL(char ping[]){//ping[0]==Right,ping[1]==Left
ryuna 3:8d718ddb84c9 228 char pingdata[1] = {READ_PING};
ryuna 3:8d718ddb84c9 229 bool val;
ryuna 3:8d718ddb84c9 230 val = Sensor.write(ADDRESS_R|0,pingdata , 1);
ryuna 3:8d718ddb84c9 231 Led[2] = val;
ryuna 3:8d718ddb84c9 232 val = Sensor.read(ADDRESS_R|1, ping, 2);
ryuna 3:8d718ddb84c9 233 Led[2] = !val;
ryuna 3:8d718ddb84c9 234
ryuna 3:8d718ddb84c9 235
ryuna 3:8d718ddb84c9 236
ryuna 3:8d718ddb84c9 237
ryuna 3:8d718ddb84c9 238 }
ryuna 2:054444aa1990 239 void rotate(unsigned int times, bool dir){
ryuna 2:054444aa1990 240 /*
ryuna 2:054444aa1990 241 *回転速度,回転方向,回転角度等設定変更ののち回転.
ryuna 2:054444aa1990 242 *
ryuna 2:054444aa1990 243 */
ryuna 3:8d718ddb84c9 244
ryuna 3:8d718ddb84c9 245
ryuna 3:8d718ddb84c9 246
ryuna 3:8d718ddb84c9 247
ryuna 2:054444aa1990 248
ryuna 2:054444aa1990 249 }
ryuna 2:054444aa1990 250
ryuna 2:054444aa1990 251 void move(int vr, int vl){
ryuna 0:ae08e2e1d82d 252 double pwm[4] = {0};
ryuna 0:ae08e2e1d82d 253 uint8_t i = 0;
ryuna 2:054444aa1990 254 pwm[0] = vr/10.0;
ryuna 2:054444aa1990 255 pwm[1] = vl/10.0;
ryuna 2:054444aa1990 256 pwm[2] = 0;
ryuna 2:054444aa1990 257 pwm[3] = 0;
ryuna 0:ae08e2e1d82d 258
ryuna 0:ae08e2e1d82d 259 for(i = 0; i < 4; i++){
ryuna 0:ae08e2e1d82d 260 if(pwm[i] > 100){
ryuna 0:ae08e2e1d82d 261 pwm[i] = 100;
ryuna 0:ae08e2e1d82d 262 }else if(pwm[i] < -100){
ryuna 0:ae08e2e1d82d 263 pwm[i] = -100;
ryuna 0:ae08e2e1d82d 264 }
ryuna 0:ae08e2e1d82d 265 speed[i] = pwm[i];
ryuna 0:ae08e2e1d82d 266 }
ryuna 0:ae08e2e1d82d 267 }
ryuna 0:ae08e2e1d82d 268
ryuna 3:8d718ddb84c9 269 void ControlRobo0(int *CompassDef)//LeftFront
ryuna 3:8d718ddb84c9 270 {}
ryuna 3:8d718ddb84c9 271 void ControlRobo1(int *CompassDef)//Front
ryuna 3:8d718ddb84c9 272 {
ryuna 3:8d718ddb84c9 273 /*前にボールがある場合の動作*/
ryuna 3:8d718ddb84c9 274 int Compass;
ryuna 3:8d718ddb84c9 275 char Ping[2];
ryuna 3:8d718ddb84c9 276 uint8_t Line,LineIr;
ryuna 3:8d718ddb84c9 277 unsigned int IrNumMax;
ryuna 3:8d718ddb84c9 278
ryuna 3:8d718ddb84c9 279 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 280 if(!((Compass>=150)&&(Compass<=210))){
ryuna 3:8d718ddb84c9 281 while(!((Compass>=150)&&(Compass<=210))){
ryuna 3:8d718ddb84c9 282 move(20,-20);//適当な回転。
ryuna 3:8d718ddb84c9 283 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 284 }
ryuna 3:8d718ddb84c9 285 return;
ryuna 3:8d718ddb84c9 286 }
ryuna 3:8d718ddb84c9 287 if(IrReceiveM()<=150){//適当な150
ryuna 3:8d718ddb84c9 288 /*ステッピングを正面に設定*/
ryuna 3:8d718ddb84c9 289 /*busy_wait()*/
ryuna 3:8d718ddb84c9 290 /*モーターを前進*/
ryuna 3:8d718ddb84c9 291 return;
ryuna 3:8d718ddb84c9 292 }
ryuna 3:8d718ddb84c9 293 PingReceiveRL(Ping);
ryuna 3:8d718ddb84c9 294 if((Ping[0]>90)&&(Ping[1]>40)){//数値は適当
ryuna 3:8d718ddb84c9 295 /*ステッピングを少しだけ傾ける*/
ryuna 3:8d718ddb84c9 296 /*モーターを左右差つけて回す(ロボットは少し傾く)*/
ryuna 3:8d718ddb84c9 297 /*busy_wait()*/
ryuna 3:8d718ddb84c9 298 /*モーターを前進*/
ryuna 3:8d718ddb84c9 299 while(1){
ryuna 3:8d718ddb84c9 300 Line = LineReceive();
ryuna 3:8d718ddb84c9 301
ryuna 3:8d718ddb84c9 302 if(Line){ //ラインを検知していないか
ryuna 3:8d718ddb84c9 303 LineIr = Line & (IrReceiveS()/3 + 1);//計算により方位を合わせる。
ryuna 3:8d718ddb84c9 304 while(LineIr){
ryuna 3:8d718ddb84c9 305 move(0,0);//
ryuna 3:8d718ddb84c9 306 Led[1] = Led[2] = Led[3] = 1;
ryuna 3:8d718ddb84c9 307
ryuna 3:8d718ddb84c9 308 LineIr = LineReceive() & (IrReceiveS()/3 + 1);
ryuna 3:8d718ddb84c9 309 }
ryuna 3:8d718ddb84c9 310 Led[1] = Led[2] = Led[3] = 0;
ryuna 3:8d718ddb84c9 311
ryuna 3:8d718ddb84c9 312 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 313 while(!((Compass>=150)&&(Compass<=210))){
ryuna 3:8d718ddb84c9 314 move(20,-20);//適当な回転。
ryuna 3:8d718ddb84c9 315 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 316 }
ryuna 3:8d718ddb84c9 317 return;
ryuna 3:8d718ddb84c9 318 }
ryuna 3:8d718ddb84c9 319 Kick = 1;
ryuna 3:8d718ddb84c9 320 wait_ms(200);
ryuna 3:8d718ddb84c9 321 Kick = 0;
ryuna 3:8d718ddb84c9 322
ryuna 3:8d718ddb84c9 323 IrNumMax = IrReceiveSM();//位置と大きさ
ryuna 3:8d718ddb84c9 324
ryuna 3:8d718ddb84c9 325 if(!((IrNumMax&0x00)>>8) == 1){//この1はボールの関数の1を表す.
ryuna 3:8d718ddb84c9 326 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 327 while(!((Compass>=150)&&(Compass<=210))){
ryuna 3:8d718ddb84c9 328 move(20,-20);//適当な回転。
ryuna 3:8d718ddb84c9 329 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 330 }
ryuna 3:8d718ddb84c9 331 return;
ryuna 3:8d718ddb84c9 332 }
ryuna 3:8d718ddb84c9 333
ryuna 3:8d718ddb84c9 334 if((IrNumMax&0x00FF)<150){
ryuna 3:8d718ddb84c9 335 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 336 while(!((Compass>=150)&&(Compass<=210))){
ryuna 3:8d718ddb84c9 337 move(20,-20);//適当な回転。
ryuna 3:8d718ddb84c9 338 Compass = ((hmc6352.sample() / 10) + 540 - *CompassDef) % 360;
ryuna 3:8d718ddb84c9 339 }
ryuna 3:8d718ddb84c9 340 return;
ryuna 3:8d718ddb84c9 341 }
ryuna 3:8d718ddb84c9 342
ryuna 3:8d718ddb84c9 343 }
ryuna 3:8d718ddb84c9 344
ryuna 3:8d718ddb84c9 345 }else if((Ping[0]>40)&&(Ping[1]>90)){
ryuna 3:8d718ddb84c9 346
ryuna 3:8d718ddb84c9 347 }else{
ryuna 3:8d718ddb84c9 348
ryuna 3:8d718ddb84c9 349 }
ryuna 3:8d718ddb84c9 350
ryuna 3:8d718ddb84c9 351 }
ryuna 3:8d718ddb84c9 352 void ControlRobo2(int *CompassDef)//RightFront
ryuna 3:8d718ddb84c9 353 {
ryuna 3:8d718ddb84c9 354
ryuna 3:8d718ddb84c9 355
ryuna 3:8d718ddb84c9 356
ryuna 3:8d718ddb84c9 357
ryuna 3:8d718ddb84c9 358 }
ryuna 3:8d718ddb84c9 359 void ControlRobo3(int *CompassDef)//RightFront
ryuna 3:8d718ddb84c9 360 {}
ryuna 3:8d718ddb84c9 361 void ControlRobo4(int *CompassDef)//Right
ryuna 3:8d718ddb84c9 362 {
ryuna 4:8444360f08e2 363 int a = 50;
ryuna 4:8444360f08e2 364 unsigned int ir_sm;
ryuna 4:8444360f08e2 365 int kakudo = -90;
ryuna 4:8444360f08e2 366 double value = 0;
ryuna 4:8444360f08e2 367 double v = 50;/* cm/s */
ryuna 4:8444360f08e2 368 double x = 20;/*モーターを回す割合,今は適当*/
ryuna 3:8d718ddb84c9 369
ryuna 4:8444360f08e2 370 ir_sm = IrReceiveSM();
ryuna 4:8444360f08e2 371 if(ir_sm&0xF00>>8 == 4){
ryuna 4:8444360f08e2 372 return;
ryuna 4:8444360f08e2 373 }
ryuna 4:8444360f08e2 374 a = 300 - ir_sm&0x00FF ;//適当な計算//300は勘
ryuna 4:8444360f08e2 375 value = 10 * a * SHORT_LEN + 3*(a * a + SHORT_LEN * SHORT_LEN);
ryuna 4:8444360f08e2 376 value = PI *(3 * ( a + SHORT_LEN) - sqrt(value))/4/v;
ryuna 4:8444360f08e2 377
ryuna 4:8444360f08e2 378 if(300 - ir_sm&0x00FF >200){
ryuna 4:8444360f08e2 379 Step.Step(-10);//適当
ryuna 4:8444360f08e2 380 Step.BusyWait(0);
ryuna 4:8444360f08e2 381 }
ryuna 4:8444360f08e2 382
ryuna 4:8444360f08e2 383 /*SetPerm()
ryuna 4:8444360f08e2 384 *valueに応じた何かを計算する
ryuna 4:8444360f08e2 385 *ACCまたはMAX_SPEEDをいじればいい気がする
ryuna 4:8444360f08e2 386 *
ryuna 4:8444360f08e2 387 */
ryuna 4:8444360f08e2 388 Step.Step(kakudo+10);
ryuna 4:8444360f08e2 389
ryuna 4:8444360f08e2 390 /*x = v*何か*/
ryuna 4:8444360f08e2 391 move(-x,-x);
ryuna 4:8444360f08e2 392
ryuna 3:8d718ddb84c9 393
ryuna 3:8d718ddb84c9 394 }
ryuna 3:8d718ddb84c9 395 void ControlRobo5(int *CompassDef)//RightBack
ryuna 3:8d718ddb84c9 396 {}
ryuna 3:8d718ddb84c9 397 void ControlRobo6(int *CompassDef)//BackRight
ryuna 3:8d718ddb84c9 398 {}
ryuna 3:8d718ddb84c9 399 void ControlRobo7(int *CompassDef)//Back
ryuna 3:8d718ddb84c9 400 {}
ryuna 3:8d718ddb84c9 401 void ControlRobo8(int *CompassDef)//BackLeft
ryuna 3:8d718ddb84c9 402 {}
ryuna 3:8d718ddb84c9 403 void ControlRobo9(int *CompassDef)//LeftBack
ryuna 3:8d718ddb84c9 404 {}
ryuna 3:8d718ddb84c9 405 void ControlRobo10(int *CompassDef)//Left
ryuna 3:8d718ddb84c9 406 {}
ryuna 3:8d718ddb84c9 407 void ControlRobo11(int *CompassDef)//LeftFront
ryuna 3:8d718ddb84c9 408 {}
ryuna 3:8d718ddb84c9 409 void GoHome(int *CompassDef)//Ball is not found.
ryuna 3:8d718ddb84c9 410 {}
ryuna 3:8d718ddb84c9 411
ryuna 3:8d718ddb84c9 412
ryuna 4:8444360f08e2 413 uint8_t SwRead(){
ryuna 4:8444360f08e2 414 /******
ryuna 4:8444360f08e2 415 *返却値はスイッチの状況
ryuna 4:8444360f08e2 416 *参照元::aaaaa
ryuna 4:8444360f08e2 417 *
ryuna 4:8444360f08e2 418 *Calibration = 0x01;
ryuna 4:8444360f08e2 419 *Kicker = 0x02;
ryuna 4:8444360f08e2 420 *Debug1 = 0x04;
ryuna 4:8444360f08e2 421 *Debug2 = 0x08;
ryuna 4:8444360f08e2 422 *StartS = 0x10;
ryuna 4:8444360f08e2 423 *
ryuna 4:8444360f08e2 424 *****/
ryuna 4:8444360f08e2 425 uint8_t i,temp,temp2;
ryuna 4:8444360f08e2 426 temp = Sw;
ryuna 4:8444360f08e2 427 if(!(temp == Calibration
ryuna 4:8444360f08e2 428 ||temp == Kicker
ryuna 4:8444360f08e2 429 ||temp == Debug1
ryuna 4:8444360f08e2 430 ||temp == Debug2
ryuna 4:8444360f08e2 431 ||temp == StartS)) return 0;/*スイッチは押されていない状況*/
ryuna 4:8444360f08e2 432 if(temp !=0x00){
ryuna 4:8444360f08e2 433 for(i = 0; i < 50; i++);
ryuna 4:8444360f08e2 434 temp2 = Sw;
ryuna 4:8444360f08e2 435 if(temp == temp2){
ryuna 4:8444360f08e2 436 return temp;
ryuna 4:8444360f08e2 437 }
ryuna 4:8444360f08e2 438 }
ryuna 4:8444360f08e2 439 return 0;
ryuna 4:8444360f08e2 440 }
ryuna 2:054444aa1990 441
ryuna 1:7d4921b5d638 442 //通信(モータ用)
ryuna 1:7d4921b5d638 443 void tx_motor(){
ryuna 1:7d4921b5d638 444 array(speed[0],speed[1],speed[3],speed[2]);
ryuna 1:7d4921b5d638 445 Motor.printf("%s",StringFIN.c_str());
ryuna 1:7d4921b5d638 446 }
ryuna 0:ae08e2e1d82d 447
ryuna 3:8d718ddb84c9 448 void SetUp(int *compass_def){
ryuna 2:054444aa1990 449 /*初期化*/
ryuna 3:8d718ddb84c9 450 int Compass;
ryuna 3:8d718ddb84c9 451 Kick = 0;
ryuna 4:8444360f08e2 452 Sw.mode(PullUp);
ryuna 1:7d4921b5d638 453 Motor.baud(115200); //ボーレート設定
ryuna 1:7d4921b5d638 454 Motor.printf("1F0002F0003F0004F000\r\n"); //モータ停止
ryuna 1:7d4921b5d638 455 Motor.attach(&tx_motor,Serial::TxIrq); //送信空き割り込み(モータ用)
ryuna 2:054444aa1990 456 move(0,0);//停止
ryuna 2:054444aa1990 457
ryuna 2:054444aa1990 458 Step.Resets();
ryuna 2:054444aa1990 459 Step.ReleseSW(0,1);//記憶がない
ryuna 2:054444aa1990 460
ryuna 3:8d718ddb84c9 461 hmc6352.setOpMode(HMC6352_CONTINUOUS, 1, 20);
ryuna 3:8d718ddb84c9 462 *compass_def = (hmc6352.sample() / 10);
ryuna 4:8444360f08e2 463 /*
ryuna 4:8444360f08e2 464 前を向くように設定をするべき→最初っから前向いてるし
ryuna 4:8444360f08e2 465 アウトオブバウンズからの復帰時に反対を向けてスタートなので必要。
ryuna 4:8444360f08e2 466 */
ryuna 4:8444360f08e2 467 while(1){
ryuna 4:8444360f08e2 468 Compass = ((hmc6352.sample() / 10) + 540 - *compass_def) % 360;
ryuna 4:8444360f08e2 469 if(Cmpass == 3) break;//前を向いたら抜ける。
ryuna 4:8444360f08e2 470 }
ryuna 2:054444aa1990 471 Lcd.cls();
ryuna 2:054444aa1990 472
ryuna 2:054444aa1990 473 /*初期化終了*/
ryuna 0:ae08e2e1d82d 474
ryuna 0:ae08e2e1d82d 475
ryuna 2:054444aa1990 476 }
ryuna 2:054444aa1990 477 void StartLoop(){
ryuna 2:054444aa1990 478 /*
ryuna 2:054444aa1990 479 *スイッチが押されるまでロボットはスタートしない.
ryuna 2:054444aa1990 480 *
ryuna 2:054444aa1990 481 *待っている間にほかのスイッチが押された場合は押されている間その動作をする等.
ryuna 2:054444aa1990 482 *
ryuna 4:8444360f08e2 483 *switch割り当て
ryuna 4:8444360f08e2 484 *1.コンパスのキャリブレーション実行スイッチ
ryuna 4:8444360f08e2 485 *2.キッカーのキック
ryuna 4:8444360f08e2 486 *3,4.自由
ryuna 4:8444360f08e2 487 *5.StartSw
ryuna 2:054444aa1990 488 */
ryuna 4:8444360f08e2 489 uint8_t State = 0;
ryuna 4:8444360f08e2 490
ryuna 4:8444360f08e2 491 while(1){
ryuna 4:8444360f08e2 492
ryuna 4:8444360f08e2 493 State = SwRead();
ryuna 4:8444360f08e2 494 if(State == 0) continue;
ryuna 4:8444360f08e2 495
ryuna 4:8444360f08e2 496 if(State == Calibration){
ryuna 4:8444360f08e2 497 /*calibration command enter...
ryuna 4:8444360f08e2 498 *
ryuna 4:8444360f08e2 499 *
ryuna 4:8444360f08e2 500 */
ryuna 4:8444360f08e2 501 continue;
ryuna 4:8444360f08e2 502 }
ryuna 4:8444360f08e2 503 if(State == Kicker){
ryuna 4:8444360f08e2 504 /*
ryuna 4:8444360f08e2 505 *kicker check
ryuna 4:8444360f08e2 506 *
ryuna 4:8444360f08e2 507 *
ryuna 4:8444360f08e2 508 */
ryuna 4:8444360f08e2 509 continue;
ryuna 4:8444360f08e2 510 }
ryuna 4:8444360f08e2 511 if(State == Debug1){
ryuna 4:8444360f08e2 512 /* debug command free */
ryuna 4:8444360f08e2 513
ryuna 4:8444360f08e2 514 }
ryuna 4:8444360f08e2 515 if(State == Debug2){
ryuna 4:8444360f08e2 516 /* debug command free */
ryuna 4:8444360f08e2 517
ryuna 4:8444360f08e2 518 }
ryuna 4:8444360f08e2 519 if(State == StartS){
ryuna 4:8444360f08e2 520 /*game start...*/
ryuna 4:8444360f08e2 521 return;
ryuna 4:8444360f08e2 522 }
ryuna 4:8444360f08e2 523
ryuna 4:8444360f08e2 524 }
ryuna 2:054444aa1990 525
ryuna 2:054444aa1990 526 }
ryuna 2:054444aa1990 527 int main() {
ryuna 3:8d718ddb84c9 528
ryuna 3:8d718ddb84c9 529 /*Ir*/
ryuna 3:8d718ddb84c9 530 uint8_t IrNum;//場所によるirの数を表したもの0~11まではボールがある状態12はボールがない状態
ryuna 2:054444aa1990 531
ryuna 2:054444aa1990 532 /*Line*/
ryuna 3:8d718ddb84c9 533 uint8_t Line;
ryuna 3:8d718ddb84c9 534
ryuna 3:8d718ddb84c9 535 /*Compass*/
ryuna 3:8d718ddb84c9 536 int CompassDef = 0, Compass = 0;
ryuna 2:054444aa1990 537
ryuna 3:8d718ddb84c9 538 /*State */
ryuna 3:8d718ddb84c9 539 //Direction LineIr = NA;//方位設定奴...エラーでてめんどくさいので後でまたやることにする。
ryuna 3:8d718ddb84c9 540 uint8_t LineIr = NA;
ryuna 3:8d718ddb84c9 541
ryuna 2:054444aa1990 542
ryuna 2:054444aa1990 543
ryuna 3:8d718ddb84c9 544 /*関数ポインタ*/
ryuna 3:8d718ddb84c9 545 void (*ControlRobo[13])(int *);//irの位置による分岐
ryuna 3:8d718ddb84c9 546 ControlRobo[0] = ControlRobo0;
ryuna 3:8d718ddb84c9 547 ControlRobo[1] = ControlRobo1;
ryuna 3:8d718ddb84c9 548 ControlRobo[2] = ControlRobo2;
ryuna 3:8d718ddb84c9 549 ControlRobo[3] = ControlRobo3;
ryuna 3:8d718ddb84c9 550 ControlRobo[4] = ControlRobo4;
ryuna 3:8d718ddb84c9 551 ControlRobo[5] = ControlRobo5;
ryuna 3:8d718ddb84c9 552 ControlRobo[6] = ControlRobo6;
ryuna 3:8d718ddb84c9 553 ControlRobo[7] = ControlRobo7;
ryuna 3:8d718ddb84c9 554 ControlRobo[8] = ControlRobo8;
ryuna 3:8d718ddb84c9 555 ControlRobo[9] = ControlRobo9;
ryuna 3:8d718ddb84c9 556 ControlRobo[10] = ControlRobo10;
ryuna 3:8d718ddb84c9 557 ControlRobo[11] = ControlRobo11;
ryuna 3:8d718ddb84c9 558 ControlRobo[12] = GoHome;
ryuna 2:054444aa1990 559
ryuna 3:8d718ddb84c9 560
ryuna 4:8444360f08e2 561 SetUp(&CompassDef);/*set up routine*/
ryuna 2:054444aa1990 562
ryuna 4:8444360f08e2 563 StartLoop(); /*loop stat, switch push end*/
ryuna 2:054444aa1990 564
ryuna 0:ae08e2e1d82d 565 while(1) {
ryuna 2:054444aa1990 566
ryuna 2:054444aa1990 567 Line = LineReceive();
ryuna 2:054444aa1990 568
ryuna 3:8d718ddb84c9 569 if(Line){ //ラインを検知していないか
ryuna 3:8d718ddb84c9 570 LineIr = Line & (IrReceiveS()/3 + 1);//計算により方位を合わせる。
ryuna 3:8d718ddb84c9 571 while(LineIr){
ryuna 3:8d718ddb84c9 572 move(0,0);//
ryuna 3:8d718ddb84c9 573 Led[1] = Led[2] = Led[3] = 1;
ryuna 2:054444aa1990 574
ryuna 3:8d718ddb84c9 575 LineIr = LineReceive() & (IrReceiveS()/3 + 1);
ryuna 3:8d718ddb84c9 576 }
ryuna 3:8d718ddb84c9 577 Led[1] = Led[2] = Led[3] = 0;
ryuna 3:8d718ddb84c9 578 continue;
ryuna 3:8d718ddb84c9 579
ryuna 3:8d718ddb84c9 580 }
ryuna 3:8d718ddb84c9 581
ryuna 3:8d718ddb84c9 582 if(Step.BusyCheck()){//ステッピングが動いていないか
ryuna 3:8d718ddb84c9 583 continue;
ryuna 3:8d718ddb84c9 584
ryuna 3:8d718ddb84c9 585 }
ryuna 3:8d718ddb84c9 586
ryuna 3:8d718ddb84c9 587 IrNum = IrReceiveS();
ryuna 3:8d718ddb84c9 588
ryuna 3:8d718ddb84c9 589 (*ControlRobo[IrNum])(&CompassDef);//irの位置によったループ等の処理に移る。
ryuna 3:8d718ddb84c9 590
ryuna 3:8d718ddb84c9 591 //wait_ms(0);
ryuna 3:8d718ddb84c9 592
ryuna 0:ae08e2e1d82d 593 }
ryuna 0:ae08e2e1d82d 594 }