如何解决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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。