文| 谷歌開發技術專家 (GDE) 王玉成 (York Wang)

物聯網 (IoT) 的應用開發,離不開跟開發板打交道,我們需要配置好開發板的各種環境,最後才能用 Android Studio 進行應用開發。

我們今天就以 Raspberry Pi 3 為例,一起來搭建 Android Things 的開發環境。

硬體準備

Raspberry Pi 3 的硬體開發板就長這樣:
這裡寫圖片描述

開發板是有了,但是我們應該怎麼用開發板呢?那好,我們先進一步瞭解並分析開發版的功能:
這裡寫圖片描述

玩過 Raspberry Pi 3 的人可以略過這段,但是對於首次上手的玩家,有幾點要注意:
事項 1:別費盡心思找電源了,開發板用的 Micro USB 口做供電介面。別找個電源介面卡,拼命往音訊介面上塞啦,這麼搞廠商也很頭疼的。
事項 2:做什麼樣的事找什麼樣的位置。每個介面有每個介面特定的作用。看著文字對上號,根據方案選擇特定的模組就行了。

那麼多 GPIO 口啊……怎麼辦?我有針腳恐懼症的。
- 沒問題,我們就先來了解針腳的作用,就可以玩轉開發板了。
這裡寫圖片描述

等等,我怎麼知道開發板哪個地方是第一根針腳啊?
- 在電路板上,找到 GPIO 針腳,離 USB 介面最遠的那一端,對了,開發板上應該有一個 J8 標記, 就是那位置為 1 號針腳,只需要找到這幾根針腳就夠了。供電是引出 5V 還是 3.3V 的電源針腳,跟你自己的電路有關,切記在連線之前把電壓搞清楚,不然會燒掉器件的。接下來認出 UART, SPI, PWM, I2C 介面,依據自己的需求,找一個麵包板,就可以拉線出來幹活了。

硬體認清楚了,這是第一步,還要找找開發版的外設,一般說外設就是供電,顯示,儲存,輸入這幾大塊。
microUSB 給電源供電;
HDMI 用來顯示;
有線或者 Wi-Fi 用來連線網路;
microSD 卡以及讀卡器用來燒寫系統。

配備完這些外設,搭好麵包板,就可以動手燒寫系統了。

下載映象

開始找地方下載映象了,映象連結在此:
developer.android.com/things/preview/download.html

上一講提到的 4 個開發版的映象都可以下載。

Raspberry Pi 3 最新的映象壓縮包名為 androidthings_rpi3_devpreview_2.zip,下載完壓縮包,解壓縮之後,只有一個檔案 iot_rpi3.img,我們來看看是什麼格式的檔案:
這裡寫圖片描述

這些資訊好像還不足以讓我們判斷映象的內容,但是可以明確的是,這是一個可以做啟動的映象檔案。那我們來看看映象內部包含了哪些內容?
這裡寫圖片描述

通過映象的內容,我們看到映象的內部結構。其中 rpi boot 是 Raspberry Pi 的 secondary boot,後續就是 uboot,接下來,就是 uboot 所引導的系統檔案了。做過 uboot 級別移植的人,應該十分清楚 bl1, bl2, uboot 的一些概念,這裡就不做詳細解釋了。

這裡再囉嗦幾句,我們看一下 Developer Preview 1 版本的映象,以 Edison 開發版的映象為例:
這裡寫圖片描述

可以看到,在 Developer Preview 1 這一版中,分成了許多檔案,並且提供了燒寫指令碼,還提供了 fastboot 和 ADB 工具。但是,對於初學者來說,如何正確使用這些工具成了一個難題。所以在 Dev Preview 2 的版本中,把這些檔案合併成一個 image 檔案,燒寫就變的很簡單了。還是要為 Google 的貼心讚一讚,每一版的改進都會讓開發者用起來更方便。

細心的讀者會發現,兩個開發版的映象檔案中,有些檔案內容是不同的,主要是 bootloader 及之前的可執行程式碼。有興趣的讀者可以對比一下 x86 和 arm 的架構的 bootloader 的不同的地方及作用。

Edision 的映象檔案中間,還包括一個檔案,似乎在回顧著某種歷史,如果你找出來了,就請在下方留言吧。

燒寫映象到 SD 卡

Raspberry Pi 的外接儲存裝置是 microSD 卡,以下簡稱 SD 卡。由於 Linux, Windows, Mac 的燒寫的工具也不盡相同,我們以 Linux 為例說一下燒寫步驟,燒寫的命令只要是 dd,但是千萬不要 dd 到你的硬碟上去了!

最安全的燒寫流程如下:
$ df -h 命令,檢視一下當前有哪些裝置,如果電腦不能識別 SD 卡,那麼開始第 2 步,如果電腦已經識別 SD 卡,記下來 SD 卡是哪個裝置,就可以走第 3 步了;
把 SD 卡插上,重複第一步;
$ sudo dd bs=4M if=iot_rpi3.img of=/dev/sdx 命令,確定自己的 SD 卡的裝置號,然後把下載的 img 檔案燒寫到 SD 卡上 ,這一步需要 root 許可權哦。這兒要提醒一句,不是燒寫到 SD 卡的某個分割槽,而是燒寫到這個 SD 卡所在的裝置上。
$ sync 命令,同步資料到 SD 卡。

Windows 系統下,用 Win32DiskImager 工具,用管理員許可權,燒寫 img 檔案到 SD 卡即可。

Mac 系統下也是用 Linux 下的命令:
$ sudo dd bs=1m if=image.img of=/dev/rdisk

啟動開發板

把已經燒寫過 Android Things 的 mciroSD 卡插到 Raspberry Pi 3 的對應位置,就可以啟動開發板了。

按以下的步驟去啟動開發板:
這裡寫圖片描述
用 microUSB 供電;
插入網線;
插入 HDMI 介面。

大概第一次系統啟動要一到兩分鐘,耐心等待就行。

系統啟動完之後,顯示器顯示了當前有線網的的 IP 地址,以及 Wi-Fi 還沒有連線上的狀態。那麼,我們可以藉助有線網的 IP,去連線 ADB:
$ adb connect
connected to :5555

由於 Raspberry Pi 是支援 DNS 廣播的,如果你的電腦支援 MDNS 功能,執行命令:
$ adb connect Android.local

連線成功後,會返回:
connected to :5555

這樣我們的 ADB 就正常連上Raspberry Pi 3了。藉助 ADB ,我們可以連線 Wi-Fi 了。
這裡寫圖片描述

其中包含了使用者名稱和密碼,如果你的密碼為空,不加 -e passphrase 這個引數即可。

接下來就要檢查 Wi-Fi 是否正確連上了:
這裡寫圖片描述

出現上面的訊息,表明 Wi-Fi 是正常啟動了。那 DNS 是否通呢?撥下網線,然後 ping 一下試試。
這裡寫圖片描述

連線串列埠用於除錯

現在雖然 ADB 連上去了,網路也通了,但是事情才剛剛開始。我們在工作前期,引入一種比較方便的除錯方法,那就是嵌入式開發中骨灰級的除錯方式:串列埠除錯:
這裡寫圖片描述

對著上圖,拿著 USB 轉 TTL 的線,找到 GPIO 的針腳上的 UART 的 TXD 和 RXD 兩根針。然後再找到地線,連線相應的杜邦線就可以了。稍等,四個針腳,為啥有一個針腳不連呢,那個不是供電線嗎?由於 USB 轉 TTL 線,在 USB 這端已經供電了,所以 VCC 介面不需要連了。

這兒需要注意的是,RX 和 TX 是交叉的,不是直連的。因為開發板上的 TX 就是 USB 這邊的 RX。RS-232 和 TTL 的區別,這兒就略過了。

然後就要開始用 PC 機上的串列埠除錯軟體來連線 USB 轉串列埠了。三大系統的工具又不太一樣。Windows下有 putty, secruCRT 等,Linux 下有 Mimicom, Mac 下有 Serial。根據自己的作業系統來選用吧。不過記各把波特率設為 115200, 8N1, 然後不要用流控,不管硬流控也好,還是軟流控也好,統統的不選。以前看過太多的血一般的教訓,選了流控,結果花好長時間跟蹤,串列埠什麼列印也沒有,但是示波器上卻能看到串列埠資料……這時間不值。
關掉開發板電源,然後撥出 SD 卡。用 PC 機讀 SD 卡。然後把 cmdline.txt 這個檔案中的這一行:這裡寫圖片描述
刪掉即可。不過作為嵌入式開發人員,誰捨得關串列埠呢?是麼?當然,如果你的開發中,有串列埠裝置做其它用途,是可以關掉串列埠輸出的。

下一講就開始 Android Things 的 SDK 的分析了。
這裡寫圖片描述