關於履帶車的混控
如題,請問有哪位前輩肯教一下!!目前想寫單搖桿操控履帶車程式,但是不知道怎麼寫~~
謝謝~~ 简单作法:X轴视为左右履带输出比例,Y轴视为马达出力
特别注意RC遥控器的控制杆活动空间是方形的,但游戏摇杆是圆形的
应用在游戏摇杆上会出现除了直线前后外无法全马力输出的状况 本帖最后由 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,所以轉向控制只需要一個數位腳. #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]