大家可以用Google瀏覽器頁面翻譯瀏覽NodeMCU官方API來獲取最新的API
一、PWM模塊
在我的項(xiàng)目開發(fā)中我用到了PWM模塊來操作SG90舵機(jī),我來分享一下我的經(jīng)驗(yàn)。
- PWM的函數(shù)
| 序號 | 函數(shù)名 | 參數(shù) | 返回值 | 作用 |
|---|---|---|---|---|
| 1 | pwm.close() | pin | nil | 退出指定GPIO引腳的PWM模式 |
| 2 | pwm.getclock() | pin | number | 獲取引腳的選定PWM頻率 |
| 3 | pwm.getduty() | pin | number | 獲取引腳的選定占空比 |
| 4 | pwm.setclock() | pin, clock | nil | 設(shè)置PWM頻率 |
| 5 | pwm.setduty() | pin, duty | nil | 設(shè)置引腳的占空比 |
| 6 | pwm.setup() | pin, clock, duty | nil | 將引腳設(shè)置為PWM模式 |
| 7 | pwm.start() | pin | nil | PWM啟動,波形應(yīng)用于GPIO引腳 |
| 8 | pwm.stop() | pin | nil | 暫停PWM波形的輸出 |
注:
pwm的頻率范圍1~1000
pwm的占空比范圍0~1024
-
SG90介紹
舵機(jī)的控制一般需要一個(gè)20ms左右的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內(nèi)的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
0.5ms------------0度;1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
計(jì)算
如果要使用PWM就必須計(jì)算出頻率和占空比
頻率:以SG90為例,它的時(shí)基脈沖為20ms也就是周期為20ms,則頻率=周期的倒數(shù)為50HZ,也就是1秒鐘內(nèi)可以轉(zhuǎn)動50次。注意SG90 脈沖周期為20毫秒(millisecond) 不是20微秒(Microsecond),兩者差1000倍呢!
-
占空比:以SG90為例,占空比的計(jì)算方法為=脈寬/周期,由此可以得出
0.5ms------------0度---------------2.5%;1.0ms------------45度--------------5%;
1.5ms------------90度--------------7.5%;
2.0ms-----------135度--------------10%;
2.5ms-----------180度--------------12.5%;
- 實(shí)踐
實(shí)際上在操作中我們最常用到的函數(shù)為
pwm.setup(pin, clock, duty)--------------初始化pwm
pwm.start(pin)---------------------------啟動pwm
pwm.close(pin)--------------------------退出pwm
pwm.stop(pin)---------------------------暫停pwm
pwm.setclock(pin,clock)-----------------設(shè)置pwm的頻率1~1000
pwm.setduty(pin,duty)-------------------設(shè)置pwmd占空比0~1024
廢話不多說,上代碼
pin = 1 --輸出引腳
pwm.setup(pin,50,77) --初始化引腳為50HZ,占空比為77=1024*7.5為90度
pwm.start(pin)
tmr.delay(1000000) --延時(shí)1秒
pwm.setduty(pin,52) --重新設(shè)置占空比為52=1024*5%為45度
tmr.delay(1000000)
pwm.setduty(pin,77) --返回初始化狀態(tài)
pwm.stop(pin) --停止PWM
- 番外-呼吸燈程序
例子:呼吸燈
pin = 4
pwm.setup(pin,500,512)--初始化頻率為500,占空比為512
pwm.start(pin)--啟動pwm輸出
while true do
for var=0,1023,1 do
pwm.setduty(pin, var)--調(diào)整占空比
tmr.delay(1000)
tmr.wdclr()--喂狗
end
for var=1023,0,-1 do
pwm.setduty(pin, var)
tmr.delay(1000)
tmr.wdclr()
end
end
注:
SG90有兩個(gè)角度選擇,一個(gè)是360度一個(gè)是180度,如果要控制角度就選擇180度的舵機(jī),如果要控制速度就選擇360度的舵機(jī)
二、encoder模塊
這個(gè)模塊應(yīng)該很不起眼,但是在我的項(xiàng)目開發(fā)中我非常需要它。我在使用nodemcu串口時(shí)發(fā)現(xiàn),我別的模塊向nodemcu發(fā)送hex數(shù)據(jù)時(shí),nodemcu顯示為亂碼,這應(yīng)該就是nodemcu串口不支持讀取hex數(shù)據(jù),所以我們需要將讀取到的文件轉(zhuǎn)換成hex在進(jìn)行輸出就可以了,現(xiàn)在我們先來看看encoder里都有什么函數(shù)。
| 序號 | 函數(shù)名 | 參數(shù) | 返回值 | 作用 |
|---|---|---|---|---|
| 1 | encoder.toBase64() | binarystr | Base64str | 提供(二進(jìn)制)Lua字符串的Base64表示。 |
| 2 | encoder.fromBase64() | b64str | binarystr | 將(二進(jìn)制)Lua字符串的Base64表示形式解碼回原始字符串。 |
| 3 | encoder.toHex() | binarystr | hexstr | 提供(二進(jìn)制)Lua字符串的ASCII十六進(jìn)制表示。 |
| 4 | encoder.fromHex() | hexstr | Decodedstr | 返回ASCII十六進(jìn)制字符串的Lua二進(jìn)制字符串解碼。 |
注:
encoder函數(shù)的參數(shù)和返回值都為字符串?。?!,例子比較簡單就不寫出來了,可以點(diǎn)開對應(yīng)的函數(shù)進(jìn)行學(xué)習(xí)。
三、Timer模塊
由于tmr模塊中alarm發(fā)送改變,所以我這里寫出最新的使用方法。alarm使用方法官方API
- 句法
tobj:alarm(interval_ms, mode, func()) - 參數(shù)
-
interval_ms計(jì)時(shí)器間隔,以毫秒為單位。最大值為6870947(1:54:30.947)。 -
mode定時(shí)器模式:-
tmr.ALARM_SINGLE一次性報(bào)警(無需撥打電話unregister()) -
tmr.ALARM_SEMI手動重復(fù)報(bào)警(調(diào)用start()重啟) -
tmr.ALARM_AUTO自動重復(fù)報(bào)警
-
-
func(timer)使用timer對象作為參數(shù)調(diào)用的回調(diào)函數(shù)
-
- 返回值
true如果計(jì)時(shí)器啟動,false則出錯(cuò) - 例子
if not tmr.create():alarm(5000, tmr.ALARM_SINGLE, function()
print("hey there")
end)
then
print("whoopsie")
end
四、小貼士
- 直接使用init.lua寫代碼時(shí)若出現(xiàn)死循環(huán)或者無法進(jìn)行操作時(shí)可以重新燒入固件(缺少代碼中所用到的模塊)就可以進(jìn)行操作了。