晾晒谷物收获机自动化代码开源留存(2)
该部分为从机代码留存
从机与主机为串口通信方式,通讯端口在注释中说明。
该部分主要负责的内容为手柄控制机器的行为
#include <PS2X_lib.h> //for v1.6
#include <Stepper.h>
#include <FlexiTimer2.h> //调用定时器的库
#define E_L 12
#define IN1_L 29
#define IN2_L 28
#define E_R 13
#define IN1_R 31
#define IN2_R 30
#define E_CS 5
#define IN1_CS 22
#define IN2_CS 23
#define E_MS 6
#define IN1_MS 24
#define IN2_MS 25
#define pressures false
#define rumble false
PS2X ps2x; // 创建PS2控制器类
int error = 0;
byte type = 0;
byte vibrate = 0;
int straight = 200; //直行速度
int swerve_fast = 100; //转弯前进速度
int swerve_slow = 100; //转弯后退速度
int speed_CS = 100; //设置传送带初始速度
int speed_MS = 200; //设置毛刷初始速度
char get_data; //定义定时器获取到的字符
void (* resetFunc) (void) = 0; //未连接上时,一直等待连接
void setup(){
Serial.begin(115200); //设置串口0波特率
Serial1.begin(38400); //设置串口波特率
pinMode(E_L, OUTPUT);
pinMode(IN1_L, OUTPUT);
pinMode(IN2_L, OUTPUT);
pinMode(E_R, OUTPUT);
pinMode(IN1_R, OUTPUT);
pinMode(IN2_R, OUTPUT);
pinMode(E_CS, OUTPUT);
pinMode(E_MS, OUTPUT);
pinMode(IN1_CS, OUTPUT);
pinMode(IN2_CS, OUTPUT);
pinMode(IN1_MS, OUTPUT);
pinMode(IN2_MS, OUTPUT);
delay(500); //等待无线模块启动
Serial.print("准备开始");
type = ps2x.readType();
error = ps2x.config_gamepad(14,15,16,17, true, true);
//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
FlexiTimer2::set(50,1.0/1000,Get_data);
FlexiTimer2::start();
}
void Get_data()
{
while (Serial1.available())
{
get_data = Serial1.read();
Serial.println(get_data);
}
switch(get_data)
{
case 65:
Start_Cs();
Serial.println("打开传送带");
break;
case 66:
Stop_Cs();
Serial.println("关闭传送带");
break;
case 67:
Start_Ms();
Serial.println("打开毛刷");
break;
case 68:
Stop_Ms();
Serial.println("关闭毛刷");
break;
case 70:
Stop();
Serial.println("停止");
break;
case 71:
Back();
Serial.println("后退");
break;
case 72:
Left();
Serial.println("左转");
break;
case 73:
Right();
Serial.println("右转");
break;
case 69:
Straight();
Serial.println("直行");
break;
}
}
void Start_Ms()
{
digitalWrite(IN1_MS,HIGH);
digitalWrite(IN2_MS,LOW);
analogWrite(E_MS,speed_MS);
}
void Start_Cs()
{
digitalWrite(IN1_CS,LOW);
digitalWrite(IN2_CS,HIGH);
analogWrite(E_CS,speed_CS);
}
void Stop_Ms()
{
digitalWrite(IN1_MS,LOW);
digitalWrite(IN2_MS,LOW);
}
void Stop_Cs()
{
digitalWrite(IN1_CS,LOW);
digitalWrite(IN2_CS,LOW);
}
void Start_Ms_Cs() //传送带和毛刷启动
{
digitalWrite(IN1_CS,LOW);
digitalWrite(IN2_CS,HIGH);
digitalWrite(IN1_MS,HIGH);
digitalWrite(IN2_MS,LOW);
analogWrite(E_CS,speed_CS);
analogWrite(E_MS,speed_MS);
}
void Stop_Ms_Cs() //传送带和毛刷停止
{
digitalWrite(IN1_CS,LOW);
digitalWrite(IN2_CS,LOW);
digitalWrite(IN1_MS,LOW);
digitalWrite(IN2_MS,LOW);
}
void Straight() //前进
{
digitalWrite(IN1_L,HIGH);
digitalWrite(IN2_L,LOW);
digitalWrite(IN1_R,LOW);
digitalWrite(IN2_R,HIGH);
analogWrite(E_L,straight);
analogWrite(E_R,straight);
}
void Right() //右转
{
digitalWrite(IN1_L,HIGH);
digitalWrite(IN2_L,LOW);
digitalWrite(IN1_R,HIGH);
digitalWrite(IN2_R,LOW);
analogWrite(E_L,swerve_fast);
analogWrite(E_R,swerve_slow);
}
void Left() //左转
{
digitalWrite(IN1_L,LOW);
digitalWrite(IN2_L,HIGH);
digitalWrite(IN1_R,LOW);
digitalWrite(IN2_R,HIGH);
analogWrite(E_L,swerve_slow);
analogWrite(E_R,swerve_fast);
}
void Back() //后退
{
digitalWrite(IN1_L,LOW);
digitalWrite(IN2_L,HIGH);
digitalWrite(IN1_R,HIGH);
digitalWrite(IN2_R,LOW);
analogWrite(E_L,straight);
analogWrite(E_R,straight);
}
void Stop() //轮子停止
{
digitalWrite(IN1_L,LOW);
digitalWrite(IN2_L,LOW);
digitalWrite(IN1_R,LOW);
digitalWrite(IN2_R,LOW);
}
void loop() {
//Serial.print("准备连接");
if(error== 1)
return; //如果没有连接上,一直等待连接,不继续执行
ps2x.read_gamepad(false, vibrate);
if(ps2x.Button(PSB_START)){Start_Ms_Cs();} //开始
if(ps2x.Button(PSB_SELECT)){Stop_Ms_Cs();} //结束
if(ps2x.ButtonPressed(PSB_PAD_UP)){Straight();Serial.print("s");} //UP键按下,前进
if(ps2x.ButtonPressed(PSB_PAD_RIGHT)){Right();} //RIGHT键按下,右转
if(ps2x.ButtonPressed(PSB_PAD_LEFT)){Left();} //LEFT键按下,左转
if(ps2x.ButtonPressed(PSB_PAD_DOWN)){Back();} //DOWN键按下,后退
if(ps2x.ButtonReleased(PSB_PAD_UP) || ps2x.ButtonReleased(PSB_PAD_RIGHT) || ps2x.ButtonReleased(PSB_PAD_LEFT) || ps2x.ButtonReleased(PSB_PAD_DOWN)) {Stop();} //前后左右任意键抬起后,停止
vibrate = ps2x.Analog(PSAB_CROSS);
if (ps2x.NewButtonState()) {
if(ps2x.Button(PSB_L2)){speed_MS = 100;} //L2按钮按下,毛刷速度复位为100
if(ps2x.Button(PSB_R2)){speed_CS = 100;} //R2按钮按下,传送带速度复位为100
}
if(ps2x.ButtonPressed(PSB_TRIANGLE)){ //三角形按钮
speed_CS = speed_CS + 20;
Start_Ms_Cs();
Serial.print(speed_CS);}
if(ps2x.ButtonPressed(PSB_CIRCLE)){ //圆形按钮
speed_CS = speed_MS + 20;
Start_Ms_Cs();
Serial.print(speed_CS);}
if(ps2x.ButtonPressed(PSB_CROSS)){ //X按钮
speed_CS = speed_CS - 20;
Start_Ms_Cs();
Serial.print(speed_MS);}
if(ps2x.ButtonPressed(PSB_SQUARE)){ //正方形按钮
speed_CS = speed_MS - 20;
Start_Ms_Cs();
Serial.print(speed_MS);}
delay(50);
}