我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195
實做說明
ESP32的類比輸出較為麻煩,採用的是ledcWrite指令,一般來說沒特別需要直接使用ESP32Servo即可。以下是採用ledcWrite的SG90指令。
一、設定頻道
ledcSetup(7, 50, 8);
ESP32一共有16個類比輸出頻道(0~15),我們在這裡使用頻道7,而50則是50 Hz輸出頻率也就是1秒/50=20ms寬度,8則是解析度,代表2的8次方=256。
二、附加頻道到腳位
ledcAttachPin(2, 7);
將上述設定好的頻道7附加在GPIO 2腳位,而GPIO 2則是我們連接SG90的腳位,也就是代表後續我們只需要指定頻道7的輸出數值,就是輸出在GPIO 2上。
三、寫入數值
ledcWrite(7, 18.56);
在頻道7輸出18.56的脈衝,代表將SG90轉到90度的位置,至於18.56代表90度是如何算出的呢?
首先頻道設定為50Hz,也就是1秒/50=20ms週期,20ms週期又被分為2的8次方=256個等級,因此一個PWM單位是20/256。
另一方面SG90的脈衝為500us~2400us,也就是0.5ms~2.4ms,因此換算為PWM範圍就是0.5/(20/256)~2.4/(20/256)=6.4~30.72之間,而6.4及30.72就分別代表0及180度了,因此90度就是(6.4+30.72)/2=18.56。
以下則為SG90從0~180度的測試程式
int value=map(angle,0,180,6.4,30.72);
map是一個很方便的取比例函數,參數分別是 轉換後數值=map(數值,數值最小值,數值最大值,轉換最小時,轉換最大值)
例如90度的計算方式:map(90,0,180,6.4,30.72)得到18.56,就是ledcWrite要寫入的數值了
void setup()
{
Serial.begin(115200);
ledcSetup(7, 50, 8);
ledcAttachPin(2, 7);
}
void loop()
{
for(int angle = 0; angle <= 180; angle++)
{
int value=map(angle,0,180,6.4,30.72);
ledcWrite(7, value);
Serial.println("角度=" + String(angle) + ",value=" + String(value));
delay(70);
}
delay(1000);
}