极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10830|回复: 3

關於履帶車的混控

[复制链接]
发表于 2017-4-22 19:46:42 | 显示全部楼层 |阅读模式
如題,請問有哪位前輩肯教一下!!
目前想寫單搖桿操控履帶車程式,但是不知道怎麼寫~~
謝謝~~
回复

使用道具 举报

发表于 2017-4-24 08:43:23 | 显示全部楼层
简单作法:X轴视为左右履带输出比例,Y轴视为马达出力
特别注意RC遥控器的控制杆活动空间是方形的,但游戏摇杆是圆形的
应用在游戏摇杆上会出现除了直线前后外无法全马力输出的状况
回复 支持 反对

使用道具 举报

 楼主| 发表于 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,所以轉向控制只需要一個數位腳.
回复 支持 反对

使用道具 举报

 楼主| 发表于 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驗證過)
但是我嘗試寫的這個程式不太正常......
不知哪裡有問題!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:25 , Processed in 0.045646 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表