使用 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 的開發體驗。

體驗開發

Contiki 官方為了降低入門的門檻,專門製作了一個包含所有工具和源碼的 Ubuntu 鏡像,讓大家通過虛擬機的方式運行鏡像。如果你覺得這種方式適合你,可以參考官方教程。我一開始貪圖簡單也跟著去下載鏡像,結果跟同事一開口說起這事,感覺從頭到腳被鄙視了一通。於是決心在 OSX 搭建原生開發環境,不依靠鏡像和虛擬機。

克隆 Contiki 最新源碼

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

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

設置編譯工具

Contiki 使用的 GCC-ARM 編譯工具,可以在 [GCC ARM Embedded](GNU ARM Embedded Toolchain) 下載最新的交叉編譯工具鏈,解壓到自己指定的目錄,再將該目錄添加到環境變數中:

#在~/.bash_profile文件最後添加以下命令:nexport PATH="/your-path-to-gcc/gcc-arm-none-eabi-5_3-2016q1/bin:$PATH"nn#再運行以下命令使其生效:n$ source .bash_profilenn#使用以下命令確認路徑是否設置正確:n$ echo $PATHnn#使用以下命令確認交叉編譯工具是否可以工作,這裡你將看到編譯器的版本信息:n$ arm-none-eabi-gcc -vn

另外,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 可以再運行此命令。n$ brew install srecordn

編譯示例

基本工具已經準備好了,接著就是編譯示例了。我這裡選用 TI 的 SimpleLink? CC2650 Wireless MCU LaunchPad? Kit 作為硬體開發平台。

針對 CC26xx 平台你還需要在 Contiki 目錄運行以下命令以確保使用最新的 cc26xxware.

# 確保使用最新的 cc26xxwaren$ git submodule sync && git submodule update --initn

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

#在contiki/examples/cc26xx目錄運行n$ make TARGET=srf06-cc26xx BOARD=launchpad/cc2650n

下載運行 Demo

可以把 hex 文件拷到 windows 機器用 SmartRF Flash Programmer 2 下載:

下載完代碼,運行,你可以通過調試器的用戶串口看到一些信息輸出:

補充

這樣就完啦,先等一下,有沒有發現要把代碼拷到 Windows 去下載太扯淡了,後來我也探索出了在 Mac OSX 上直接下載固件的方法,不妨再看一下:

CC26xx 內部 ROM 嵌入了一個簡單的 bootloader,我們可以通過UART0 或者 SSI0 下載 firmware,要使能該功能,需要對 CCFG 參數進行配置,修改 /contiki/cpu/cc26xx-cc13xx/lib/cc26xxware/startup_files/ccfg.c,更改內容如下,然後再編譯,用 SmartRF Flash Programmer 2 燒錄這個 firmware 就可以激活 UART0 bootloader 的功能。

//#####################################nn// Bootloader settingsnn//#####################################nn// #define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 // Disable ROM boot loadernn#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 // Enable ROM boot loadernn#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x0 // Active low to open boot loader backdoornn//#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x1 // Active high to open boot loader backdoornn#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0x0E // DIO number for boot loader backdoornn#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 // Enabled boot loader backdoornn//#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF // Disabled boot loader backdoorn

Contiki 自帶 UART 下載 firmware 的 python 腳本,在 Mac OSX 上還需要安裝 pyserial 工具,點擊下載 。

解壓後,在 pyserial-x.x 的目錄下運行以下命令完成安裝。

$ sudo python setup.py installn

按住 CC2650 LaunchPad BTN-2 按鍵上電,使其進入 bootloader 模式,運行以下命令即可完成下載:

#PORT參數設置為你使用的串口的名稱n$ make TARGET=srf06-cc26xx BOARD=launchpad/cc2650 cc26xx-demo.upload PORT=/dev/cu.usbserial-xxxxn

到這裡基本的開發環境就搭建完畢了,後面我會寫一篇關於 Contiki 6LowPAN 的文章做進一步探索。


推薦閱讀:

「智能城市」比拼,美國「矽谷」恐不及中國「烏鎮」

TAG:物联网 | 开源硬件 | 嵌入式开发 |