晾晒谷物收获机自动化代码开源留存(2)

晾晒谷物收获机自动化代码开源留存(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);  
}

样机图片

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别和李俊儒抢辣条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值