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

Dependencies:   mbed-rtos mbed

Revision:
0:0773a5499020
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Oct 12 00:43:25 2014 +0000
@@ -0,0 +1,629 @@
+/*
+ *覚え書き
+ *
+ ***mbedのピン配置に対するこのプログラムのピンの設定
+ *p5  ~ p12 Motor ...BusOut     :Motor moved
+ *p13 ~ p20 Photo ...BusIn      :Photo Sensor
+ *p21 ~ p24 Pwm   ...PwmOut     :Motor Pwm Signal
+ *p21 ~ p24 Sp    ...DigitalOut :Check sensor state,do ditto led
+ *p25 ~ p28 Tempra...BusOut     :Motor Tempra Moved
+ *p29,p30   Sw[2] ...DigitalIn  :Switch Multi Use
+ *LED1 ~ LED4 Led ...DigitalOut :Led Brinked
+ *
+ **********************
+ ***関数の内容
+ *void WaitStop()   :use  wait
+ *void MotorStop()  :erase motor pulses
+ *void MotorStart() :motor start timing timer
+ *void TempraStop() :stop motor of crawler
+ *     //void Photo()      :main processing ,wheel(lift or lower)motor move start
+ *void Reset()      :wheels lower
+ *void GainSetting():sensor check mode,blinking Led
+ *void AndCount()   :and count
+ *void SetUp()      :first in function
+ *int main()        :main function
+ *
+ *スレッド
+ *void Photo01_Thread(void const *argument)  
+ *void Photo23_Thread(void const *argument)
+ *void Photo45_Thread(void const *argument)
+ *void Photo67_Thread(void const *argument) : main processing ,wheel(lift or lower)motor move start thread
+ *void ParallelThread(void const *argument) : Jump  reset or GainSetting function 
+ *
+ ***********************
+ ***処理内容
+ *photo系 
+ *前のセンサで検知したら足をあげる、その後後ろのセンサが検知したら足を下げる
+ *前センサ→前センサ→後ろセンサ→後ろセンサ この場合足の上げ下げは一回しか行われない
+ *
+ *
+ *
+ **追記
+ *Photo {右前々、右前後、右後前、右後々、 左前々、左前後、左後前、左後々}
+ *
+ *
+ */
+
+
+#include "mbed.h"
+#include "rtos.h"
+
+#define MOTOR_NUM 8             //motor & sensor num
+#define START_TIME_B 0.237      //motor start wait time of Back  //a lot
+#define START_TIME_F 0.04 
+#define MOVE_TIME 0.10          //lift a wheel for 0.090 seconds
+#define MOVE_DOWN_TIME 0.115    //lower a wheel for 0.10 seconds
+#define TEMPRA_TIME 3.0         //move a crawler for 4.0 seconds
+#define WAIT_TIME 0.010         //make wait time 
+#define PWM_LEVEL 1.0           //motors pwm setting level
+
+
+BusIn Photo(p5, p6, p7, p8, p9, p10, p11, p12 );
+DigitalIn Sw[2] = {p29, p30};
+
+DigitalOut Led[4] = {LED1, LED2, LED3, LED4 };
+DigitalOut Sp[4] = {p21, p22, p23, p24 };
+BusOut Motor(p13, p14, p15, p16, p17, p18, p19, p20 );//{left front, right front, left back ,right back }
+BusOut Tempra(p25, p26, p27, p28 );
+//PwmOut Pwm[4] = {p21, p22, p23, p24 };
+
+Timeout StartTimer[4];
+Timeout StopTimer[8];
+Timeout StopTempra;
+Timeout StopWait[4];
+
+
+volatile bool MotorState[4] = {0} ,Flag[4] = {0} ,FlagAdd[4] = {0} ,And[4] = {0} ,Wait[4] = {0};
+volatile uint8_t Way = 0, DownCount = 0;
+volatile bool TempraFlag = 1;
+
+
+/*
+Motor = {
+          LeftFrontUp, LeftFrontDown,
+          RightFrontUp, RightFrontDown,
+          LeftBackUp, LeftBackDown,
+          RightBackUp, RightBackDown
+          };
+*/
+
+/***********************WaitStop*/
+void WaitStop0()
+{
+    Wait[0] =  0;
+}
+void WaitStop1()
+{
+    Wait[1] =  0;
+}
+void WaitStop2()
+{
+    Wait[2] =  0;
+}
+void WaitStop3()
+{
+    Wait[3] =  0;
+}
+/*
+********************************MotorStop
+*/
+void MotorStop0()
+{
+    Motor = Motor & 0x7F;
+}
+void MotorStop1()
+{
+    Motor = Motor & 0xBF;
+    StopWait[0].attach(&WaitStop0,WAIT_TIME);
+}
+void MotorStop2()
+{
+    Motor = Motor & 0xF7;
+}
+void MotorStop3()
+{
+    Motor = Motor & 0xFB;
+    StopWait[1].attach(&WaitStop1,WAIT_TIME);
+}
+void MotorStop4()
+{
+    Motor = Motor & 0xDF;
+}
+void MotorStop5()
+{
+    Motor = Motor & 0xEF;
+    StopWait[2].attach(&WaitStop2,WAIT_TIME);
+}
+void MotorStop6()
+{
+    Motor = Motor & 0xFD;
+}
+void MotorStop7()
+{
+    Motor = Motor & 0xFE;
+    StopWait[3].attach(&WaitStop3,WAIT_TIME);
+}
+
+/*
+***********************MotorStart
+*/
+void MotorStart0()
+{
+    StopTimer[0].attach(&MotorStop0,MOVE_TIME);
+    Motor = Motor & 0xBF;
+    Motor = Motor | 0x80;//10000000
+    
+}
+void MotorStart1()
+{
+    StopTimer[2].attach(&MotorStop2,MOVE_TIME);
+    Motor = Motor & 0xFB;
+    Motor = Motor | 0x08;//00001000
+}
+void MotorStart2()
+{
+    StopTimer[4].attach(&MotorStop4,MOVE_TIME);
+    Motor = Motor & 0xEF;
+    Motor = Motor | 0x20;//00100000
+                            
+}
+void MotorStart3()
+{
+    StopTimer[6].attach(&MotorStop6,MOVE_TIME);
+    Motor = Motor & 0xFE;
+    Motor = Motor | 0x02;//00000010
+}
+
+
+void TempraStop()
+{
+    Tempra = 0x00;
+}
+
+
+
+void Photo01_Thread(void const *argument)
+{
+    uint8_t CkPhoto = 0;
+    bool CkFlag[2] = {1,1};
+
+    while(1) {
+        CkPhoto = (~Photo) & 0x03;
+        if(CkPhoto==0) { // 右前足
+            CkFlag[0] = 1;
+            CkFlag[1] = 1;
+        } else if(CkPhoto<3) {
+            CkPhoto -= 1;
+            if(CkFlag[CkPhoto]) {
+                if(CkPhoto == 0) {
+                    if(Way ==0){
+                        Way = 1;
+                    }
+                    if((Way == 1)&&!Wait[0]) {
+                        if(!MotorState[0]) {
+                            StartTimer[0].attach(&MotorStart0,START_TIME_F);
+                            MotorState[0] = 1;
+                            Led[0] = 1;
+                            Sp [0] = 1;
+                        } else {
+                            Flag[0] = 1;
+                        }
+                    }
+
+                } else {
+                    if(Way == 1) {
+                        if(Flag[0]&&!FlagAdd[0]) {
+                            FlagAdd[0] = 1;
+                        } else if(MotorState[0]) {
+                            StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
+                            Motor = Motor & 0x7F;// 01111111
+                            Motor = Motor | 0x40;//0x40 = 01000000
+                            MotorState[0] = 0;
+                            Flag[0] = 0;
+                            FlagAdd[0] = 0;
+                            Led[0] = 0;
+                            Sp [0] = 0;
+                            And[0] = 1;
+                            Wait[0] = 1;
+                        }
+                    }
+
+                }
+                CkFlag[CkPhoto] = 0;
+            }
+        }
+    }
+
+}
+void Photo23_Thread(void const *argument)
+{
+    uint8_t CkPhoto = 0;
+    bool CkFlag[2] = {1,1};
+
+    while(1) {
+        CkPhoto = ((~Photo) & 0x0C) >> 2;
+        if(CkPhoto==0) { // 右前足
+            CkFlag[0] = 1;
+            CkFlag[1] = 1;
+        } else if(CkPhoto<3) {
+            CkPhoto -= 1;
+            if(CkFlag[CkPhoto]) {
+                if(CkPhoto == 0) {
+                    if((Way == 1)&&!Wait[1]) {
+                        if(!MotorState[1]) {
+                            StartTimer[1].attach(&MotorStart1,START_TIME_B);
+                            MotorState[1] = 1;
+                            Led[1] = 1;
+                            Sp [1] = 1;
+                        } else {
+                            Flag[1] = 1;
+                        }
+                    }
+
+                } else {
+                    if(Way == 1) {
+                        if(Flag[1]&&!FlagAdd[1]) {
+                            FlagAdd[1] = 1;
+                        } else if(MotorState[1]) {
+                            StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
+                            Motor = Motor & 0xF7;
+                            Motor = Motor | 0x04;//00000100
+                            MotorState[1] = 0;
+                            Flag[1] = 0;
+                            FlagAdd[1] = 0;
+                            Led[1] = 0;
+                            Sp [1] = 0;
+                            And[1] = 1;
+                            Wait[1] = 1;
+                        }
+                    }
+
+                }
+                CkFlag[CkPhoto] = 0;
+            }
+        }
+    }
+
+}
+void Photo45_Thread(void const *argument)
+{
+    uint8_t CkPhoto = 0;
+    bool CkFlag[2] = {1,1};
+
+    while(1) {
+        CkPhoto = ((~Photo) & 0x30) >> 4;
+        if(CkPhoto==0) { // 右前足
+            CkFlag[0] = 1;
+            CkFlag[1] = 1;
+        } else if(CkPhoto<3) {
+            CkPhoto -= 1;
+            if(CkFlag[CkPhoto]) {
+                if(CkPhoto == 0) {
+                    if(Way == 0) {
+                        Way = 1;
+                    }
+                    if((Way == 1)&&!Wait[2]) {
+                        if(!MotorState[2]) {
+                            StartTimer[2].attach(&MotorStart2,START_TIME_F);
+                            MotorState[2] = 1;
+                            Led[2] = 1;
+                            Sp [2] = 1;
+                        } else {
+                            Flag[2] = 1;
+                        }
+                    }
+                } else {
+                    if(Way == 1) {
+                        if(Flag[2]&&!FlagAdd[2]) {
+                            FlagAdd[2] = 1;
+                        } else if(MotorState[2]) {
+                            StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
+                            Motor = Motor & 0xDF;
+                            Motor = Motor | 0x10;//00010000
+                            MotorState[2] = 0;
+                            Flag[2] = 0;
+                            FlagAdd[2] = 0;
+                            Led[2] = 0;
+                            Sp [2] = 0;
+                            And[2] = 1;
+                            Wait[2] = 1;
+                        }
+                    }
+
+                }
+                CkFlag[CkPhoto] = 0;
+            }
+        }
+    }
+
+}
+void Photo67_Thread(void const *argument)
+{
+    uint8_t CkPhoto = 0;
+    bool CkFlag[2] = {1,1};
+
+    while(1) {
+        CkPhoto = ((~Photo) & 0xC0) >> 6;
+        if(CkPhoto==0) { // 右前足
+            CkFlag[0] = 1;
+            CkFlag[1] = 1;
+        } else if(CkPhoto<3) {
+            CkPhoto -= 1;
+            if(CkFlag[CkPhoto]) {
+                if(CkPhoto == 0) {
+                    if((Way == 1)&&!Wait[3]) {
+                        if(!MotorState[3]) {
+                            StartTimer[3].attach(&MotorStart3,START_TIME_B);
+                            MotorState[3] = 1;
+                            Led[3] = 1;
+                            Sp [3] = 1;
+                        } else {
+                            Flag[3] = 1;
+                        }
+                    }
+
+                } else {
+                    if(Way == 1) {
+                        if(Flag[3]&&!FlagAdd[3]) {
+                            FlagAdd[3] = 1;
+                        } else if(MotorState[3]) {
+                            StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
+                            Motor = Motor & 0xFD;//11111101
+                            Motor = Motor | 0x01;//00000001
+                            MotorState[3] = 0;
+                            Flag[3] = 0;
+                            FlagAdd[3] = 0;
+                            Led[3] = 0;
+                            Sp [3] = 0;
+                            And[3] = 1;
+                            Wait[3] = 1;
+                        }
+                    }
+
+                }
+                CkFlag[CkPhoto] = 0;
+            }
+        }
+    }
+
+}
+
+
+void Reset()
+{
+    int i;
+
+    if(MotorState[0]) {
+        StopTimer[1].attach(&MotorStop1,MOVE_DOWN_TIME);
+        Motor = Motor | 0x40;//01000000
+    }
+    if(MotorState[1]) {
+        StopTimer[3].attach(&MotorStop3,MOVE_DOWN_TIME);
+        Motor = Motor | 0x04;//00000100
+    }
+    if(MotorState[2]) {
+        StopTimer[5].attach(&MotorStop5,MOVE_DOWN_TIME);
+        Motor = Motor | 0x10;//00010000
+    }
+    if(MotorState[3]) {
+        StopTimer[7].attach(&MotorStop7,MOVE_DOWN_TIME);
+        Motor = Motor | 0x01;//00000001
+    }
+    for(i = 0; i < 4; i++) {
+        Led[i] = 0;
+        Flag[i] = 0;
+        FlagAdd[i] = 0;
+        MotorState[i] = 0;
+        And[i] = 0;
+    }
+
+    Way = 0;
+    DownCount = 0;
+    TempraFlag = 1;
+
+}
+
+void GainSetting ()
+{
+
+    bool CkFlag[8] = {1,1,1,1,1,1,1,1},PhotoCk[8] = {0};
+
+    Reset();
+    Tempra = 0;
+    TempraFlag = 0;
+    Led[0] = Led[1] = Led[2] = Led[3] = 1;
+    Sp[0] = Sp[1] = Sp[2] = Sp[3] = 1;
+    
+    while(1) {
+        if(!Sw[0]) {
+            while(1) {//右側のセンサの調整
+                PhotoCk[0] = ((~Photo)&0x01);
+                PhotoCk[1] = ((~Photo)&0x02) >> 1;
+                PhotoCk[2] = ((~Photo)&0x04) >> 2;
+                PhotoCk[3] = ((~Photo)&0x08) >> 3;
+                if(PhotoCk[0]&&CkFlag[0]) {
+                    Led[0] = 0;
+                    Sp [0] = 0;
+                    CkFlag[0] = 0;
+                } else if(!PhotoCk[0]) {
+                    CkFlag[0] = 1;
+                    Led[0] = 1;
+                    Sp [0] = 1;
+                }
+
+                if(PhotoCk[1]&&CkFlag[1]) {
+                    Led[1] = 0;
+                    Sp [1] = 0;
+                    CkFlag[1] = 0;
+                } else if(!PhotoCk[1]) {
+                    CkFlag[1] = 1;
+                    Led[1] = 1;
+                    Sp [1] = 1;
+                }
+                if(PhotoCk[2]&&CkFlag[2]) {
+                    Led[2] = 0;
+                    Sp [2] = 0;
+                    CkFlag[2] = 0;
+                } else if(!PhotoCk[2]) {
+                    CkFlag[2] = 1;
+                    Led[2] = 1;
+                    Sp [2] = 1;
+                }
+                if(PhotoCk[3]&&CkFlag[3]) {
+                    Led[3] = 0;
+                    Sp [3] = 0;
+                    CkFlag[3] = 0;
+                } else if(!PhotoCk[3]) {
+                    CkFlag[3] = 1;
+                    Led[3] = 1;
+                    Sp [3] = 1;
+                }
+                if(!Sw[1]) break;
+            }
+        }
+
+        //左側のセンサの調整
+        PhotoCk[4] = ((~Photo)&0x10) >> 4;
+        PhotoCk[5] = ((~Photo)&0x20) >> 5;
+        PhotoCk[6] = ((~Photo)&0x40) >> 6;
+        PhotoCk[7] = ((~Photo)&0x80) >> 7;
+
+        if(PhotoCk[4]&&CkFlag[4]) {
+            Led[0] = 0;
+            Sp [0] = 0;
+            CkFlag[4] = 0;
+        } else if(!PhotoCk[4]) {
+            CkFlag[4] = 1;
+            Led[0] = 1;
+            Sp [0] = 1;
+        }
+        if(PhotoCk[5]&&CkFlag[5]) {
+            Led[1] = 0;
+            Sp [1] = 0;
+            CkFlag[5] = 0;
+        } else if(!PhotoCk[5]) {
+            CkFlag[5] = 1;
+            Led[1] = 1;
+            Sp [1] = 1;
+        }
+        if(PhotoCk[6]&&CkFlag[6]) {
+            Led[2] = 0;
+            Sp [2] = 0;
+            CkFlag[6] = 0;
+        } else if(!PhotoCk[6]) {
+            CkFlag[6] = 1;
+            Led[2] = 1;
+            Sp [2] = 1;
+        }
+        if(PhotoCk[7]&&CkFlag[7]) {
+            Led[3] = 0;
+            Sp [3] = 0;
+            CkFlag[7] = 0;
+        } else if(!PhotoCk[7]) {
+            CkFlag[7] = 1;
+            Led[3] = 1;
+            Sp [3] = 1;
+        }
+
+    }
+
+}
+
+
+void AndCount() //"Wheels" Up and Down counting
+{
+
+    DownCount ++;
+    And[0] = 0 ;
+    And[1] = 0 ;
+    And[2] = 0 ;
+    And[3] = 0 ;
+    if(DownCount > 3) {
+        DownCount = 0;
+        Way = 0;
+    }
+}
+
+/****************************Reset or Crawler_stop or CheckMode_Start Thread
+*/
+void ParallelThread(void const *argument)
+{
+    uint8_t Ct;
+    while (1) {
+
+
+        if(And[0]&&And[1]&&And[2]&&And[3]) {
+            AndCount();
+        }
+
+        if((MotorState[0]||MotorState[1]||MotorState[2]||MotorState[3])&&TempraFlag) {
+            Tempra = 0x0A;
+            StopTempra.attach(&TempraStop,TEMPRA_TIME);
+        }
+
+        if(!Sw[0]&&!Sw[1]) {
+            Ct = 0;
+            while(!Sw[0]&&!Sw[1]&&(Ct <= 100)) {
+                Ct++;
+            }
+            if(Ct >= 100) {
+                GainSetting();
+            }
+
+        } else if(!Sw[0]) {
+            Ct = 0;
+            while(!Sw[0]&&(Ct <= 100)) {
+                Ct ++;
+            }
+            if(Ct >= 100) {
+                Reset();
+            }
+
+        } else if(!Sw[1]) {
+            Ct = 0;
+            while(!Sw[1]&&(Ct <= 100)) {
+                Ct ++;
+            }
+            if(Ct >= 100) {
+                Tempra = 0;
+                TempraFlag = 0;
+            }
+
+
+        }
+    }
+}
+
+
+void SetUp()
+
+{
+/*
+    Pwm[0] = PWM_LEVEL ;
+    Pwm[1] = PWM_LEVEL ;
+    Pwm[2] = PWM_LEVEL ;
+    Pwm[3] = PWM_LEVEL ;
+*/
+    Sp[0] = Sp[1] = Sp[2] = Sp[3] = 0;
+    Photo.mode(PullUp);
+    Sw[0].mode(PullUp);
+    Sw[1].mode(PullUp);
+
+}
+int main()
+{
+    SetUp();
+
+    Thread thread(ParallelThread);
+    Thread thread0(Photo01_Thread);
+    Thread thread1(Photo23_Thread);
+    Thread thread2(Photo45_Thread);
+    Thread thread3(Photo67_Thread);
+    wait(0.5);
+
+
+    while(1) {
+
+    }
+}
+