| ESP32 教學 | MicroPython | PWM Control | 202 |

ESP32 的 PWM 腳位是可以指定到 Output 的腳位,用法也相當簡單,可以操作的頻率從 1Hz 到 40Mhz,範圍相當大,今天就來與分享 PWM Control 使用上需注意的地方與 SG90 角度控制實際範例。

1. PWM Control

PWM 類別一樣放在 machine 模組內,但因為需指定哪支 Pin 腳,所以需要import PWM 和 Pin,下面為快速初始化的範例:

from machine import Pin, PWM
pwm16= PWM(Pin(16))
pwm17= PWM(Pin(17),freq=1000,duty=512)

兩種方法都可以,純粹看需不需要使用 PWM 時就同時開始啟動,此外這個 PWM 物件還有3個方法可以操作:

  • pwm16.freq(1000):指定 pwm 的基本頻率,如果括號內不填值可以取得目前 pwm 腳位的頻率也就是 pwm16.freq()。(pwm16 是一開始建立的物件名稱)
  • pwm16.duty(512):指定 pwm 的 duty cycle,duty 內的值可以填入 0-1023,也就是代表 0-100%,如果想要 duty 為 30% 時,就是填入1024×0.3=307 就可以啦!那如果要取得目前的 duty 值就可以直接pwm16.duty()就會回傳目前的duty值。(pwm16 是一開始建立的物件名稱
  • pwm16.deinit():這個方法就是把 pwm 功能關掉,如果在 pwm 的操作結束後,可以放入這個方法,避免該隻腳位為仍然有波型輸出,導致誤動作發生。

以上就是ESP32 pwm的基本用法,如果對於pwm(Pulse Width Modulation) 這項技術不是很瞭解的朋友,可以參考JIMI哥之前寫的這篇RGB LED的前幾個小節內容應該就會有基礎的認識啦!那pwm控制可以用來哪裡呢?馬達的電壓控制、led的亮度控制、伺服馬達的角度控制等,今天我們就用常用的SG90伺服馬達來進行應用吧!

2. SG90 伺服馬達

SG90 這顆馬達在 DIY 創客間非常普遍,在拍賣價格多落在幾十塊做左右,通常可以帶買到兩種形式的,0-180 度跟 360 度,適合做角度控制是 180 度的那顆,同時也是可以接收 PWM 訊號進行動作,我們先來看一下這顆 SG90的規格:

  • Weight: 9g
  • Dimension: 23×12.2x29mm
  • Stall torque: 1.8kg/cm(4.8v)
  • Gear type: POM gear set
  • Operating speed: 0.1sec/60degree(4.8v)
  • Operating voltage: 4.8v
  • Temperature range: 0℃_ 55℃
  • Dead band width: 1us
  • Power Supply: Through External Adapter
  • servo wire length: 25 cm
  • Servo Plug: JR (Fits JR and Futaba)

我們需要注意的就是操作電壓 (Operating Voltage) 跟 『dead band width』這兩個參數,這顆的操作電壓規格設定在 4.8V,也就是我們需要讓連接到 5V 左右,另一個參數的意思是當伺服機接受指令時,不同的命令兩個必須大於 1us,不然內部控制器是忽略控制命令。

在來我們來看這顆可以接受的 PWM 控制命令形式。

pwm control
pwm control

由上圖可以得知,SG90 的控制命令的 PWM Period 要設定為 50Hz,Duty 需為500us-2400us 之間,轉換成角度就是 0-180 度之間,透過數學轉換可以得知要轉動一度,控制命令約需要增加10.55us ( 1900us/180 )左右的時間,後續我們可以透過 python 程式碼將此數學式進行轉換。

3. 電路連接

SG90 的電路接法很簡單,紅色為電源 5V,棕色為 GND,橘色為可以接收 PWM 訊號的腳位,下圖為實際電路的接法:(ESP32 USB 端插入電腦即可)

4. 程式功能

這支程式的目的就是利用 PWM 訊號控制 SG90 馬達分別在 0度、90度、180度停止 1 秒,並來回循環。

from machine import Pin,PWM
import time
sg_pin=PWM(Pin(14),freq=50,duty=0)  #duty range 0-1023
d_90=(int)(1023*0.0725) #1.45ms
d_zero=(int)(1023*0.025) #0.5ms
d_180=(int)(1023*0.12)  #2.4ms
de_map=[d_90,d_zero,d_90,d_180]
try:
    while 1:
        for i in de_map:
            sg_pin.duty(i)
            time.sleep(1)
except Exception as e:
    print(e)
    sg_pin.deinit()

> 程式解說

from machine import Pin,PWM
import time
sg_pin=PWM(Pin(14),freq=50,duty=0)  #duty range 0-1023

此部分為 import 需要的 Pin, PWM 類別,由於還需要用到 delay 功能,所以增加time Module。同時指定GPIO14 為 PWM 輸出腳位,PWM 的基本週期為 50Hz,Duty 初始值為0,該腳位先關閉,等需要用時再開啟 PWM。

d_90=(int)(1024*0.0725) #1.45ms
d_zero=(int)(1024*0.025) #0.5ms
d_180=(int)(1024*0.12)  #2.4ms

由於我們要控制在0 度、90度與180度,所需的 HIGH 時間分別為 0.5ms、1.45ms、2.4ms(可以參考 SG90 的控制時序圖),而完整 PWM 週期為 20ms,所以 Duty 就為 2.5%、7.25%、12%,並 x1024 後可以轉換成 PWM Duty填入的數值。

de_map=[d_90,d_zero,d_90,d_180]
try:
    while 1:
        for i in de_map:
            sg_pin.duty(i)
            time.sleep(1)
except Exception as e:
    print(e)
    sg_pin.deinit()

將各個角度建立一個循環 List,讓 SG90 可已呈現置中、左轉、置中、右轉的狀態,透過 Loop 迴圈實現功能,try-except 則是預留中斷程式的機制。

5. 結語

PWM 技術應用的範圍相當廣泛,今天這篇是只是一個簡單 servo 位置控制,不過相信各位朋熟悉後,也可以使用在像 RGB LED 呼吸燈類的產品,原理都是相同的,日後 JIMI哥會再補充一些相關的範例的,就請大家耐心等待吧!

↓↓↓↓↓↓賣場連結↓↓↓↓↓↓

歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀 

吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw

Follow JIMI哥 Twitter : https://twitter.com/jimirobot  <–得到最新文章通知

發佈留言

Close Menu