cjs1748 发表于 2017-4-22 19:46:42

關於履帶車的混控

如題,請問有哪位前輩肯教一下!!
目前想寫單搖桿操控履帶車程式,但是不知道怎麼寫~~
謝謝~~

Be1ieve 发表于 2017-4-24 08:43:23

简单作法:X轴视为左右履带输出比例,Y轴视为马达出力
特别注意RC遥控器的控制杆活动空间是方形的,但游戏摇杆是圆形的
应用在游戏摇杆上会出现除了直线前后外无法全马力输出的状况

cjs1748 发表于 2017-5-9 15:45:27

本帖最后由 cjs1748 于 2017-5-9 16:01 编辑

#include <PS2X_lib.h>
PS2X ps2x;
int PS2 = 0;
const int inA = 7;   
const int enA = 6;   
const int inB = 8;   
const int enB = 9;

int PWMR;         
int PWML;
int RUN;
int TURN;         

void setup(){
PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //指定PS2搖桿腳位及類比搖桿開啟

pinMode(inA, OUTPUT);      // connection to TB6612FNG
pinMode(enA, OUTPUT);       // connection to TB6612FNG
pinMode(inB, OUTPUT);      // connection to TB6612FNG
pinMode(enB, OUTPUT);       // connection to TB6612FNG
pinMode(A0, OUTPUT);   // LED燈
pinMode(A1, OUTPUT);   // LED燈
pinMode(A2, OUTPUT);   // LED燈
pinMode(A3, OUTPUT);   // LED燈
pinMode(A4, OUTPUT);   // LED燈
pinMode(A5, OUTPUT);   // LED燈

}

void loop(){

ps2x.read_gamepad();
if(ps2x.ButtonPressed(PSB_CIRCLE))
    { if (digitalRead(A0)==LOW) { digitalWrite (A0, HIGH);} else digitalWrite(A0,LOW); }
   if(ps2x.ButtonPressed(PSB_TRIANGLE))
    { if (digitalRead(A1)==LOW) { digitalWrite (A1, HIGH);} else digitalWrite(A1,LOW); }
   if(ps2x.ButtonPressed(PSB_CROSS))
    { if (digitalRead(A2)==LOW) { digitalWrite (A2, HIGH);} else digitalWrite(A2,LOW); }
   if(ps2x.ButtonPressed(PSB_SQUARE))
    { if (digitalRead(A3)==LOW) { digitalWrite (A3, HIGH);} else digitalWrite(A3,LOW); }
   if(ps2x.ButtonPressed(PSB_L1))
    { if (digitalRead(A4)==LOW) { digitalWrite (A4, HIGH);} else digitalWrite(A4,LOW); }
   if(ps2x.ButtonPressed(PSB_R1))
    { if (digitalRead(A5)==LOW) { digitalWrite (A5, HIGH);} else digitalWrite(A5,LOW); }
   if(ps2x.ButtonPressed(PSB_R2)){
          digitalWrite (A0, LOW);
          digitalWrite (A1, LOW);
          digitalWrite (A2, LOW);
          digitalWrite (A3, LOW);
   }
   if(ps2x.ButtonPressed(PSB_L2)){
          digitalWrite (A4, LOW);
          digitalWrite (A5, LOW);
   }
   
if (ps2x.Analog(PSS_LY) > 134 ){//前進
      digitalWrite(inA, HIGH);
      digitalWrite(inB, HIGH);
      if (ps2x.Analog(PSS_LX) < 122){ //前左
         RUN = map(ps2x.Analog(PSS_LY), 134, 255, 0, 255);
         TURN = map(ps2x.Analog(PSS_LX), 0, 122, 255, 0);
         PWMR = RUN;
         PWML = (TURN/255)*RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 123 && ps2x.Analog(PSS_LX) < 133){ //向正前
         RUN = map(ps2x.Analog(PSS_LY), 134, 255, 0, 255);
         PWMR = RUN;
         PWML = RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 134){ //前右
         RUN = map(ps2x.Analog(PSS_LY), 134, 255, 0, 255);
         TURN = map(ps2x.Analog(PSS_LX), 134, 255, 0, 255);
         PWML = RUN;
         PWMR = (TURN/255)*RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }   
}

   if (ps2x.Analog(PSS_LY) > 123 && ps2x.Analog(PSS_LY) < 133 ){//原地轉向
      if (ps2x.Analog(PSS_LX) < 122){ //原地左回旋
         digitalWrite(inA, HIGH);
         digitalWrite(inB, LOW);
         TURN = map(ps2x.Analog(PSS_LX), 0, 122, 255, 0);
         PWMR = TURN;
         PWML = TURN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 123 && ps2x.Analog(PSS_LX) < 133){ //停止
         digitalWrite(inA, HIGH);
         digitalWrite(inB, HIGH);
         PWMR = 0;
         PWML = 0;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 134){ //原地右迴旋
         digitalWrite(inA, LOW);
         digitalWrite(inB, HIGH);
         TURN = map(ps2x.Analog(PSS_LX), 134, 255, 0, 255);
         PWML = TURN;
         PWMR = TURN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }   
}
if (ps2x.Analog(PSS_LY) < 122 ){//向後
      digitalWrite(inA, LOW);
      digitalWrite(inB, LOW);
      if (ps2x.Analog(PSS_LX) < 122){ //左後
         RUN = map(ps2x.Analog(PSS_LY), 0, 122, 255, 0);
         TURN = map(ps2x.Analog(PSS_LX), 0, 122, 255, 0);
         PWMR = RUN;
         PWML = (TURN/255)*RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 123 && ps2x.Analog(PSS_LX) < 133){ //正後
         RUN = map(ps2x.Analog(PSS_LY), 0, 122, 255, 0);
         PWMR = RUN;
         PWML = RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }
      if (ps2x.Analog(PSS_LX) > 134){ //右後
         RUN = map(ps2x.Analog(PSS_LY), 0, 122, 255, 0);
         TURN = map(ps2x.Analog(PSS_LX), 134, 255, 0, 255);
         PWML = RUN;
         PWMR = (TURN/255)*RUN;
         analogWrite(enB , PWMR);
         analogWrite(enA , PWML);
       }   
}
delay(50);
}   

上面是自己嘗試寫的程式,大致上正確.不過在邊走邊轉的部分不連貫(有空白)
不知有無前輩可 指導一下!!
PS.在ARDUINO和驅動板中間有外加一個7404,所以轉向控制只需要一個數位腳.

cjs1748 发表于 2017-5-10 12:09:48

#include <PS2X_lib.h>
PS2X ps2x;
int PS2 = 0;
int MLA = 3;   
int MLB = 5;   
int MRA = 6;   
int MRB = 9;
byte RUNL;
byte RUNR;
byte PWMLA;
byte PWMLB;         
byte PWMRA;
byte PWMRB;


void setup(){
PS2 = ps2x.config_gamepad(13,11,10,12, true, true);   //指定PS2搖桿腳位及類比搖桿開啟

pinMode(MLA, OUTPUT);      // connection to TB6612FNG
pinMode(MLB, OUTPUT);       // connection to TB6612FNG
pinMode(MRA, OUTPUT);      // connection to TB6612FNG
pinMode(MRB, OUTPUT);       // connection to TB6612FNG

}

void loop(){

ps2x.read_gamepad();

RUNL = ps2x.Analog(PSS_LY) - (128 - ps2x.Analog(PSS_LX));
RUNR = ps2x.Analog(PSS_LY) - (ps2x.Analog(PSS_LX) - 128);

PWMLA = (255 / 128) * RUNL - 255;
PWMLB = (-1 * 255 / 128) * RUNL + 255;
PWMRA = (255 / 128) * RUNR - 255;
PWMRB = (-1 * 255 / 128) * RUNR + 255;

analogWrite(MLA , PWMLA);
analogWrite(MLB , PWMLB);
analogWrite(MRA , PWMRA);
analogWrite(MRB , PWMRB);






delay(50);
}   
這是令 一種寫法,不過一個馬達需要使用兩個PWM腳.
計算公式是對的(我用EXECL驗證過)
但是我嘗試寫的這個程式不太正常......
不知哪裡有問題!!
页: [1]
查看完整版本: 關於履帶車的混控