robocup メイン fumiya

Dependencies:   AQM0802A HMC6352 L6470_lib PID mbed

Fork of CatPot_Main_ver1 by CatPot 2015-2016

Committer:
ryuna
Date:
Fri Jan 09 06:59:18 2015 +0000
Revision:
6:c2c31bc971ad
Parent:
5:3d68334aab20
Child:
7:7a0aee1477d9
sensor??????????????????

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