PS4控制器的故障保护,用于控制直流电动机

问题描述

我正在研究通过arduino uno和L298N控制旧的遥控车直流电动机的项目。我可以使电动机正常工作,但是想包括一个故障保护功能,如果蓝牙超出范围,该故障保护功能将停止电动机,以使它不仅可以继续驱动直到崩溃。代码从下面开始,我尝试在最底部进行故障保护。

    //This begins the actual motor stuff 

int forwards = (PS4.getAnalogButton(R2)); // Read R2 Button for forward 
int backwards = (PS4.getAnalogButton(L2)); // Read L2 Button for backwards 
forwards  = map(forwards,255,255); //Need to figure out how to add offset to remove buzzing 
//noise from motor. 
backwards = map(backwards,255);

//This is for Rear motor Forwards
if ((PS4.getAnalogButton( R2 )) > 0 ) {
analogWrite(enA,forwards );
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);}
//This is for Rear motor Backwards 
if  ((PS4.getAnalogButton( L2 )) > 0 ) {
 analogWrite(enA,backwards );
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);} 
//This is so that if neither L2/R2 is pressed the motor does nothing.
if (PS4.getAnalogButton( R2 ) == 0  &&
PS4.getAnalogButton( L2 ) == 0  ){
  analogWrite(enA,255);
digitalWrite(in1,LOW); }


//This is for front l/r Motor

int steer = (PS4.getAnalogHat(LeftHatX) ); 
steer = map(steer,255);


//This is for front motor turning left 
//code for analog for l/r 
 if ((PS4.getAnalogHat(LeftHatX)) >135 ){
 analogWrite(enB,steer); 
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);} 
else if ((PS4.getAnalogHat(LeftHatX)) <115 ){
 analogWrite(enB,steer);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH); } 
 else{
  analogWrite(enB,255);
digitalWrite(in3,LOW); }
//This is code to turn off motor if controller is out of range and disconnect still a wip 
//if (PS4.disconnect())return = true;{      //this comes back as an error "could not convert 
'PS4.PS4BT::<anonymous>.BTHID::disconnect()' from 'void' to 'bool' "
 //analogWrite(enA,255);
 //digitalWrite(in1,LOW);
 //digitalWrite(in2,LOW);}

 }}

解决方法

您的代码使用.disconnect()函数,该函数实际上会在连接设备后断开连接,因此为什么它是void而不是bool。相反,我将使用.connected()方法,该方法返回一个bool来告诉您设备是否已连接。为了实现这一点,您可以这样做:

if (PS4.connected() == false {
// do whatever you need to do here to turn off your motors
}

我希望这会有所帮助,并且如果您需要Arduino上的蓝牙功能更多帮助,可以在这里找到我从中获得函数.connected()的函数库:https://www.arduino.cc/en/Reference/CurieBLE

,

如果您无法检测到控制器已断开连接并给出了可以运行的minimal piece of code,那将更容易理解您的问题。

正如Anubhav Nigam指出的那样,.connected()是测试控制器是否仍处于连接状态的方法。

https://felis.github.io/USB_Host_Shield_2.0/class_p_s4_b_t.html#a08a857b8533e59f6eb872e4c8f727405

我没有硬件可以测试,但是请看以下示例:https://www.instructables.com/id/Creating-a-DualShock-4-Controlled-Arduino/

我相信这是一个最小的可运行示例:

#include <PS4BT.h>
#include <usbhub.h>

USB Usb;

BTD Btd(&Usb);

PS4BT PS4(&Btd,PAIR);

void setup() {
  Serial.begin(19200);
  if (Usb.Init() == -1) {
    Serial.print("OSC did not start");
    while (1); // Halt
  }
  Serial.print("PS4 Bluetooth Library Started");
}
void loop() {
  Usb.Task();

  if (PS4.connected()) {
    if(PS4.getButtonClick(CROSS)){
      Serial.print("cross");
    } 

    if(PS4.getButtonClick(PS)){
      PS4.disconnect();
      Serial.end();
    }
      
  } else {   
    Serial.print("switch off motors");
  }
}
,

最后添加了一些东西,以便在控制器已连接且不再连接的情况下,这要感谢一个帮助我的伙伴

/*
PS4 Bluetooth Controlled RC Car- developed by David Duronslet,Code adapted from example sketch for the PS4 Bluetooth library by Kristian Lauszus
 */
#include <PS4BT.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>


////////////GLOBALS DEFINED HERE///////////

bool Paired=false; 
//For motor 1 
#define enA 9
#define in1 4
#define in2 5

//For motor 2 
#define in3 6
#define in4 7
#define enB 10 

//For PS4 Controller inputs on debug menu 
#define ENABLE_UHS_DEBUGGING 1

USB Usb; //use Usb class
BTD Btd(&Usb);
bool printAngle,printTouch;
uint8_t oldL2Value,oldR2Value;

int val = map(PS4.getAnalogButton(R2),255,100,255)   ; //map function for R2 button 

void setup() {
  Serial.begin(115200);//communication baud rate for the Serial port.
  
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo,Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); // Permanently Halt
  }
  Serial.print(F("\r\nPS4 Bluetooth Library Started "));

  //Motor Controller Pin Setup
  pinMode(enA,OUTPUT);
  pinMode(enB,OUTPUT);
  pinMode(in1,OUTPUT);
  pinMode(in2,OUTPUT);
  pinMode(in3,OUTPUT);
  pinMode(in4,OUTPUT);
}

void loop() {
  Usb.Task();
 if (PS4.connected()) {
  Paired=true; //for the range checker 
//This begins the actual motor stuff 

int forwards = (PS4.getAnalogButton(R2)); // Read R2 Button for forward 
int backwards = (PS4.getAnalogButton(L2)); // Read L2 Button for backwards 
forwards  = map(forwards,255); //Need to figure out how to add offset to remove buzzing noise from motor. 
backwards = map(backwards,255);

//This is for Rear motor Forwards
  if ((PS4.getAnalogButton( R2 )) > 0 ) {
    analogWrite(enA,forwards );
    digitalWrite(in1,HIGH);
    digitalWrite(in2,LOW);}
//This is for Rear motor Backwards 
if  ((PS4.getAnalogButton( L2 )) > 0 ) {
     analogWrite(enA,backwards );
    digitalWrite(in1,LOW);
    digitalWrite(in2,HIGH);} 
//This is so that if neither L2/R2 is pressed the motor does nothing.
if (PS4.getAnalogButton( R2 ) == 0  &&
    PS4.getAnalogButton( L2 ) == 0  ){
      analogWrite(enA,255);
    digitalWrite(in1,LOW); }

    
//This is for front l/r Motor

int steer = (PS4.getAnalogHat(LeftHatX) ); 
steer = map(steer,255);


//This is for front motor turning left 
//code for analog for l/r 
 if ((PS4.getAnalogHat(LeftHatX)) >135 ){
 analogWrite(enB,steer); 
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);} 
else if ((PS4.getAnalogHat(LeftHatX)) <115 ){
 analogWrite(enB,steer);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW); } 
 else{
      analogWrite(enB,steer);//Change 255 value?
    digitalWrite(in3,LOW);
    digitalWrite(in4,LOW); }

 }

//Out of range condition goes here! 
else if(Paired==true){//this means the was Connected in the past but is no longer connected.
  //stop all motors
    analogWrite(enA,LOW);
}
 }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...