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





