树莓派驱动AX-12总线舵机

偶然找到了thiagohersan这位网友写的一篇文章,他写的关于使用树莓派驱动AX-12A数字舵机的解决方案让我深受启发。因此在这里翻译,以供参考。

原为地址:http://www.instructables.com/id/How-to-drive-Dynamixel-AX-12A-servos-with-a-Raspbe/

下面即为翻译:

我决定使用Dynamixel AX-12A电机(以下简称AX12)来完成一个项目,并且最终搭建了一个库,下面我将会介绍我的所感所想。

除了舵机的昂贵(笔者表示,这是真的贵!!!!),这个舵机还是有很多可取之处的。

特别的,Dynamixel的舵机具有更强大的功能,比如可返回位置、温度等的机器人控制系统。

第一步:总章

网络上关于AX-12有两个不同版本的说明书,2006年这一版的已经有些过时:一些数据已经过时,比如关于速度的控制等),还有一些在控制面板上的初始化数据也不对,但是对如何发送和读取指令写的十分详细。

另一个版本的数据很正确,但是通信协议写的并不是很清楚。

所以两个结合在一起用会好很多。

传送门:AX-12舵机说明书

第二步:其他的库

这些对学习使用AX12很有帮助:

An Arduino library and tutorial

传送门:http://savageelectronics.blogspot.it/2011/01/arduino-y-dynamixel-ax-12.html

Controlling Dynamixels with a Raspberry Pi

传送门:http://www.oppedijk.com/robotics/control-dynamixel-with-raspberrypi

该文翻译:

如何使用树莓派控制AX12

第一步就是连接,使用5V、GND(根据表对照选择)供电,RXD接受,TX进行半双工通信。因此我们需要74LS241。看一下如何开始:

http://robottini.altervista.org/dynamixel-ax-12a-and-arduino-how-to-use-the-serial-port

http://savageelectronics.blogspot.com/2011/01/arduino-y-dynamixel-ax-12.html

(笔者表示,这些都很实用,不过我没有使用文中的方法,因为我不需要返回值)

我们需要74LS241如此连接:

  • PIN2和PIN3连接(data out to AX-12)
  • PIN1和PIN19连接(和RPi port12(GPIO 18)连接)
  • PIN18(和RPi PIN10 RX连接)
  • PIN17(和RPI pin8 TX连接)
  • PIN10接地(可以和RPi PIN6共地)
  • PIN20接VCC(5V)

同样,AX12需要9-12V的供电

然后我们可以写一个python来进行测试了。

(笔者表示,亲测可用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import serial
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

port = serial.Serial("/dev/ttyAMA0", baudrate=1000000, timeout=3.0)

while True:
        GPIO.output(18, GPIO.HIGH)
        port.write(bytearray.fromhex("FF FF 01 05 03 1E 32 03 A3"))
        time.sleep(0.1)
        GPIO.output(18, GPIO.LOW)
        time.sleep(3)

        GPIO.output(18,GPIO.HIGH)
        port.write(bytearray.fromhex("FF FF 01 05 03 1E CD 00 0b"))
        time.sleep(0.1)
        GPIO.output(18,GPIO.LOW)
        time.sleep(3)

Jesse Merritt’s Python library

传送门:https://github.com/jes1510/python_dynamixels

第三步:连接UART

图片1↓

图片2↓

图片3↓

与其他数字舵机不同的是,Dynamixel系列的舵机并不是通过PWM信号来控制,而是使用一种读写RAM的通信协议。这种通信基于半双工UART端口,只需要一根总线便可以同时接受和发送信号。

这意味着如果我们使用树莓派或者Arduino或者其他具有全双工串口的主控板,需要构建一个特殊结构来完成全双工到半双工的转换。

在AX12的2006版文档里对这个模块进行了详细介绍

见图片1

其原理很简单,当DIRECTION_PORT高电平使,TXD可使用,低电平时,RXD可使用。

但是我没有用74HC126和74HC04,而是使用了74LS241作为代替。

这是我的PCB图:https://circuits.io/circuits/267189-ax-12-driver-for-raspberry-pi/

第四步:配置树莓派

这一步我看了一下,写的并不详细,而且他使用的是2代树莓派,因此大家可以浏览我另一个文章,可以对目前最新的3B进行配置。

传送门:http://blog.csdn.net/wren1997/article/details/79273477

第五步:库

我先用Arduino测试了我画的那个电路图,并且完成了一个库

传送门:http://savageelectronics.blogspot.com.es/2011/08/actualizacion-biblioteca-dynamixel.html

但因为我的项目需要联网,并且与机器人保持通信,所以我用树莓派代替。

我通过控制机器人来测试了这个库:

The resulting AX-12A Python library for Raspberry Pi is on github

传送门:https://github.com/thiagohersan/memememe/tree/master/Python/ax12

在发送和接收信息的时候设置时间间隔(笔者:根据文中电路图就可以明白,如果看过AX12使用说明的应该知道发送和接受有时间差)

第六步:连接更多的舵机

这一步说出来没什么太大意义,我也就不翻译了,既然使用AX-12,都明白为什么用它了哈哈。

这篇翻译也是为了以后学妹学弟能够快速上手而写的。国内中文资料着实太少,无效的资料满天飞,确实让我在学习过程中花了不少时间走了不少弯路。这篇原文最早是2011年写的,2014年牛人对这个过程进行了总结验证。我也花了一天时间对这个方法进行了验证,并确认可行。