使用 SmartDrive 扩展板编程遥控机器人
作者:Rishi Deshpande (MagPi 第26期)
翻译:@MagPi
如何使用操纵杆控制机器人
树莓派几乎可以通过编程来解决任何问题,从这个角度来讲树莓派简直是令人吃惊的存在。我曾见过有人用这种便携小电脑做出多媒体中心、云存储设备、气象站、游戏模拟器以及其他许多有用的工具。
然而,我决定创造一个可以遥控并且不需要大量软件维护的机器。机器的硬件特性根据不同的用户而改变,因此我不过多的关注硬件而是在控制机器的代码上下功夫。
我用一个手柄来控制我的机器。为了控制电机,我使用了SmartDrive。这是一个可以让用户通过树莓派控制两个大电流电机的驱动。
程序的开始,需要输入如下的程序段:
import pygame
import sys, os
from SmartDrive import SmartDrive
pygame
用来创立一个手柄事件。sys
用来停止运行中的程序。os
用来读取字符环境。
下面是创建手柄事件的代码
try:
j = pygame.joystick.Joystick(0)
j.init()
print 'Enabled joystick: ' + j.get_name()
except pygame.error
print 'no jotstick found.'
建议使用Try-block代码段,因为调试的时候能发现 pygame.error
的异常很重要。
使用单独的函数来使机器人运动是十分有效的。函数如下:
def move(motor, speed):
direction = 1
if(speed < 0):
direction = 0
speed = speed * -1
if speed > 100:
speed = 100
SmartDrive,SmartDrive_Run_Unlimited(
motor, direction, speed)
当 direction
等于0的时候,马达会向后转。当 direction
等于1的时候,马达会向前转。要注意 SmartDrive
的速度值区间是 0-100
,所以编程时要注意这个范围。现在这个函数现在可以在任何时候被调用。
在写程序的主循环部分要注意需要对手柄轴坐标进行缩放。Pygame
的 get_axis
函数的范围是从 -1
到 1
。0
的时候是中间。因此我们需要将上面的值放大100倍来使之前函数的 Speed
参数可以和轴坐标值对应上。代码如下:
while True:
pygame.event.get()
x1 = 100 * j.get_axis(0)
y1 = 100 * j.get_axis(1)
if j.get_button(1):
move(1, 0)
move(2, 0)
sys.exit(1)
lMotor = x1 + y1
rMotor = x1 - y1
move(1, lMotor)
move(2, -rMotor)
get_button
函数用来停止程序并使机器人停止运行。
我已经列出了我在这个项目中所使用的所有的电子器件、马达以及其他一些硬件。其实我挺推荐你去废品场淘一点用得到的马达,这样你就可以省下一小笔钱了。你可以找一找电动窗马达或者玩具车上的马达。我之所以用 SmartDrive 是因为它可以为每个马达提供 300W 的功率,尽管我实际使用时只用了 22W。
正如我之前提到的,SmartDrive 可以使树莓派最多控制2个大电流电机。它由树莓派上的I2C接口控制。
程序接口是用 Python 编写的并且包含了许多可以用不同方法控制马达的函数。马达可以连接到 SmartDrive - 被标为M1和M2的两个(第三个是用来接电源的)黑色螺丝接线端子上。 当然使用C语言来编写 SmartDrive 也是可以的。
还有一些函数可以用来控制马达运行时的转向角度、每秒的转速、甚至可以指定转动的次数。它还支持旋转编码器。SmartDrive 还有一个很好的特性就是它提供了一个可以驱动树莓派的5V电源,这样我们就不用再找其他的电源了。
元件清单:
- SmartDrive
- Tempest TR1 .3-1 2 Battery (1 2V)
- DreamGrear Shadow USB wireless joystick
- 2x Pittman GM9234E765-R1 motors