設(shè)計(jì)一種將方向盤(pán)的旋轉(zhuǎn)角度轉(zhuǎn)換為USB信號(hào)的裝置,用于汽車(chē)駕駛模擬
掃描二維碼
隨時(shí)隨地手機(jī)看文章
量角器是一種專(zhuān)門(mén)的設(shè)備,用于高精度測(cè)量旋轉(zhuǎn)角度,并通過(guò)USB將這些測(cè)量結(jié)果傳輸?shù)街鳈C(jī)。它集成了一個(gè)精確的編碼器,能夠以1度的精度測(cè)量角度。樹(shù)莓派Pico通過(guò)可編程I/O (Programmable I/O)高速讀取編碼器信號(hào),而TinyUSB庫(kù)則用于與主機(jī)共享數(shù)據(jù)。該量角器的開(kāi)發(fā)主要是為了解決在汽車(chē)駕駛模擬中需要精確測(cè)量物理方向盤(pán)的旋轉(zhuǎn)角度的問(wèn)題。
軟件棧
為了提供所需的功能,該平臺(tái)需要支持快速I(mǎi)/O和簡(jiǎn)單的USB處理。使用直接GPIO讀取編碼器信號(hào)的初步實(shí)驗(yàn)表明,在快速旋轉(zhuǎn)過(guò)程中,信號(hào)可能部分丟失,因?yàn)橹苯覩PIO只能處理高達(dá)~10kHz的變化。一個(gè)更好更快的選擇是使用Raspberry Pi Pico上可用的可編程輸入/輸出(Programmable Input/Output, PIO)功能。
最初,我計(jì)劃使用最簡(jiǎn)單的軟件選項(xiàng)——MicroPython,但它缺乏對(duì)USB功能的直接支持。CircuitPython是第二個(gè)候選,但它沒(méi)有完全的PIO支持。最后,我選擇了c++,因?yàn)樗鼮镽aspberry Pi Pico (TinyUSB庫(kù))提供了良好的USB支持以及PIO功能。
我基于TinyUSB庫(kù)中的hid_composite示例實(shí)現(xiàn),并從實(shí)現(xiàn)中刪除了除通用輸入/輸出設(shè)備外的所有子設(shè)備。我用一個(gè)處理基于tm1637的顯示的簡(jiǎn)單類(lèi)和一個(gè)帶有處理編碼器信號(hào)的自定義PIO代碼的Encoder c++類(lèi)完成了代碼。
為了開(kāi)發(fā),我使用了Microsoft Visual Studio Code和官方的Raspberry Pi Pico擴(kuò)展(在macOS和Windows上)。
編碼器信號(hào)處理
編碼器產(chǎn)生兩相正交脈沖信號(hào),每個(gè)相位每旋轉(zhuǎn)400個(gè)脈沖。該信號(hào)的解碼由PIO程序(在文件encoder.pio中)執(zhí)行,該程序等待通道a上的上升沿,然后檢查通道B上的值:對(duì)于0,生成IRQ 0;對(duì)于1,生成irq1。這些中斷由Encoder c++類(lèi)處理:irq0減少旋轉(zhuǎn)計(jì)數(shù)器,而irq1增加旋轉(zhuǎn)計(jì)數(shù)器。這種配置每次旋轉(zhuǎn)產(chǎn)生400個(gè)脈沖,計(jì)數(shù)器值需要乘以360/400 = 0.9來(lái)表示以度為單位的值。
通過(guò)增加三個(gè)PIO程序,可以將測(cè)量精度提高到每旋轉(zhuǎn)1600個(gè)脈沖:一個(gè)等待通道A的下降沿,另一個(gè)等待通道B的上升沿,第三個(gè)等待通道B的下降沿。
USB通信
USB處理實(shí)現(xiàn)基于TinyUSB庫(kù)中的hid_composite示例。除通用輸入/輸出設(shè)備外,所有設(shè)備類(lèi)型都從原始代碼中刪除。可以使用tests目錄中的兩個(gè)示例在主機(jī)設(shè)備上測(cè)試該實(shí)現(xiàn):
?Test_hid.py,它使用了hid庫(kù)
?Test_pyusb.py,它使用pyusb庫(kù)
?構(gòu)建指令
連接:
?編碼器<-> RPi Pico
?VCC[紅色]<-> VBus[引腳40](5V)
?GND[黑色]<-> GND[例如引腳38]
?通道A[白色]<-> GP2[引腳4]+ 10 kOhm上拉電阻至3V3[引腳36]
?通道B[綠色]<-> GP3[引腳5]+ 10 kOhm上拉電阻到3V3[引腳36]
?TM1637顯示<-> RPi Pico
?CLK <-> 5[引腳7]
?DIO <-> 4[引腳6]
?VCC <-> 3V3[引腳36]
?GND <-> GND[例如引腳38]
?復(fù)位開(kāi)關(guān)<-> RPi Pico
?3V3[針36]
?GP14[引腳19]
案例:
使用OpenSCAD設(shè)計(jì)的簡(jiǎn)單設(shè)備案例和插件案例可以在GitHub的案例目錄中找到。
本文編譯自hackster.io