■ 简介
在很多研究中,需要对传感器、被测对象进行移动。比如在 室外声音信标可行性分析 对于声音信源移动,使用了单轨滑动杆移动扬声器。
现在手边有一个蜗杆单轨,使用了Rui Xin 57BYG250B 步进电机进行驱动蜗杆,带动滑台做一维直线运动。关于 57BYG250B步进电机+SR4驱动器 可以参见相关的博文和技术资料。
▲ 丝杠单轴平台
在滑轨上还有两个 SN04-N感应无触点行程开关 。为了能够使用实验室中的统一步进电机的接口来驱动,需要制作一个统一的接口,来进行转换。
▲ 驱动步进电机
相关的步进驱动平台包括:
- 单轴步进驱动模块SH-20403
- DRV8825步进电机驱动控制模块以及双轴平台
- 基于ESP8266WiFi步进电机控制
- SH-20403AXIS12双轴蓝牙移动框架
- 基于ESP8266 WiFi控制的步进升降机械平台
01统一接口定义
驱动器输出使用DB9-FEMAIL接口;负载接头使用DB9-MAIL接头。
在DB9中定义了步进电机两项接线(MA+,MA-,MB+,MB-)以及两端极限位置传感器。
▲ 统一接口功能定义
上面的定义参考了 基于ESP8266WiFi步进电机控制 中的改造信息。
02接口板设计
由于SN04-N感应无触点行程开关需要电源(DC 5V ~ 24V)工作,在转接板上需要增加外部输入电压。
1.电路设计
▲ 接口的SCH
▲ 快速制版后的实验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.663−0.416=2.47×10−6m
根据后面测量滑轨的总行程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×10−60.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×10−30.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
#============================================================
■ 相关文献链接: