sampleProgram

Dependencies:   QEI accelerator bit_test cyclic_io cyclic_var cylinder event_var limit mbed mecanum motor_drive pid pid_encoder rs422_put sbdbt servo

Fork of 17robo_fuzi by kusano kiyoshige

Revision:
72:7d6177047823
Parent:
71:7d684ff43ddd
Child:
74:98bad67fde39
diff -r 7d684ff43ddd -r 7d6177047823 main.cpp
--- a/main.cpp	Tue Sep 26 08:39:55 2017 +0000
+++ b/main.cpp	Wed Sep 27 08:30:19 2017 +0000
@@ -15,8 +15,6 @@
 #include "cyclic_io.h"
 #include "cylinder.h"
 #include "event_var.h"
-//#include "servo.h"
-
 
 //index_define
 #define SBDBT_TX    p13
@@ -26,6 +24,27 @@
 #define RS422_RX    p27
 #define CONTROL_INDICATOR p11
 
+#define SHOT_CYLINDER_ON    p18
+#define SHOT_CYLINDER_OFF   p17
+#define SHOT_INTERRUPT      p29
+#define SHOT_ENCODER_A      p21
+#define SHOT_ENCODER_B      p22
+#define RELOAD_CYLINDER     p15
+
+#define SHOULDER_RIGHT_INTERRUPT_MAX  p19
+#define SHOULDER_RIGHT_INTERRUPT_MIN  p20
+#define SHOULDER_LEFT_INTERRUPT_MAX   p7
+#define SHOULDER_LEFT_INTERRUPT_MIN   p8
+
+#define nucleo_num  6
+#define n1_id       3
+#define n2_id       4
+#define n3_id       5
+#define n4_id       6
+#define n5_id       7
+#define n6_id       8
+
+//index_namespace_const_variable
 namespace BAUD {
     const int PC    = 460800;
     const int SBDBT = 115200;
@@ -53,246 +72,198 @@
     const int CYLINDER_POSITION_MAX = 6;
 }
 
+namespace POWER {
+    const float MECANUM = 1.0;
+    const float SWORD   = 1.0;
+    const float SHOLDER = 1.0;
+}
 
-#define nucleo_num  6
-#define n1_id       3
-#define n2_id       4
-#define n3_id       5
-#define n4_id       6
-#define n5_id       7
-#define n6_id       8
+//index_namespace_variable
+namespace yaw{
+    float now;
+    float target;
+}
 
-#define SHOT_CYLINDER_ON     p18
-#define SHOT_CYLINDER_OFF    p17
-#define SHOT_INTERRUPT       p29
-#define SHOT_ENCODER_A       p21
-#define SHOT_ENCODER_B       p22
-#define RELOAD_CYLINDER p15
+namespace shot{
+    int   cylinderOriginFlag = 0;
+    int   cylinderPosNum = 0;
+    float cylinderPos[SHOT::CYLINDER_POSITION_MAX] = {0.0,90.0,325.0,450.0,580.0,700.0};
+    float cylinderPwm = 0;
+    float cylinderPower = 0.0;
+}
 
-#define mecanum_power   1.0
-#define sword_power     1.0
-#define sholder_power   1.0
-#define SHOULDER_RIGHT_INTERRUPT_MAX  p19 //p21
-#define SHOULDER_RIGHT_INTERRUPT_MIN  p20 //p22
-#define SHOULDER_LEFT_INTERRUPT_MAX   p7
-#define SHOULDER_LEFT_INTERRUPT_MIN   p8
-//#define pin_servo p21
-//#define servo_reload_time 1.0
-
+//index_Function
+void    setup();
+void    output();
+void    motorCalculation();
+//void  motorBoost();
+float   shotCylinderPowerCalclation();
+void    shotCylinderCalculation();
+void    firstMotion();
+void    swordCalculation();
+float   shoulderRightCalclation();
+float   shoulderLeftCalclation();
+void    shoulderInterruptIndicator();
 
 //index_setupPin
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-DigitalIn interrupt_cylinder_min(SHOT_INTERRUPT);
-Serial pc(USBTX,USBRX);
-Rs422 rs422(RS422_TX, RS422_RX);
-Sbdbt sbdbt(SBDBT_TX, SBDBT_RX, SBDBT_STO);
-Ticker output_timer;
-Mecanum mecanum;
-Bno055 bno055;
-PositionPid yaw_pid;
+DigitalOut  led1(LED1);
+DigitalOut  led2(LED2);
+DigitalOut  led3(LED3);
+DigitalOut  led4(LED4);
+Serial      pc(USBTX,USBRX);
+Rs422       rs422(RS422_TX, RS422_RX);
+Sbdbt       sbdbt(SBDBT_TX, SBDBT_RX, SBDBT_STO);
+Ticker      outputTimer;
+Mecanum     mecanum;
+Bno055      bno055;
+PositionPid yawPid;
 Accelerator v1;
 Accelerator v2;
 Accelerator v3;
 Accelerator v4;
-DigitalOut cylinder_on(SHOT_CYLINDER_ON);
-DigitalOut cylinder_off(SHOT_CYLINDER_OFF);
-CyclicVar sword;
-CyclicVar cyclic_cylinder_position;
-DigitalIn interrupt_sholderright_min(SHOULDER_RIGHT_INTERRUPT_MIN);
-DigitalIn interrupt_sholderright_max(SHOULDER_RIGHT_INTERRUPT_MAX);
-DigitalIn interrupt_sholderleft_min(SHOULDER_LEFT_INTERRUPT_MIN);
-DigitalIn interrupt_sholderleft_max(SHOULDER_LEFT_INTERRUPT_MAX);
-Encoder enc_cylinder(SHOT_ENCODER_A,SHOT_ENCODER_B);
-CyclicVar cyclic_servo;
-CyclicIo cylinder_reload(RELOAD_CYLINDER);
-//PwmOut servo(pin_servo);
-DigitalOut sbdbt_indigator(CONTROL_INDICATOR);
-eventVar cylinder_event;
-
+eventVar    shotCylinderEvent;
+CyclicVar   shotPositionCyclic;
+DigitalIn   shotInterrupt(SHOT_INTERRUPT);
+DigitalOut  shotCylinderOn(SHOT_CYLINDER_ON);
+DigitalOut  shotCylinderOff(SHOT_CYLINDER_OFF);
+Encoder     shotEncoder(SHOT_ENCODER_A,SHOT_ENCODER_B);
+DigitalIn   shoulderRightInterruptMin(SHOULDER_RIGHT_INTERRUPT_MIN);
+DigitalIn   shoulderRightInterruptMax(SHOULDER_RIGHT_INTERRUPT_MAX);
+DigitalIn   shoulderLeftInterruptMin(SHOULDER_LEFT_INTERRUPT_MIN);
+DigitalIn   shoulderLeftInterruptMax(SHOULDER_LEFT_INTERRUPT_MAX);
+CyclicVar   swordSwingCyclic;
+CyclicIo    reloadCylinder(RELOAD_CYLINDER);
+DigitalOut  controlIndigator(CONTROL_INDICATOR);
 
-//index_setupFunction
-void setup();
-void output();
-void motor_cal();
-void cylinder_cal();
-void boost();
-void cylinder_origin();
-void firstmotion();
-void sword_cal();
-void servo_origin();
-float shoulder_right_cal();
-float shoulder_left_cal();
-
-//index_setupVariable
-//output
-float yaw, target_yaw;
-//cylinder_origin
-int cylinder_origin_flag = 0;
-//cylinder
-float cylinder_pwm;
-int cylinder_pos_num = 0;
-float cylinder_pos[SHOT::CYLINDER_POSITION_MAX] = {0.0,90.0,325.0,450.0,580.0,700.0};
-float cylinder_power = 0.0;
 
 int main()
 {
     setup();
     while(1) {
-        led1 = interrupt_sholderleft_max;
-        led2 = interrupt_sholderleft_min;
-        led3 = interrupt_sholderright_max;
-        led4 = interrupt_sholderright_min;
-        
-        //pc.printf("cylinder pos : %f\r\n",enc_cylinder.deg());
+        //pc.printf("cylinder pos : %f\r\n",shotEncoder.deg());
         //pc.printf("riseState %d  :  fallState %d\r\n",event.getRise(),event.getFall());
     }
 }
 
 void setup()
 {
-    wait(2.0);
+    wait(1.0);
     bno055.begin();
     wait(1.0);
     bno055.firstRead();
     pc.baud(BAUD::PC);
     sbdbt.begin(BAUD::SBDBT);
     rs422.begin(BAUD::RS422);
-    firstmotion();
-    cylinder_pos_num = 2;                   //セットアップタイムでの初期装填のため
-    output_timer.attach(&output, CYCLE::OUTPUT);
-    yaw_pid.setup(YAW::KP, YAW::KI, YAW::KD, CYCLE::OUTPUT);
-    mecanum.setupdeg(bno055.getYawRad());   //基盤が前後逆の場合+180
+    firstMotion();
+    shot::cylinderPosNum = 1;                   //セットアップタイムでの初期装填のため
+    outputTimer.attach(&output, CYCLE::OUTPUT);
+    yawPid.setup(YAW::KP, YAW::KI, YAW::KD, CYCLE::OUTPUT);
+    mecanum.setupdeg(bno055.getYawRad());       //基盤が前後逆の場合+180
     v1.setup(MECANUM::ACCELERATION, CYCLE::OUTPUT);
     v2.setup(MECANUM::ACCELERATION, CYCLE::OUTPUT);
     v3.setup(MECANUM::ACCELERATION, CYCLE::OUTPUT);
     v4.setup(MECANUM::ACCELERATION, CYCLE::OUTPUT);
-    enc_cylinder.setPpr(100);
-    enc_cylinder.setup(SHOT::ENCORDER_KP, SHOT::ENCORDER_KI, SHOT::ENCORDER_KD, CYCLE::OUTPUT);
-    //servo.period(0.020);
+    shotEncoder.setPpr(100);
+    shotEncoder.setup(SHOT::ENCORDER_KP, SHOT::ENCORDER_KI, SHOT::ENCORDER_KD, CYCLE::OUTPUT);
+}
+
+//index_sword
+void shoulderInterruptIndicator(){
+    led1 = shoulderLeftInterruptMax;
+    led2 = shoulderLeftInterruptMin;
+    led3 = shoulderRightInterruptMax;
+    led4 = shoulderRightInterruptMin;
 }
 
-//Sword
-float shoulder_right_cal()
-{
-    if(interrupt_sholderright_max==0&&sbdbt.sankaku==1) {
+float shoulderRightCalclation(){
+    if(shoulderRightInterruptMax==0&&sbdbt.sankaku==1) {
+        return 0.0;
+    }
+    if(shoulderRightInterruptMin==0&&sbdbt.batu==1) {
         return 0.0;
     }
-    if(interrupt_sholderright_min==0&&sbdbt.batu==1) {
+    return (-sbdbt.sankaku*0.8+sbdbt.batu*0.8);
+}
+
+float shoulderLeftCalclation(){
+    if(shoulderLeftInterruptMax==0&&sbdbt.sankaku==1) {
+        return 0.0;
+    }
+    if(shoulderLeftInterruptMin==0&&sbdbt.batu==1) {
         return 0.0;
     }
     return (-sbdbt.sankaku*0.8+sbdbt.batu*0.8);
 }
 
-float shoulder_left_cal()
-{
-    if(interrupt_sholderleft_max==0&&sbdbt.sankaku==1) {
-        return 0.0;
-    }
-    if(interrupt_sholderleft_min==0&&sbdbt.batu==1) {
-        return 0.0;
-    }
-    return (-sbdbt.sankaku*0.8+sbdbt.batu*0.8);
-}
-void sword_cal()
-{
-    sword.cyclic(sbdbt.maru);
+void swordCalculation(){
+    swordSwingCyclic.cyclic(sbdbt.maru);
 }
 
-//cylinder
-void firstmotion()
-{
-        float cylinder = 0.0;
-        float sholderL = 0.0;
-        float sholderR = 0.0;
-    while(interrupt_cylinder_min == 1 || interrupt_sholderleft_max == 1 || interrupt_sholderright_max == 1){
-        if(interrupt_cylinder_min == 1){
+//index_shot
+void firstMotion(){
+    float cylinder = 0.0;
+    float sholderL = 0.0;
+    float sholderR = 0.0;
+    while(shotInterrupt == 1 || shoulderLeftInterruptMax == 1 || shoulderRightInterruptMax == 1){
+        if(shotInterrupt == 1){
             cylinder = 2.0;
         }else{
             cylinder = 0.0;
         }
-        if(interrupt_sholderright_max == 1){
+        if(shoulderRightInterruptMax == 1){
             sholderR = -2.0;
         }else{
             sholderR = 0.0;
         }
-        if(interrupt_sholderleft_max == 1){
+        if(shoulderLeftInterruptMax == 1){
             sholderL = 2.0;
         }else{
             sholderL = 0.0;
         }
-            rs422.put(5, cylinder, 0.0);
-            rs422.put(6, sholderR, sholderL);
+        rs422.put(5, cylinder, 0.0);
+        rs422.put(6, sholderR, sholderL);
     }
-    enc_cylinder.origin();
+    shotEncoder.origin();
 }
 
-//cylinder_origin_flagを1にすることで動作する
-void cylinder_origin()
-{
-}
-float cylinder_power_cal(){
-        if(interrupt_cylinder_min == 0&&cylinder_origin_flag == 1) {
-            cylinder_origin_flag = 0;
-            enc_cylinder.origin();
-            cylinder_pos_num = 0;
-            cylinder_power = -0.0;
-        }else if(cylinder_origin_flag == 1){
-            return -0.8;
-        }else{
-            return -1*enc_cylinder.duty_enableWidth(-10.0,10.0);   
-        }
+//cylinderOriginFlagを1にすることで動作する
+float shotCylinderPowerCalclation(){
+    if(shotInterrupt == 0&&shot::cylinderOriginFlag == 1) {
+        shot::cylinderOriginFlag = 0;
+        shotEncoder.origin();
+        shot::cylinderPosNum = 0;
+        shot::cylinderPower = -0.0;
+        return 0.0;
+    }else if(shot::cylinderOriginFlag == 1){
+        return -0.8;
+    }else{
+        return -1*shotEncoder.duty_enableWidth(-10.0,10.0);   
+    }
 }
 
-void cylinder_cal()
-{
+void shotCylinderCalculation(){
     //cylinder ON/OFF
     if(sbdbt.shikaku){
-        cylinder_on = 1;
-        cylinder_off = 0;
+        shotCylinderOn = 1;
+        shotCylinderOff = 0;
     }else{
-        cylinder_on = 0;
-        cylinder_off = 1;    
+        shotCylinderOn = 0;
+        shotCylinderOff = 1;    
     }
-    
-    cylinder_event.input(sbdbt.right);
-    if(cylinder_event.getRise()) {        //cylinder degset
-        cylinder_pos_num++;
-        if(cylinder_pos_num >= SHOT::CYLINDER_POSITION_MAX) {
-            //cylinder_pos_num = 0;
-            cylinder_origin_flag=1;
+    shotCylinderEvent.input(sbdbt.right);
+    if(shotCylinderEvent.getRise()) {        //cylinder degset
+        shot::cylinderPosNum++;
+        if(shot::cylinderPosNum >= SHOT::CYLINDER_POSITION_MAX) {
+            //shot::cylinderPosNum = 0;
+            shot::cylinderOriginFlag=1;
         }
     }
-    enc_cylinder.cal((float)cylinder_pos[cylinder_pos_num],CYCLE::OUTPUT); //set cylinder_tergetPos
-
-    pc.printf("terget\t%f\tnow_deg\t%f\tnow_pulse\t%d\tpwm\t%f\r\n",cylinder_pos[cylinder_pos_num],enc_cylinder.deg(),enc_cylinder.pulse(),enc_cylinder.duty());
+    shotEncoder.cal((float)shot::cylinderPos[shot::cylinderPosNum],CYCLE::OUTPUT); //set cylinder_tergetPos
+    //pc.printf("target\t%f\tnow_deg\t%f\tnow_pulse\t%d\tpwm\t%f\r\n",shot::cylinderPos[shot::cylinderPosNum],shotEncoder.deg(),shotEncoder.pulse(),shotEncoder.duty());
 }
 
-//function
-/*void servo_max()
-{
-    servo.pulsewidth(0.0022);
-}
-void servo_min()
-{
-    servo.pulsewidth(0.0010);
-}
-void servo_out()
-{
-    cyclic_servo.cyclic(sbdbt.down);    //setServoControl
-    if(cyclic_servo.getState()==0) {
-        servo_min();
-    } else if(cyclic_servo.getState()==1) {
-        servo_max();
-    }
-}*/
-
-
 //functionBoost
-void boost()
-{
+void motorBoost(){
     if(sbdbt.r2) {
         mecanum.boost_forward();
     }
@@ -309,13 +280,12 @@
     */
 }
 
-//functionMecanum
-void motor_cal()
-{
+//index_mecanum
+void motorCalculation(){
     static float out_right_x;
-    yaw = bno055.getYawRad();
-    target_yaw = yaw;
-    yaw_pid.calculate(target_yaw, yaw); 
+    yaw::now = bno055.getYawRad();
+    yaw::target = yaw::now;
+    yawPid.calculate(yaw::target, yaw::now); 
     
     //後進時に方向が逆転するため
     if(sbdbt.right_y < 0.0){
@@ -326,47 +296,48 @@
     mecanum.sbdbt_cal(sbdbt.left_x, sbdbt.left_y, sbdbt.l1, sbdbt.r1, out_right_x, bno055.getYawRad());
 //    pc.printf("%f\t data %f\t %f\t %f\t %f\t\r\n", bno055.getYawRad(), sbdbt.left_x, sbdbt.left_y, mecanum.VX(), mecanum.VY());
 }
+
+//index_output
 void output()
 {
-    motor_cal();
-    cylinder_cal();
-    sword_cal();
+    motorCalculation();
+    shotCylinderCalculation();
+    swordCalculation();
     //servo_out();
-    cylinder_origin();
-    //boost();
-    sbdbt_indigator = sbdbt.get_pairingState();
+    //motorBoost();
+    controlIndigator = sbdbt.get_pairingState();
     //led1 = sbdbt.get_pairingState();
-    if(sbdbt.up)cylinder_origin_flag = 1;
+    shoulderInterruptIndicator();
+    if(sbdbt.up)shot::cylinderOriginFlag = 1;
     if(sbdbt.left)bno055.yaw_origin();
-    cylinder_reload.cyclic(sbdbt.down);
-
+    reloadCylinder.cyclic(sbdbt.down);
+    
     static int counter;
-    static float mecanumV1, mecanumV2, mecanumV3, mecanumV4;
     int id[nucleo_num] = {n1_id, n2_id, n3_id, n4_id, n5_id, n6_id};
 
     //sbdbtがpairingしている場合のみ動作
     if(sbdbt.get_pairingState()) {
         switch (counter) {
             case 0:
-                rs422.put(id[counter], v1.duty(limitf(((mecanum.v1()*mecanum_power)+(sbdbt.right_y*0.8)),1.0,-1.0)), v3.duty(limitf(((mecanum.v3()*mecanum_power)+(sbdbt.right_y*0.8)),1.0,-1.0)));
+                rs422.put(id[counter], v1.duty(limitf(((mecanum.v1()*POWER::MECANUM)+(sbdbt.right_y*0.8)),1.0,-1.0)), v3.duty(limitf(((mecanum.v3()*POWER::MECANUM)+(sbdbt.right_y*0.8)),1.0,-1.0)));
                 counter++;
                 break;
             case 1:
-                //.duty(<cal>*<powerControle>+(<boost>*0.5))
-                rs422.put(id[counter], v2.duty(limitf(((mecanum.v2()*mecanum_power)-(sbdbt.right_y*0.8)),1.0,-1.0)), v4.duty(limitf(((mecanum.v4()*mecanum_power)-(sbdbt.right_y*0.8)),1.0,-1.0)));
+                //.duty(<cal>*<powerControle>+(<motorBoost>*0.5))
+                rs422.put(id[counter], v2.duty(limitf(((mecanum.v2()*POWER::MECANUM)-(sbdbt.right_y*0.8)),1.0,-1.0)), v4.duty(limitf(((mecanum.v4()*POWER::MECANUM)-(sbdbt.right_y*0.8)),1.0,-1.0)));
                 counter ++;
                 break;
             case 2:
                 //rs422.put(id[counter], sbdbt.right_y, 0.0);
-                rs422.put(id[counter], limitf(cylinder_power_cal(),1.0,-1.0), 0.0);
+                rs422.put(id[counter], limitf(shotCylinderPowerCalclation(),1.0,-1.0), 0.0);
                 counter ++;
                 break;
             case 3:
-                rs422.put(id[counter], limitf((-1*shoulder_right_cal()*sholder_power),1.0,-1.0), limitf((shoulder_left_cal()*sholder_power),1.0,-1.0));
+                rs422.put(id[counter], limitf((-1*shoulderRightCalclation()*POWER::SHOLDER),1.0,-1.0), limitf((shoulderLeftCalclation()*POWER::SHOLDER),1.0,-1.0));
                 counter ++;
                 break;
             case 4:
-                rs422.put(id[counter], limitf(((float)sword.getState()*sword_power),1.0,-1.0),0.0);
+                rs422.put(id[counter], limitf(((float)swordSwingCyclic.getState()*POWER::SWORD),1.0,-1.0),0.0);
                 counter = 0;
                 break;
             default: