电子说
步骤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以所需的输出量输出输出,汽车就会行驶!
全部0条评论
快来发表一下你的评论吧 !