MQTT&node-RED控制二軸云台-mpython


MQTT&node-RED控制二軸云台-mpython

承接使用PWM控制伺服馬達-micropython這篇,透過node-red加入mqtt訂閱主題控制二軸云台

有一些感想紀錄下來,我發現其實像mqtt或者wifi連網,大都是固定一個寫法,其它不同的模組分為讀取數值或用數值受控制的元件,只要套用上去就可以。

首先主要是被控制的伺服馬達,所以先把它測試一下,參考這篇(點我

測試好之後,就可以開始加入wifi和mqtt了,但因為我用的是樹莓派建立的MQTT,所以這陪分前提是要有樹苺派,如何在樹苺派上建立Node-RED和MQTT,可以參考這篇(點我)。


Node-RED設定

程式碼


from machine import SLEEP, Pin, PWM, freq
    
from time import sleep
    
from umqtttsimple import MQTTClient
    
import binascii, micropython, network, time, socket, machine
    

ssid = "------------"
    
password = "-------"
    
mqtt_server = "192.168.210.22"
    
#將客戶端ID轉換為16進位,以便MQTT伺服端讀取
    
mqtt_id = binascii.hexlify(machine.unique_id())
    

#和Nord-RED上的主題一致
    
client_servoPan = b'esp32/servoPan'
    
client_servoTilt = b'esp32/servoTilt'
    

servo_pan = PWM(Pin(13), freq=50)
    
servo_tilt = PWM(Pin(14), freq=50)
    

#wifi連線
    
def wifiConn():
    
    wifi = network.WLAN(network.STA_IF)
    
    wifi.active(True)
    
    wifi.connect(ssid, password)
    
    while wifi.isconnected() == False:
    
       pass
    
    print("Connected successful!")
    
    print("IP: {}".format(wifi.ifconfig()))
    

#樹莓派上的mqtt回應訂閱
    
# Duty 就為 2.5%、7.25%、12%,並 x1024 後可以轉換成 PWM Duty填入的數值
    
def callBack(topic, msg):
    
   ang0 = int(1023*0.025)
    
   ang90 = int(1023*0.0725)
    
   ang180 = int(1023*0.12)
    
   print((topic, msg))
    
   if topic == client_servoPan:
    
        servo_pan.duty(int(msg))
    
        sleep(0.5)
    
    elif topic == client_servoTilt:
    
        servo_tilt.duty(int(msg))
    
        sleep(0.5)
    

#連線MQTT,連線成功後訂閱主題
    
def connToMqtt():
    
    try:
    
        client = MQTTClient(mqtt_id, mqtt_server)
    
        client.set_callback(callBack)
    
        client.connect()
    
        client.subscribe(client_servoPan)
    
        client.subscribe(client_servoTilt)
    
        print("connect to %s"%mqtt_server)
    
        return client
    
        #如果無法連線重新連線
    
    except OSError as e:
    
        print("not to connected for MQTT server!")
    
        machine.reset()
    
    wifiConn()
    
    client = connToMqtt()
    
    while True:
    
        #檢查有無進來的訊息
    
        client.check_msg()

調過等待時間還是會偶爾抖動,雖然不知道抖動原在哪,先這樣好了,下次再來抓原因。


文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄