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

目录

  • 1 背景
  • 2 实例
    • 2.1 输入脉冲数控制旋转角度
    • 2.2 RS485型传感器通讯
    • 2.3 通过串口控制电机
  • 3 常见问题:
    • 问题1:提示ModuleNotFoundError: No module named 'encodings'
    • 问题2:ModuleNotFoundError: No module named 'pyserial'
    • 问题3:ValueError: invalid literal for int() with base 10: '4e47'

1 背景

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

2 实例

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

03 | 脉冲输出控制步进电机伺服_第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

你可能感兴趣的:(#,伺服电机,物联网)