顯示具有 Servo Motor 標籤的文章。 顯示所有文章
顯示具有 Servo Motor 標籤的文章。 顯示所有文章

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