天天看點

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

目錄标題

  • A4988 步進電機驅動子產品測試-兩相4線步進電機
    • 電機
    • stm32發脈沖的代碼
    • 常見問題總結:
    • 燒毀
      • 接線注意:
    • 代碼。參考文章
    • 連結
  • 舵機指令包
  • windows下運作步驟
  • sync_read_write
  • bulk_read_write
  • 故障
    • length does not match
    • 調試過程中查的小知識
      • list
      • setup.py
      • from . import XXX
      • Visual Studio Code快捷鍵

A4988 步進電機驅動子產品測試-兩相4線步進電機

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

使用中,把使能腳和細分腳全部接地,即不設定細分(步進值為1),複位腳和睡眠腳用跳線帽短接。

A4988功能實驗測試:

DIR=1,STEP為3.3V占空比50%,頻率為500Hz的方波,電機電壓Vmot=12V。

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

電機

接線參考下圖對應關系

A+和A-為一相

B+和B-為一相

同相之間電阻較小,非同相之間電阻無窮大,接完線可以用萬用表測量是否接錯

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障
2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障
2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障
2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障
2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

A4988的引腳圖及運用 – 八色木

https://www.basemu.com/a4988_pinout_and_how_to_use.html

stm32發脈沖的代碼

//PB15 enable  低電平有效
//PB14 dir
//PB13 pulse
void loop()
{
	int i,j,k,x=7;
	int num=1000;
	PBout(15)=0;
	PBout(14)=1;
	for(i=0;i<num;i++)
	{
		PBout(13)=1;
		Delay_ms(x);
		PBout(13)=0;
		Delay_ms(x);
	}
	GPIOBE_REV;
	Delay_ms(1000);
	PBout(14)=0;
	for(i=0;i<num;i++)
	{
		PBout(13)=1;
		Delay_ms(x);
		PBout(13)=0;
		Delay_ms(x);
	}
	GPIOBE_REV;
	Delay_ms(1000);
	PBout(15)=1;
	
//	GPIOBE_REV;
}

           

主函數:

int main(void)
{
	u8 i,j,k=0;
    RCC_Configuration();
    GPIO_Configuration();//LED+用到的GPIO
    while(1)
    {
			loop();
	}
}

           

脈沖越快電機轉動速度越快

脈沖不能發的太快,否則電機跟不上就會吱吱響但是不轉動

常見問題總結:

1、4988驅動闆可以驅動57電機嗎?

4988可以驅動的電機跟尺寸關系不大,主要與工作電流有關,理論上電流小于2A的步進電機都是可以驅動的,不論是42還是57電機。

2、可以驅動多大的電流?

如果4988晶片上沒有加散熱片,電流最好在1.2A以下。如果加散熱片,電流可以達到2A。

3、步進電機的連接配接方式是什麼?

正如4988闆子背面所辨別的,連接配接方式是依次連接配接步進電機的1B-1A-2A-2B,或者反向為2B-2A-1A-1B,或者1A-1B-2B-2A,其它的方式一次類推。如果你的電機線是标準的紅藍綠黑的顔色,可以按照顔色連接配接為:紅-藍-綠-黑,或相反:黑-綠-藍-紅。

4、如何調節相電流?

相電流的大小跟步進電機的扭力有直接關系,如果感覺你的步進電機扭力不足,可以加大4988闆子的電流配置。驅動闆是通過一個小的電位器來實作對輸出電流的配置的。可以通過用萬用表測量電位器中間管腳的電位。電位和電流的關系滿足下面的公式:Vref = A*0.8.也就是如果你想配置電機工作電流為1A,則電位應該配置在0.8V。預設的元件配置可以将電流調節到1.5A,如果需要更大電流需要修改電路中的R1,将30K的阻值改為20K(左右),就可以将電流調節到2A左右。

5、4988闆子的細分如何配置?

4988闆子細配置設定置需要ramps或其它相似闆子的短路塊來配置。ramps上對應每個4988驅動都有ms1,ms2,ms3三個短路塊來調節細分(需要取下4988闆子才可以看到),

ms1 | ms2 | ms3

no | no | no |全細分

yes | no | no |1/2(2細分)

no | yes | no | 1/4 (4細分)

yes | yes | no |1/8(8細分)

yes | yes | yes | 1/16(16細分)

6、接上電機後,電機不能正常運作,在左右抖動,是什麼原因?

電機出現抖動一般有兩個原因,

一是缺相:可能是4988闆子沒有焊接好或因為外力導緻4988的輸出端某一相斷開,造成電機缺相進而抖動。也有可能是步進電機接線隻用一相沒有連接配接好;

而是兩相接錯:如果步進電機沒有按照正确的順序進行連接配接,電機也會出現抖動的情況,請按照問題3進行正确的連接配接。

7、4988可以驅動兩相六線或兩相無線的電機嗎?

可以,兩相連線按照問題3連接配接,将中間抽頭懸空即可。

8、電機停止轉動時會有滋滋的電流聲。

首先說明的是這是正常現象。步進電機的特點是走特定的角度而不是一直轉,是以步進電機都有一個參數,步距角。如果通過細分,可以最小走 步距角/細分數的角度,比如步距角為1.8度的步進電機,采用16細分,最小可以走的角度是1.8/16=0.1125度。但由于這個角度非常小,并且不一定在電機實體所在的位置(1.8度為一個實體位置),是以步進電機停止時也需要通電,進而保證電機不會自動跳到實體步距角上。因為這個特性使得步進電機在靜止時會有電流聲,這屬于正常現象,不用擔心。

連結:https://www.jianshu.com/p/a168c20b0f65

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

燒毀

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

a4988晶片燒毀的現象:24V和GND短路,AB兩相也短路

步進電機驅動晶片a4988上電燒毀-OpenEdv-開源電子網

http://openedv.com/thread-100510-1-1.html

接線注意:

好幾根線都要接的時候

  • 盡量弄成不同長度的,錯開接線的位置,可以有效避免因為不小心發生短路。
  • 接完後盡量找膠帶粘上,避免裸露。
    2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

代碼。參考文章

代碼 A4988 步進電機驅動子產品測試 - 簡書

https://www.jianshu.com/p/a168c20b0f65

(8條消息) A4988步進驅動_Nc2016的部落格-CSDN部落格

https://blog.csdn.net/PoJiaA123/article/details/85107927

連結

(8條消息) 使用Arduino與A4988 驅動步進電機_淩順實驗室-CSDN部落格

https://blog.csdn.net/ling3ye/article/details/47001251

A4988 步進電機驅動子產品測試 - 簡書

https://www.jianshu.com/p/a168c20b0f65

(8條消息) A4988步進驅動_Nc2016的部落格-CSDN部落格

https://blog.csdn.net/PoJiaA123/article/details/85107927

(8條消息) 【arduino】arduino uno + A4988控制42步進電機_g1fdgfgdf2_的部落格-CSDN部落格

https://blog.csdn.net/g1fdgfgdf2_/article/details/78692759

舵機指令包

Instruction Packet

Instruction Packet is the command data sent to the Device.

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

windows下運作步驟

安裝vscode和python,pyserial

vscode選擇打開檔案夾

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

選擇協定2檔案夾

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

打開如圖

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

選擇檔案後改動com口,點選菜單“運作”

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

sync_read_write

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

由上圖協定可知,param前四個為位址和資料長度,後面是id編号

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

這裡初始化了同步讀取的四個參數,分别為端口 資料包 位址 資料長度。。協定第二條要求位址和資料長度不可變。

類初始化四個參數:

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

後面繼續添加要讀取的舵機id(添加了兩個):

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

發送,并獲得傳回資料:

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

使用完後,(程式即将退出時):

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

寫入類似,多了個寫入的目标位置值

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障

bulk_read_write

# Enable Dynamixel#1 Torque
dxl_comm_result, dxl_error = packetHandler.write1ByteTxRx(portHandler, DXL1_ID, ADDR_PRO_TORQUE_ENABLE, TORQUE_ENABLE)
if dxl_comm_result != COMM_SUCCESS:
    print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
elif dxl_error != 0:
    print("%s" % packetHandler.getRxPacketError(dxl_error))
else:
    print("Dynamixel#%d has been successfully connected" % DXL1_ID)


# Add parameter storage for Dynamixel#1 present position
dxl_addparam_result = groupBulkRead.addParam(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
if dxl_addparam_result != True:
    print("[ID:%03d] groupBulkRead addparam failed" % DXL1_ID)
    quit()


           

while1循環

while 1:
    print("Press any key to continue! (or press ESC to quit!)")
    if getch() == chr(0x1b):
        break

    # Allocate goal position value into byte array
    param_goal_position = [DXL_LOBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_LOBYTE(DXL_HIWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_HIWORD(dxl_goal_position[index]))]

    # Add Dynamixel#1 goal position value to the Bulkwrite parameter storage
    dxl_addparam_result = groupBulkWrite.addParam(DXL1_ID, ADDR_PRO_GOAL_POSITION, LEN_PRO_GOAL_POSITION, param_goal_position)
    if dxl_addparam_result != True:
        print("[ID:%03d] groupBulkWrite addparam failed" % DXL1_ID)
        quit()
    # Bulkwrite goal position and LED value
    dxl_comm_result = groupBulkWrite.txPacket()
    if dxl_comm_result != COMM_SUCCESS:
        print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
    groupBulkWrite.clearParam()

    # Add Dynamixel#2 LED value to the Bulkwrite parameter storage
    dxl_addparam_result = groupBulkWrite.addParam(DXL1_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED, [dxl_led_value[index]])
    if dxl_addparam_result != True:
        print("[ID:%03d] groupBulkWrite addparam failed" % DXL1_ID)
        quit()

    # Bulkwrite goal position and LED value
    dxl_comm_result = groupBulkWrite.txPacket()
    if dxl_comm_result != COMM_SUCCESS:
        print("%s" % packetHandler.getTxRxResult(dxl_comm_result))

    # Clear bulkwrite parameter storage
    groupBulkWrite.clearParam()

    while 1:
        # # Bulkread present position and LED status
        dxl_comm_result = groupBulkRead.txRxPacket()
        if dxl_comm_result != COMM_SUCCESS:
            print("%s" % packetHandler.getTxRxResult(dxl_comm_result))

        # Check if groupbulkread data of Dynamixel#1 is available
        dxl_getdata_result = groupBulkRead.isAvailable(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
        if dxl_getdata_result != True:
            print("[ID:%03d] groupBulkRead getdata failed" % DXL1_ID)
            quit()

        # # Check if groupbulkread data of Dynamixel#2 is available
        # dxl_getdata_result = groupBulkRead.isAvailable(DXL2_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED)
        # if dxl_getdata_result != True:
        #     print("[ID:%03d] groupBulkRead getdata failed" % DXL2_ID)
        #     quit()

        # Get present position value
        dxl1_present_position = groupBulkRead.getData(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)

        # # Get LED value
        # dxl2_led_value_read = groupBulkRead.getData(DXL2_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED)

        # print("[ID:%03d] Present Position : %d \t [ID:%03d] LED Value: %d" % (DXL1_ID, dxl1_present_position, DXL2_ID, dxl2_led_value_read))

        if not (abs(dxl_goal_position[index] - dxl1_present_position) > DXL_MOVING_STATUS_THRESHOLD):
            break

    # Change goal position
    if index == 0:
        index = 1
        
    else:
        index = 0
           

故障

length does not match

Succeeded to open the port
Succeeded to change the baudrate
[RxPacketError] The data length does not match as expected!
           

####已解決,舵機位址錯誤

調試過程中查的小知識

list

txpacket = [0] * (length + 7)

在python中, 如果用一個清單list1乘一個數字n 會得到一個新的清單list2, 這個清單的元素是list1的元素重複n次, 例如:

list1 = [0]
list2 = list1 * 5		# list2 = [0, 0, 0, 0, 0]
           

(3條消息) python 清單乘一個數字_hq_cjj的部落格-CSDN部落格

https://blog.csdn.net/hq_cjj/article/details/86659589

setup.py

Python 庫打包分發(setup.py 編寫)簡易指南 | Huoty’s Blog

https://blog.konghy.cn/2018/04/29/setup-dot-py/#part-2bb23717ee7e9bfc

from . import XXX

我的了解是 from . import XXX預設的就是在目前程式所在檔案夾裡__init__.py程式中導入XXX,如果目前程式所在檔案夾裡沒有__init__.py檔案的話,就不能這樣寫,而應該寫成from .A import XXX,A是指目前檔案夾下你想導入的函數(或者其他的)的python程式名,如果你想導入的函數不在目前檔案夾,那麼就有可能用到 from … import XXX(即上一個檔案夾中的__init__.py),或者from …A import XXX(即上一個檔案夾中的檔案A)

連結:https://www.zhihu.com/question/28688151/answer/66982373

Visual Studio Code快捷鍵

(3條消息) 【Visual Studio Code】VS Code在Linux/Mac/Windows中向前、向後定位的快捷鍵及修改方法_H_O_W_E的專欄-CSDN部落格

https://blog.csdn.net/H_O_W_E/article/details/104944130

2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障