0

我正在研究一个通过 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,  0, 255, 0, 255); //Need to figure out how to add offset to remove buzzing 
//noise from motor. 
backwards = map(backwards, 0, 255, 0, 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);
digitalWrite(in2, LOW); }


//This is for front l/r Motor

int steer = (PS4.getAnalogHat(LeftHatX) ); 
steer = map(steer, 0, 255, 255, 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);
digitalWrite(in4, 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);}

 }}
4

3 回答 3

0

最后添加了一些东西,所以如果控制器已连接并且不再连接,感谢帮助我的好友

/*
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, 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,  0, 255, 0, 255); //Need to figure out how to add offset to remove buzzing noise from motor. 
backwards = map(backwards, 0, 255, 0, 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);
    digitalWrite(in2, LOW); }

    
//This is for front l/r Motor

int steer = (PS4.getAnalogHat(LeftHatX) ); 
steer = map(steer, 0, 255, 255, 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, 255);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
}
 }
于 2020-08-14T21:07:56.673 回答
0

您的代码使用该.disconnect()功能,如果设备已连接,该功能实际上会断开您的设备,因此它是 avoid而不是 a bool。相反,我会使用该.connected()方法,它返回一个bool告诉您您的设备是否已连接的方法。为了实现这一点,您将执行以下操作:

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

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

于 2020-08-12T20:54:12.503 回答
0

如果您无法检测到控制器已断开连接并给出可以运行的最小代码段,那么您的问题会更容易理解。

话虽如此,正如 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");
  }
}
于 2020-08-13T06:01:30.037 回答