“109010019 舵机转向小车套件”的版本间的差异
来自YFRobotwiki
(→规格书) |
|||
| 第1行: | 第1行: | ||
== 发货清单 == | == 发货清单 == | ||
| − | 舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数 | + | 舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数 。 |
[[Media:舵机小车套装物料清单.pdf|舵机小车套装物料清单]] | [[Media:舵机小车套装物料清单.pdf|舵机小车套装物料清单]] | ||
| 第9行: | 第9行: | ||
[[Media:舵机小车套装规格书.pdf|舵机小车套装规格书]] | [[Media:舵机小车套装规格书.pdf|舵机小车套装规格书]] | ||
| + | |||
| + | == 舵机小车手册 == | ||
| + | 舵机小车安装手册。 | ||
| + | |||
| + | [[Media:舵机转向小车手册.pdf|舵机转向小车手册]] | ||
| + | |||
| + | |||
| + | == 示例代码 == | ||
| + | /* | ||
| + | 舵机转向小车PS2控制 | ||
| + | |||
| + | 控制方式:左摇杆控制小车的前进后退(前后有效),右摇杆控制方向(左右有效); | ||
| + | 控制均为比例控制,遥感倾斜度越大,速度/角度越大;按键部分同理. | ||
| + | |||
| + | 手柄前端L1,L2调节舵机的居中角度位置,每次增加减小1度,右侧R1,R2调节电机速度. | ||
| + | |||
| + | YFROBOT-WST | ||
| + | WWW.YFROBOT.COM.CN | ||
| + | 09/19/2020 | ||
| + | */ | ||
| + | |||
| + | /****************************************** | ||
| + | 导入必须的库文件 | ||
| + | *****************************************/ | ||
| + | #include <Servo.h> //舵机库,软件自带 | ||
| + | #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); | ||
| + | } | ||
| + | } | ||
2021年8月16日 (一) 14:40的版本
发货清单
舵机小车套装配件清单,核对清单检查物品数量和认识具体的型号参数。
规格书
舵机小车套装基础尺寸和详细的运行参数。
舵机小车手册
舵机小车安装手册。
示例代码
/*
舵机转向小车PS2控制
控制方式:左摇杆控制小车的前进后退(前后有效),右摇杆控制方向(左右有效); 控制均为比例控制,遥感倾斜度越大,速度/角度越大;按键部分同理.
手柄前端L1,L2调节舵机的居中角度位置,每次增加减小1度,右侧R1,R2调节电机速度.
YFROBOT-WST WWW.YFROBOT.COM.CN 09/19/2020
- /
/******************************************
导入必须的库文件 *****************************************/
- include <Servo.h> //舵机库,软件自带
- 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);
}
}