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