《超圖解ESP32深度實作》第2章介紹了偵測磁場變化的霍爾感測器及其用途,並展示ESP32內建的霍爾感測器的操作範例,《超圖解ESP32深度實作》範例檔更新說明這篇貼文提到,新版開發工具已不支援讀取霍爾感測值的hallRread()函式。
因此,《超圖解ESP32應用實作》第5章說明如何使用霍爾感測器檢測馬達轉速與移動距離。
本文將使用另一種「磁編碼器」來實驗霍爾感測器應用。市面上有多種不同型號的非接觸式磁性旋轉位置感測器,例如,AS5040, AS5600, MT6701, MT6816, MT6826S, … 等。下圖左是AS5600(I2C介面),右邊是MT6816(SPI介面)。
這兩個模組都能檢測位於IC上方的磁石的絕對旋轉角度,而透過連續偵測旋轉角度,程式也能計算出磁石的每分鐘旋轉數(RPM)。MT6816模組的價格大約比AS5600貴一倍,若要偵測馬達的轉速,MT6816比較合適,其轉速偵測上限約25000RPM;在普通I2C通訊速率(100KHz)下,AS5600轉速偵測上限約3000 ~4000 RPM。
AS5600可取代傳統(機械式)的角度偵測器,例如,可變電阻和旋轉編碼器,用於偵測旋鈕以及機械手臂的轉動角度,其主要特點:
- 具備數位與類比資料輸出介面:I2C, PWM與類比。
- 12位元解析度,也就是0~360度分別對應到0~4095數值,或者,在類比輸出腳,每旋轉增加1度,類比輸出電壓上升VDD/4096 V。
AS5600 IC正面中心,內部有4個霍爾感測器,如下圖左所示;下圖右是AS5600模組的主要電路,可用5V或3.3V供電,I2C接腳各連接一個10KΩ上拉電阻。
底下列舉AS5600的主要接腳定義,詳細說明請參閱AS5600原廠資料手冊。
- SDA:I2C資料,I2C的位址是0x36。
- SCL:I2C時脈
- OUT:PWM或類比訊號輸出,類比訊號電壓介於0~VDD,與偵測角度值成正比。
- DIR:旋轉方向(direction),預設(IC內部接地)為磁石往順時針方向旋轉時,輸出值增大;DIR腳接VDD(高電位),則是逆時針旋轉,輸出值增大。
下圖顯示磁石轉動角度和AS5600的輸出值變化。
- GPO:程式設置模式(program option)。若程式不需要偵測完整的0~360角度範圍,可透過程式設定實際使用的範圍來提升輸出解析度,設置範圍介於18~360度。此模組的GPO腳接地,代表透過OUT接腳設定偵測的角度範圍。
磁石的類型與擺設方式
筆者購買的AS5600和MT6816模組都有附帶直徑4mm的小磁石,按照磁化(充磁)方向,磁石可分成平面和垂直兩種,「磁編碼器」採用的是「平面充磁」類型。
AS5600原廠技術文件有提到,磁石與IC的典型距離為0.5~3mm。
3D列印不需要螺絲即可組裝的磁編碼器旋鈕
我用3D製圖軟體繪製了一個旋鈕,正反面外觀如下,其內部軸心底下做了一個可塞入磁鐵的凹槽。為了讓這個旋鈕跟放置磁感測器模組的底部相連,不要用螺絲或黏膠,我在旋鈕的內部刻劃了30個半圓形的凹槽。
這是旋鈕底座的模樣,中間的方形開孔,是為了露出磁感測器模組的IC(以及突出PCB板的焊接排針),左下圖的環狀結構外圍有4個小凸點,用於嵌入旋鈕內側的凹槽,環狀的缺口是為了讓它保有彈性,方便塞入或取出旋鈕。
旋鈕和底座組合起來的樣子:
用3D列印機列印的成品外觀,磁石已經塞入旋鈕軸心。實際操作組合好的旋鈕時,轉動到某些點會感覺到不滑順,畢竟這個旋鈕的尺寸不大,直徑30mm,普通0.4mm噴嘴的FDM型3D列印機,無法精密打印出其內部30個細小、平滑的凹槽。此外,底部環型上面有4個凸點,若減少成兩個,應該能讓轉動變得滑順。
建立3D模型時,需要先測量感測器模組的尺寸。這個電路板的兩邊並不等長,約差0.5mm,四個圓孔對應電路板中心點的距離也不一樣。「PID循跡自走車PCB電路板說明」貼文有提到,即便是相同尺寸的OLED顯示器,以及循跡紅外線感測器模組,它們的連接孔位不見得一樣。
仔細觀察你手邊的電子模組的PCB板,你會發現有些板子周圍會留下一點切除的毛邊,甚至不平整的切痕,所以這個底座當中,嵌入PCB板的凹槽,我刻意預留多一點空間。
實際在此模組焊接排針,並插入麵包板,可看到這個PCB板的排針焊接孔跟兩側沒有平行,所以整體是歪斜的。當然,這不影響使用。
我已經把.stl和.step格式的旋鈕和底座的3D模型檔上傳到創想雲的這個網址,任何人都能下載、自由修改。
AS5600磁感測器的麵包板接線
若採用I2C介面連接控制板,只需要接4條線。Arduino UNO R3或R4開發板的I2C有固定的腳位,跟其他I2C模組的接法一樣。像ESP32-S3這種,沒有固定的I2C腳位,則由開發板的編譯環境決定,以《超圖解ESP32應用實作》第11章採用的樂鑫ESP32-S3-DevKit開發板為例,SDA和SCL腳分別設定在腳8和9,因此接線如下:
當然,我們也可以把SDA和SCL接在其他腳位,下一篇貼文再一併說明。
