/ 物联网

使用 Contiki 快速构建 IoT 设备

“Contiki是真正的推动者,它允许我们快速构建原型,并轻松在不同的硬件平台之间切换” Markham这样说过。至于 Markham 是谁,他是 Contiki 的发明者之一。

背景介绍

Contiki 开始于2003年,它的起源可追溯到 Dunkels 还是瑞典梅拉达伦大学的一名计算机科学学生的时候。在2000年,他工作的一个项目是使用无线传感器追踪曲棍球球员的关键信号,并把它们呈现在观众可以看到的屏幕上。Dunkels 说,“我们说服他们把传感器放在鼻子上面,这样我们就能测量他们的呼吸频率”。怎么我现在脑袋里浮现的是一群人鼻子上贴着电路板打曲棍球的奇怪场景...😶

为了使传感器正常运行,Dunkels 不得不编写软件,让它们与计算机网络交互。他把相应的代码叫做 LwIp,“轻量级互联网协议(light weight internet protocol)”。尽管 LwIP 今天仍然应用于很多微控制器和其他产品里,Dunkels 认为它还不够轻量。在2003年,他创立了 microIP,后来演化成了 Contiki。这个操作系统马上引起了研究人员和爱好者的注意,最近几年它还吸引了商业用户,包括 Rad-DX 发射物检测设备和 Zolertia 噪音监测系统。

为了帮助支持 Contiki 的快速成长起来的商业应用,Dunkels 辞去了瑞典计算机科学院教授的职务,创立了 Thingsquare,致力于为 Contiki 设备提供基于云的后端的一家创业公司。其理念是让开发者更容易地把他们的硬件设备和智能手机、网络连接在一起。Thingsquare 管理服务器,提供借助网络管理设备的所有必需软件。

2015年8月,Contiki 3.0 发布,距离上一版本2.7也有两年之久,而这两年 IoT 发展态势良好:各大主流半导体厂商基本都推出了 IoT 的无线连接方案(6LoWPAN, ZigBee, BLE, Thread 等等,TI 更是宣称其向 Contiki 社区贡献了所有 Contiki 6LoWPAN 开发成果。),甚至一些大大小小的互联网公司都在搭建 IoT 的后端云平台。我们还可以看到 Contiki 在 Github 上的代码提交情况,我想造成最近几年的频繁提交应该就是各大厂商不断推出新的芯片解决方案以及新的应用场景需求不断涌现。

Contiki Contributions Graph

背景讲完了,可以来感受一下 Contiki 的开发体验。

Contiki 官方为了降低入门的门槛,专门制作了一个包含所有工具和源码的 Ubuntu 镜像,让大家通过虚拟机的方式运行镜像。如果你觉得这种方式适合你,可以参考官方教程。我一开始贪图简单也跟着去下载镜像,结果跟同事一开口说起这事,感觉从头到脚被鄙视了一通。于是决心在 OSX 搭建原生开发环境,不依靠镜像和虚拟机。

克隆 Contiki 最新源码

克隆 Contiki master 分支的源码到你自己指定的目录:

$ git clone https://github.com/contiki-os/contiki.git

设置编译工具

Contiki 使用的 GCC-ARM 编译工具,可以在 GCC ARM Embedded 下载最新的交叉编译工具链,解压到自己指定的目录,再将该目录添加到环境变量中:

#在~/.bash_profile文件最后添加以下命令:
export PATH="/your-path-to-gcc/gcc-arm-none-eabi-5_3-2016q1/bin:$PATH"

#再运行以下命令使其生效:
$ source .bash_profile

#使用以下命令确认路径是否设置正确:
$ echo $PATH

#使用以下命令确认交叉编译工具是否可以工作,这里你将看到编译器的版本信息:
$ arm-none-eabi-gcc -v

另外,Contiki 同时支持 8051 架构的 MCU,例如 CC2530 等等,这类器件的编译工具 SDCC,可以在这里下载,然后使用类似前面介绍的方法添加环境变量即可,这里不再赘述。

安装 SRecord 工具

这里是 SRecord 作者自己关于该工具的介绍:

I wrote SRecord because when I was looking for programs to manipulate EPROM load files, I could not find very many. The ones that I could find only did a few of the things I needed. SRecord is written in C++ and polymorphism is used to provide the file format flexibility and arbitrary filter chaining. Adding more file formats and filters is relatively simple.

简单的说,我们用它来生成可用于烧录的 hex 文件。在 OSX 上可以使用 brew 进行安装:

#一杯咖啡☕️的时间,如果出现 error 可以再运行此命令。
$ brew install srecord

编译示例

基本工具已经准备好了,接着就是编译示例了。我这里选用 TI 的 SimpleLink™ CC2650 Wireless MCU LaunchPad™ Kit 作为硬件开发平台。

CC2650LP_v1.2_Perspective

针对 CC26xx 平台你还需要在 Contiki 目录运行以下命令以确保使用最新的 cc26xxware.

# 确保使用最新的 cc26xxware
$ git submodule sync && git submodule update --init

接下来就可以 make 你的 cc26xx-demo 了:

#在contiki/examples/cc26xx目录运行
$ make TARGET=srf06-cc26xx BOARD=launchpad/cc2650

下载运行 Demo

可以把 hex 文件拷到 windows 机器用 SmartRF Flash Programmer 2 下载:
使用 SmartRF Flash Programmer 2 下载固件

下载完代码,运行,你可以通过调试器的用户串口看到一些信息输出:
cc26xx-demo-contiki

补充

这样就完啦,先等一下,有没有发现要把代码拷到 Windows 去下载太扯淡了,后来我也探索出了在 Mac OSX 上直接下载固件的方法,不妨再看一下:

CC26xx 内部 ROM 嵌入了一个简单的 bootloader,我们可以通过UART0 或者 SSI0 下载 firmware,要使能该功能,需要对 CCFG 参数进行配置,修改 /contiki/cpu/cc26xx-cc13xx/lib/cc26xxware/startup_files/ccfg.c,更改内容如下,然后再 make 编译,用 SmartRF Flash Programmer 2 烧录这个 firmware 就可以激活 UART0 bootloader 的功能。

//#####################################
// Bootloader settings
//#####################################

// #define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE         0x00       // Disable ROM boot loader
#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE            0xC5       // Enable ROM boot loader

#define SET_CCFG_BL_CONFIG_BL_LEVEL                     0x0        // Active low to open boot loader backdoor
//#define SET_CCFG_BL_CONFIG_BL_LEVEL                   0x1        // Active high to open boot loader backdoor

#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER                0x0E       // DIO number for boot loader backdoor

#define SET_CCFG_BL_CONFIG_BL_ENABLE                    0xC5       // Enabled boot loader backdoor
//#define SET_CCFG_BL_CONFIG_BL_ENABLE                  0xFF       // Disabled boot loader backdoor

Contiki 自带 UART 下载 firmware 的python脚本,在 Mac OSX 上还需要安装 pyserial 工具,点击下载

解压后,在 pyserial-x.x 的目录下运行以下命令完成安装。

$ sudo python setup.py install

按住 CC2650 LaunchPad BTN-2 按键上电,使其进入 bootloader 模式,运行以下命令即可完成下载:

#PORT参数设置为你使用的串口的名称
$ make TARGET=srf06-cc26xx BOARD=launchpad/cc2650 cc26xx-demo.upload PORT=/dev/cu.usbserial-xxxx

到这里基本的开发环境就搭建完毕了,后面我会写一篇关于 Contiki 6LowPAN 的文章做进一步探索。



如无特殊说明,本文版权归本文作者及「创客日记」所有,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

转载请注明:来自「创客日记」https://makerdiary.co/getting-started-with-contiki/