2022年8月23日 星期二

直流電機與 NodeMCU 的接口

 

介紹

直流電機

直流電機

直流電機將直流電形式的電能轉換為電機軸旋轉運動形式的機械能。

直流電機的速度可以通過施加不同的直流電壓來控制;而電機的旋轉方向可以通過反轉通過它的電流方向來改變。

為了施加變化的電壓,我們可以利用 PWM 技術。為了反轉電流,我們可以使用 H 橋電路或採用 H 橋技術的電機驅動器 IC。

有關直流電機及其使用方法、H 橋電路配置和 PWM 技術的更多信息,請參閱傳感器和模塊部分中的直流電機主題。

基於 NodeMCU 的 ESP8266 可用於控制直流電機的速度和旋轉方向。NodeMCU 在其 GPIO 引腳上具有 PWM 功能,我們可以使用它來控制直流電機。

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

接口圖

NodeMCU 直流電機接口

NodeMCU 通過 L293D 驅動器與直流電機接口

 

例子

讓我們使用 NodeMCU 套件控制直流電機的速度和旋轉方向。

在這裡,電位器用作速度控制的手段,而來自觸覺開關的輸入用於改變電機的方向。

我們可以利用 NodeMCU 的 ADC 功能來讀取電位器。我們可以利用 NodeMCU 的 GPIO 中斷功能來讀取開關狀態。

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

要了解 NodeMCU GPIO 中斷,請參閱 使用 Arduino IDE的 NodeMCU GPIO 中斷或使用 ESPlorer IDE 的 NodeMCU GPIO 中斷

L293D電機驅動IC用於控制電機的方向。NodeMCU 上產生的 PWM 波通過 L293D 為電機提供可變電壓。

我們可以使用 ESPlorer IDE(帶有 Lua 腳本)以及使用 Arduino IDE(帶有 Arduino 草圖)向 NodeMCU 編寫程序

要了解更多關於如何使用 ESPlorer IDE 開始使用 NodeMCU,請參閱 使用 ESPlorer IDE 開始使用 NodeMCU有關如何開始使用帶有 Arduino IDE 的 NodeMCU 的更多信息,請參閱 使用 Arduino IDE 開始使用 NodeMCU

直流電機的 Lua 腳本

PWM_Pin = 5        --set pins for control
DirectionPin1 = 6
DirectionPin2 = 7
DirectionControlPin = 8

timer_id = 1
delay_ms = 200

PWMfrequency = 1000 -- Set PWM frequency
PWMDutyCycle = 512  -- Set PWM duty cycle in between 0-1023

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

gpio.mode(DirectionPin1,gpio.OUTPUT)--set direction control pins as output pins
gpio.mode(DirectionPin2,gpio.OUTPUT)
gpio.mode(DirectionControlPin,gpio.INT,gpio.PULLUP)-- Set GPIO interrupt mode for pin 

DirectionPinValue1 = gpio.LOW   -- write direction control pin initial states
DirectionPinValue2 = gpio.HIGH
gpio.write(DirectionPin1,DirectionPinValue1)
gpio.write(DirectionPin2,DirectionPinValue2)

function interrupt(level, stamp)-- callback function while interrupt
    gpio.trig(DirectionControlPin) -- disable interrupt for that pin

    if (DirectionPinValue1 == gpio.HIGH) then
        DirectionPinValue1 = gpio.LOW
        gpio.write(DirectionPin1,DirectionPinValue1)
    else
        DirectionPinValue1 = gpio.HIGH
        gpio.write(DirectionPin1,DirectionPinValue1)
    end
    if (DirectionPinValue2 == gpio.HIGH) then
        DirectionPinValue2 = gpio.LOW
        gpio.write(DirectionPin2,DirectionPinValue2)
    else
        DirectionPinValue2 = gpio.HIGH
        gpio.write(DirectionPin2,DirectionPinValue2)
    end

    tmr.delay(700000)    -- wait 700 ms
    print('Rotational Direction changed..!')--print direction change msg

    gpio.trig(DirectionControlPin,"high",interrupt)--re-enable interrupt on pin while exit
end

gpio.trig(DirectionControlPin,"high",interrupt)-- set interrupt type high i.e. High level

function POT_Control()
    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
    pwm.setduty(PWM_Pin, POT_read)-- set PWM duty cycle to DC motor
    print('Speed (%):',math.floor(100*POT_read/1023))-- print speed of DC motor
end

tmr.alarm(timer_id,delay_ms,tmr.ALARM_AUTO,function() POT_Control() end)--start alarm function to PWM duty cycle control

直流電機的 Arduino 草圖

bool d1 = HIGH;
bool d2 = LOW;

void motor_direction(){
 d1 = !d1;
 d2 = !d2;
 for(inti = 0; i<10000; i++)
  for(int j =0; j<10000; j++);
}

void setup() {
 Serial.begin(9600);
 pinMode(D5, OUTPUT);  /* PWM pin for Speed Control */
 pinMode(D6, OUTPUT);  /* Motor control pin 1 */
 pinMode(D7, OUTPUT);  /* Motor control pin 2 */
 pinMode(D8, INPUT_PULLUP);  /* Interrupt pin for direction control */
 attachInterrupt(D8, motor_direction, HIGH);	
 /* call motor direction function on HIGH level at pin 8 */
}

void loop() {
 intpwm_adc;
 pwm_adc = analogRead(A0); /* Input from Potentiometer for speed control */
 digitalWrite(D6,d1);
 digitalWrite(D7,d2);
 analogWrite(D5,pwm_adc);
 delay(100);
}

 

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

沒有留言: