步驟1:拆開汽車
您需要卸下汽車外殼以露出電線,以便您可以輕松地使用電動(dòng)機(jī)并插入arduino。幾乎有一堆螺絲和東西,所以只要將它們卸下,就可以開始使用。
步驟2:找出控制器
您需要使用usb電纜將ps3控制器連接到計(jì)算機(jī),以找出輸入等。我為此使用了程序USB視圖。您可以從以下鏈接下載:http://www.ftdichip.com/Resources/Utilities/usbview.zip
然后打開程序并選擇ps3控制器
結(jié)果應(yīng)如下所示:
設(shè)備描述符:
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
當(dāng)前配置值:0x01
設(shè)備總線速度:完整
設(shè)備地址:0x01
打開管道:2
端點(diǎn)描述符:
bEndpointAddress:0x02
傳輸類型:中斷
wMaxPacketSize:0x0040(64)
bInterval:0x01
端點(diǎn)描述符:
bEndpointAddress:0x81
傳輸類型:Interrupt PackageSize:0x0040(64) BInterval:0x01
重要的一點(diǎn)是控制器在輸出時(shí)提供輸出(0x02),并在(0x81)上接收輸入
步驟3:使用USB庫
幸運(yùn)的是,我不是第一個(gè)將ps3控制器連接到arduino的人,因此可以使用非常有用的庫。您應(yīng)該在這里獲取它:https://github.com/ribbotson/USB-Host/tree/master/ps3/PS3USB
現(xiàn)在,您應(yīng)該下載此文件以了解有關(guān)控制器的更多信息:https://github.com/ribbotson/USB-Host/blob/master/examples/USB_desc.pde
使用此代碼,我們可以找到有關(guān)arduino的各種內(nèi)容。
請(qǐng)參閱:開始
freeMemory()報(bào)告683 《設(shè)備》描述符:
描述符長度:12
描述符類型:01 USB版本:0200
設(shè)備類別: 00
設(shè)備子類:00 《設(shè)備》協(xié)議:00 《最大》數(shù)據(jù)包大?。?0 《供應(yīng)商ID:054C 《產(chǎn)品》產(chǎn)品ID:0268 《版本》修訂ID:0100
制造商。字符串索引:01
產(chǎn)品字符串索引:02
序列號(hào)索引:00
配置數(shù):01
配置描述符:
總長度:0029
Num.intf: 01
Conf。值:01 字符串:00
屬性:80 最大功率:FA
接口描述符:
Intf.number:00
Alt 。:00
端點(diǎn):02
Intf。類別:03
Intf。子類:00
Intf。協(xié)議:00
Intf.string:00
未知描述符:
長度:09
類型:21
內(nèi)容:110100012294000705
端點(diǎn)描述符:
端點(diǎn)地址:02
屬性:03
最大包大小:0040
輪詢間隔:01
端點(diǎn)描述符:
端點(diǎn)地址:81
屬性:03 《最大》包大?。?040
輪詢間隔:01 現(xiàn)在我們需要使庫和控制器同步。為此,我們使用以下代碼:
typedef struct {
byte epAddr;//如果設(shè)置了
byte Attr,則從端點(diǎn)描述符復(fù)制而沒有位7。//端點(diǎn)傳輸類型。
unsigned int MaxPktSize;//最大數(shù)據(jù)包大小。
字節(jié)間隔;//輪詢間隔(以幀為單位)。
byte sndToggle;//最后一個(gè)觸發(fā)值,HCTL觸發(fā)位的位掩碼
byte rcvToggle;//最后一個(gè)觸發(fā)值,HCTL觸發(fā)位的位掩碼
} EP_RECORD;
還有:
device_descriptor =(USB_DEVICE_DESCRIPTOR *)&buf;
if(
(device_descriptor-》 idVendor!= PS3_VID)||(device_descriptor-》 idProduct!= PS3_PID)){
Serial.println(“不支持的USB設(shè)備”);
while(1);//stop
第4步:現(xiàn)在,我們將控制器設(shè)置為提供輸入!
我們希望控制器能夠隨時(shí)向以下位置提供輸入: 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, ;
/*設(shè)置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(“設(shè)置報(bào)告錯(cuò)誤:”);
Serial.println (rcode,HEX);
while(1);//stop
}
如果您想做一些額外的工作以保持冷靜,還可以將ps3控制器上的LED 1設(shè)為打開。因?yàn)楫?dāng)您將控制器連接到ps3時(shí),LED會(huì)亮起,所以看起來更親,但除了美觀以外,這沒什么用。 (注意:您還可以使控制器與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(“設(shè)置報(bào)告錯(cuò)誤:”);
Serial.println(rcode,HEX);
while(1);//stop
}
更重要的是,arduino需要處理來自控制器的信號(hào)。使用以下代碼:
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步:大結(jié)局:將Arduino連接到汽車上
因此,每輛車都不一樣。在我的項(xiàng)目中,我有一輛非常簡單的汽車,只有四個(gè)控制選項(xiàng)(向前,向后,向左,向右),并且每個(gè)都只允許一個(gè)值,即只有一個(gè)允許的加速度。因此,相應(yīng)地創(chuàng)建代碼。我只使用了控制器上的方向按鈕,因?yàn)槲艺J(rèn)為這是最簡單的。也可以使用加速度計(jì)進(jìn)行轉(zhuǎn)向,使用操縱桿進(jìn)行前進(jìn)等?;旧?,您可以選擇所需的任何控制配置。我將在短期內(nèi)說明如何操作。
但是,現(xiàn)在,我們需要將arduino連接到汽車上。我的車有兩個(gè)馬達(dá)。向前后退一圈,向前轉(zhuǎn)一圈。您需要確定這些電機(jī)的工作方式。如果它們像我的,則將連接兩根電線,您將需要去除這些電線并將其從arduino的輸出端焊接到它們上。如果您的汽車與眾不同,那么希望它不會(huì)太難找出答案。
現(xiàn)在我們已經(jīng)將arduino連接到汽車上,我們需要編寫代碼來告訴汽車要做什么。正如我上面提到的,這取決于您的喜好和個(gè)人汽車。因此,現(xiàn)在我將介紹一堆無論情況如何都將有用的代碼。首先,我們希望方法讀取按鈕輸入。我們可以使用以下內(nèi)容:
#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。因此,對(duì)于我來說,我使用了buUp,buDown等。
如果您想成為發(fā)燒友,并且可能具有一系列輸入值,那么您可以使用多個(gè)加速力,則可以使用加速度計(jì)。這些是他們的方法:
#define加速度計(jì)X 0
#define加速度計(jì)Y 1
#define加速度計(jì)Z 2
#define陀螺儀Z 3
這些值從0到1023,其中512為中性
無論如何,一旦執(zhí)行了此操作,您只需要告訴arduino以所需的輸出量輸出輸出,汽車就會(huì)行駛!
-
控制器
+關(guān)注
關(guān)注
114文章
17105瀏覽量
184273
發(fā)布評(píng)論請(qǐng)先 登錄
兩輪自平衡電動(dòng)車及其電機(jī)控制器設(shè)計(jì)
具有同步續(xù)流的電動(dòng)車用直流電機(jī)控制器設(shè)計(jì)


工程機(jī)械控制器廠家 控制器國產(chǎn)替代 #國產(chǎn)控制器#控制器廠家#控制器品牌

無線遙控車的電機(jī)抖動(dòng)

移動(dòng)機(jī)械控制器X1010,支持433兆赫茲遙控器#工程機(jī)械控制器 #車載智能控制器
電動(dòng)車控制器欠壓保護(hù)怎樣調(diào)整
電動(dòng)車控制器電壓過高怎么解決
電動(dòng)車用萬能控制器不用霍爾可以嗎
控制器取掉霍爾線可以嗎

國產(chǎn)控制器廠家 整車控制器 以太網(wǎng)控制器 CAN控制器 國產(chǎn)化替代

評(píng)論