ELMO驱动器用arm板子控制,并通过串口从RS232获取编码器数据

在设计机械臂的过程中,由于使用的maxon伺服电机和ELMO驱动器,需要在maxon伺服电机的尾部安装编码器作为反馈信号连接至ELMO驱动器的feedback A 接口,采用的控制方式是通过PWM信号发送至feedback B作为控制信号。如下图所示:

这种控制方式简单方便,但是也有缺点,那就是feedback A作为反馈输出信号被驱动器占用,feedback B作为控制信号输入被占用,导致我们没有更多的接口去获取编码器的数据,先上图,脉冲控制方式的接线图如下所示,可以看出port B1是作为输入的信号。

所以问题来了,当把伺服电机安装在机械臂上的时候,如何获取到编码器的数据呢?

1. 将伺服电机的编码器脉冲信号分开使用,采用并接的方式,给驱动器feedback A 接一个,再给并联一个出来接到板子监控机械臂位姿?

理论上说是可以的,直接接到板子相应的模板上,但是可能会出现干扰的问题,造成反溃信号不准确,导致电机速度位置控制都不准确,得不偿失啊!

2.在机械臂上各个关节重新安装一个编码器,单独给板子使用。

这样的确不存在干扰的问题,而且实验室的独立驱动转向小车就是这么操作的。但是俺们自己设计的机械臂长这个样子,这空间肯定不够了,强行加肯定更丑,成本又高了那么一丢丢!

还有一种方式,当初电机和驱动器的增益调节的时候,composer软件提供了两个界面,上方界面可以帮助我们发送特定指令,可以让电机使能或以特定速度转动,下方界面可以帮助我们监控驱动器和电机的各种参数,包括速度电流位置等等。

数据传输的方式是通过RS232或者CAN总线,因为调试的时候用的是RS232,咱就不讨论CAN总线的方式了,具体可以翻阅相关手册。

       既然上位机软件能通过设置监控面板来监视伺服电机的位置速度等等信息,是否就意味着驱动器以某种方式将编码器的数据传输给了上位机软件,而上位机和驱动器通信的目前只有一根RS232传输线。所以可以判断编码器数据经过feedback A进入了驱动器,驱动器通过一系列算法计算出电机运动过程中的position,velocity,position err等数据并保存在驱动器的寄存器空间中,当我们点击监控面板上的选项或者按钮,软件就会帮助我们发送特定的指令到串口的写端,随后Cello的Rx端接收了指令,并将特定命令对应的数据通过Tx端发送至上位机的串口,上位机软件(也就是composer)利用这些数据,可视化成面板上的监控数据。

如下图所示,首先选择监视的方式,然后选择监控的参数是position和velocity,下面有个Mapping 和Start Record 按钮,也是帮助我们记录和读取数据的。

现在数据的来龙去脉搞清楚了,接下来就需要了解清楚传输过程的数据类型和当我们点击按钮时候上位机到底向串口发送了那些指令。这些都搞清楚了,就可以通过板子的UART串口与驱动器RS232通信,免于使用composer软件,直接UART串口接收数据和发送指令,转换成具体的position,velocity和position err数据使用即可。接线也是很简单的:RS232只有三根线Rx,Tx,GND,依次接到板子UART串口的Tx(P9_21),Rx(P9_22),GND。因为板子能承受的逻辑电平和RS232的逻辑电平不一致,所以需要MAX232模块进行电平转换。(注意实验室使用的beagleboneUART不能使用超过5V的电压,安全起见,给232转TTL转换器供应3.3V的电压,也就是VCC接beaglebone的P9-2,GND直接接板子的GND即可,232网口那端直接接驱动器即可)

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

接下来先测试传输的数据类型和控制指令,必不可少要用到串口调试的软件,网上随便找一个下载https://blog.csdn.net/qq_38108251/article/details/86737424

使用调试完成的电机进行测试,关于如何调试请参考之前的博客或者手册。将RS232连接伺服驱动器和电脑的USB口,插入完成之后,可以在电脑的设备管理器里面的查看端口号。

打开下载的串口调试软件,如下图,设置成上面查看到的端口号。波特率要注意设置成和驱动器一致,就是当初使用界面调试的那个波特率,一般都是19200,串口连接成功之后,点击打开串口,注意此时要退出composer软件,否则会提示串口被占用。

我们首先用串口助手发送命令来控制电机。我们在发送窗口,依次输入如下命令然后点击发送:

  1. UM=2; //速度环模式

  2. MO=1; //电机开始

  3. JV=1666;//持续运动,速度为1666

  4. BG; //开始

如果电机开始运转表明这种通过串口直接发送指令的方式是可以与驱动器交互的,可以通过指令控制驱动器,也可以通过指令获取编码器数据。这里注意:一旦发送MO=0命令,电机立即停止转动,处于失电状态,不会有钳位。注意发送的命令之后要有分号;同样的指令还有RM=1;和RM=0;分别对应电机启动和停止。如果上面的指令无法运行成功,可能是驱动器调试的问题或者控制指令冲突,简单的方式就是发送RM=0或1;观察电机是否使能即可。

由于我我们实验室是通过Feedback B控制电机运动,所以关于通过串口发送指令控制电机运动就不过多介绍了。下面主要介绍关于驱动器记录编码器的各种数据的指令和将数据发送至上位机(或是串口)的指令和操作方法,有需要的可以看一下,无需要直接跳到实战。

BG, BT, IL[N]Begins motion using software or hardware command. Start of motion may be used to trigger the recorder使用软硬件的指令,该指令可用做触发记录器
BHUploads recorder results上传记录的数据
LSLoads a record from the serial flash memory, in order to retrieve the list of recorder signals.从 serial flash memory读取记录
RCDefines which of mapped signals should be recorded定义要记录的数据类型
RGRecorder gap: specifies sampling rate of the recorder采样比率
RLRecorder length记录的数据长度
RP[N]Recorder parameters: defines which event will trigger the recorder,
and the trigger position. Also defines basic time quantum for recorder (TS or four times TS) and data to be uploaded to host by next BH command
触发条件和条件的地址。。。
RRLaunches recorder and reads back its status设置记录器的状态
RVSignal mapping: maps the IDs of the recordable signals to logical IDs that the recorder can reference.映射要记录的数据的地址
SRStatus register, which indicates the status of the recorder: idle, armed,triggered and recording, or ready with data状态寄存器
TSSampling time, the basic resolution of recorder采样分辨率
WI[21]Actual amount of recorded data

真实数据量

比较重要的指令已经标红,翻译也不准确,所以我将手册原文也贴上来了。这几条指令主要对应composer面板上的recorder按钮和mapping按钮。

1.   RR=0;    // 停止recorder并清空数据
2.   RR=1;    // 下次运动时开始记录
3.   RR=2;    // 立刻记录
4.   RR=3;   // 通过触发条件来判断是否开始记录  

关于mapping按钮,由于recorder可以记录一个不同的信号数据,例如速度位置和位置误差等等一共16个信号,所以mapping signal如下,这个比较简单,就不逐一翻译了,通过mapping的指令,可以获取speed、position、position err等等, length type 和 description也描述的很清楚。

虽然记录器可以记录这么多的数据,但是很多数据并不是我们想要的,强行获取所有数据不仅浪费空间,而且数据叠加在一起,根本分不清到底那些数据是我们想要的,所以要通过指令RV和RC来定义要记录的数据和这些数据的排列顺序。

RV[1]=5; RV[2]=1; RC=3;

首先RC = 3,换算成16位二进制是 0000 0000 0000 0011
可以看到第一位和第二位都是1,其余位都是0,说明我们只记录 main speed(VX)和 position error(PE).
但是查看手册发现,第一位是main speed(VX)并没有错,但是第二位明明是main position(PX)才对呀,
这就是由于RV的作用了,RV[1] = 5;将原本在第五位的PE放到了记录顺序的第一位,RV[2] = 1;将原本在第一位的VX放到了记录顺序的第二位。

指令BH是上传记录,他本是也是一个掩码,相当于一个开关位,类似与umask,不使用它就不详细说明了。指令暂时就用这么多,后期测试会再修改。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------实   战------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

首先往串口发送指令 MO; (一共三个字节,可以看下方的R和S),可以看到驱动器给我们返回了五个字节的数据,其中 4D 4F 3B 分别对应M O ; 三个字符的ascii码的十六进制,这就是串口的回显功能,无论发送什么,串口都会给我们回一个一模一样的数据,便于调试。可以通过EO指令关闭回显功能。回显之后的数据是 31 3B,同理对应ASCII码中的字符 1 和 ;,意味只MO的数值为1,;很自然的可以当作结束标志。

我们也可以将右下方的 HEX发送打勾,HEX显示取消打勾,那样我们发送指令就要用ascii字符对应的十六进制发送了。

 接下来测试位置信息,这个数据是编码器的脉冲数,类型为长整型,发送的指令为PX;(参考上面的手册指令)。前三个字节很好理解,是串口的回显,所以我们关注的就是两个3B之间的数据-------------30,也就是0,因为刚启动电机,编码器数据自然是0,没毛病。

让电机运转起来,然后再发送指令PX;查看,数据如下,33 36 35 35 37,所以此时编码器的数据是36557. 同理使用VX;可以查看电机的速度数据,由于串口读取数据时间不是很精确,所以我只使用了编码器的位置数据,其他的不做考虑了。

测试完毕,接下来使用板子的UART代替串口调试程序来读取位置数据。先上一个简单的demo程序:

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>

#define SLOTS  "/sys/devices/bone_capemgr.9/slots"
#define max_len 15
int main()
{
    int fd, count_r,count_t,i;
    // 注意unsigned char 表示的就是一个字节的数据
    unsigned char buff[max_len]={0};  // 初始化读取串口数据数组
    struct termios opt;       // 串口结构体

    // 加载设备树
    if ((fd = open(SLOTS, O_RDWR)) < 0)
    {
        perror("UART: Failed to open the UART device:ttyO1.\n");
        return -1;
    } 
    write(fd,"BB-UART2",8);
    close(fd);

    // 打开 beaglebone 的UART2串口, 可读写 | 非终端 | 不阻塞
    if ((fd = open("/dev/ttyO2", O_RDWR | O_NOCTTY | O_NDELAY)) < 0)
    {
        perror("UART: Failed to open the UART device:ttyO2.\n");
        return -1;
    }

    tcgetattr(fd, &opt); // 配置UART
    // 19200波特率 | 8位 | 使能接收器 |  no modem control lines
    opt.c_cflag = B19200 | CS8 | CREAD | CLOCAL;
    // ignore partity errors, CR -> newline
    opt.c_iflag = IGNPAR | ICRNL;
    //turn off software stream control
    opt.c_iflag &= ~(IXON | IXOFF | IXANY);
    //关闭回显功能,关闭经典输入 改用原始输入
    opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    tcflush(fd,TCIOFLUSH);        // 清理输入输出缓冲区
    tcsetattr(fd, TCSANOW, &opt); // changes occur immmediately

    // 发送指令的字符数组,注意并不是字符串,没有'\0'
    unsigned char send_buff[3];
    send_buff[0] = 'P';
    send_buff[1] = 'X';
    send_buff[2] = ';';
    if ((count_t = write(fd, send_buff,3))<0)
    {
        perror("ERR:Failed to write to the Device:ttyO2\n");
        return -1;
    }
    // 确保串口数据发送并接收完成
    usleep(5000000); // 延时 5s
    // 读串口缓冲区,count_r表示的是读取的字节数
    if ((count_r = read(fd,(void*)buff, sizeof(buff)))<=0)
        perror("ERR:No data is ready to be read\n");
    else
    {
        for(int i=0;i<max_len;i++)
        {
            printf("%X ",buff[i]);
        }
    }
    printf("\n");
    close(fd);
    return 0;
}

可以看到数据和串口调试助手是一致的,图是之前截的,和上面的程序稍有不符合,不影响。 后面将数据进行处理然后通过TCP传送给上位机ROS即可。

 

最后忽略我凌乱的接线和桌面。

 

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Elmo驱动器是一种用于控制电机的设备,它具有简单易用、高效稳定的特点。以下是Elmo驱动器的使用说明: 1. 硬件安装: a. 将Elmo驱动器正确安装在电机上。确保连接准确,紧固螺丝,并连接好电源和控制信号线。 b. 检查驱动器的供电要求,并确保提供正确的电源电压和电流。 2. 驱动器连接: a. 使用正确的接口连接Elmo驱动器控制器或主机设备。 b. 确保连接正确无误,并检查所有连接是否牢固可靠。 3. 驱动器配置: a. 使用配置工具(如Elmo's Composer)连接驱动器并进行基本配置。根据需要,可以调整电机参数、控制模式和保护设置。 b. 确保配置完整正确,并保存配置文件以备将来使用。 4. 控制命令: a. Elmo驱动器支持多种控制模式,包括速度控制、位置控制等。根据需要选择合适的控制模式。 b. 使用适当的控制命令发送速度、位置或其他控制指令。确保命令格式正确,并根据需要进行校准和调整。 5. 状态监控和故障诊断: a. Elmo驱动器提供实时的状态监控功能,可以显示电机的转速、电流和温度等数据。监控这些数据可以帮助及时发现问题并采取措施。 b. 当发生故障或警报时,驱动器会输出相应的错误码或信息。及时处理故障,并根据驱动器手册中的故障诊断指南进行故障排除。 总之,Elmo驱动器具有易安装、易配置和强大的控制能力。使用者只需按照使用说明正确安装、连接和配置,就可以快速有效地控制电机。同时,关注驱动器的状态监控和故障诊断,可以及时发现问题并进行维修和保养。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值