蜗杆单轨滑轨的驱动的统一接口

 

■ 简介


在很多研究中,需要对传感器、被测对象进行移动。比如在 室外声音信标可行性分析 对于声音信源移动,使用了单轨滑动杆移动扬声器。

现在手边有一个蜗杆单轨,使用了Rui Xin 57BYG250B 步进电机进行驱动蜗杆,带动滑台做一维直线运动。关于 57BYG250B步进电机+SR4驱动器 可以参见相关的博文和技术资料。

▲ 丝杠单轴平台

▲ 丝杠单轴平台

在滑轨上还有两个 SN04-N感应无触点行程开关 。为了能够使用实验室中的统一步进电机的接口来驱动,需要制作一个统一的接口,来进行转换。

▲ 驱动步进电机

▲ 驱动步进电机

相关的步进驱动平台包括:

 

01统一接口定义


驱动器输出使用DB9-FEMAIL接口;负载接头使用DB9-MAIL接头。

在DB9中定义了步进电机两项接线(MA+,MA-,MB+,MB-)以及两端极限位置传感器。

▲ 统一接口功能定义

▲ 统一接口功能定义

上面的定义参考了 基于ESP8266WiFi步进电机控制 中的改造信息。

 

02接口板设计


由于SN04-N感应无触点行程开关需要电源(DC 5V ~ 24V)工作,在转接板上需要增加外部输入电压。

1.电路设计

▲ 接口的SCH

▲ 接口的SCH

▲ 快速制版后的实验PCB

▲ 快速制版后的实验PCB

 

03测试


1.基本功能

使用基于ESP8266WiFi步进电机控制 的驱动器来驱动滑轨移动。

  • rccw(n):远离步进电机
  • rcccw(n):接近步进电机

利用单轴步进驱动模块SH-20403也可以驱动滑轨运动。并且左右限位正常。

  • lscm8mb(n) :接近步进电机
  • lscm8mf(n) :远离步进电机

lscm8f(100000) : 运动25秒左右。

测量距离:起始:0.416米。ypds lscm8f(100000)之后,距离为:0.663米。因此,使用lscm8驱动是步长常数为: L s t e p = 0.663 − 0.416 1 0 5 = 2.47 × 1 0 − 6 m L_{step} = {{0.663 - 0.416} \over {10^5 }} = 2.47 \times 10^{ - 6} m Lstep=1050.6630.416=2.47×106m

根据后面测量滑轨的总行程Lmax=0.891米,因此,使用lscm驱动最大的步进数量为:
N max ⁡ = L max ⁡ L s t e p = 0.891 2.47 × 1 0 − 6 = 360729 N_{\max } = {{L_{\max } } \over {L_{step} }} = {{0.891} \over {2.47 \times 10^{ - 6} }} = 360729 Nmax=LstepLmax=2.47×1060.891=360729

运行时间约:90秒。

2.性能

(1) 运动时间

使用基于ESP8266WiFi步进电机控制驱动滑轨运动,设置驱动步进电机细分为1,也就是运动速度最快。

运行时间:大约三十秒。

(2) 运行距离

使用激光测距测量固定在滑轨上的反光板的距离。

  • 最靠近步进电机时距离: 0.162米
  • 行进1000步之后,距离为:0.662米
  • 行进至最远端:1.053米

运行参数:
(1) Lstep=L/N=50微米: L:行进距离,N:运动步长。
L s t e p = 0.5 10000 = 0.05 m m L_{step} = {{0.5} \over {10000}} = 0.05mm Lstep=100000.5=0.05mm
(2) 行进总长度: Lmax=1.053-0.162=0.891米
(3) 行进步数最大值:
N max ⁡ = L max ⁡ L s t e p = 0.891 0.05 × 1 0 − 3 = 17820 N_{\max } = {{L_{\max } } \over {L_{step} }} = {{0.891} \over {0.05 \times 10^{ - 3} }} = 17820 Nmax=LstepLmax=0.05×1030.891=17820

 

※ 结论


本文描述了对于蜗杆滑轨的驱动制作统一接口的方式。并通过两款驱动进行了测试。获得可滑轨运动总长度,两款驱动器的步长常数,运动速度等参数。为今后应用提供数据基础。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LSCM8.PY                     -- by Dr. ZhuoQing 2020-01-14
#
# Note:
#============================================================

from head import *
import serial

#------------------------------------------------------------
cmdportdef = 'COM2'
cmdport = serial.Serial(cmdportdef, baudrate=115200, timeout=0.1)
cmdport.setDTR(False)
#cmdport.setRTS(False)

printf("Open %s for LSCM8."%cmdportdef)

#------------------------------------------------------------
COMMAND_FRAME_HEAD		= 0x56
COMMAND_FRAME_TAIL		= 0x65

COMMAND_STATUS_WAIT		= 0x0
COMMAND_STATUS_COMMAND	        = 0x1
COMMAND_STATUS_LENGTH	        = 0x2
COMMAND_STATUS_DATA		= 0x3
COMMAND_STATUS_CHECK	        = 0x4
COMMAND_STATUS_TAIL		= 0x5

#------------------------------------------------------------
COMMAND_HELLO_ECHO		= 0x20
COMMAND_BEEP_ON			= 0x21
COMMAND_BEEP_OFF		= 0x22
COMMAND_DIR_ON			= 0x23
COMMAND_DIR_OFF			= 0x24
COMMAND_REL_ON			= 0x25
COMMAND_REL_OFF			= 0x26
COMMAND_PUL_SET			= 0x27
COMMAND_PUL_STOP		= 0x28
COMMAND_GOTO_HEAD		= 0x29
COMMAND_GOTO_TAIL		= 0x2A
COMMAND_GET_STATE		= 0x2B
COMMAND_GET_PULSEOUT	        = 0x2C
COMMAND_CLEAR_PULSEOUT	        = 0x2D

#------------------------------------------------------------
def lscm8cmd(cmd, cmddata):

    checksum = cmd + len(cmddata)
    for cd in cmddata:
        checksum = checksum + cd

    checksum = (checksum & 0xff) ^ 0xff

    cmdstr = b'' + byte(COMMAND_FRAME_HEAD) + byte(cmd) + byte(len(cmddata)) +\
             cmddata + byte(checksum) + byte(COMMAND_FRAME_TAIL)

#    printf(cmdstr)
    cmdport.write(cmdstr)

def lscm8hello():
    lscm8cmd(COMMAND_HELLO_ECHO, b'')

def lscm8beepon():
    lscm8cmd(COMMAND_BEEP_ON, b'')

def lscm8beepoff():
    lscm8cmd(COMMAND_BEEP_OFF, b'')

#------------------------------------------------------------
def lscm8relon(bits):
    cmd = bits.to_bytes(1, byteorder='big')
    lscm8cmd(COMMAND_REL_ON, cmd)

#------------------------------------------------------------
# bits:0:relay0, 1:relay1
def lscm8reloff(bits):
    cmd = bits.to_bytes(1, byteorder='big')
    lscm8cmd(COMMAND_REL_OFF, cmd)

def lscm8diron(bits):
    cmd = bits.to_bytes(1, byteorder='big')
    lscm8cmd(COMMAND_DIR_ON, cmd)

def lscm8diroff(bits):
    cmd = bits.to_bytes(1, byteorder='big')
    lscm8cmd(COMMAND_DIR_OFF, cmd)

#------------------------------------------------------------
def lscm8setpulse(bits, pulse):
    cmd = bits.to_bytes(1, byteorder='big') +\
          pulse.to_bytes(4, byteorder='big')
    lscm8cmd(COMMAND_PUL_SET, cmd)

def lscm8stoppulse():
    lscm8cmd(COMMAND_PUL_STOP, b'')

def lscm8gotohead():
    lscm8cmd(COMMAND_GOTO_HEAD, b'')

def lscm8gototail():
    lscm8cmd(COMMAND_GOTO_TAIL, b'')

def lscm8clearpulseout():
    lscm8cmd(COMMAND_CLEAR_PULSEOUT, b'')

def lscm8mf(steps):
    lscm8diron(3)
    lscm8reloff(3)
    lscm8setpulse(3, steps)

def lscm8mb(steps):
    lscm8diroff(3)
    lscm8reloff(3)
    lscm8setpulse(3, steps)

#------------------------------------------------------------
if __name__ == "__main__":
#    time.sleep(.5)

#    lscm8diron(3)
#    lscm8reloff(3)
#    lscm8gotohead()
#   lscm8gototail()
#    lscm8setpulse(3, 1000)
#    lscm8diron(3)

    lscm8mf(100000)

#    lscm8mf(1900000)

    tspbeep(1500, 100)
    printf('End of the command')

#------------------------------------------------------------
#        END OF FILE : LSCM8.PY
#============================================================

 
■ 相关文献链接:

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页