Jetbot实战系列07:机电控制设备的安装

机电控制是智能车最重要的输出功能,假如您使用Jetbot官方的自行打印车体并用组装方式来搭建智能小车的话,就需要搭配下图这个 ”DC-Stepper-Motor” 控制板,因为3D打印车体是根据这个控制板所设计的。

机电控制是智能车最重要的输出功能,假如您使用Jetbot官方的自行打印车体并用组装方式来搭建智能小车的话,就需要搭配下图这个DC-Stepper-Motor控制板,因为3D打印车体是根据这个控制板所设计的。

Jetbot实战系列07:机电控制设备的安装

只要在淘宝上输入 “DC-Stepper-Motor” 关键字,就能找到非常多的供应商,价位在30~50人民币之间,不过出货都是以上图左边的散件为主,需要将四个关键位置自己加以焊接,其他用不上的部分可以不用处理。

这个控制板是由一个PCA9685PWM控制芯片与两个TB6612电机驱动芯片所组成,与Jetson设备、TT电机之间形成如下图的接线关系。由PCA9685接收来自Jetson设备I2C总线的指令,然后驱动TB6612芯片按照PWM控制信号对两个TT电机,透过改变电流大小去调整电机转速与方向,来执行Jetbot小车的移动。

Jetbot实战系列07:机电控制设备的安装

但是这里有个在Jetbot实战系列06I2C总线与PiOLED”所遗留的问题需要先解决,因为PiOLED显示屏也要接上一组3V3/GND供电与SDA/SCL接脚,已经将Jetson1~6引脚全部占用,那么这个DC-Stepper-Motor控制板的SDA/SCL该如何与JetsonI2C引脚对接呢?

这个显示屏的选项有三种,Jetbot原厂使用下图最左边的Adafruit原厂显示屏,然后按照 https://jetbot.org/master/hardware_setup.htm 10步骤,在上面焊接690度弯曲引脚,再透过杜邦线与DC-Stepper-Motor控制板上的3V3/GNDSDA/SCL的四个脚位对接,如此一来只需要一组I2C总线就能完成在PiOLED屏上显示与控制DC-Stepper-Motor用途,在总线上的资源调用是最节省的。

Jetbot实战系列07:机电控制设备的安装

但这种Adafruit显示屏在国内的售价大约在120~150人民币,比中间的国产显示器的30~50人民币足足高出4~5倍,而且还需要额外的6根接脚的焊接作业,其实并不是个优选的方案。

这里推荐一个既省钱又省力的方案,:

  1. 使用上图中间(2号)的国产PiOLED显示屏,线路上不需要做任何调整,按照标准方式插上Jetson设备的1~6引脚位置,如下图左;Jetbot实战系列07:机电控制设备的安装

 

  1. 如上图,使用Jetson设备上另一组I2C总线(27脚位的SDA28脚位的SCL)3V3(17脚位)GND(20脚位),与DC-Stepper-Motor控制板上的四根引脚对接,也能执行相同的控制任务;
  2. 调整控制代码里面的总线编号,在项目中~/jetbot/jetbot/robot.py就是用来控制这个DC-Stepper-MotorPWM信号,将第14行代码中的default_value=1改成default_value=0就可以,如下:

14

i2c_bus = traitlets.Integer(default_value=0).tag(config=True)

如果是使用Docker容器的方式,修改代码之后需要重新创建basejupyter两个容器,请执行以下代码,就能让修改的配置生效:

$

$

 

$

$

$

cd ~/jetbot/docker && ./disable.sh

source configure.sh

# 只需要重建basejupyter两个容器

cd base && ./build.sh && cd ..

cd jupyter && ./build.sh && cd ..

./enable.sh $HOME/jetbot

这样就能用原本I2C_2执行PiOLED显示内容,另一组I2C_1处理机电控制的部分,总的来说会是最简单轻松的处理方式。

前面提到DC-Stepper-Motor控制版是由PCA9685TB6612两种芯片所组成,前者在I2C总线应用领域是非常重要的一个PWM控制器,后者则是根据PWM的控制信号为TT电机提供对应电流控制的芯片,透过二者的协作让Jetbot用最简便的元器件,搭建完整功能的车轮控制体系。

Jetbot已经针对这两个芯片提供高级封装的接口,极大程度减少我们的代码复杂度,但是为了让读者能在这过程中,对于I2C总线与这些控制芯片的协作有进一步理解,能更广泛地在Jetson设备上开发出更丰富的机电控制应用,因此占用一些篇幅来讲解一下这两个控制器的基本工作与Jetbot里面的底层代码内容。

  • PWM控制信号与PCA9685控制器

这里最重要的关键技术是“脉冲宽度调制(PWM,Pulse width modulation)”控制信号,负责调节对机电设备的电源供给量但并不对设备提供电源,就像水龙头的功能是负责调节水量而并不具备供水能力是一样的,水龙头是大家所熟悉的“人机界面”,我们只要简单地调节水龙头来控制水流量就像,至于埋藏在墙里的供水管道有多复杂,通常不太引人们注意,除非漏水或阻塞!

目前大部分嵌入式设备都提供这个功能,包括Jetson系列开发套件里也都提供一组PWM引脚(3233),不过这必须先经过前面讲解过的jetson-io.py工具进行配置,并且重启之后才能使用。但除非您要开发的应用只需要非常单纯地控制一个设备,否则一组PWM顶多能做个 ”LED闪灯这类最基础的入门小实验而已。

PCA9685芯片是能提供16PWM通道的控制芯片,用1I2C总线就能控制高达16组机电设备,在机器人、机械手臂或无人机等应用领域是非常合适的,毕竟I2C总线在设备上的数量是相对稀缺的。在https://i2cdevices.org/devices/pca9685设备地址列表中,可以看到PCA9685地址编号横跨0x40~0x7F的半壁江山,就能显示这个芯片在I2C应用领域的高使用性。

这个信号控制器需要独立的2.5V~5.5V电源来支持其运作,在控制板上以VCC作为标识,由于所需要的电流非常小,可以直接使用主控设备(如Jetson Nano 2GB)上扩充引脚的合适电源与GND,也不会影响主控设备的稳定性,另外再加上一组来自主控设备上的I2C总线的SDA/SCL输入就可以开始工作。

控制板上有另一个V+标识的电源输入,是真正要对舵机(下图左)、电机马达(下图右)等动力设备提供电力的供电源。

Jetbot实战系列07:机电控制设备的安装

根据设备不同转速、扭力、转距等参数有不同的工作电流,总的来说一路舵机的最基本工作电流在100毫安以上、一个电机马达的待机状态最少就需要250毫安,实际所需要预留的供电量往往是这个最低量的2~3倍以上,这样的用电级别就不是Jetson Nano 2GB这类嵌入设备所能供应的,必须依赖一个独立供电源才足以支撑。

网上大部分提到的PCA9685控制板,指的是下图中间这种16PWM舵机驱动板,左边的接脚与Jetson Nano 2GBI2C与电源的引脚相连,下面有编号0~15总共16组引脚可以接上右边的各种舵机。控制板中间可以看到PWM/V+/GND的印刷字样,上方白色电源孔接到独立供电系统,这样就能轻松地组合多机械手臂的应用

Jetbot实战系列07:机电控制设备的安装

读者可以自行采购这类舵机控制板,去搭建组合机械手臂或者二维/三维可旋转的摄像头的项目,透过指定控制板上的0~15通道(channel)编号的PWM值,进而控制每个舵机的独立工作。

  • TB6612电机驱动器与电机供电

这是个俗称为“H桥”的直流电机控制器,主要因为其核心电路形状酷似字母”H”而得名,其功能就是根据所接收的PWM信号,为电机马达提供对应的电流,每个TB6612芯片可以控制一对(两个)电机马达的转速与方向。

DC-Stepper-Motor控制板上(如下图中),可以看到两边各有一个6612FNC芯片,每个芯片占用PCA9685一个通道,各自控制两组电源供应线路,每一组都有正(红线)负(黑线)两极的线,与最右边TT减速电机进行对接。

Jetbot实战系列07:机电控制设备的安装

这个芯片的每个桥都为电机提供1.2A的高电流,每组两个电机就至少需要2.4A以上电流,这绝对不是Jetson Nano 2GB这类嵌入设备所能供应的,必须依赖独立的5V电源才足以满足。

Jetbot项目中只需要用到1个通道的两个电机组就可以,5V电源由市售的充电宝来担任,但受到这种电源的供电能力所局限,后面要进行的Jetbot范例全都是“慢速低电流”的应用,读者可以在过程中尝试将电机转速调到最大,会发现很容易因为供电不足而导致整套Jetbot掉电。

  • Jetbot的控制代码

~/jetbot/jetbot下面的robot.pymotor.py两个代码,就是为这个项目提供的两个不同阶层的调用库,在这里简单做个说明,读者可以根据这些定义进行调整,改写成适用于其他项目的代码:

  • robot.py
  1. 定义“以小车为单位”的“前进/后退/左转/右转/停止”等5个动作,可以自行修改speed=参数去调整行进速度。
  2. 这是个高阶封装的开发接口,主要调用Python版的Adafruit_MotorHAT库以及下面的motor.py所定义的函数。
  3. 这里会使用到的几个参数,主要对应上层robot.py的参数如下
    1. i2c_bus:必须根据实际使用的I2C总线去设置编号,如果使用I2C_2总线则default_value=1,如果使用I2C_1总线则”default_value=0
    2. motor_channel:将 ”left” 设为 ”1””right” 设为 ”2”,这些设定会传给motor.py中,去判断该对那个接口输出对应PWM的电流。
  • motor.py
  1. 定义“以电机为单位”的“前进/后退/停止”等3个动作,
  2. 调用Python版的Adafruit_MotorHAT库,定义与DC-Stepper-Motor控制板直接互动的低阶接口,作为robot.py的基础函数库。
  3. 这里会使用到的几个参数,主要对应上层robot.py的参数如下:
    1. driver:对应到robot.pyI2C总线编号
    2. channal:对应robot.py的左右轮”motor_channel”
    3. ina/inb:根据左右通道去设置实际电流输出口的位置编号。

以上将两个代码中最重要的关键提取出来简单说明,其实还是比较简单的,只要捋清楚上面参数之间的关系,就能很轻松地调整代码内容。

这两个代码是针对TB6612驱动的车轮应用所设计的,并不适用于舵机用途,但是只要清楚这些调用逻辑之后,其实代码内容同样是“根据PWM值给设备供给电流”的操作过程,最关键的工作就是先确认设备所对应的接脚编号,其他的代码就是指派工作而已,并没有什么技术难度。

强烈推荐读者可以基于本文所讲解的技术内容,先试着将网上众多树莓派小型项目移植到Jetson设备上,例如LED灯闪烁控制、多维度摄像头云台等机械手臂相关应用,也可以到https://developer.nvidia.com/embedded/community/jetson-projects 这个英伟达开发社区优选项目中,寻找合适的范例。[]

来源:业界供稿

0赞

好文章,需要你的鼓励

2022

01/04

18:01

分享

点赞

邮件订阅
白皮书