2022年8月23日 星期二

伺服電機與 NodeMCU 的接口

 

介紹

伺服電機

伺服電機

伺服電機是一種用於精確控制角旋轉的電動裝置。它用於需要精確控制運動的應用中,例如控制機械臂的情況。

伺服電機的旋轉角度是通過向其施加 PWM 信號來控制的。

通過改變 PWM 信號的寬度,我們可以改變電機的旋轉角度和方向。多采用 50Hz PWM 來控制伺服電機的軸位。

有關伺服電機及其使用方法的更多信息,請參閱傳感器和模塊部分中的伺服電機主題。

基於 NodeMCU 的 ESP8266 可用於控制伺服電機。NodeMCU 的 GPIO 上有一個 PWM 功能,我們可以使用它來控制伺服電機。

要了解 NodeMCU PWM,請參閱 帶有 Arduino IDE的 NodeMCU PWM或帶有 ESPlorer IDE 的 NodeMCU PWM

接口圖

NodeMCU 伺服電機接口

連接伺服電機與 NodeMCU

 

例子

使用電位計控制伺服電機的位置。

此處,電位計用作伺服電機的軸位置控制裝置。我們可以利用 NodeMCU 的 ADC 功能來讀取電位器。

要了解 NodeMCU ADC,請參閱 帶有 Arduino IDE的 NodeMCU ADC或帶有 ESPlorer IDE 的 NodeMCU ADC

對於伺服電機,我們在 NodeMCU 的 D2 引腳上創建了一個 50Hz 的 PWM 信號。要將伺服電機的軸位置控制在 180 度以內,需要將其 PWM 佔空比控制在 5% 到 10% 之間。我們得到了一些 PWM 佔空比的實用值,這些佔空比從 2.5% 到 10.75% 不等,以將伺服電機的軸位置控制在 180 度以內。

我們可以用 Lua 腳本或 C/C++ 語言為 NodeMCU DevKit 編寫代碼。我們使用 ESPlorer IDE 用 Lua 腳本編寫代碼,使用 Arduino IDE 用 C/C++ 編寫代碼。要了解更多信息,請參閱 使用 ESPlorer IDE 開始使用 NodeMCU(對 NodeMCU 使用 Lua 腳本)和使用 Arduino IDE 開始使用 NodeMCU(對 NodeMCU 使用基於 C/C++ 語言的 Arduino 草圖)。

用於伺服的 Arduino 草圖

uint8_t ServoMotorpin = D2;

void setup(){
 analogWrite(ServoMotorpin, 512);
 analogWriteFreq(50);  /* Set PWM frequency to 50Hz */
}
void loop(){
 uint16_t dutycycle=  analogRead(A0); /* Read potentiometer to control servo motor */
 if(dutycycle> 1023) dutycycle = 1023;
 dutycycle = 25+((85*dutycycle/1023)); /* make it in range 20 to 110 */
 analogWrite(ServoMotorpin, dutycycle);  /* Write duty cycle to pin */
 delay(100);
}

 

此外,伺服電機庫隨帶有 ESP8266 封裝的 Arduino IDE 一起提供。要打開 Servo 示例,請轉到 File -> Examples -> Servo(esp8266) -> Sweep,如下圖所示。

 

ESP8266伺服電機示例

 

根據示例草圖中的應用更改伺服銷。

伺服電機的 Lua 腳本

ServoControlPin = 2
PWMfrequency = 50 -- Set PWM frequency
PWMDutyCycle = 512  -- Set PWM duty cycle in between 0-1023

pwm.setup(ServoControlPin, PWMfrequency, PWMDutyCycle)-- Setup PWM
pwm.start(ServoControlPin)   -- Start PWM on control pin

while true do
POT_read = adc.read(0) -- Read pot using ADC
    if POT_read> 1023 then-- Limit PWM to max of duty cycle
POT_read = 1023
    end
POT_read = 25+((85*POT_read/1023))--make it in range 20 to 110
    --we got practical range in 0.5% to 2.15% of 50Hz PWM
pwm.setduty(ServoControlPin, POT_read)-- set PWM duty cycle
tmr.delay(10000)
end

 

資料來源:https://www.electronicwings.com/nodemcu/servo-motor-interfacing-with-nodemcu

沒有留言: