如何使用PSOC?6板和MicroPython控制兩種不同類型的伺服電機
你有沒有想過到底是什么在移動RC飛機的副翼或3d打印的機械手?你在YouTube上看到的許多很酷的移動項目都是由廉價的業(yè)余伺服電機秘密驅(qū)動的。
在這個protip中,我們將使用PSOC?6 Wi-Fi BT原型工具包和幾行MicroPython制作兩個常見的伺服器旋轉(zhuǎn)和掃描。
順便說一下:
PSOC?6 Wi-Fi BT原型工具包是一款開發(fā)板,具有PSOC?6(可編程片上系統(tǒng))微控制器,這是一種功能強大且靈活的芯片,可用于廣泛的應(yīng)用。以下是我們用這種芯片完成的一些項目:鱷魚肱二頭肌訓(xùn)練器、慕尼黑啤酒節(jié)智能啤酒斯坦或自平衡機器人。
引出線
第一步是將您的板連接到伺服電機和PC。rc -伺服電機一般有三種輸出:
?最暗的電線連接到GND。
?中間的一個連接到VCC(檢查您的數(shù)據(jù)表所需的電壓)。
?最輕的連接到任何支持PWM通信的引腳(我們將在稍后討論)。在這種情況下,我們選擇了pin 9.7,但是你可以使用任何一個你喜歡的,你只需要相應(yīng)地改變代碼。
要連接到PC,請將micro-USB插入左上方的連接器(KitProg3 USB連接器)。
設(shè)置MicroPython
如果這是您第一次在PSOC?6原型工具包上使用MicroPython,您需要首先將軟件閃存到微控制器上。我們已經(jīng)準(zhǔn)備了一個protip和一篇文章來解釋如何在PSOC?6上使用MicroPython。
伺服電機與PWM通信
什么是PWM, PWM通信是如何工作的?
PWM代表“脈沖寬度調(diào)制”,是微控制器與伺服電機和其他組件通信的一種方式。每個電機都有一個頻率作為設(shè)定參數(shù)(檢查相應(yīng)電機的數(shù)據(jù)表),微控制器向電機發(fā)送一個脈沖,因此每周期T = 1/f一次。
輸入是由信號在T期間被設(shè)置為高(脈沖寬度)的時間長短來接收的,通常在電機特定范圍內(nèi)。調(diào)制(改變)脈沖寬度將改變你的電機輸出。
不同的伺服器有不同的方式來解釋這些數(shù)據(jù),今天我們將看兩個使用SG90(位置伺服)和MG995(連續(xù)伺服)的例子。
與PSOC?6的一般通信
連接板和使用thony IDE
我們將使用ony IDE來運行代碼。要連接到微控制器并使用MicroPython,請創(chuàng)建一個新文件,并按Tools > Options > Interpreter。在那里,將解釋器設(shè)置為MicroPython(通用),端口設(shè)置為KitProg3 USB-UART @您的COM端口(在本例中為COM4)。
設(shè)置引腳和PWM
首先,您需要從機器庫中導(dǎo)入PWM庫。然后,通過聲明引腳(本例中為引腳9.7)、設(shè)置PWM頻率并初始化脈沖寬度,將引腳設(shè)置為PWM引腳。starting_pw將在后面根據(jù)我們使用的電機來定義。
提示:設(shè)置脈沖寬度
有許多不同的方法來設(shè)置脈沖寬度,例如:使用PWM庫中定義的兩個函數(shù)。如上所示,第一個使用duty_ns()函數(shù)以納秒為單位設(shè)置脈沖寬度。第二個是通過使用duty_u16()函數(shù)發(fā)送一個無符號16位整數(shù)來設(shè)置它。這表示占空比(電流脈沖寬度與周期的比率),其值范圍從周期的0%(0位)到周期T的100%(2^16 = 65,536位)。
查看更多關(guān)于PWM控制與PSOC?6 Wi-Fi BT原型工具包在這里!
例1:位置馬達(dá)
一般
定位電機以脈沖寬度作為輸入,并將其映射到一定角度,如下圖所示:
參數(shù)
我們的電機有這些參數(shù):
?Angle_max = 180°
?Angle_min = 0°
?頻率= 50hz;周期= 20ms
?Pw_min = 0.5 ms:我們的最小脈沖寬度為0.5 ms或500000 ns,這將使我們的電機設(shè)置為最小角度。
?Pw_max = 2.5 ms:我們的最大脈沖寬度為2.5 ms或2500000 ns,這將設(shè)置我們的電機到我們的最大角度。
代碼
我們的目標(biāo)是創(chuàng)建一個名為set_motor_to_angle()的函數(shù),該函數(shù)將所需的角度作為輸入,將其轉(zhuǎn)換為脈沖寬度,并將其發(fā)送給電機。為了做到這一點,我們將定義一個輔助函數(shù)angle_to_ns()來完成所有的脈沖寬度計算。
例2:連續(xù)電機
一般
連續(xù)電機將脈沖寬度映射到電機的速度,如下圖所示:
參數(shù)
這里使用的電機有以下參數(shù):
?Pw_min = 1ms:順時針方向全速旋轉(zhuǎn)(正轉(zhuǎn)速)。
?Pw_max = 2ms:表示逆時針全速旋轉(zhuǎn)(負(fù)速度)。
?gradient = -777846 ns/Hz:表示脈沖寬度/轉(zhuǎn)速的比值。我們將在函數(shù)中使用它來映射旋轉(zhuǎn)速度到脈沖寬度。你可以從數(shù)據(jù)表中得到這個數(shù)字,也可以自己計算出來。
?pw_stationary = (pw_max-pw_min)/2 + pw_min = 1.5 ms:這是電機速度為0 Hz時的脈沖寬度值(當(dāng)它靜止時)。我們需要這個(或圖上的任何其他點),因為一個線性函數(shù)需要一個梯度和一個點來完全定義。
計算梯度
我們的第一個假設(shè)是我們的速度脈寬比近似線性,這大大簡化了我們的計算。為了重建圖形,我們需要測量一些數(shù)據(jù)點并使用它們計算梯度。實際的函數(shù)將以a*x + b的格式使用梯度(a)和圖上的一個點(b)。
提示:測量轉(zhuǎn)速
這可以通過將電機設(shè)置為一定的脈沖寬度并用手機相機拍攝來完成。把它放在某個東西旁邊,幫助跟蹤它的運動,讓它旋轉(zhuǎn)10-20次,以盡量減少錯誤,提高精度。然后一幀一幀地回放鏡頭,看看所有這些回合花了多長時間,并計算:(回合數(shù))/(時間)來獲得每秒的旋轉(zhuǎn)。
代碼
我們的目標(biāo)是創(chuàng)建一個名為set_motor_to_speed()的函數(shù),它將我們期望的速度作為輸入,將其轉(zhuǎn)換為脈沖寬度,并將其發(fā)送給電機。為了做到這一點,我們將定義一個輔助函數(shù)speed_to_ns()來完成所有的脈沖寬度計算。
本文編譯自hackster.io





