03 | 脉冲输出控制步进电机伺服

1 背景

为了能更好的用户体验,操作更方便。运用python实现相应的功能。

2 实例

2.1 输入脉冲数控制旋转角度

在这里插入图片描述

实现:

import time
from mcush import *

STEP = 1600  # 根据控制器组合开关设置
# 以下三个控制引脚共阴输入
ENABLE = '0.0'  # 允许
DIR = '0.1'  # 方向
PULSE = '0.2'  # 脉冲

s = Mcush.Mcush(‘/dev/ttyACM0’)
s.pinOutputLow( [ENABLE, DIR, PULSE] )  # 同时控制3个引脚输出低电平
s.pulseInit( pin=PULSE, delay_us=50 )  # 初始化PULSE引脚

direction = True
try:
    s.pinClr( ENABLE )
    while True:
        # 准备方向信号
        print( "Direction: %d"% (int(direction)) )
        if direction:
            s.pinSet( DIR )
        else:
            s.pinClr( DIR )
        # 旋转一圈
        s.pulse( STEP )  # 产生STEP个脉冲
        time.sleep(1)
        # 反转方向
        direction = not direction
finally:
    s.pinSet( ENABLE )  # 按Ctrl-C中止后,恢复该控制引脚

2.2 RS485型传感器通讯

import serial
import time

CO = "04 03 00 02 00 01 25 9F"           # 一氧化碳传感器问询帧
smoke = "03 03 00 03 00 01 75 E8"        # 烟雾传感器问询帧
#CO = "home1"             # 一氧化碳传感器问询帧
temp_GS = 1                                # 报警标志    1 正常   0 报警

ser = serial.Serial("COM5", 9600)  # 选择串口,设置波特率

def read_data(temp):
    global temp_GS
    if ser.is_open:
        print("port open success")
        # hex(16进制)转换为bytes(2进制),应注意python3.7与python2.7此处转换不同
        if temp:
            send_data = bytes.fromhex(CO)  # 发送数据转换为b'\xff\xff\xff\xff\xff'
        else:
            send_data = bytes.fromhex(smoke)
        ser.write(send_data)  # 发送数据
        time.sleep(0.1)       # 延时,否则len_return_data将返回0
        len_return_data = ser.inWaiting()  # 将获取缓冲数据(接收数据)长度
        # print(len_return_data)
        if len_return_data:
            return_data = ser.read(len_return_data)    # 读取缓冲数据
            # bytes(2进制)转换为hex(16进制),应注意python3.7与python2.7此处转换不同
            str_return_data = str(return_data.hex())
            # print(str_return_data)
            if temp:
                print("当前CO浓度为:", end="")
                print(int(str_return_data[6:10], 16) / 10, end="")  # 16进制转为整形   CO值
                print("ppm")
                if int(str_return_data[6:10], 16) > 50000:
                    print("当前CO浓度过高!")
                    temp_GS = 0
            else:
                print("当前烟雾状态:", end="")
                if int(str_return_data[6:10],16) /10:  # 16进制转为整形
                    print("警告")
                    print("起烟了!")
                    temp_GS = 0
                else:
                    print("正常")
    else:
        print("port open failed")
def main():
    read_data(1)
    time.sleep(0.5)
    read_data(0)
    time.sleep(0.5)
if __name__ == "__main__":
    # global temp_GS
    while temp_GS:
        main()

运行结果:

C:\Users\Administrator\Python\Python38\python.exe
port open success
当前烟雾状态:警告
起烟了!

2.3 通过串口控制电机

背景:通过python实现通过串口发送命令来控制电机x、y和z轴

import  serial
def motor_init():
    ser =serial.Serial();
    ser.port ="COM5";
    ser.baudrate =9600
    ser.bytesize = serial.EIGHTBITS
    ser.stopbits = serial.STOPBITS_ONE
    ser.timeout =.1
    ser.xonxoff = False
    ser.rtscts = False
    ser.dsrdtr = False
    ser.writeTimeout = 0
    return ser
def send(ser,command):
    ser.write((command +'\r').encode())

if __name__ == "__main__":
    ser = motor_init()
    ser.open()
    print("port open success")
    send(ser,'xxxxx')      # 实现x轴回零

3 常见问题:

问题1:提示ModuleNotFoundError: No module named ‘encodings’

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

导致原因:
排查发现是安装python的版本过多,里边有安装python3.8,还有Conda自带的python。
解决方法:
卸载Conda,重新运行python,正常。

问题2:ModuleNotFoundError: No module named ‘pyserial’

解决方法:
方式一:直接安装pyserial
方式二 :排查环境配置是否正确

问题3:ValueError: invalid literal for int() with base 10: ‘4e47’

解决方法:

if int(str_return_data[6:10])

修改成:

if int(str_return_data[6:10],16) /10
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值