一、前言

最近我在研究自行车的功率计,于是不可避免的需要了解ANT+协议,查了一圈资料之后发现网上关于ANT+开发的资料非常少,而且都是几年前的了,所以打算写一篇文章记录一下。

ANT(源于自适应网络拓扑,即Adaptive Network Topology)是一种专有(但开放访问)的多播无线传感器网络技术,ANT由Dynastream Innovations于2003年推出,随后在2004年推出了低功耗标准ANT+,而Dynastream在2006年被佳明收购。ANT定义了一套无线通信协议栈,使工作在2.4 GHz ISM频段的硬件能够通过建立共存、数据表示、信号传输、认证和错误检测的标准规则进行通信。而ANT+协议则是基于ANT协议的扩展协议,具体内容可以访问其官网thisisant.com

二、硬件选择

ANT协议并不是任何设备都支持,如果要开发ANT应用,我们需要选择硬件上支持发射ANT信号的设备。以下有几种可行方案:

  1. 手机:我没有尝试过,而且现在只有少数手机支持ANT协议,比如三星的部分系列,HTC等。如果想要知道自己的手机支不支持ANT,可以安装ANT Tester这个软件进行检测,另外,即使手机支持,开发的时候也需要在ANT官网下载SDK。

  2. Nordic nrf52系列开发板:nrf52系列的芯片基本上都支持ANT协议,具体内容可以查看其官网https://www.nordicsemi.com/Products/Development-hardware/nRF52-DK 根据后续的开发流程,我个人认为比较方便的选择是Nordic 官方的nrf52832开发套件或者第三方的板子Adafruit feather nrf52840 express。虽然这都是进口开发板,价格比较贵,但是如果你选择一些非主流的开发板,板子的功能或者接口会不太一样,会影响开发。(当然如果你是大佬就无所谓了)

    9d8b1dc7491a502353456d850d8995ff.jpg

三、开发环境搭建

请选择你的方案,我用的是ArduinoIDE,所以我会着重讲解Arduino环境的搭建。

1.ArduinoIDE方案

这里我使用的是Adafruit feather nrf52840 express开发板,因为这个板子官方明确支持Arduino开发,而且有丰富的教程。使用手册 根据这个使用手册我们可以发现这里面没有任何关于如何开发ANT的信息,这是出于法律原因,feather开发板并没有出厂内置ANT的协议栈,你可以理解为就是硬件本身支持ANT但是没有预装驱动,需要用户手动烧录。下面要做的操作就是让我们的feather板子支持ANT。

(一)编译bootloader

bootloader包含softdevice(也就是协议栈)以及提供DFU烧录和引导程序加载的功能,也就是说,没有bootloader我们就没法使用Arduino开发和烧录我们的程序。然而feather nrf52840出厂自带的bootloader里的softdevice型号是s140,也就是只支持蓝牙。我们现在要做的就是将s340(同时支持ANT和蓝牙的协议栈)替换s140。

首先下载s340的压缩包,你只能在ANT官网下载,你需要注册并成为adapter。下载并解压完后,你会得到这些文件。

然后我们要下载官方bootloader的源代码进行魔改并编译,所以先确保安装了以下工具:

接下来你可以选择按照这个教程进行修改,但是由于我已经做过以上工作了,所以你可以直接使用我改完的代码,也就是直接下载后面这个链接 GitHub - 1wpc/ANT_Adafruit_bootloader: support for Adafruit feather nrf52840 express包含s340

然后在项目的根目录编译即可,注意要把下面的GNU_INSTALL_ROOT换成你的安装路径,然后把SERIAL换成你的板子连接的串口。

1
make GNU_INSTALL_ROOT="C:/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/bin/"  BOARD=feather_nrf52840_express_s340 SERIAL=COM5 dfu-flash

(二) 在ArduinoIDE中安装开发板

先按照常规步骤安装Adafruit nrf52系列的开发板,进入首选项,在“其他开发板管理地址”一栏处填入下面的地址https://adafruit.github.io/arduino-board-index/package_adafruit_index.json 然后重启ArduinoIDE等待其下载完成Adafruit的支持库,最后在左侧的开发版管理器中安装Adafruit即可。详细的步骤就不展开说明了。

然后你应该能够在这个文件路径中找到Adafruit支持库的安装位置C:\Users\xxx\AppData\Local\Arduino15\packages\adafruit\hardware\nrf52

在这个路径下会有一个名为版本号的文件夹,比如我这里是1.7.0

然后将这个文件夹中的内容全部删除,使用git克隆我这个已经修改好的仓库https://github.com/1wpc/Adafruit_nRF52_Arduino_ANT.git ,并放进1.7.0文件夹中,最终的目录结应该长这样。(ANT+网络密钥我已经配置好了)

然后别忘了把子模块下载下来,在1.7.0目录下执行下面的指令

1
git submodule update --init --recursive

参考资料

(三)在项目中添加ANT库

随便找个位置将这个仓库克隆下来https://github.com/orrmany/SDAntplus.git ,这个仓库是一个适配了Adafruit feather nrf52840 express 的ANT库,可以让你在ArduinoIDE中方便地调用ANT相关的API进行开发。使用这个库的前提是前两步必须完成,因为这是一个上层的库,用于简化API的调用。

然后我以我的虚拟功率计项目举例如何开发自己的ANT应用。先新建一个PowerMeter项目,然后在这个项目的根目录下新建一个src文件夹。

之后将刚才克隆的SDAntplus仓库下的src目录中的所有.h和.cpp文件复制到自己项目中的src文件夹下(不要管profiles文件夹),然后在src目录下新建一个名为PowerMeter的目录,然后将PowerMeter的profile文件放进去(这个几个文件可以从我的仓库中找,也就是BicyclePower和PowerMeterGitHub - 1wpc/PowerMeter_Arduino: XDSHacker function: XDS -> nrf52840 -> magene)。顺便说一下,SDAntplus仓库里的profile文件夹中就是一些常用的ANT+设备的profile实现。

(四)运行

注意在ArduinoIDE中选择名称为Adafruit Bluefruit Feather nRF52840 Express w.ANT的开发板,然后正常运行就可以。

2.keil方案

由于我最终没有用keil,所以我就简单提一下大概需要做什么工作,我用的是keil 5。另外官方SDK给的demo是基于nrf52832的。

  1. 从Nordic官网下载(nRF5 SDK downloads - nordicsemi.com)nrf52的SDK,我下的版本是17.1.0

  2. 安装nRF_DeviceFamilyPack(8.40.3)和CMSIS(5.6.0)

  3. 配置编译器和ROM、RAM

  4. 在SDK的example文件夹下会有一些例子,其中就包含ANT和ANT+的相关demo,在components\softdevice\s212(对应协议栈的文件夹)\headers中加入相关头文件,这些头文件就是你在ANT官网上下载得到的(include文件夹下所有内容),然后在nrf_sdm.h文件中配置ANT+的网络密钥,之后用keil打开相关文件进行开发就行。

四、运行效果

72d74524a2096f59800bbb009763ab45.jpg

图中码表是迈金C606pro