“109010019 舵机转向小车套件”的版本间的差异

来自YFRobotwiki
跳转至: 导航搜索
规格书
 
(未显示2个用户的12个中间版本)
第1行: 第1行:
 +
 +
[[Image:舵机转向小车套装.jpg|300px|thumb|舵机转向小车套装]]
  
 
== 发货清单 ==
 
== 发货清单 ==
 舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数
+
 舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数
  
 
[[Media:舵机小车套装物料清单.pdf|舵机小车套装物料清单]]
 
[[Media:舵机小车套装物料清单.pdf|舵机小车套装物料清单]]
第9行: 第11行:
  
 
[[Media:舵机小车套装规格书.pdf|舵机小车套装规格书]]
 
[[Media:舵机小车套装规格书.pdf|舵机小车套装规格书]]
 +
 +
== 舵机小车手册 ==
 +
舵机小车安装手册。
 +
 +
[[Media:舵机转向小车手册.pdf|舵机转向小车手册]]
 +
 +
<html>
 +
<iframe width="720" height="405" frameborder="0" src="https://www.ixigua.com/iframe/7042840939194384909?autoplay=0" referrerpolicy="unsafe-url" allowfullscreen></iframe>
 +
</html>
 +
 +
 +
== 示例代码 ==
 +
库文件链接地址(百度网盘):https://eyun.baidu.com/s/3eTqLAfC 密码:Cf2T
 +
 +
库文件需放置在Arduino IDE目录下的libraries文件夹内,不可重复多个文件夹名。
 +
 +
<source lang="c">
 +
/*
 +
  舵机转向小车PS2控制
 +
 +
  控制方式:左摇杆控制小车的前进后退(前后有效),右摇杆控制方向(左右有效);
 +
  控制均为比例控制,遥感倾斜度越大,速度/角度越大;按键部分同理.
 +
 +
  手柄前端L1,L2调节舵机的居中角度位置,每次增加减小1度,右侧R1,R2调节电机速度.
 +
 +
  YFROBOT-WST
 +
  WWW.YFROBOT.COM.CN
 +
  09/19/2020
 +
*/
 +
 +
/******************************************
 +
   导入必须的库文件
 +
*****************************************/
 +
#include <Servo.h>  //舵机库,软件自带
 +
//#include "PS2X_lib.h"  //PS2手柄库,同程序文件夹
 +
#include <PS2X_lib.h>  //PS2手柄库,同程序文件夹
 +
 +
PS2X ps2x;
 +
Servo myservo;
 +
 +
/******************************************
 +
  PS2手柄引脚设置端口,如需改动请保持软硬件同步
 +
   电机驱动端口设置;舵机端口设置
 +
*****************************************/
 +
#define PS2_DAT        A4
 +
#define PS2_CMD        A0  //PS2 pin
 +
#define PS2_SEL        A1
 +
#define PS2_CLK        A2
 +
 +
#define PWM            5  //电机速度引脚
 +
#define DIR            4  //电机方向引脚
 +
#define SERVOPIN      3  //舵机引脚
 +
 +
/***************************************************
 +
   默认居中90度情况下,最小值为50,最大值为130
 +
**************************************************/
 +
#define SERVOMIN 55      //舵机左转最大值
 +
#define SERVOMID 90      //舵机回中值
 +
#define SERVOMAX 125      //舵机右转最大值
 +
#define TURNLEFT myservo.write(SERVOMIN)  //左转
 +
#define TURNMID myservo.write(SERVOMID)    //回中
 +
#define TURNRIGHT myservo.write(SERVOMAX)  //右转
 +
/*************************************************
 +
   电机速度控制,按键控制速度值设置
 +
*************************************************/
 +
#define MOTORFORWARD setMotor(100)  //按键前进速度
 +
#define MOTORBACK setMotor(-100)    //按键后退速度
 +
#define MOTORSTOP setMotor(0)      //停止
 +
 +
int MAXSPEED = 150;          //摇杆控制电机默认速度,可修改范围0-255.
 +
int MIDSPEED = MAXSPEED;
 +
int SERVOPOS = SERVOMID;
 +
 +
bool EnableRockerR = 1;
 +
bool EnableRockerL = 1;
 +
int RMid = 0 ;
 +
int LStop = 0 ;
 +
 +
#define pressures  false    //按键模拟值关闭
 +
#define rumble      true    //震动电机打开
 +
int error = 0;
 +
byte type = 0;
 +
byte vibrate = 0;
 +
 +
void setup() {
 +
  Serial.begin(57600);        // Baud rate
 +
  pinMode(PWM, OUTPUT);        // Pin state
 +
  pinMode(DIR, OUTPUT);
 +
  myservo.attach(SERVOPIN);
 +
  SERVOMID;                    // Servo middle
 +
  delay(300);
 +
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
 +
 +
  if (error == 0) {
 +
    Serial.print("Found Controller, configured successful ");
 +
    Serial.print("pressures = ");
 +
    if (pressures)
 +
      Serial.println("true ");
 +
    else
 +
      Serial.println("false");
 +
    Serial.print("rumble = ");
 +
    if (rumble)
 +
      Serial.println("true)");
 +
    else
 +
      Serial.println("false");
 +
  }
 +
  else if (error == 1) {
 +
    Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
 +
  }
 +
  else if (error == 2)
 +
    Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
 +
  else if (error == 3)
 +
    Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
 +
  type = ps2x.readType();
 +
  switch (type) {
 +
    case 0:
 +
      Serial.print("Unknown Controller type found ");
 +
      break;
 +
    case 1:
 +
      Serial.print("DualShock Controller found ");
 +
      break;
 +
    case 2:
 +
      Serial.print("GuitarHero Controller found ");
 +
      break;
 +
    case 3:
 +
      Serial.print("Wireless Sony DualShock Controller found ");
 +
      break;
 +
  }
 +
}
 +
void(* resetFunc) (void) = 0; //重新配对
 +
 +
void loop() {
 +
  if (error == 1) //skip loop if no controller found
 +
    resetFunc();
 +
  ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
 +
 +
  if (ps2x.Button(PSB_START))        //will be TRUE as long as button is pressed
 +
    Serial.println("Start is being held");
 +
  if (ps2x.Button(PSB_SELECT))
 +
    Serial.println("Select is being held");
 +
 +
  /*************************************************
 +
    PS2手柄左边按键部分控制电机
 +
  *************************************************/
 +
  if (ps2x.ButtonPressed(PSB_PAD_UP)) {          // 按下前进
 +
    //    Serial.println("PAD_UP just pressed");
 +
    MOTORFORWARD;
 +
    EnableRockerL = 0;
 +
  } else if (ps2x.ButtonReleased(PSB_PAD_UP)) {  //松开停止
 +
    //    Serial.println(" PAD_UP just released");
 +
    MOTORSTOP;
 +
    EnableRockerL = 1;
 +
    LStop = 0;
 +
  }
 +
 +
  if (ps2x.ButtonPressed(PSB_PAD_DOWN)) {        //按下后退
 +
    //    Serial.println("PAD_DOWN just pressed");
 +
    MOTORBACK;
 +
    EnableRockerL = 0;
 +
  } else if (ps2x.ButtonReleased(PSB_PAD_DOWN)) {  //松开停止
 +
    //    Serial.println(" PAD_DOWN just released");
 +
    MOTORSTOP;
 +
    EnableRockerL = 1;
 +
    LStop = 0;
 +
  }
 +
 +
  /***********************************************************************
 +
    Rocker program
 +
    Through the rocker arm around before and after the change of
 +
    resistance for motor speed control
 +
    Up and Left(0 - 127)
 +
    Down and Right (129 - 255)
 +
     摇杆比例控制程序
 +
        通过摇杆前后左右阻值的变化实现电机转速控制
 +
        上左范围(0 - 127)
 +
        下右范围(129 - 255)
 +
  ***********************************************************************/
 +
  if (EnableRockerL) {
 +
    if (0 <= ps2x.Analog(PSS_LY) && ps2x.Analog(PSS_LY) <= 115) {
 +
      digitalWrite(DIR, LOW);
 +
      analogWrite(PWM, map(ps2x.Analog(PSS_LY), 0, 115, MAXSPEED, 0));
 +
      LStop = 0;
 +
    } else if (255 >= ps2x.Analog(PSS_LY) && ps2x.Analog(PSS_LY) >= 135) {
 +
      digitalWrite(DIR, HIGH);
 +
      analogWrite(PWM, map(ps2x.Analog(PSS_LY), 140, 255, 0, MAXSPEED));
 +
      LStop = 0;
 +
    } else {
 +
      if (LStop == 0) {
 +
        MOTORSTOP;
 +
        LStop ++;
 +
      }
 +
    }
 +
  }
 +
 +
  /*************************************************
 +
    PS2手柄右边按键控制舵机代码
 +
  *************************************************/
 +
  if (ps2x.ButtonPressed(PSB_CIRCLE)) {            //按下右转
 +
    //    Serial.println("Circle just pressed");        //will be TRUE if button was JUST pressed
 +
    TURNRIGHT;
 +
    EnableRockerR = 0;
 +
  } else if (ps2x.ButtonReleased(PSB_CIRCLE)) {    //松开回中
 +
    //    Serial.println("Circle just released");
 +
    TURNMID;
 +
    EnableRockerR = 1;
 +
    RMid = 0;
 +
  }
 +
 +
  if (ps2x.ButtonPressed(PSB_SQUARE)) {            //按下左转
 +
    //    Serial.println("Square just pressed");
 +
    TURNLEFT;
 +
    EnableRockerR = 0;
 +
  } else if (ps2x.ButtonReleased(PSB_SQUARE)) {    //松开回中
 +
    //    Serial.println("Square just released");
 +
    TURNMID;
 +
    EnableRockerR = 1;
 +
    RMid = 0;
 +
  }
 +
 +
 +
  if (EnableRockerR) {
 +
    if (0 <= ps2x.Analog(PSS_RX) && ps2x.Analog(PSS_RX) <= 115) {
 +
      myservo.write(map(ps2x.Analog(PSS_RX), 0, 115, SERVOMIN, SERVOPOS));
 +
      RMid = 0;
 +
    } else if (255 >= ps2x.Analog(PSS_RX) && ps2x.Analog(PSS_RX) >= 130) {
 +
      myservo.write(map(ps2x.Analog(PSS_RX), 130, 255, SERVOPOS, SERVOMAX));
 +
      RMid = 0;
 +
    } else {
 +
      if (RMid == 0) {
 +
        TURNMID;
 +
        RMid ++;
 +
      }
 +
    }
 +
  }
 +
 +
  //电机速度增加20,最大增加到255(全速) 摇杆部分
 +
  if (ps2x.ButtonPressed(PSB_R1)) {
 +
    MAXSPEED += 20;
 +
    if (MAXSPEED > 255) {
 +
      MAXSPEED = 255;
 +
    }
 +
    vibrate = 100;
 +
  }
 +
 +
  //电机速度减少20,最低到0(停止)
 +
  if (ps2x.ButtonPressed(PSB_R2)) {
 +
    MAXSPEED -= 20;
 +
    if (MAXSPEED <= 0) {
 +
      MAXSPEED = 0;
 +
    }
 +
    vibrate = 100;
 +
  }
 +
 +
  //恢复电机初始速度值
 +
  if (ps2x.ButtonPressed(PSB_CROSS)) {
 +
    // reset speed;
 +
    MAXSPEED = MIDSPEED;
 +
    vibrate = 100;
 +
  }
 +
 +
  if (ps2x.ButtonReleased(PSB_L1) || ps2x.ButtonReleased(PSB_L2) ||
 +
      ps2x.ButtonReleased(PSB_R1) || ps2x.ButtonReleased(PSB_R2) || ps2x.ButtonReleased(PSB_CROSS)) {
 +
    vibrate = 0;
 +
    //    Serial.println("vibrate = 0");
 +
  }
 +
 +
  delay(50);
 +
}
 +
 +
//电机驱动函数,按键部分
 +
void setMotor(int Speed) {
 +
  if (Speed > 0) {
 +
    digitalWrite(DIR, LOW);
 +
    analogWrite(PWM, Speed);
 +
  } else if (Speed < 0) {
 +
    digitalWrite(DIR, HIGH);
 +
    analogWrite(PWM, abs(Speed));
 +
  } else {
 +
    analogWrite(PWM, LOW);
 +
    digitalWrite(DIR, LOW);
 +
  }
 +
}
 +
</source>
 +
 +
=== 参考资料 ===
 +
* [https://yfrobot.gitee.io/wiki/doc/tb6612fng_datasheet.pdf TB6612FNG datasheet]
 +
 +
 +
 +
 +
----
 +
 +
{| border="0" cellpadding="5" width="100%"
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|''' [http://www.yfrobot.com.cn 访问YFRobot论坛]'''
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|''' [http://www.yfrobot.com.cn/thread-2235-1-1.html 论坛邀请码获取]'''
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|'''[https://jq.qq.com/?_wv=1027&k=466mOjv 技术交流群]'''
 +
|}
 +
 +
{| border="0" cellpadding="5" width="100%"
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|''' [http://yfanmcu.taobao.com 淘宝企业店]'''
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|''' [http://yfrobot.taobao.com 淘宝直营店]'''
 +
|width="33%" valign="top" align="center" bgcolor=#d3d7d4 style="border-radius:5px;"|'''[[联系我们]]'''
 +
|}

2022年2月22日 (二) 09:44的最后版本

舵机转向小车套装

发货清单

舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数。

舵机小车套装物料清单

规格书

舵机小车套装基础尺寸和详细的运行参数。

舵机小车套装规格书

舵机小车手册

舵机小车安装手册。

舵机转向小车手册


示例代码

库文件链接地址(百度网盘):https://eyun.baidu.com/s/3eTqLAfC 密码:Cf2T

库文件需放置在Arduino IDE目录下的libraries文件夹内,不可重复多个文件夹名。

/*
  舵机转向小车PS2控制
 
  控制方式:左摇杆控制小车的前进后退(前后有效),右摇杆控制方向(左右有效);
  控制均为比例控制,遥感倾斜度越大,速度/角度越大;按键部分同理.
 
  手柄前端L1,L2调节舵机的居中角度位置,每次增加减小1度,右侧R1,R2调节电机速度.
 
  YFROBOT-WST
  WWW.YFROBOT.COM.CN
  09/19/2020
*/
 
/******************************************
   导入必须的库文件
 *****************************************/
#include <Servo.h>  //舵机库,软件自带
//#include "PS2X_lib.h"  //PS2手柄库,同程序文件夹
#include <PS2X_lib.h>  //PS2手柄库,同程序文件夹
 
PS2X ps2x;
Servo myservo;
 
/******************************************
   PS2手柄引脚设置端口,如需改动请保持软硬件同步
   电机驱动端口设置;舵机端口设置
 *****************************************/
#define PS2_DAT        A4
#define PS2_CMD        A0   //PS2 pin
#define PS2_SEL        A1
#define PS2_CLK        A2
 
#define PWM            5   //电机速度引脚
#define DIR            4   //电机方向引脚
#define SERVOPIN       3   //舵机引脚
 
/***************************************************
   默认居中90度情况下,最小值为50,最大值为130
 **************************************************/
#define SERVOMIN 55       //舵机左转最大值
#define SERVOMID 90       //舵机回中值
#define SERVOMAX 125      //舵机右转最大值
#define TURNLEFT myservo.write(SERVOMIN)   //左转
#define TURNMID myservo.write(SERVOMID)    //回中
#define TURNRIGHT myservo.write(SERVOMAX)  //右转
/*************************************************
   电机速度控制,按键控制速度值设置
 *************************************************/
#define MOTORFORWARD setMotor(100)   //按键前进速度
#define MOTORBACK setMotor(-100)    //按键后退速度
#define MOTORSTOP setMotor(0)       //停止
 
int MAXSPEED = 150;          //摇杆控制电机默认速度,可修改范围0-255.
int MIDSPEED = MAXSPEED;
int SERVOPOS = SERVOMID;
 
bool EnableRockerR = 1;
bool EnableRockerL = 1;
int RMid = 0 ;
int LStop = 0 ;
 
#define pressures   false    //按键模拟值关闭
#define rumble      true     //震动电机打开
int error = 0;
byte type = 0;
byte vibrate = 0;
 
void setup() {
  Serial.begin(57600);         // Baud rate
  pinMode(PWM, OUTPUT);        // Pin state
  pinMode(DIR, OUTPUT);
  myservo.attach(SERVOPIN);
  SERVOMID;                     // Servo middle
  delay(300);
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
 
  if (error == 0) {
    Serial.print("Found Controller, configured successful ");
    Serial.print("pressures = ");
    if (pressures)
      Serial.println("true ");
    else
      Serial.println("false");
    Serial.print("rumble = ");
    if (rumble)
      Serial.println("true)");
    else
      Serial.println("false");
  }
  else if (error == 1) {
    Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
  }
  else if (error == 2)
    Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
  else if (error == 3)
    Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
  type = ps2x.readType();
  switch (type) {
    case 0:
      Serial.print("Unknown Controller type found ");
      break;
    case 1:
      Serial.print("DualShock Controller found ");
      break;
    case 2:
      Serial.print("GuitarHero Controller found ");
      break;
    case 3:
      Serial.print("Wireless Sony DualShock Controller found ");
      break;
  }
}
void(* resetFunc) (void) = 0; //重新配对
 
void loop() {
  if (error == 1) //skip loop if no controller found
    resetFunc();
  ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
 
  if (ps2x.Button(PSB_START))        //will be TRUE as long as button is pressed
    Serial.println("Start is being held");
  if (ps2x.Button(PSB_SELECT))
    Serial.println("Select is being held");
 
  /*************************************************
     PS2手柄左边按键部分控制电机
   *************************************************/
  if (ps2x.ButtonPressed(PSB_PAD_UP)) {          // 按下前进
    //    Serial.println("PAD_UP just pressed");
    MOTORFORWARD;
    EnableRockerL = 0;
  } else if (ps2x.ButtonReleased(PSB_PAD_UP)) {   //松开停止
    //    Serial.println(" PAD_UP just released");
    MOTORSTOP;
    EnableRockerL = 1;
    LStop = 0;
  }
 
  if (ps2x.ButtonPressed(PSB_PAD_DOWN)) {         //按下后退
    //    Serial.println("PAD_DOWN just pressed");
    MOTORBACK;
    EnableRockerL = 0;
  } else if (ps2x.ButtonReleased(PSB_PAD_DOWN)) {  //松开停止
    //    Serial.println(" PAD_DOWN just released");
    MOTORSTOP;
    EnableRockerL = 1;
    LStop = 0;
  }
 
  /***********************************************************************
     Rocker program
     Through the rocker arm around before and after the change of
     resistance for motor speed control
     Up and Left(0 - 127)
     Down and Right (129 - 255)
     摇杆比例控制程序
        通过摇杆前后左右阻值的变化实现电机转速控制
        上左范围(0 - 127)
        下右范围(129 - 255)
  ***********************************************************************/
  if (EnableRockerL) {
    if (0 <= ps2x.Analog(PSS_LY) && ps2x.Analog(PSS_LY) <= 115) {
      digitalWrite(DIR, LOW);
      analogWrite(PWM, map(ps2x.Analog(PSS_LY), 0, 115, MAXSPEED, 0));
      LStop = 0;
    } else if (255 >= ps2x.Analog(PSS_LY) && ps2x.Analog(PSS_LY) >= 135) {
      digitalWrite(DIR, HIGH);
      analogWrite(PWM, map(ps2x.Analog(PSS_LY), 140, 255, 0, MAXSPEED));
      LStop = 0;
    } else {
      if (LStop == 0) {
        MOTORSTOP;
        LStop ++;
      }
    }
  }
 
  /*************************************************
     PS2手柄右边按键控制舵机代码
   *************************************************/
  if (ps2x.ButtonPressed(PSB_CIRCLE)) {             //按下右转
    //    Serial.println("Circle just pressed");         //will be TRUE if button was JUST pressed
    TURNRIGHT;
    EnableRockerR = 0;
  } else if (ps2x.ButtonReleased(PSB_CIRCLE)) {     //松开回中
    //    Serial.println("Circle just released");
    TURNMID;
    EnableRockerR = 1;
    RMid = 0;
  }
 
  if (ps2x.ButtonPressed(PSB_SQUARE)) {            //按下左转
    //    Serial.println("Square just pressed");
    TURNLEFT;
    EnableRockerR = 0;
  } else if (ps2x.ButtonReleased(PSB_SQUARE)) {    //松开回中
    //    Serial.println("Square just released");
    TURNMID;
    EnableRockerR = 1;
    RMid = 0;
  }
 
 
  if (EnableRockerR) {
    if (0 <= ps2x.Analog(PSS_RX) && ps2x.Analog(PSS_RX) <= 115) {
      myservo.write(map(ps2x.Analog(PSS_RX), 0, 115, SERVOMIN, SERVOPOS));
      RMid = 0;
    } else if (255 >= ps2x.Analog(PSS_RX) && ps2x.Analog(PSS_RX) >= 130) {
      myservo.write(map(ps2x.Analog(PSS_RX), 130, 255, SERVOPOS, SERVOMAX));
      RMid = 0;
    } else {
      if (RMid == 0) {
        TURNMID;
        RMid ++;
      }
    }
  }
 
  //电机速度增加20,最大增加到255(全速) 摇杆部分
  if (ps2x.ButtonPressed(PSB_R1)) {
    MAXSPEED += 20;
    if (MAXSPEED > 255) {
      MAXSPEED = 255;
    }
    vibrate = 100;
  }
 
  //电机速度减少20,最低到0(停止)
  if (ps2x.ButtonPressed(PSB_R2)) {
    MAXSPEED -= 20;
    if (MAXSPEED <= 0) {
      MAXSPEED = 0;
    }
    vibrate = 100;
  }
 
  //恢复电机初始速度值
  if (ps2x.ButtonPressed(PSB_CROSS)) {
    // reset speed;
    MAXSPEED = MIDSPEED;
    vibrate = 100;
  }
 
  if (ps2x.ButtonReleased(PSB_L1) || ps2x.ButtonReleased(PSB_L2) ||
      ps2x.ButtonReleased(PSB_R1) || ps2x.ButtonReleased(PSB_R2) || ps2x.ButtonReleased(PSB_CROSS)) {
    vibrate = 0;
    //    Serial.println("vibrate = 0");
  }
 
  delay(50);
}
 
//电机驱动函数,按键部分
void setMotor(int Speed) {
  if (Speed > 0) {
    digitalWrite(DIR, LOW);
    analogWrite(PWM, Speed);
  } else if (Speed < 0) {
    digitalWrite(DIR, HIGH);
    analogWrite(PWM, abs(Speed));
  } else {
    analogWrite(PWM, LOW);
    digitalWrite(DIR, LOW);
  }
}

参考资料




访问YFRobot论坛 论坛邀请码获取 技术交流群
淘宝企业店 淘宝直营店 联系我们