iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

ESP32 Micropython 從入門到實用系列 第 27

27.連接馬達與測試整合控制程式

  • 分享至 

  • xImage
  •  

今天我們會把風扇組裝起來,並且在上面執行一套完整的 具紅外線遙控功能的 電風扇。

由於紅外線接收模組需要拉到外面來,所以我們找到一個帶紅外線遙控接收 的四節 7 段顯示器,此顯示器模組詳細的控制功能,您可以參考這篇:从零开始打造基于MicroPython的电子时钟(3)

由於此顯示目前的驅動程式採用 I2C 方式,但在選擇過高的 I2C clock 會造成顯示不穩定,因此我們選擇在 10K。

我們以第四種馬達爲例來組裝,此馬達拉出五條電線:

  • 紅色: 接 12-24V 電壓,在這裡,我們可以接一個保護二極體,因此,縱使不小心電源正負極接反,再也不怕燒馬達了,這對於我們 DIY 會有很大的幫助。
  • 黑色:接電源的 負極。
  • 白色:由於此馬達內部的控制電路是 5V 的,而且需要外部供應,因此,將此線接到控制小板的 5V 電壓輸出。
  • 綠色:調速控制信號,接到控制小板的調速信號,需注意的是此馬達爲調頻率控制轉速,程式設定在 50Hz ~ 400Hz。
  • 黃色:剎車信號,輸入一個 5V,馬達會剎車,可能應用到的場景是:偵測電扇傾倒了(可使用加速度感測器量測),避免危險,馬達剎車。目前我們沒有用到剎車功能,因此將此腳位拉低(接 10K 電阻後接地),以避免誤動作。

控制小板的接線:
上邊綠色端子排:

  • 右邊 + - : 接燒 DC 插座,外接電壓我們推薦使用廢棄的 19V 筆記型電腦電源即可,注意座子的中心爲正極,外圍爲負極。
  • 左邊 + -:接馬達正(紅線)負(黑線)極。
  • V : 爲控制小板的 +5V 輸出,需要接到馬達白色線,以及 ESP32-S3 開發板的 5V 端(開發板放在電扇接線盒內,無 USB 可接)

下邊藍色端子排:

  • I:接擺頭馬達的正極(紅色)
  • O:接擺頭馬達的負極(黑色)
  • S:接 ESP32-S3 擺頭馬達控制 GPIO
  • B:接 ESP32-S3 蜂鳴器控制 GPIO, 注意蜂鳴器的類型:有源或是無源
  • P:接 ESP32-S3 調速控制 GPIO 與 風扇馬達綠色調速線
  • T -:接 10K 旋鈕可變電阻,T 再接到 ESP32-S3 ADC 輸入

測試接線如下:

整合好的控制程式如下:

from machine import Timer, Pin, I2C
import FourDigitDisplay as FDD
import time
from micropython import const
from ir_rx.nec import NEC_8  # NEC remote, 8 bit addresses

IR = Pin(2, Pin.IN)
buzz = Pin(12, Pin.OUT, value=0)
speed_ctl = Pin(13, Pin.OUT)
swing = Pin(15, Pin.OUT, value=0)

# IR code
ADDR = const(0)
PWR_ON = const(0x43)
SPD_UP = const(0x47)
SPD_DN = const(0x45)
SWING = const(0x46)
TMR_UP = const(0x15)
TMR_DN = const(0x7)

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=10000)
fdd = FDD.FourDigitDisplay(i2c)
i2c.scan()
fdd.clear()

ir_code_old = 0
ir_code_new = 0

speed = 0 # Hz
fan_on = False
swing_on = False
t0 = Timer(-1) # software timer

def toogle_speed(t):
    speed_ctl.value(not speed_ctl.value())

def change_speed(speed):
    global t0
    global fdd
    t0.init(freq=speed*2*50, mode=Timer.PERIODIC, callback=toogle_speed)
    fdd.showbit(int(speed),3)

def beep():
    buzz.value(1)
    time.sleep_ms(100)
    buzz.value(0)
    
def ir_cb(data, addr, ctrl):
    global ir_code_new
    global ir_code_old
    global ADDR
    if data < 0:  # NEC protocol sends repeat codes.
        print('Repeat code.')
    else:
        print('Data {:02x} Addr {:04x}'.format(data, addr))
        if (addr == ADDR):
            ir_code_new = data
            ir_code_old = 0

ir = NEC_8(IR, ir_cb)

# power on beep()
beep()
beep()
beep()
beep()

while True:
    #time.sleep_ms(1)
    if (ir_code_new == ir_code_old):
        continue
    print('Cheking...')
    beep()
    ir_code_old = ir_code_new
    if (ir_code_new == PWR_ON):
        if (fan_on == True):
            speed = 0
            fan_on = False
            swing_on = False
            swing.value(swing_on)
            change_speed(speed)
            fdd.clear()
            beep()
            time.sleep_ms(200)
            beep()
            print('Off')
        else:
            fan_on = True
            speed = 1
            change_speed(speed)
            print('On')
            continue
    
    if (fan_on == True):
        if (ir_code_new == SPD_UP): # increase speed
            speed += 1
            if (speed > 8): speed = 8
            change_speed(speed)
        elif (ir_code_new == SPD_DN): #decrease speed
            speed -= 1
            if (speed < 0): speed = 0
            change_speed(speed)
        elif (ir_code_new == SWING): #swing
            swing_on = not swing_on
            swing.value(swing_on)
            
    print('Done...')
            

測試完成之後,組裝風扇,就可以開始使用了!


上一篇
26.DC變頻風扇控制電路板
下一篇
28. 使用MQTT
系列文
ESP32 Micropython 從入門到實用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fuhu
iT邦新手 5 級 ‧ 2023-10-13 19:42:34

本篇還缺幾個圖片,未來會再修飾與補上。

我要留言

立即登入留言