10/22

Dependencies:   ColorSensor1 Servo mbed

Committer:
OGA
Date:
Tue Oct 22 07:19:27 2013 +0000
Revision:
0:fa26bf0aad5e
10/22;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
OGA 0:fa26bf0aad5e 1 //カラーセンサ6つ同時に動かすプログラム
OGA 0:fa26bf0aad5e 2 //大会用ロボ
OGA 0:fa26bf0aad5e 3 //ジャンプのプログラムも入ってる
OGA 0:fa26bf0aad5e 4 //ジャンプ命令のプログラムを変更
OGA 0:fa26bf0aad5e 5 //6_2の使わないところを消したプログラム
OGA 0:fa26bf0aad5e 6 //2回連続ジャンプシーケンス予定
OGA 0:fa26bf0aad5e 7 //5回連続ジャンプシーケンス搭載予定
OGA 0:fa26bf0aad5e 8 //10/21使用
OGA 0:fa26bf0aad5e 9 #include "mbed.h"
OGA 0:fa26bf0aad5e 10 #include "ColorSensor.h"
OGA 0:fa26bf0aad5e 11 #include "Servo.h"
OGA 0:fa26bf0aad5e 12
OGA 0:fa26bf0aad5e 13 #include "main.h"
OGA 0:fa26bf0aad5e 14
OGA 0:fa26bf0aad5e 15
OGA 0:fa26bf0aad5e 16 void tic_sensor()
OGA 0:fa26bf0aad5e 17 {
OGA 0:fa26bf0aad5e 18 colorUpdate(1);
OGA 0:fa26bf0aad5e 19
OGA 0:fa26bf0aad5e 20
OGA 0:fa26bf0aad5e 21 for(int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 22 cAve[i] = moving_ave(i, bluep[i]);
OGA 0:fa26bf0aad5e 23 }
OGA 0:fa26bf0aad5e 24
OGA 0:fa26bf0aad5e 25 roboF = robotFront();
OGA 0:fa26bf0aad5e 26 jumI = jumpInstruction(roboF);
OGA 0:fa26bf0aad5e 27
OGA 0:fa26bf0aad5e 28 }
OGA 0:fa26bf0aad5e 29
OGA 0:fa26bf0aad5e 30 ////////////////////////////////////////カラーセンサの////////////////////////////////////////
OGA 0:fa26bf0aad5e 31 ////////////////////////////////////////更新と補正プログラム///////////////////////////////////
OGA 0:fa26bf0aad5e 32 /*void rivisedate()
OGA 0:fa26bf0aad5e 33 {
OGA 0:fa26bf0aad5e 34 unsigned long red = 0,green = 0,blue =0;
OGA 0:fa26bf0aad5e 35 static unsigned R[COLOR_NUM], G[COLOR_NUM], B[COLOR_NUM];
OGA 0:fa26bf0aad5e 36
OGA 0:fa26bf0aad5e 37 //最初の20回だけ平均を取る
OGA 0:fa26bf0aad5e 38 for (int i=0;i<=20;i++){
OGA 0:fa26bf0aad5e 39 color0.getRGB(R[0],G[0],B[0]);
OGA 0:fa26bf0aad5e 40 red += R[0] ;
OGA 0:fa26bf0aad5e 41 green += G[0] ;
OGA 0:fa26bf0aad5e 42 blue += B[0] ;
OGA 0:fa26bf0aad5e 43 //pc.printf(" %d %d\n",ptm(sum),sum);
OGA 0:fa26bf0aad5e 44 }
OGA 0:fa26bf0aad5e 45
OGA 0:fa26bf0aad5e 46 rir = (double)green/ red ;
OGA 0:fa26bf0aad5e 47 rib = (double)green/ blue ;
OGA 0:fa26bf0aad5e 48 }*/
OGA 0:fa26bf0aad5e 49
OGA 0:fa26bf0aad5e 50 void colorUpdate(uint8_t mode)
OGA 0:fa26bf0aad5e 51 {
OGA 0:fa26bf0aad5e 52 double colorSum[COLOR_NUM];
OGA 0:fa26bf0aad5e 53 unsigned R[COLOR_NUM], G[COLOR_NUM], B[COLOR_NUM];
OGA 0:fa26bf0aad5e 54
OGA 0:fa26bf0aad5e 55
OGA 0:fa26bf0aad5e 56 for (int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 57 R[i] = 0;
OGA 0:fa26bf0aad5e 58 G[i] = 0;
OGA 0:fa26bf0aad5e 59 B[i] = 0;
OGA 0:fa26bf0aad5e 60 redp[i] = 0;
OGA 0:fa26bf0aad5e 61 greenp[i] = 0;
OGA 0:fa26bf0aad5e 62 bluep[i] = 0;
OGA 0:fa26bf0aad5e 63 }
OGA 0:fa26bf0aad5e 64
OGA 0:fa26bf0aad5e 65 //カラーセンサの切り替え
OGA 0:fa26bf0aad5e 66 if(mode == 1){
OGA 0:fa26bf0aad5e 67 color0.getRGB(R[0],G[0],B[0]);
OGA 0:fa26bf0aad5e 68 color1.getRGB(R[1],G[1],B[1]);
OGA 0:fa26bf0aad5e 69 color2.getRGB(R[2],G[2],B[2]);
OGA 0:fa26bf0aad5e 70
OGA 0:fa26bf0aad5e 71 color3.getRGB(R[3],G[3],B[3]);
OGA 0:fa26bf0aad5e 72 color4.getRGB(R[4],G[4],B[4]);
OGA 0:fa26bf0aad5e 73 color5.getRGB(R[5],G[5],B[5]);
OGA 0:fa26bf0aad5e 74 }
OGA 0:fa26bf0aad5e 75
OGA 0:fa26bf0aad5e 76 /*for (int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 77 colorSum[i] = R[i]*rir + G[i] + B[i]*rib ;
OGA 0:fa26bf0aad5e 78 redp[i] = R[i]* rir * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 79 greenp[i] = G[i] * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 80 bluep[i] = B[i]* rib * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 81 }*/
OGA 0:fa26bf0aad5e 82
OGA 0:fa26bf0aad5e 83 for (int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 84 colorSum[i] = R[i]*0.65 + G[i] + B[i] *1.3;
OGA 0:fa26bf0aad5e 85 redp[i] = R[i]*0.65 * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 86 greenp[i] = G[i] * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 87 bluep[i] = B[i]*1.3 * 100 / colorSum[i];
OGA 0:fa26bf0aad5e 88 }
OGA 0:fa26bf0aad5e 89 }
OGA 0:fa26bf0aad5e 90
OGA 0:fa26bf0aad5e 91
OGA 0:fa26bf0aad5e 92 uint16_t moving_ave(uint8_t num, uint16_t data)//移動平均的な
OGA 0:fa26bf0aad5e 93 {
OGA 0:fa26bf0aad5e 94 uint8_t threshold = 0;
OGA 0:fa26bf0aad5e 95 static uint16_t tmp[COLOR_NUM][10] = {{0}};
OGA 0:fa26bf0aad5e 96 //static uint32_t sum[COLOR_NUM] = {0};
OGA 0:fa26bf0aad5e 97
OGA 0:fa26bf0aad5e 98 //sum[num] -= tmp[num][9];
OGA 0:fa26bf0aad5e 99 //sum[num] += data;
OGA 0:fa26bf0aad5e 100
OGA 0:fa26bf0aad5e 101 for(uint8_t i=9; i>=1; i--){
OGA 0:fa26bf0aad5e 102 tmp[num][i] = tmp[num][i-1];
OGA 0:fa26bf0aad5e 103 }
OGA 0:fa26bf0aad5e 104 tmp[num][0] = data;
OGA 0:fa26bf0aad5e 105
OGA 0:fa26bf0aad5e 106 for(uint8_t i=0; i<=9; i++){
OGA 0:fa26bf0aad5e 107 if(tmp[num][i] >= B_THR){
OGA 0:fa26bf0aad5e 108 threshold++;
OGA 0:fa26bf0aad5e 109 }
OGA 0:fa26bf0aad5e 110 }
OGA 0:fa26bf0aad5e 111
OGA 0:fa26bf0aad5e 112 return threshold;
OGA 0:fa26bf0aad5e 113 }
OGA 0:fa26bf0aad5e 114
OGA 0:fa26bf0aad5e 115 ////////////////////////////////////////ロボの状態///////////////////////////////////////////
OGA 0:fa26bf0aad5e 116 ///////////////////////////////////////////////////////////////////////////////////////////
OGA 0:fa26bf0aad5e 117 uint8_t robotFront()//縄回しロボの正面にいるか
OGA 0:fa26bf0aad5e 118 {
OGA 0:fa26bf0aad5e 119 uint8_t threshold = 0;
OGA 0:fa26bf0aad5e 120
OGA 0:fa26bf0aad5e 121 for(int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 122 if(cAve[i] >= 8) threshold++;
OGA 0:fa26bf0aad5e 123 }
OGA 0:fa26bf0aad5e 124
OGA 0:fa26bf0aad5e 125 if(threshold >= 1){
OGA 0:fa26bf0aad5e 126 return 1;
OGA 0:fa26bf0aad5e 127 }else{
OGA 0:fa26bf0aad5e 128 return 0;
OGA 0:fa26bf0aad5e 129 }
OGA 0:fa26bf0aad5e 130 }
OGA 0:fa26bf0aad5e 131
OGA 0:fa26bf0aad5e 132 uint8_t jumpInstruction(uint8_t front)//ジャンプ命令
OGA 0:fa26bf0aad5e 133 {
OGA 0:fa26bf0aad5e 134 uint8_t threshold = 0;
OGA 0:fa26bf0aad5e 135
OGA 0:fa26bf0aad5e 136 for(int i=0; i<COLOR_NUM; i++){
OGA 0:fa26bf0aad5e 137 if((cAve[i] >= 8) && (redp[i] >= R_THR)) threshold++;
OGA 0:fa26bf0aad5e 138 }
OGA 0:fa26bf0aad5e 139
OGA 0:fa26bf0aad5e 140 if(threshold >= 1){
OGA 0:fa26bf0aad5e 141 return 1;
OGA 0:fa26bf0aad5e 142 }else{
OGA 0:fa26bf0aad5e 143 return 0;
OGA 0:fa26bf0aad5e 144 }
OGA 0:fa26bf0aad5e 145 }
OGA 0:fa26bf0aad5e 146
OGA 0:fa26bf0aad5e 147
OGA 0:fa26bf0aad5e 148
OGA 0:fa26bf0aad5e 149 ////////////////////////////////////////ジャンププログラム////////////////////////////////////
OGA 0:fa26bf0aad5e 150 ///////////////////////////////////////////////////////////////////////////////////////////
OGA 0:fa26bf0aad5e 151 void jumpAction(uint8_t threshold)
OGA 0:fa26bf0aad5e 152 {
OGA 0:fa26bf0aad5e 153 static uint8_t swFlag=0, jumpCount=0, jumpwait = 0;
OGA 0:fa26bf0aad5e 154
OGA 0:fa26bf0aad5e 155
OGA 0:fa26bf0aad5e 156 if((sw1 == 0) && (swFlag == 0)){//フォトインタラプタがオン
OGA 0:fa26bf0aad5e 157 swFlag = 1;
OGA 0:fa26bf0aad5e 158 jumpCount++;
OGA 0:fa26bf0aad5e 159 }else if(sw1 == 1){//フォトインタラプタがオフ
OGA 0:fa26bf0aad5e 160 swFlag = 0;
OGA 0:fa26bf0aad5e 161 }
OGA 0:fa26bf0aad5e 162
OGA 0:fa26bf0aad5e 163 if(threshold){
OGA 0:fa26bf0aad5e 164 led[0] = 1; led[1] = 1; led[2] = 1; led[3] = 1;
OGA 0:fa26bf0aad5e 165 myservo1 = 0;
OGA 0:fa26bf0aad5e 166
OGA 0:fa26bf0aad5e 167 wait(0.4);
OGA 0:fa26bf0aad5e 168 }
OGA 0:fa26bf0aad5e 169
OGA 0:fa26bf0aad5e 170 if(jumpCount == 1){
OGA 0:fa26bf0aad5e 171 /*if(jumpwait == 0){
OGA 0:fa26bf0aad5e 172 myservo1 = 0.5;
OGA 0:fa26bf0aad5e 173 wait(1);
OGA 0:fa26bf0aad5e 174 jumpwait = 1;
OGA 0:fa26bf0aad5e 175 }*/
OGA 0:fa26bf0aad5e 176 myservo1 = 0.3; led[0] = 1;led[1] = 1; led[2] = 1; led[3] = 0;
OGA 0:fa26bf0aad5e 177 }else if(jumpCount >= 2){
OGA 0:fa26bf0aad5e 178 myservo1 = 0.5; led[0] = 1;led[1] = 1; led[2] = 0; led[3] = 0;
OGA 0:fa26bf0aad5e 179 jumpCount = 0;
OGA 0:fa26bf0aad5e 180 jumpwait = 0;
OGA 0:fa26bf0aad5e 181 }
OGA 0:fa26bf0aad5e 182 }
OGA 0:fa26bf0aad5e 183
OGA 0:fa26bf0aad5e 184
OGA 0:fa26bf0aad5e 185
OGA 0:fa26bf0aad5e 186 ////////////////////////////////////////通信用プログラム/////////////////////////////////////
OGA 0:fa26bf0aad5e 187 ///////////////////////////////////////////////////////////////////////////////////////////
OGA 0:fa26bf0aad5e 188 /*
OGA 0:fa26bf0aad5e 189 #define SEND_DATA_NUM 7
OGA 0:fa26bf0aad5e 190 #define RECEIVE_DATA_NUM 7
OGA 0:fa26bf0aad5e 191
OGA 0:fa26bf0aad5e 192 #define KEYCODE 120
OGA 0:fa26bf0aad5e 193
OGA 0:fa26bf0aad5e 194 Serial device(p28,p27);
OGA 0:fa26bf0aad5e 195
OGA 0:fa26bf0aad5e 196 static uint8_t SendData0[SEND_DATA_NUM];
OGA 0:fa26bf0aad5e 197
OGA 0:fa26bf0aad5e 198 void dev_tx()
OGA 0:fa26bf0aad5e 199 {
OGA 0:fa26bf0aad5e 200 static uint8_t count = 0;
OGA 0:fa26bf0aad5e 201
OGA 0:fa26bf0aad5e 202 SendData0[0] = KEYCODE;
OGA 0:fa26bf0aad5e 203
OGA 0:fa26bf0aad5e 204 device.putc(SendData0[count]);
OGA 0:fa26bf0aad5e 205
OGA 0:fa26bf0aad5e 206 count++;
OGA 0:fa26bf0aad5e 207
OGA 0:fa26bf0aad5e 208 if(count > SEND_DATA_NUM){
OGA 0:fa26bf0aad5e 209 count = 0;
OGA 0:fa26bf0aad5e 210 }
OGA 0:fa26bf0aad5e 211
OGA 0:fa26bf0aad5e 212 led[4] = 1;
OGA 0:fa26bf0aad5e 213 }
OGA 0:fa26bf0aad5e 214 */
OGA 0:fa26bf0aad5e 215
OGA 0:fa26bf0aad5e 216
OGA 0:fa26bf0aad5e 217
OGA 0:fa26bf0aad5e 218
OGA 0:fa26bf0aad5e 219 int main() {
OGA 0:fa26bf0aad5e 220 //init
OGA 0:fa26bf0aad5e 221
OGA 0:fa26bf0aad5e 222 /*device.baud(9600);
OGA 0:fa26bf0aad5e 223 device.printf("START");
OGA 0:fa26bf0aad5e 224 device.attach(&dev_tx,Serial::TxIrq);*/
OGA 0:fa26bf0aad5e 225
OGA 0:fa26bf0aad5e 226 //rivisedate();
OGA 0:fa26bf0aad5e 227 wait(3);
OGA 0:fa26bf0aad5e 228
OGA 0:fa26bf0aad5e 229 interrupt0.attach(&tic_sensor, 0.1/*sec*/);//0.04sec以上じゃないとmain動かない?
OGA 0:fa26bf0aad5e 230 //sw1.mode(PullUp);
OGA 0:fa26bf0aad5e 231 //init end
OGA 0:fa26bf0aad5e 232
OGA 0:fa26bf0aad5e 233 myservo1 = 0.1;
OGA 0:fa26bf0aad5e 234 wait(0.5);
OGA 0:fa26bf0aad5e 235
OGA 0:fa26bf0aad5e 236 while(1) {
OGA 0:fa26bf0aad5e 237 //SendData0[1] = jumI;
OGA 0:fa26bf0aad5e 238
OGA 0:fa26bf0aad5e 239 pc.printf("R:%d G:%d B:%d %t moving_ave():%d %t robotFront():%d %t jumpInstruction():%d\n", redp[2], greenp[2], bluep[2], cAve, roboF, jumI);
OGA 0:fa26bf0aad5e 240
OGA 0:fa26bf0aad5e 241
OGA 0:fa26bf0aad5e 242 jumpAction(jumI);
OGA 0:fa26bf0aad5e 243 }
OGA 0:fa26bf0aad5e 244 }