怎样用PS3控制器控制遥控车

电子说

1.3w人已加入

描述

步骤1:拆开汽车

控制器

您需要卸下汽车外壳以露出电线,以便您可以轻松地使用电动机并插入arduino。几乎有一堆螺丝和东西,所以只要将它们卸下,就可以开始使用。

步骤2:找出控制器

控制器

您需要使用usb电缆将ps3控制器连接到计算机,以找出输入等。我为此使用了程序USB视图。您可以从以下链接下载:http://www.ftdichip.com/Resources/Utilities/usbview.zip

然后打开程序并选择ps3控制器

结果应如下所示:

设备描述符:

bcdUSB:0x0200

bDeviceClass:0x00

bDeviceSubClass:0x00

bDeviceProtocol:0x00

bMaxPacketSize0:0x40(64)

idVendor:0x054C(Sony Corporation)

idProduct:0x0268

bcdDevice:0x0100

iManufacturer:0x01

iProduct:0x02

iSerialNumber:0x00

bNumConfigurations:0x01

ConnectionStatus:DeviceConnected

当前配置值:0x01

设备总线速度:完整

设备地址:0x01

打开管道:2

端点描述符:

bEndpointAddress:0x02

传输类型:中断

wMaxPacketSize:0x0040(64)

bInterval:0x01

端点描述符:

bEndpointAddress:0x81

传输类型:Interrupt PackageSize:0x0040(64) BInterval:0x01

重要的一点是控制器在输出时提供输出(0x02),并在(0x81)上接收输入

步骤3:使用USB库

幸运的是,我不是第一个将ps3控制器连接到arduino的人,因此可以使用非常有用的库。您应该在这里获取它:https://github.com/ribbotson/USB-Host/tree/master/ps3/PS3USB

现在,您应该下载此文件以了解有关控制器的更多信息:https://github.com/ribbotson/USB-Host/blob/master/examples/USB_desc.pde

使用此代码,我们可以找到有关arduino的各种内容。

请参阅:开始

freeMemory()报告683 《设备》描述符:

描述符长度:12

描述符类型:01 USB版本:0200

设备类别: 00

设备子类:00 《设备》协议:00 《最大》数据包大小:40 《供应商ID:054C 《产品》产品ID:0268 《版本》修订ID:0100

制造商。字符串索引:01

产品字符串索引:02

序列号索引:00

配置数:01

配置描述符:

总长度:0029

Num.intf: 01

Conf。值:01 字符串:00

属性:80 最大功率:FA

接口描述符:

Intf.number:00

Alt 。:00

端点:02

Intf。类别:03

Intf。子类:00

Intf。协议:00

Intf.string:00

未知描述符:

长度:09

类型:21

内容:110100012294000705

端点描述符:

端点地址:02

属性:03

最大包大小:0040

轮询间隔:01

端点描述符:

端点地址:81

属性:03 《最大》包大小:0040

轮询间隔:01 现在我们需要使库和控制器同步。为此,我们使用以下代码:

typedef struct {

byte epAddr;//如果设置了

byte Attr,则从端点描述符复制而没有位7。//端点传输类型。

unsigned int MaxPktSize;//最大数据包大小。

字节间隔;//轮询间隔(以帧为单位)。

byte sndToggle;//最后一个触发值,HCTL触发位的位掩码

byte rcvToggle;//最后一个触发值,HCTL触发位的位掩码

} EP_RECORD;

还有:

device_descriptor =(USB_DEVICE_DESCRIPTOR *)&buf;

if(

(device_descriptor-》 idVendor!= PS3_VID)||(device_descriptor-》 idProduct!= PS3_PID)){

Serial.println(“不支持的USB设备”);

while(1);//stop

第4步:现在,我们将控制器设置为提供输入!

我们希望控制器能够随时向以下位置提供输入: arduino,因此我们使用以下代码:

#define PS3_F4_REPORT_LEN 4

#define HID_REPORT_FEATURE 3

#define PS3_F4_REPORT_ID 0xF4 prog_char feature_F4_report [] PROGMEM = {0x42,0x0c, ;

/*设置PS3控制器为(i = 0; i ;

rcode = Usb.setReport (PS3_ADDR,ep_record [CONTROL_PIPE] .epAddr,PS3_F4_REPORT_LEN,PS3_IF,HID_REPORT_FEATURE,PS3_F4_REPORT_ID,buf);

if(rcode){

Serial.print(“设置报告错误:”);

Serial.println (rcode,HEX);

while(1);//stop

}

如果您想做一些额外的工作以保持冷静,还可以将ps3控制器上的LED 1设为打开。因为当您将控制器连接到ps3时,LED会亮起,所以看起来更亲,但除了美观以外,这没什么用。 (注意:您还可以使控制器与arduino配合使用,非常酷!)。这是LED的代码:

#define PS3_01_REPORT_LEN 48

#define HID_REPORT_OUTPUT 2

#define PS3_01_REPORT_ID 0x01

prog_char output_01_report [] PROGMEM = {0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00,

0x00、0x02、0xff,0x27、0x10、0x00、0x32、0xff,

0x27、0x10、0x00, 0x32、0xff,0x27、0x10、0x00,

0x32、0xff,0x27、0x10、0x00、0x32、0x00、0x00,

0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00,

》 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00

};

/*为(i = 0; i buf [i] = pgm_read_byte_near(output_01_report + i);

rcode = Usb.setReport(PS3_ADDR,ep_record [CONTROL_PIPE] .epAddr,PS3_01_REPORT_LEN,PS3_IF,HID_REPORT_OUTPUT,PS3_01_REPORT_ID,《) br》 Serial.print(“设置报告错误:”);

Serial.println(rcode,HEX);

while(1);//stop

}

更重要的是,arduino需要处理来自控制器的信号。使用以下代码:

void PS3_poll(void)

{

byte rcode = 0;//返回代码

/*轮询PS3 */

rcode = Usb.inTransfer(PS3_ADDR,ep_record [INPUT_PIPE] .epAddr,PS3_01_REPORT_LEN,buf);

if(rcode!= 0){

return;

}

process_report();

return;

}

第5步:大结局:将Arduino连接到汽车上

因此,每辆车都不一样。在我的项目中,我有一辆非常简单的汽车,只有四个控制选项(向前,向后,向左,向右),并且每个都只允许一个值,即只有一个允许的加速度。因此,相应地创建代码。我只使用了控制器上的方向按钮,因为我认为这是最简单的。也可以使用加速度计进行转向,使用操纵杆进行前进等。基本上,您可以选择所需的任何控制配置。我将在短期内说明如何操作。

但是,现在,我们需要将arduino连接到汽车上。我的车有两个马达。向前后退一圈,向前转一圈。您需要确定这些电机的工作方式。如果它们像我的,则将连接两根电线,您将需要去除这些电线并将其从arduino的输出端焊接到它们上。如果您的汽车与众不同,那么希望它不会太难找出答案。

现在我们已经将arduino连接到汽车上,我们需要编写代码来告诉汽车要做什么。正如我上面提到的,这取决于您的喜好和个人汽车。因此,现在我将介绍一堆无论情况如何都将有用的代码。首先,我们希望方法读取按钮输入。我们可以使用以下内容:

#define buSelect 0

#define buLAlog 1

#define buRAnalog 2

#define buStart 3

#define buUp 4

#define buRight 5

#define buDown 6

#define buLeft 7

#define buL2 8

#define buR2 9

#define buL1 10

#define buR1 11

#define buTriangle 12

#define buCircle 13

#define buCross 14

#define buSquare 15

#define buPS 16

如果按下指定的按钮,则它们返回true。因此,对于我来说,我使用了buUp,buDown等。

如果您想成为发烧友,并且可能具有一系列输入值,那么您可以使用多个加速力,则可以使用加速度计。这些是他们的方法:

#define加速度计X 0

#define加速度计Y 1

#define加速度计Z 2

#define陀螺仪Z 3

这些值从0到1023,其中512为中性

无论如何,一旦执行了此操作,您只需要告诉arduino以所需的输出量输出输出,汽车就会行驶!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分