CatPot for defence on RoboCup in 2015 winter

Dependencies:   HMC6352 Ping IRM2121_2 mbed MultiSerial Watchdog

Committer:
lilac0112_1
Date:
Sat Jan 24 05:47:18 2015 +0000
Revision:
0:94ced082e13a
Child:
1:5b2e1ee5e63e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lilac0112_1 0:94ced082e13a 1 /*
lilac0112_1 0:94ced082e13a 2 *メインと通信するLPC1114のプログラム()
lilac0112_1 0:94ced082e13a 3 *
lilac0112_1 0:94ced082e13a 4 *現在は両方がmainと通信します.
lilac0112_1 0:94ced082e13a 5 *
lilac0112_1 0:94ced082e13a 6 *mainの通信回数が多いためそれに耐えうる速度で通信しなければならないのではという懸念。
lilac0112_1 0:94ced082e13a 7 *試してみないとわからないが、RTOSにより常に通信のみを監視するのもありかもしれない。
lilac0112_1 0:94ced082e13a 8 *それでダメなら詰む。
lilac0112_1 0:94ced082e13a 9 */
lilac0112_1 0:94ced082e13a 10 /***********************************
lilac0112_1 0:94ced082e13a 11 *RoboCupJunior Soccer B Open 2014
lilac0112_1 0:94ced082e13a 12 *Koshinestu progrum
lilac0112_1 0:94ced082e13a 13 *
lilac0112_1 0:94ced082e13a 14 * このプログラムでは以下の処理をする.
lilac0112_1 0:94ced082e13a 15 *
lilac0112_1 0:94ced082e13a 16 * 主にセンサーデータの作成を行う.
lilac0112_1 0:94ced082e13a 17 *
lilac0112_1 0:94ced082e13a 18 * IRM2121を6(12/2)個用いてボールの位置を読み取る.
lilac0112_1 0:94ced082e13a 19 * 
lilac0112_1 0:94ced082e13a 20 * フォトダイオードを4(8/2)個用いてラインを読み取る.
lilac0112_1 0:94ced082e13a 21 * 
lilac0112_1 0:94ced082e13a 22 * 超音波センサを2個用いて周囲の壁との距離を読み取る.
lilac0112_1 0:94ced082e13a 23 *
lilac0112_1 0:94ced082e13a 24 * LPC1768へI2Cを用いて各種センサーデータを送信する.
lilac0112_1 0:94ced082e13a 25 *
lilac0112_1 0:94ced082e13a 26 *************************
lilac0112_1 0:94ced082e13a 27 *
lilac0112_1 0:94ced082e13a 28 *Pin Map
lilac0112_1 0:94ced082e13a 29 *
lilac0112_1 0:94ced082e13a 30 * dp17,dp18,dp24,dp25,dp26,NC >> IRM2121
lilac0112_1 0:94ced082e13a 31 *
lilac0112_1 0:94ced082e13a 32 * dp1,dp2 >> Ping1
lilac0112_1 0:94ced082e13a 33 *
lilac0112_1 0:94ced082e13a 34 * dp4,dp6 >> Ping2
lilac0112_1 0:94ced082e13a 35 *
lilac0112_1 0:94ced082e13a 36 * dp9,dp10,dp11,dp13 >> PhotoDiode
lilac0112_1 0:94ced082e13a 37 *
lilac0112_1 0:94ced082e13a 38 * dp5,dp27 >> I2C >> LPC1768
lilac0112_1 0:94ced082e13a 39 *
lilac0112_1 0:94ced082e13a 40 ******************************/
lilac0112_1 0:94ced082e13a 41
lilac0112_1 0:94ced082e13a 42 #include "mbed.h"
lilac0112_1 0:94ced082e13a 43 /*
lilac0112_1 0:94ced082e13a 44 #define SYSAHBCLKDIV_Val 0x00000001 // Reset: 0x001
lilac0112_1 0:94ced082e13a 45 #define CLOCK_SETUP 1 // デフォルト=1
lilac0112_1 0:94ced082e13a 46 #define SYSPLLCTRL_Val 0x00000023 // デフォルト=23 Reset: 0x000
lilac0112_1 0:94ced082e13a 47 #define SYSPLLCLKSEL_Val 0x00000001 // デフォルト=0 Reset: 0x000
lilac0112_1 0:94ced082e13a 48 #define MAINCLKSEL_Val 0x00000003 // デフォルト=3 Reset: 0x000
lilac0112_1 0:94ced082e13a 49 */
lilac0112_1 0:94ced082e13a 50 #include "IRM2121.h"
lilac0112_1 0:94ced082e13a 51 #include "Ping.h"
lilac0112_1 0:94ced082e13a 52
lilac0112_1 0:94ced082e13a 53 #define PING_COUNT 5 //5回に1回にPing処理
lilac0112_1 0:94ced082e13a 54 #define LINE_LEVEL (1-0.55) //しきい値を設定 0.55がしきい値
lilac0112_1 0:94ced082e13a 55 #define IR_LEVEL 400 //irのしきい値
lilac0112_1 0:94ced082e13a 56
lilac0112_1 0:94ced082e13a 57 #define I2C_ADDRESS 0xAA // another (0xAC)
lilac0112_1 0:94ced082e13a 58
lilac0112_1 0:94ced082e13a 59
lilac0112_1 0:94ced082e13a 60
lilac0112_1 0:94ced082e13a 61 IRM2121 Ir[6] = {dp17,dp18,dp24,dp25,dp26,NC};
lilac0112_1 0:94ced082e13a 62 Ping Ping1(dp1,dp2);
lilac0112_1 0:94ced082e13a 63 Ping Ping2(dp4,dp6);
lilac0112_1 0:94ced082e13a 64 AnalogIn Line[4] = {dp9,dp10,dp11,dp13};
lilac0112_1 0:94ced082e13a 65 DigitalOut Led(LED1);
lilac0112_1 0:94ced082e13a 66
lilac0112_1 0:94ced082e13a 67 I2CSlave Mbed(dp5,dp27);//sda,scl
lilac0112_1 0:94ced082e13a 68 Serial pc(USBTX,USBRX);
lilac0112_1 0:94ced082e13a 69
lilac0112_1 0:94ced082e13a 70 /*irm2121平均化*/
lilac0112_1 0:94ced082e13a 71 uint8_t IrMoving_ave(uint8_t num, int data)
lilac0112_1 0:94ced082e13a 72 {
lilac0112_1 0:94ced082e13a 73 static unsigned int sum[10];
lilac0112_1 0:94ced082e13a 74 static unsigned temp[6][10];
lilac0112_1 0:94ced082e13a 75
lilac0112_1 0:94ced082e13a 76 sum[num] -= temp[num][9];
lilac0112_1 0:94ced082e13a 77 sum[num] += data;
lilac0112_1 0:94ced082e13a 78
lilac0112_1 0:94ced082e13a 79
lilac0112_1 0:94ced082e13a 80 temp[num][9] = temp[num][8];
lilac0112_1 0:94ced082e13a 81 temp[num][8] = temp[num][7];
lilac0112_1 0:94ced082e13a 82 temp[num][7] = temp[num][6];
lilac0112_1 0:94ced082e13a 83 temp[num][6] = temp[num][5];
lilac0112_1 0:94ced082e13a 84 temp[num][5] = temp[num][4];
lilac0112_1 0:94ced082e13a 85 temp[num][4] = temp[num][3];
lilac0112_1 0:94ced082e13a 86 temp[num][3] = temp[num][2];
lilac0112_1 0:94ced082e13a 87 temp[num][2] = temp[num][1];
lilac0112_1 0:94ced082e13a 88 temp[num][1] = temp[num][0];
lilac0112_1 0:94ced082e13a 89 temp[num][0] = data;
lilac0112_1 0:94ced082e13a 90
lilac0112_1 0:94ced082e13a 91 return sum[num]/10;
lilac0112_1 0:94ced082e13a 92 }
lilac0112_1 0:94ced082e13a 93
lilac0112_1 0:94ced082e13a 94 void IrDataSelect(int input[], uint8_t output[])
lilac0112_1 0:94ced082e13a 95 {
lilac0112_1 0:94ced082e13a 96 /*
lilac0112_1 0:94ced082e13a 97 *1,2位の値とその場所の番号をアウトプットに格納する.
lilac0112_1 0:94ced082e13a 98 *値が255以上だとボールを検知してないことになる。
lilac0112_1 0:94ced082e13a 99 */
lilac0112_1 0:94ced082e13a 100 uint8_t nigh1 = 255, nigh2 = 255;
lilac0112_1 0:94ced082e13a 101 uint8_t ni1=12, ni2 = 12, i;
lilac0112_1 0:94ced082e13a 102
lilac0112_1 0:94ced082e13a 103 for(i = 6; i > 0; i-- ) {
lilac0112_1 0:94ced082e13a 104 if(nigh2 < input[i]) {
lilac0112_1 0:94ced082e13a 105 continue;
lilac0112_1 0:94ced082e13a 106 }
lilac0112_1 0:94ced082e13a 107 if(nigh1 < input[i]) {
lilac0112_1 0:94ced082e13a 108 nigh2 = input[i];
lilac0112_1 0:94ced082e13a 109 ni2 = i;
lilac0112_1 0:94ced082e13a 110 continue;
lilac0112_1 0:94ced082e13a 111 }
lilac0112_1 0:94ced082e13a 112 nigh2 = nigh1;
lilac0112_1 0:94ced082e13a 113 ni2 = ni1;
lilac0112_1 0:94ced082e13a 114 nigh1 = input[i];
lilac0112_1 0:94ced082e13a 115 ni1 = i;
lilac0112_1 0:94ced082e13a 116 }
lilac0112_1 0:94ced082e13a 117 /*
lilac0112_1 0:94ced082e13a 118 for(i = 0; i < 6; i++){
lilac0112_1 0:94ced082e13a 119
lilac0112_1 0:94ced082e13a 120 if(nigh1 > input[i]){
lilac0112_1 0:94ced082e13a 121 nigh1 = input[i];
lilac0112_1 0:94ced082e13a 122 ni1 = i;
lilac0112_1 0:94ced082e13a 123 }
lilac0112_1 0:94ced082e13a 124 if((nigh1<input[i])&&(nigh2>input[i])){
lilac0112_1 0:94ced082e13a 125 nigh2 = input[i];
lilac0112_1 0:94ced082e13a 126 ni2 = i;
lilac0112_1 0:94ced082e13a 127 }
lilac0112_1 0:94ced082e13a 128 }*/
lilac0112_1 0:94ced082e13a 129 if(ni1 == 12) { //ボールがないとき
lilac0112_1 0:94ced082e13a 130 output[0] = 0;
lilac0112_1 0:94ced082e13a 131 output[1] = 255;
lilac0112_1 0:94ced082e13a 132 output[2] = 255;
lilac0112_1 0:94ced082e13a 133 return;
lilac0112_1 0:94ced082e13a 134 }
lilac0112_1 0:94ced082e13a 135
lilac0112_1 0:94ced082e13a 136 output[0] = ni1*6 + ni2;
lilac0112_1 0:94ced082e13a 137 output[1] = nigh1;
lilac0112_1 0:94ced082e13a 138 output[2] = nigh2;
lilac0112_1 0:94ced082e13a 139
lilac0112_1 0:94ced082e13a 140 }
lilac0112_1 0:94ced082e13a 141 /*周回の初期動作*/
lilac0112_1 0:94ced082e13a 142 void ResetSet(uint8_t *PingCk)
lilac0112_1 0:94ced082e13a 143 {
lilac0112_1 0:94ced082e13a 144
lilac0112_1 0:94ced082e13a 145 Led = 1;//周回の初め
lilac0112_1 0:94ced082e13a 146 PingCk ++;
lilac0112_1 0:94ced082e13a 147
lilac0112_1 0:94ced082e13a 148 }
lilac0112_1 0:94ced082e13a 149
lilac0112_1 0:94ced082e13a 150
lilac0112_1 0:94ced082e13a 151
lilac0112_1 0:94ced082e13a 152 int main()
lilac0112_1 0:94ced082e13a 153 {
lilac0112_1 0:94ced082e13a 154
lilac0112_1 0:94ced082e13a 155 //default Mbed.frequency();
lilac0112_1 0:94ced082e13a 156 Mbed.address(I2C_ADDRESS);
lilac0112_1 0:94ced082e13a 157 /*Data*/
lilac0112_1 0:94ced082e13a 158 int IrMemory[6] = {0};//IRのデータ保管
lilac0112_1 0:94ced082e13a 159 uint8_t PingMemory[2] = {0};
lilac0112_1 0:94ced082e13a 160 unsigned int LineMemory[4] = {0};
lilac0112_1 0:94ced082e13a 161
lilac0112_1 0:94ced082e13a 162 int IrTemp[6] = {0};//仮置き場
lilac0112_1 0:94ced082e13a 163 uint8_t IrSendData[3];//[0]:どのirを指すのかアドレスで
lilac0112_1 0:94ced082e13a 164
lilac0112_1 0:94ced082e13a 165 /*Flag*/
lilac0112_1 0:94ced082e13a 166 uint8_t LineFlag;//配置 - - - - Line[3] Line[2] Line[1] Line[0]
lilac0112_1 0:94ced082e13a 167
lilac0112_1 0:94ced082e13a 168 /*State(operate_value etc...)*/
lilac0112_1 0:94ced082e13a 169 int I2CState;
lilac0112_1 0:94ced082e13a 170
lilac0112_1 0:94ced082e13a 171 /*Count*/
lilac0112_1 0:94ced082e13a 172 uint8_t PingCk = 0;
lilac0112_1 0:94ced082e13a 173
lilac0112_1 0:94ced082e13a 174 /* I2Cdata*/
lilac0112_1 0:94ced082e13a 175 char SendData[9]= {0};
lilac0112_1 0:94ced082e13a 176 char AddressData = 0;
lilac0112_1 0:94ced082e13a 177
lilac0112_1 0:94ced082e13a 178 /*Debug valiable*/
lilac0112_1 0:94ced082e13a 179 bool valid = 0,busy = 0;
lilac0112_1 0:94ced082e13a 180
lilac0112_1 0:94ced082e13a 181 while(1) {
lilac0112_1 0:94ced082e13a 182
lilac0112_1 0:94ced082e13a 183 ResetSet(&PingCk);
lilac0112_1 0:94ced082e13a 184 Ir[0].Set();
lilac0112_1 0:94ced082e13a 185 Ir[1].Set();
lilac0112_1 0:94ced082e13a 186 Ir[2].Set();
lilac0112_1 0:94ced082e13a 187 Ir[3].Set();
lilac0112_1 0:94ced082e13a 188 Ir[4].Set();
lilac0112_1 0:94ced082e13a 189 //Ir[5].Set();
lilac0112_1 0:94ced082e13a 190
lilac0112_1 0:94ced082e13a 191 wait_ms(50);//wait値は最適値を探す必要がある.
lilac0112_1 0:94ced082e13a 192
lilac0112_1 0:94ced082e13a 193 IrTemp[0] = IR_LEVEL - Ir[0].Read();
lilac0112_1 0:94ced082e13a 194 IrTemp[1] = IR_LEVEL - Ir[1].Read();
lilac0112_1 0:94ced082e13a 195 IrTemp[2] = IR_LEVEL - Ir[2].Read();
lilac0112_1 0:94ced082e13a 196 IrTemp[3] = IR_LEVEL - Ir[3].Read();
lilac0112_1 0:94ced082e13a 197 IrTemp[4] = IR_LEVEL - Ir[4].Read();
lilac0112_1 0:94ced082e13a 198 //IrTemp[5] = IR_LEVEL - Ir[5].Read();
lilac0112_1 0:94ced082e13a 199
lilac0112_1 0:94ced082e13a 200 Ir[0].ReturnVB(&valid,&busy);
lilac0112_1 0:94ced082e13a 201 pc.printf("valid %d, busy %d \n\r",valid, busy);
lilac0112_1 0:94ced082e13a 202 /*
lilac0112_1 0:94ced082e13a 203 IrMemory[0] = IrMoving_ave(0,IrTemp[0]);
lilac0112_1 0:94ced082e13a 204 IrMemory[1] = IrMoving_ave(1,IrTemp[1]);
lilac0112_1 0:94ced082e13a 205 IrMemory[2] = IrMoving_ave(2,IrTemp[2]);
lilac0112_1 0:94ced082e13a 206 IrMemory[3] = IrMoving_ave(3,IrTemp[3]);
lilac0112_1 0:94ced082e13a 207 IrMemory[4] = IrMoving_ave(4,IrTemp[4]);
lilac0112_1 0:94ced082e13a 208 //IrMemory[5] = IrMoving_ave(5,IrTemp[5]);
lilac0112_1 0:94ced082e13a 209 */
lilac0112_1 0:94ced082e13a 210
lilac0112_1 0:94ced082e13a 211 /*小さい(大きい)二つだけでいい気がする.値をみて小さかったらそうしょう*/
lilac0112_1 0:94ced082e13a 212 /**/
lilac0112_1 0:94ced082e13a 213 //IrDataSelect(IrMemory,IrSendData);
lilac0112_1 0:94ced082e13a 214 /**/
lilac0112_1 0:94ced082e13a 215 /*
lilac0112_1 0:94ced082e13a 216 if(PingCk >= PING_COUNT){
lilac0112_1 0:94ced082e13a 217 Ping1.Send();
lilac0112_1 0:94ced082e13a 218 Ping2.Send();
lilac0112_1 0:94ced082e13a 219 wait_ms(30);
lilac0112_1 0:94ced082e13a 220 PingMemory[0] = Ping1.Read_cm();
lilac0112_1 0:94ced082e13a 221 PingMemory[1] = Ping2.Read_cm();
lilac0112_1 0:94ced082e13a 222 PingCk = 0;
lilac0112_1 0:94ced082e13a 223 }
lilac0112_1 0:94ced082e13a 224 */
lilac0112_1 0:94ced082e13a 225 LineMemory[0] = Line[0];
lilac0112_1 0:94ced082e13a 226 LineMemory[1] = Line[1];
lilac0112_1 0:94ced082e13a 227 LineMemory[2] = Line[2];
lilac0112_1 0:94ced082e13a 228 LineMemory[3] = Line[3];
lilac0112_1 0:94ced082e13a 229
lilac0112_1 0:94ced082e13a 230 LineFlag = (((int)(LineMemory[3]+LINE_LEVEL)) | ((int)(LineMemory[2]+LINE_LEVEL)))<<1 +
lilac0112_1 0:94ced082e13a 231 (((int)(LineMemory[1]+LINE_LEVEL)) | ((int)(LineMemory[0]+LINE_LEVEL))); //まとめてる
lilac0112_1 0:94ced082e13a 232 /*
lilac0112_1 0:94ced082e13a 233 I2CState = Mbed.receive();
lilac0112_1 0:94ced082e13a 234
lilac0112_1 0:94ced082e13a 235 switch(I2CState){
lilac0112_1 0:94ced082e13a 236 case I2CSlave::ReadAddressed:
lilac0112_1 0:94ced082e13a 237 if(AddressData){
lilac0112_1 0:94ced082e13a 238 switch(AddressData){
lilac0112_1 0:94ced082e13a 239 case 0x01://IR
lilac0112_1 0:94ced082e13a 240 SendData[0] = (char)IrSendData[0];
lilac0112_1 0:94ced082e13a 241 SendData[1] = (char)IrSendData[1];
lilac0112_1 0:94ced082e13a 242 SendData[2] = (char)IrSendData[2];
lilac0112_1 0:94ced082e13a 243 Mbed.write(SendData, 3);
lilac0112_1 0:94ced082e13a 244 break;
lilac0112_1 0:94ced082e13a 245
lilac0112_1 0:94ced082e13a 246 case 0x02://ping
lilac0112_1 0:94ced082e13a 247 SendData[0] = (char)PingMemory[0];
lilac0112_1 0:94ced082e13a 248 SendData[1] = (char)PingMemory[1];
lilac0112_1 0:94ced082e13a 249 Mbed.write(SendData, 2);
lilac0112_1 0:94ced082e13a 250 break;
lilac0112_1 0:94ced082e13a 251 default:
lilac0112_1 0:94ced082e13a 252 break;
lilac0112_1 0:94ced082e13a 253 }
lilac0112_1 0:94ced082e13a 254 }else{//line
lilac0112_1 0:94ced082e13a 255 SendData[0] = (char)LineFlag;
lilac0112_1 0:94ced082e13a 256 Mbed.write(SendData, 1);
lilac0112_1 0:94ced082e13a 257 }
lilac0112_1 0:94ced082e13a 258 AddressData = 0;
lilac0112_1 0:94ced082e13a 259 break;
lilac0112_1 0:94ced082e13a 260 case I2CSlave::WriteGeneral:
lilac0112_1 0:94ced082e13a 261 AddressData = Mbed.read();
lilac0112_1 0:94ced082e13a 262 break;
lilac0112_1 0:94ced082e13a 263 case I2CSlave::WriteAddressed:
lilac0112_1 0:94ced082e13a 264 AddressData = Mbed.read();
lilac0112_1 0:94ced082e13a 265 break;
lilac0112_1 0:94ced082e13a 266
lilac0112_1 0:94ced082e13a 267 }
lilac0112_1 0:94ced082e13a 268 */
lilac0112_1 0:94ced082e13a 269 pc.printf("%d %d %d %d %d %d\n\r",IrTemp[0],IrTemp[1],IrTemp[2],IrTemp[3],IrTemp[4],IrTemp[5]);
lilac0112_1 0:94ced082e13a 270
lilac0112_1 0:94ced082e13a 271 Led = 0;
lilac0112_1 0:94ced082e13a 272
lilac0112_1 0:94ced082e13a 273 }
lilac0112_1 0:94ced082e13a 274 }