1. 問(wèn)題的提出
在設(shè)計(jì)機(jī)器人結(jié)構(gòu)時(shí),我們常常會(huì)用到舵機(jī),作為旭日x3派“首百?lài)L鮮”活動(dòng)的試用者,本次實(shí)驗(yàn)我準(zhǔn)備用旭日x3派控制一臺(tái)舵機(jī),為了方便讀者了解實(shí)驗(yàn)的設(shè)計(jì)意圖,下面先提出幾個(gè)基本問(wèn)題以供討論:
(1)什么是舵機(jī)?舵機(jī)是一種能夠按照指定角度轉(zhuǎn)動(dòng)的電動(dòng)執(zhí)行器。
(2)舵機(jī)的結(jié)構(gòu)?舵機(jī)一般由馬達(dá)、減速齒輪組、電位器和控制電路組成。
(3)怎樣控制舵機(jī)動(dòng)作?給舵機(jī)提供一個(gè)特定的PWM信號(hào),舵機(jī)就可以旋轉(zhuǎn)到指定的位置。
(4)怎樣用旭日x3派遠(yuǎn)程控制一臺(tái)舵機(jī)?旭日x3派本身有兩個(gè)PWM脈沖信號(hào)端口(32、33),受限于供電電流,一般不建議直接控制舵機(jī),所以我們需要借助MCU驅(qū)動(dòng)舵機(jī)運(yùn)動(dòng),而旭日派的任務(wù)就是給MCU發(fā)送指令,通常我們想到的就是通過(guò)串口(旭日派UART3的14、15端口)發(fā)送指令,僅僅為了串口硬線(xiàn)連接而把旭日派與MCU“綁定”到一起,倒不如通過(guò)無(wú)線(xiàn)串口通訊方便實(shí)用,所以本文準(zhǔn)備探索通過(guò)無(wú)線(xiàn)串口通信控制一臺(tái)舵機(jī)。
(5)有沒(méi)有具體方案?如果采用普通舵機(jī),還要考慮MCU的編程,為了簡(jiǎn)化起見(jiàn),采用UART串行總線(xiàn)舵機(jī),只需要向舵機(jī)控制板發(fā)送指令,舵機(jī)就會(huì)按照指定角度旋轉(zhuǎn),這樣就大大簡(jiǎn)化了編程。對(duì)于無(wú)線(xiàn)串口部分,我們采用無(wú)線(xiàn)發(fā)送接收模塊實(shí)現(xiàn)。
2. 總體方案
具體方案如下圖所示,筆記本電腦通過(guò)wifi(SSH無(wú)線(xiàn)網(wǎng)絡(luò)ip地址)連接并登陸旭日x3派,實(shí)現(xiàn)筆記本端到旭日派端的無(wú)線(xiàn)連接,旭日x3派與串口控制板采用無(wú)線(xiàn)串口收發(fā)器,實(shí)現(xiàn)旭日派與MCU控制板之間無(wú)線(xiàn)傳遞“信息”。
3. 控制編程
下面借鑒了官方python例程,并做了修改:
#!/usr/bin/env python3# coding = utf-8import sysimport osimport timeimport serialimport serial.tools.list_portsdef serialTest(): print("List of enabled UART:") os.system('ls /dev/tty[a-zA-Z]*') uart_dev= '/dev/ttyS3' #定義串口端口 baudrate = 115200 #波特率 val = 1500 #舵機(jī)初始位置(0位) incr = 100 #舵機(jī)轉(zhuǎn)位遞增(減)步長(zhǎng) try: ser = serial.Serial(uart_dev, int(baudrate), timeout=1) # 1s timeout except Exception as e: print("open serial failed!\n") print(ser) print("Starting demo now! Press CTRL+C to exit") while True: #舵機(jī)一秒轉(zhuǎn)位一次,到達(dá)限位后反轉(zhuǎn),往復(fù)轉(zhuǎn)動(dòng) if val >= 2500: #高限位 incr = -incr if val <= 0: #低限位 incr = -incr val += incr val1 = str(val) #轉(zhuǎn)換成字符串 if val <= 1000: test_data = '#000P'+'0'+val1+'T1000!' #當(dāng)val<1000時(shí),前位自動(dòng)補(bǔ)0,即:若val=500,則字符串為“0500”,實(shí)際發(fā)送字符串為:#000P0500T1000! else: test_data = '#000P'+val1+'T1000!' write_num = ser.write(test_data.encode('UTF-8')) #發(fā)送到串口 print(test_data) time.sleep(1) ser.close() return 0if __name__ == '__main__': if serialTest() != 0: print("Serial test failed!") else: print("Serial test success!")
4. 運(yùn)行效果
在筆記本端運(yùn)行MobaXterm,運(yùn)行python程序,效果如圖所示:
5. 挖坑時(shí)間
請(qǐng)旭友們幫幫忙,我的這篇文章里有一處錯(cuò)誤和一處疑惑,幫我解答一下唄!
(1)電機(jī)轉(zhuǎn)動(dòng)到某個(gè)限位時(shí),會(huì)停幾秒,為什么?代碼有哪里需要改進(jìn)?
(2)筆記本不需要用串口線(xiàn)連接旭日x3派,開(kāi)機(jī)直接用充電寶給旭日派插電,Ubuntu要做什么設(shè)置,MobaXterm又要采用什么連接方式?
本文轉(zhuǎn)自地平線(xiàn)開(kāi)發(fā)者社區(qū)原作者:David988
原鏈接:https://developer.horizon.ai/forumDetail/106482341031035906
-
單片機(jī)
+關(guān)注
關(guān)注
6042文章
44617瀏覽量
637575
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論