足の上げ下げを行う 一つの足につき2つのセンサを使用、 RTOS使用、 NHKの足上げプログラム予定

Dependencies:   mbed-rtos mbed

Committer:
ryuna
Date:
Sun Oct 12 00:43:25 2014 +0000
Revision:
0:0773a5499020
RTOS????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryuna 0:0773a5499020 1 /*
ryuna 0:0773a5499020 2 *覚え書き
ryuna 0:0773a5499020 3 *
ryuna 0:0773a5499020 4 ***mbedのピン配置に対するこのプログラムのピンの設定
ryuna 0:0773a5499020 5 *p5 ~ p12 Motor ...BusOut :Motor moved
ryuna 0:0773a5499020 6 *p13 ~ p20 Photo ...BusIn :Photo Sensor
ryuna 0:0773a5499020 7 *p21 ~ p24 Pwm ...PwmOut :Motor Pwm Signal
ryuna 0:0773a5499020 8 *p21 ~ p24 Sp ...DigitalOut :Check sensor state,do ditto led
ryuna 0:0773a5499020 9 *p25 ~ p28 Tempra...BusOut :Motor Tempra Moved
ryuna 0:0773a5499020 10 *p29,p30 Sw[2] ...DigitalIn :Switch Multi Use
ryuna 0:0773a5499020 11 *LED1 ~ LED4 Led ...DigitalOut :Led Brinked
ryuna 0:0773a5499020 12 *
ryuna 0:0773a5499020 13 **********************
ryuna 0:0773a5499020 14 ***関数の内容
ryuna 0:0773a5499020 15 *void WaitStop() :use wait
ryuna 0:0773a5499020 16 *void MotorStop() :erase motor pulses
ryuna 0:0773a5499020 17 *void MotorStart() :motor start timing timer
ryuna 0:0773a5499020 18 *void TempraStop() :stop motor of crawler
ryuna 0:0773a5499020 19 * //void Photo() :main processing ,wheel(lift or lower)motor move start
ryuna 0:0773a5499020 20 *void Reset() :wheels lower
ryuna 0:0773a5499020 21 *void GainSetting():sensor check mode,blinking Led
ryuna 0:0773a5499020 22 *void AndCount() :and count
ryuna 0:0773a5499020 23 *void SetUp() :first in function
ryuna 0:0773a5499020 24 *int main() :main function
ryuna 0:0773a5499020 25 *
ryuna 0:0773a5499020 26 *スレッド
ryuna 0:0773a5499020 27 *void Photo01_Thread(void const *argument)
ryuna 0:0773a5499020 28 *void Photo23_Thread(void const *argument)
ryuna 0:0773a5499020 29 *void Photo45_Thread(void const *argument)
ryuna 0:0773a5499020 30 *void Photo67_Thread(void const *argument) : main processing ,wheel(lift or lower)motor move start thread
ryuna 0:0773a5499020 31 *void ParallelThread(void const *argument) : Jump reset or GainSetting function
ryuna 0:0773a5499020 32 *
ryuna 0:0773a5499020 33 ***********************
ryuna 0:0773a5499020 34 ***処理内容
ryuna 0:0773a5499020 35 *photo系
ryuna 0:0773a5499020 36 *前のセンサで検知したら足をあげる、その後後ろのセンサが検知したら足を下げる
ryuna 0:0773a5499020 37 *前センサ→前センサ→後ろセンサ→後ろセンサ この場合足の上げ下げは一回しか行われない
ryuna 0:0773a5499020 38 *
ryuna 0:0773a5499020 39 *
ryuna 0:0773a5499020 40 *
ryuna 0:0773a5499020 41 **追記
ryuna 0:0773a5499020 42 *Photo {右前々、右前後、右後前、右後々、 左前々、左前後、左後前、左後々}
ryuna 0:0773a5499020 43 *
ryuna 0:0773a5499020 44 *
ryuna 0:0773a5499020 45 */
ryuna 0:0773a5499020 46
ryuna 0:0773a5499020 47
ryuna 0:0773a5499020 48 #include "mbed.h"
ryuna 0:0773a5499020 49 #include "rtos.h"
ryuna 0:0773a5499020 50
ryuna 0:0773a5499020 51 #define MOTOR_NUM 8 //motor & sensor num
ryuna 0:0773a5499020 52 #define START_TIME_B 0.237 //motor start wait time of Back //a lot
ryuna 0:0773a5499020 53 #define START_TIME_F 0.04
ryuna 0:0773a5499020 54 #define MOVE_TIME 0.10 //lift a wheel for 0.090 seconds
ryuna 0:0773a5499020 55 #define MOVE_DOWN_TIME 0.115 //lower a wheel for 0.10 seconds
ryuna 0:0773a5499020 56 #define TEMPRA_TIME 3.0 //move a crawler for 4.0 seconds
ryuna 0:0773a5499020 57 #define WAIT_TIME 0.010 //make wait time
ryuna 0:0773a5499020 58 #define PWM_LEVEL 1.0 //motors pwm setting level
ryuna 0:0773a5499020 59
ryuna 0:0773a5499020 60
ryuna 0:0773a5499020 61 BusIn Photo(p5, p6, p7, p8, p9, p10, p11, p12 );
ryuna 0:0773a5499020 62 DigitalIn Sw[2] = {p29, p30};
ryuna 0:0773a5499020 63
ryuna 0:0773a5499020 64 DigitalOut Led[4] = {LED1, LED2, LED3, LED4 };
ryuna 0:0773a5499020 65 DigitalOut Sp[4] = {p21, p22, p23, p24 };
ryuna 0:0773a5499020 66 BusOut Motor(p13, p14, p15, p16, p17, p18, p19, p20 );//{left front, right front, left back ,right back }
ryuna 0:0773a5499020 67 BusOut Tempra(p25, p26, p27, p28 );
ryuna 0:0773a5499020 68 //PwmOut Pwm[4] = {p21, p22, p23, p24 };
ryuna 0:0773a5499020 69
ryuna 0:0773a5499020 70 Timeout StartTimer[4];
ryuna 0:0773a5499020 71 Timeout StopTimer[8];
ryuna 0:0773a5499020 72 Timeout StopTempra;
ryuna 0:0773a5499020 73 Timeout StopWait[4];
ryuna 0:0773a5499020 74
ryuna 0:0773a5499020 75
ryuna 0:0773a5499020 76 volatile bool MotorState[4] = {0} ,Flag[4] = {0} ,FlagAdd[4] = {0} ,And[4] = {0} ,Wait[4] = {0};
ryuna 0:0773a5499020 77 volatile uint8_t Way = 0, DownCount = 0;
ryuna 0:0773a5499020 78 volatile bool TempraFlag = 1;
ryuna 0:0773a5499020 79
ryuna 0:0773a5499020 80
ryuna 0:0773a5499020 81 /*
ryuna 0:0773a5499020 82 Motor = {
ryuna 0:0773a5499020 83 LeftFrontUp, LeftFrontDown,
ryuna 0:0773a5499020 84 RightFrontUp, RightFrontDown,
ryuna 0:0773a5499020 85 LeftBackUp, LeftBackDown,
ryuna 0:0773a5499020 86 RightBackUp, RightBackDown
ryuna 0:0773a5499020 87 };
ryuna 0:0773a5499020 88 */
ryuna 0:0773a5499020 89
ryuna 0:0773a5499020 90 /***********************WaitStop*/
ryuna 0:0773a5499020 91 void WaitStop0()
ryuna 0:0773a5499020 92 {
ryuna 0:0773a5499020 93 Wait[0] = 0;
ryuna 0:0773a5499020 94 }
ryuna 0:0773a5499020 95 void WaitStop1()
ryuna 0:0773a5499020 96 {
ryuna 0:0773a5499020 97 Wait[1] = 0;
ryuna 0:0773a5499020 98 }
ryuna 0:0773a5499020 99 void WaitStop2()
ryuna 0:0773a5499020 100 {
ryuna 0:0773a5499020 101 Wait[2] = 0;
ryuna 0:0773a5499020 102 }
ryuna 0:0773a5499020 103 void WaitStop3()
ryuna 0:0773a5499020 104 {
ryuna 0:0773a5499020 105 Wait[3] = 0;
ryuna 0:0773a5499020 106 }
ryuna 0:0773a5499020 107 /*
ryuna 0:0773a5499020 108 ********************************MotorStop
ryuna 0:0773a5499020 109 */
ryuna 0:0773a5499020 110 void MotorStop0()
ryuna 0:0773a5499020 111 {
ryuna 0:0773a5499020 112 Motor = Motor & 0x7F;
ryuna 0:0773a5499020 113 }
ryuna 0:0773a5499020 114 void MotorStop1()
ryuna 0:0773a5499020 115 {
ryuna 0:0773a5499020 116 Motor = Motor & 0xBF;
ryuna 0:0773a5499020 117 StopWait[0].attach(&WaitStop0,WAIT_TIME);
ryuna 0:0773a5499020 118 }
ryuna 0:0773a5499020 119 void MotorStop2()
ryuna 0:0773a5499020 120 {
ryuna 0:0773a5499020 121 Motor = Motor & 0xF7;
ryuna 0:0773a5499020 122 }
ryuna 0:0773a5499020 123 void MotorStop3()
ryuna 0:0773a5499020 124 {
ryuna 0:0773a5499020 125 Motor = Motor & 0xFB;
ryuna 0:0773a5499020 126 StopWait[1].attach(&WaitStop1,WAIT_TIME);
ryuna 0:0773a5499020 127 }
ryuna 0:0773a5499020 128 void MotorStop4()
ryuna 0:0773a5499020 129 {
ryuna 0:0773a5499020 130 Motor = Motor & 0xDF;
ryuna 0:0773a5499020 131 }
ryuna 0:0773a5499020 132 void MotorStop5()
ryuna 0:0773a5499020 133 {
ryuna 0:0773a5499020 134 Motor = Motor & 0xEF;
ryuna 0:0773a5499020 135 StopWait[2].attach(&WaitStop2,WAIT_TIME);
ryuna 0:0773a5499020 136 }
ryuna 0:0773a5499020 137 void MotorStop6()
ryuna 0:0773a5499020 138 {
ryuna 0:0773a5499020 139 Motor = Motor & 0xFD;
ryuna 0:0773a5499020 140 }
ryuna 0:0773a5499020 141 void MotorStop7()
ryuna 0:0773a5499020 142 {
ryuna 0:0773a5499020 143 Motor = Motor & 0xFE;
ryuna 0:0773a5499020 144 StopWait[3].attach(&WaitStop3,WAIT_TIME);
ryuna 0:0773a5499020 145 }
ryuna 0:0773a5499020 146
ryuna 0:0773a5499020 147 /*
ryuna 0:0773a5499020 148 ***********************MotorStart
ryuna 0:0773a5499020 149 */
ryuna 0:0773a5499020 150 void MotorStart0()
ryuna 0:0773a5499020 151 {
ryuna 0:0773a5499020 152 StopTimer[0].attach(&MotorStop0,MOVE_TIME);
ryuna 0:0773a5499020 153 Motor = Motor & 0xBF;
ryuna 0:0773a5499020 154 Motor = Motor | 0x80;//10000000
ryuna 0:0773a5499020 155
ryuna 0:0773a5499020 156 }
ryuna 0:0773a5499020 157 void MotorStart1()
ryuna 0:0773a5499020 158 {
ryuna 0:0773a5499020 159 StopTimer[2].attach(&MotorStop2,MOVE_TIME);
ryuna 0:0773a5499020 160 Motor = Motor & 0xFB;
ryuna 0:0773a5499020 161 Motor = Motor | 0x08;//00001000
ryuna 0:0773a5499020 162 }
ryuna 0:0773a5499020 163 void MotorStart2()
ryuna 0:0773a5499020 164 {
ryuna 0:0773a5499020 165 StopTimer[4].attach(&MotorStop4,MOVE_TIME);
ryuna 0:0773a5499020 166 Motor = Motor & 0xEF;
ryuna 0:0773a5499020 167 Motor = Motor | 0x20;//00100000
ryuna 0:0773a5499020 168
ryuna 0:0773a5499020 169 }
ryuna 0:0773a5499020 170 void MotorStart3()
ryuna 0:0773a5499020 171 {
ryuna 0:0773a5499020 172 StopTimer[6].attach(&MotorStop6,MOVE_TIME);
ryuna 0:0773a5499020 173 Motor = Motor & 0xFE;
ryuna 0:0773a5499020 174 Motor = Motor | 0x02;//00000010
ryuna 0:0773a5499020 175 }
ryuna 0:0773a5499020 176
ryuna 0:0773a5499020 177
ryuna 0:0773a5499020 178 void TempraStop()
ryuna 0:0773a5499020 179 {
ryuna 0:0773a5499020 180 Tempra = 0x00;
ryuna 0:0773a5499020 181 }
ryuna 0:0773a5499020 182
ryuna 0:0773a5499020 183
ryuna 0:0773a5499020 184
ryuna 0:0773a5499020 185 void Photo01_Thread(void const *argument)
ryuna 0:0773a5499020 186 {
ryuna 0:0773a5499020 187 uint8_t CkPhoto = 0;
ryuna 0:0773a5499020 188 bool CkFlag[2] = {1,1};
ryuna 0:0773a5499020 189
ryuna 0:0773a5499020 190 while(1) {
ryuna 0:0773a5499020 191 CkPhoto = (~Photo) & 0x03;
ryuna 0:0773a5499020 192 if(CkPhoto==0) { // 右前足
ryuna 0:0773a5499020 193 CkFlag[0] = 1;
ryuna 0:0773a5499020 194 CkFlag[1] = 1;
ryuna 0:0773a5499020 195 } else if(CkPhoto<3) {
ryuna 0:0773a5499020 196 CkPhoto -= 1;
ryuna 0:0773a5499020 197 if(CkFlag[CkPhoto]) {
ryuna 0:0773a5499020 198 if(CkPhoto == 0) {
ryuna 0:0773a5499020 199 if(Way ==0){
ryuna 0:0773a5499020 200 Way = 1;
ryuna 0:0773a5499020 201 }
ryuna 0:0773a5499020 202 if((Way == 1)&&!Wait[0]) {
ryuna 0:0773a5499020 203 if(!MotorState[0]) {
ryuna 0:0773a5499020 204 StartTimer[0].attach(&MotorStart0,START_TIME_F);
ryuna 0:0773a5499020 205 MotorState[0] = 1;
ryuna 0:0773a5499020 206 Led[0] = 1;
ryuna 0:0773a5499020 207 Sp [0] = 1;
ryuna 0:0773a5499020 208 } else {
ryuna 0:0773a5499020 209 Flag[0] = 1;
ryuna 0:0773a5499020 210 }
ryuna 0:0773a5499020 211 }
ryuna 0:0773a5499020 212
ryuna 0:0773a5499020 213 } else {
ryuna 0:0773a5499020 214 if(Way == 1) {
ryuna 0:0773a5499020 215 if(Flag[0]&&!FlagAdd[0]) {
ryuna 0:0773a5499020 216 FlagAdd[0] = 1;
ryuna 0:0773a5499020 217 } else if(MotorState[0]) {
ryuna 0:0773a5499020 218 StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 219 Motor = Motor & 0x7F;// 01111111
ryuna 0:0773a5499020 220 Motor = Motor | 0x40;//0x40 = 01000000
ryuna 0:0773a5499020 221 MotorState[0] = 0;
ryuna 0:0773a5499020 222 Flag[0] = 0;
ryuna 0:0773a5499020 223 FlagAdd[0] = 0;
ryuna 0:0773a5499020 224 Led[0] = 0;
ryuna 0:0773a5499020 225 Sp [0] = 0;
ryuna 0:0773a5499020 226 And[0] = 1;
ryuna 0:0773a5499020 227 Wait[0] = 1;
ryuna 0:0773a5499020 228 }
ryuna 0:0773a5499020 229 }
ryuna 0:0773a5499020 230
ryuna 0:0773a5499020 231 }
ryuna 0:0773a5499020 232 CkFlag[CkPhoto] = 0;
ryuna 0:0773a5499020 233 }
ryuna 0:0773a5499020 234 }
ryuna 0:0773a5499020 235 }
ryuna 0:0773a5499020 236
ryuna 0:0773a5499020 237 }
ryuna 0:0773a5499020 238 void Photo23_Thread(void const *argument)
ryuna 0:0773a5499020 239 {
ryuna 0:0773a5499020 240 uint8_t CkPhoto = 0;
ryuna 0:0773a5499020 241 bool CkFlag[2] = {1,1};
ryuna 0:0773a5499020 242
ryuna 0:0773a5499020 243 while(1) {
ryuna 0:0773a5499020 244 CkPhoto = ((~Photo) & 0x0C) >> 2;
ryuna 0:0773a5499020 245 if(CkPhoto==0) { // 右前足
ryuna 0:0773a5499020 246 CkFlag[0] = 1;
ryuna 0:0773a5499020 247 CkFlag[1] = 1;
ryuna 0:0773a5499020 248 } else if(CkPhoto<3) {
ryuna 0:0773a5499020 249 CkPhoto -= 1;
ryuna 0:0773a5499020 250 if(CkFlag[CkPhoto]) {
ryuna 0:0773a5499020 251 if(CkPhoto == 0) {
ryuna 0:0773a5499020 252 if((Way == 1)&&!Wait[1]) {
ryuna 0:0773a5499020 253 if(!MotorState[1]) {
ryuna 0:0773a5499020 254 StartTimer[1].attach(&MotorStart1,START_TIME_B);
ryuna 0:0773a5499020 255 MotorState[1] = 1;
ryuna 0:0773a5499020 256 Led[1] = 1;
ryuna 0:0773a5499020 257 Sp [1] = 1;
ryuna 0:0773a5499020 258 } else {
ryuna 0:0773a5499020 259 Flag[1] = 1;
ryuna 0:0773a5499020 260 }
ryuna 0:0773a5499020 261 }
ryuna 0:0773a5499020 262
ryuna 0:0773a5499020 263 } else {
ryuna 0:0773a5499020 264 if(Way == 1) {
ryuna 0:0773a5499020 265 if(Flag[1]&&!FlagAdd[1]) {
ryuna 0:0773a5499020 266 FlagAdd[1] = 1;
ryuna 0:0773a5499020 267 } else if(MotorState[1]) {
ryuna 0:0773a5499020 268 StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 269 Motor = Motor & 0xF7;
ryuna 0:0773a5499020 270 Motor = Motor | 0x04;//00000100
ryuna 0:0773a5499020 271 MotorState[1] = 0;
ryuna 0:0773a5499020 272 Flag[1] = 0;
ryuna 0:0773a5499020 273 FlagAdd[1] = 0;
ryuna 0:0773a5499020 274 Led[1] = 0;
ryuna 0:0773a5499020 275 Sp [1] = 0;
ryuna 0:0773a5499020 276 And[1] = 1;
ryuna 0:0773a5499020 277 Wait[1] = 1;
ryuna 0:0773a5499020 278 }
ryuna 0:0773a5499020 279 }
ryuna 0:0773a5499020 280
ryuna 0:0773a5499020 281 }
ryuna 0:0773a5499020 282 CkFlag[CkPhoto] = 0;
ryuna 0:0773a5499020 283 }
ryuna 0:0773a5499020 284 }
ryuna 0:0773a5499020 285 }
ryuna 0:0773a5499020 286
ryuna 0:0773a5499020 287 }
ryuna 0:0773a5499020 288 void Photo45_Thread(void const *argument)
ryuna 0:0773a5499020 289 {
ryuna 0:0773a5499020 290 uint8_t CkPhoto = 0;
ryuna 0:0773a5499020 291 bool CkFlag[2] = {1,1};
ryuna 0:0773a5499020 292
ryuna 0:0773a5499020 293 while(1) {
ryuna 0:0773a5499020 294 CkPhoto = ((~Photo) & 0x30) >> 4;
ryuna 0:0773a5499020 295 if(CkPhoto==0) { // 右前足
ryuna 0:0773a5499020 296 CkFlag[0] = 1;
ryuna 0:0773a5499020 297 CkFlag[1] = 1;
ryuna 0:0773a5499020 298 } else if(CkPhoto<3) {
ryuna 0:0773a5499020 299 CkPhoto -= 1;
ryuna 0:0773a5499020 300 if(CkFlag[CkPhoto]) {
ryuna 0:0773a5499020 301 if(CkPhoto == 0) {
ryuna 0:0773a5499020 302 if(Way == 0) {
ryuna 0:0773a5499020 303 Way = 1;
ryuna 0:0773a5499020 304 }
ryuna 0:0773a5499020 305 if((Way == 1)&&!Wait[2]) {
ryuna 0:0773a5499020 306 if(!MotorState[2]) {
ryuna 0:0773a5499020 307 StartTimer[2].attach(&MotorStart2,START_TIME_F);
ryuna 0:0773a5499020 308 MotorState[2] = 1;
ryuna 0:0773a5499020 309 Led[2] = 1;
ryuna 0:0773a5499020 310 Sp [2] = 1;
ryuna 0:0773a5499020 311 } else {
ryuna 0:0773a5499020 312 Flag[2] = 1;
ryuna 0:0773a5499020 313 }
ryuna 0:0773a5499020 314 }
ryuna 0:0773a5499020 315 } else {
ryuna 0:0773a5499020 316 if(Way == 1) {
ryuna 0:0773a5499020 317 if(Flag[2]&&!FlagAdd[2]) {
ryuna 0:0773a5499020 318 FlagAdd[2] = 1;
ryuna 0:0773a5499020 319 } else if(MotorState[2]) {
ryuna 0:0773a5499020 320 StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 321 Motor = Motor & 0xDF;
ryuna 0:0773a5499020 322 Motor = Motor | 0x10;//00010000
ryuna 0:0773a5499020 323 MotorState[2] = 0;
ryuna 0:0773a5499020 324 Flag[2] = 0;
ryuna 0:0773a5499020 325 FlagAdd[2] = 0;
ryuna 0:0773a5499020 326 Led[2] = 0;
ryuna 0:0773a5499020 327 Sp [2] = 0;
ryuna 0:0773a5499020 328 And[2] = 1;
ryuna 0:0773a5499020 329 Wait[2] = 1;
ryuna 0:0773a5499020 330 }
ryuna 0:0773a5499020 331 }
ryuna 0:0773a5499020 332
ryuna 0:0773a5499020 333 }
ryuna 0:0773a5499020 334 CkFlag[CkPhoto] = 0;
ryuna 0:0773a5499020 335 }
ryuna 0:0773a5499020 336 }
ryuna 0:0773a5499020 337 }
ryuna 0:0773a5499020 338
ryuna 0:0773a5499020 339 }
ryuna 0:0773a5499020 340 void Photo67_Thread(void const *argument)
ryuna 0:0773a5499020 341 {
ryuna 0:0773a5499020 342 uint8_t CkPhoto = 0;
ryuna 0:0773a5499020 343 bool CkFlag[2] = {1,1};
ryuna 0:0773a5499020 344
ryuna 0:0773a5499020 345 while(1) {
ryuna 0:0773a5499020 346 CkPhoto = ((~Photo) & 0xC0) >> 6;
ryuna 0:0773a5499020 347 if(CkPhoto==0) { // 右前足
ryuna 0:0773a5499020 348 CkFlag[0] = 1;
ryuna 0:0773a5499020 349 CkFlag[1] = 1;
ryuna 0:0773a5499020 350 } else if(CkPhoto<3) {
ryuna 0:0773a5499020 351 CkPhoto -= 1;
ryuna 0:0773a5499020 352 if(CkFlag[CkPhoto]) {
ryuna 0:0773a5499020 353 if(CkPhoto == 0) {
ryuna 0:0773a5499020 354 if((Way == 1)&&!Wait[3]) {
ryuna 0:0773a5499020 355 if(!MotorState[3]) {
ryuna 0:0773a5499020 356 StartTimer[3].attach(&MotorStart3,START_TIME_B);
ryuna 0:0773a5499020 357 MotorState[3] = 1;
ryuna 0:0773a5499020 358 Led[3] = 1;
ryuna 0:0773a5499020 359 Sp [3] = 1;
ryuna 0:0773a5499020 360 } else {
ryuna 0:0773a5499020 361 Flag[3] = 1;
ryuna 0:0773a5499020 362 }
ryuna 0:0773a5499020 363 }
ryuna 0:0773a5499020 364
ryuna 0:0773a5499020 365 } else {
ryuna 0:0773a5499020 366 if(Way == 1) {
ryuna 0:0773a5499020 367 if(Flag[3]&&!FlagAdd[3]) {
ryuna 0:0773a5499020 368 FlagAdd[3] = 1;
ryuna 0:0773a5499020 369 } else if(MotorState[3]) {
ryuna 0:0773a5499020 370 StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 371 Motor = Motor & 0xFD;//11111101
ryuna 0:0773a5499020 372 Motor = Motor | 0x01;//00000001
ryuna 0:0773a5499020 373 MotorState[3] = 0;
ryuna 0:0773a5499020 374 Flag[3] = 0;
ryuna 0:0773a5499020 375 FlagAdd[3] = 0;
ryuna 0:0773a5499020 376 Led[3] = 0;
ryuna 0:0773a5499020 377 Sp [3] = 0;
ryuna 0:0773a5499020 378 And[3] = 1;
ryuna 0:0773a5499020 379 Wait[3] = 1;
ryuna 0:0773a5499020 380 }
ryuna 0:0773a5499020 381 }
ryuna 0:0773a5499020 382
ryuna 0:0773a5499020 383 }
ryuna 0:0773a5499020 384 CkFlag[CkPhoto] = 0;
ryuna 0:0773a5499020 385 }
ryuna 0:0773a5499020 386 }
ryuna 0:0773a5499020 387 }
ryuna 0:0773a5499020 388
ryuna 0:0773a5499020 389 }
ryuna 0:0773a5499020 390
ryuna 0:0773a5499020 391
ryuna 0:0773a5499020 392 void Reset()
ryuna 0:0773a5499020 393 {
ryuna 0:0773a5499020 394 int i;
ryuna 0:0773a5499020 395
ryuna 0:0773a5499020 396 if(MotorState[0]) {
ryuna 0:0773a5499020 397 StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 398 Motor = Motor | 0x40;//01000000
ryuna 0:0773a5499020 399 }
ryuna 0:0773a5499020 400 if(MotorState[1]) {
ryuna 0:0773a5499020 401 StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 402 Motor = Motor | 0x04;//00000100
ryuna 0:0773a5499020 403 }
ryuna 0:0773a5499020 404 if(MotorState[2]) {
ryuna 0:0773a5499020 405 StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 406 Motor = Motor | 0x10;//00010000
ryuna 0:0773a5499020 407 }
ryuna 0:0773a5499020 408 if(MotorState[3]) {
ryuna 0:0773a5499020 409 StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
ryuna 0:0773a5499020 410 Motor = Motor | 0x01;//00000001
ryuna 0:0773a5499020 411 }
ryuna 0:0773a5499020 412 for(i = 0; i < 4; i++) {
ryuna 0:0773a5499020 413 Led[i] = 0;
ryuna 0:0773a5499020 414 Flag[i] = 0;
ryuna 0:0773a5499020 415 FlagAdd[i] = 0;
ryuna 0:0773a5499020 416 MotorState[i] = 0;
ryuna 0:0773a5499020 417 And[i] = 0;
ryuna 0:0773a5499020 418 }
ryuna 0:0773a5499020 419
ryuna 0:0773a5499020 420 Way = 0;
ryuna 0:0773a5499020 421 DownCount = 0;
ryuna 0:0773a5499020 422 TempraFlag = 1;
ryuna 0:0773a5499020 423
ryuna 0:0773a5499020 424 }
ryuna 0:0773a5499020 425
ryuna 0:0773a5499020 426 void GainSetting ()
ryuna 0:0773a5499020 427 {
ryuna 0:0773a5499020 428
ryuna 0:0773a5499020 429 bool CkFlag[8] = {1,1,1,1,1,1,1,1},PhotoCk[8] = {0};
ryuna 0:0773a5499020 430
ryuna 0:0773a5499020 431 Reset();
ryuna 0:0773a5499020 432 Tempra = 0;
ryuna 0:0773a5499020 433 TempraFlag = 0;
ryuna 0:0773a5499020 434 Led[0] = Led[1] = Led[2] = Led[3] = 1;
ryuna 0:0773a5499020 435 Sp[0] = Sp[1] = Sp[2] = Sp[3] = 1;
ryuna 0:0773a5499020 436
ryuna 0:0773a5499020 437 while(1) {
ryuna 0:0773a5499020 438 if(!Sw[0]) {
ryuna 0:0773a5499020 439 while(1) {//右側のセンサの調整
ryuna 0:0773a5499020 440 PhotoCk[0] = ((~Photo)&0x01);
ryuna 0:0773a5499020 441 PhotoCk[1] = ((~Photo)&0x02) >> 1;
ryuna 0:0773a5499020 442 PhotoCk[2] = ((~Photo)&0x04) >> 2;
ryuna 0:0773a5499020 443 PhotoCk[3] = ((~Photo)&0x08) >> 3;
ryuna 0:0773a5499020 444 if(PhotoCk[0]&&CkFlag[0]) {
ryuna 0:0773a5499020 445 Led[0] = 0;
ryuna 0:0773a5499020 446 Sp [0] = 0;
ryuna 0:0773a5499020 447 CkFlag[0] = 0;
ryuna 0:0773a5499020 448 } else if(!PhotoCk[0]) {
ryuna 0:0773a5499020 449 CkFlag[0] = 1;
ryuna 0:0773a5499020 450 Led[0] = 1;
ryuna 0:0773a5499020 451 Sp [0] = 1;
ryuna 0:0773a5499020 452 }
ryuna 0:0773a5499020 453
ryuna 0:0773a5499020 454 if(PhotoCk[1]&&CkFlag[1]) {
ryuna 0:0773a5499020 455 Led[1] = 0;
ryuna 0:0773a5499020 456 Sp [1] = 0;
ryuna 0:0773a5499020 457 CkFlag[1] = 0;
ryuna 0:0773a5499020 458 } else if(!PhotoCk[1]) {
ryuna 0:0773a5499020 459 CkFlag[1] = 1;
ryuna 0:0773a5499020 460 Led[1] = 1;
ryuna 0:0773a5499020 461 Sp [1] = 1;
ryuna 0:0773a5499020 462 }
ryuna 0:0773a5499020 463 if(PhotoCk[2]&&CkFlag[2]) {
ryuna 0:0773a5499020 464 Led[2] = 0;
ryuna 0:0773a5499020 465 Sp [2] = 0;
ryuna 0:0773a5499020 466 CkFlag[2] = 0;
ryuna 0:0773a5499020 467 } else if(!PhotoCk[2]) {
ryuna 0:0773a5499020 468 CkFlag[2] = 1;
ryuna 0:0773a5499020 469 Led[2] = 1;
ryuna 0:0773a5499020 470 Sp [2] = 1;
ryuna 0:0773a5499020 471 }
ryuna 0:0773a5499020 472 if(PhotoCk[3]&&CkFlag[3]) {
ryuna 0:0773a5499020 473 Led[3] = 0;
ryuna 0:0773a5499020 474 Sp [3] = 0;
ryuna 0:0773a5499020 475 CkFlag[3] = 0;
ryuna 0:0773a5499020 476 } else if(!PhotoCk[3]) {
ryuna 0:0773a5499020 477 CkFlag[3] = 1;
ryuna 0:0773a5499020 478 Led[3] = 1;
ryuna 0:0773a5499020 479 Sp [3] = 1;
ryuna 0:0773a5499020 480 }
ryuna 0:0773a5499020 481 if(!Sw[1]) break;
ryuna 0:0773a5499020 482 }
ryuna 0:0773a5499020 483 }
ryuna 0:0773a5499020 484
ryuna 0:0773a5499020 485 //左側のセンサの調整
ryuna 0:0773a5499020 486 PhotoCk[4] = ((~Photo)&0x10) >> 4;
ryuna 0:0773a5499020 487 PhotoCk[5] = ((~Photo)&0x20) >> 5;
ryuna 0:0773a5499020 488 PhotoCk[6] = ((~Photo)&0x40) >> 6;
ryuna 0:0773a5499020 489 PhotoCk[7] = ((~Photo)&0x80) >> 7;
ryuna 0:0773a5499020 490
ryuna 0:0773a5499020 491 if(PhotoCk[4]&&CkFlag[4]) {
ryuna 0:0773a5499020 492 Led[0] = 0;
ryuna 0:0773a5499020 493 Sp [0] = 0;
ryuna 0:0773a5499020 494 CkFlag[4] = 0;
ryuna 0:0773a5499020 495 } else if(!PhotoCk[4]) {
ryuna 0:0773a5499020 496 CkFlag[4] = 1;
ryuna 0:0773a5499020 497 Led[0] = 1;
ryuna 0:0773a5499020 498 Sp [0] = 1;
ryuna 0:0773a5499020 499 }
ryuna 0:0773a5499020 500 if(PhotoCk[5]&&CkFlag[5]) {
ryuna 0:0773a5499020 501 Led[1] = 0;
ryuna 0:0773a5499020 502 Sp [1] = 0;
ryuna 0:0773a5499020 503 CkFlag[5] = 0;
ryuna 0:0773a5499020 504 } else if(!PhotoCk[5]) {
ryuna 0:0773a5499020 505 CkFlag[5] = 1;
ryuna 0:0773a5499020 506 Led[1] = 1;
ryuna 0:0773a5499020 507 Sp [1] = 1;
ryuna 0:0773a5499020 508 }
ryuna 0:0773a5499020 509 if(PhotoCk[6]&&CkFlag[6]) {
ryuna 0:0773a5499020 510 Led[2] = 0;
ryuna 0:0773a5499020 511 Sp [2] = 0;
ryuna 0:0773a5499020 512 CkFlag[6] = 0;
ryuna 0:0773a5499020 513 } else if(!PhotoCk[6]) {
ryuna 0:0773a5499020 514 CkFlag[6] = 1;
ryuna 0:0773a5499020 515 Led[2] = 1;
ryuna 0:0773a5499020 516 Sp [2] = 1;
ryuna 0:0773a5499020 517 }
ryuna 0:0773a5499020 518 if(PhotoCk[7]&&CkFlag[7]) {
ryuna 0:0773a5499020 519 Led[3] = 0;
ryuna 0:0773a5499020 520 Sp [3] = 0;
ryuna 0:0773a5499020 521 CkFlag[7] = 0;
ryuna 0:0773a5499020 522 } else if(!PhotoCk[7]) {
ryuna 0:0773a5499020 523 CkFlag[7] = 1;
ryuna 0:0773a5499020 524 Led[3] = 1;
ryuna 0:0773a5499020 525 Sp [3] = 1;
ryuna 0:0773a5499020 526 }
ryuna 0:0773a5499020 527
ryuna 0:0773a5499020 528 }
ryuna 0:0773a5499020 529
ryuna 0:0773a5499020 530 }
ryuna 0:0773a5499020 531
ryuna 0:0773a5499020 532
ryuna 0:0773a5499020 533 void AndCount() //"Wheels" Up and Down counting
ryuna 0:0773a5499020 534 {
ryuna 0:0773a5499020 535
ryuna 0:0773a5499020 536 DownCount ++;
ryuna 0:0773a5499020 537 And[0] = 0 ;
ryuna 0:0773a5499020 538 And[1] = 0 ;
ryuna 0:0773a5499020 539 And[2] = 0 ;
ryuna 0:0773a5499020 540 And[3] = 0 ;
ryuna 0:0773a5499020 541 if(DownCount > 3) {
ryuna 0:0773a5499020 542 DownCount = 0;
ryuna 0:0773a5499020 543 Way = 0;
ryuna 0:0773a5499020 544 }
ryuna 0:0773a5499020 545 }
ryuna 0:0773a5499020 546
ryuna 0:0773a5499020 547 /****************************Reset or Crawler_stop or CheckMode_Start Thread
ryuna 0:0773a5499020 548 */
ryuna 0:0773a5499020 549 void ParallelThread(void const *argument)
ryuna 0:0773a5499020 550 {
ryuna 0:0773a5499020 551 uint8_t Ct;
ryuna 0:0773a5499020 552 while (1) {
ryuna 0:0773a5499020 553
ryuna 0:0773a5499020 554
ryuna 0:0773a5499020 555 if(And[0]&&And[1]&&And[2]&&And[3]) {
ryuna 0:0773a5499020 556 AndCount();
ryuna 0:0773a5499020 557 }
ryuna 0:0773a5499020 558
ryuna 0:0773a5499020 559 if((MotorState[0]||MotorState[1]||MotorState[2]||MotorState[3])&&TempraFlag) {
ryuna 0:0773a5499020 560 Tempra = 0x0A;
ryuna 0:0773a5499020 561 StopTempra.attach(&TempraStop,TEMPRA_TIME);
ryuna 0:0773a5499020 562 }
ryuna 0:0773a5499020 563
ryuna 0:0773a5499020 564 if(!Sw[0]&&!Sw[1]) {
ryuna 0:0773a5499020 565 Ct = 0;
ryuna 0:0773a5499020 566 while(!Sw[0]&&!Sw[1]&&(Ct <= 100)) {
ryuna 0:0773a5499020 567 Ct++;
ryuna 0:0773a5499020 568 }
ryuna 0:0773a5499020 569 if(Ct >= 100) {
ryuna 0:0773a5499020 570 GainSetting();
ryuna 0:0773a5499020 571 }
ryuna 0:0773a5499020 572
ryuna 0:0773a5499020 573 } else if(!Sw[0]) {
ryuna 0:0773a5499020 574 Ct = 0;
ryuna 0:0773a5499020 575 while(!Sw[0]&&(Ct <= 100)) {
ryuna 0:0773a5499020 576 Ct ++;
ryuna 0:0773a5499020 577 }
ryuna 0:0773a5499020 578 if(Ct >= 100) {
ryuna 0:0773a5499020 579 Reset();
ryuna 0:0773a5499020 580 }
ryuna 0:0773a5499020 581
ryuna 0:0773a5499020 582 } else if(!Sw[1]) {
ryuna 0:0773a5499020 583 Ct = 0;
ryuna 0:0773a5499020 584 while(!Sw[1]&&(Ct <= 100)) {
ryuna 0:0773a5499020 585 Ct ++;
ryuna 0:0773a5499020 586 }
ryuna 0:0773a5499020 587 if(Ct >= 100) {
ryuna 0:0773a5499020 588 Tempra = 0;
ryuna 0:0773a5499020 589 TempraFlag = 0;
ryuna 0:0773a5499020 590 }
ryuna 0:0773a5499020 591
ryuna 0:0773a5499020 592
ryuna 0:0773a5499020 593 }
ryuna 0:0773a5499020 594 }
ryuna 0:0773a5499020 595 }
ryuna 0:0773a5499020 596
ryuna 0:0773a5499020 597
ryuna 0:0773a5499020 598 void SetUp()
ryuna 0:0773a5499020 599
ryuna 0:0773a5499020 600 {
ryuna 0:0773a5499020 601 /*
ryuna 0:0773a5499020 602 Pwm[0] = PWM_LEVEL ;
ryuna 0:0773a5499020 603 Pwm[1] = PWM_LEVEL ;
ryuna 0:0773a5499020 604 Pwm[2] = PWM_LEVEL ;
ryuna 0:0773a5499020 605 Pwm[3] = PWM_LEVEL ;
ryuna 0:0773a5499020 606 */
ryuna 0:0773a5499020 607 Sp[0] = Sp[1] = Sp[2] = Sp[3] = 0;
ryuna 0:0773a5499020 608 Photo.mode(PullUp);
ryuna 0:0773a5499020 609 Sw[0].mode(PullUp);
ryuna 0:0773a5499020 610 Sw[1].mode(PullUp);
ryuna 0:0773a5499020 611
ryuna 0:0773a5499020 612 }
ryuna 0:0773a5499020 613 int main()
ryuna 0:0773a5499020 614 {
ryuna 0:0773a5499020 615 SetUp();
ryuna 0:0773a5499020 616
ryuna 0:0773a5499020 617 Thread thread(ParallelThread);
ryuna 0:0773a5499020 618 Thread thread0(Photo01_Thread);
ryuna 0:0773a5499020 619 Thread thread1(Photo23_Thread);
ryuna 0:0773a5499020 620 Thread thread2(Photo45_Thread);
ryuna 0:0773a5499020 621 Thread thread3(Photo67_Thread);
ryuna 0:0773a5499020 622 wait(0.5);
ryuna 0:0773a5499020 623
ryuna 0:0773a5499020 624
ryuna 0:0773a5499020 625 while(1) {
ryuna 0:0773a5499020 626
ryuna 0:0773a5499020 627 }
ryuna 0:0773a5499020 628 }
ryuna 0:0773a5499020 629