在Nordic nRF52晶片上跑Micropython

雖然在Micropython官方網站上主要的支持晶片中沒有看到Nordic nRF52, 但其實已經有支持了。只是目前還在開發早期階段中。可以先嘗鮮一下,但要有心理準備,有很多東西還不完備。

Tony D!的影片是一個不錯的開始!
另外官方網站關於nRF平台的說明,其實就放在GitHub。這裡放了程式碼以及簡單的安裝說明。

我使用nRF52840 DK開發板來嘗試:

這個板子大了一點,用在開發階段還不錯,如果真的要拿來用,可以改用nRF52840 Dongle,不但體積小巧,售價也便宜!只是燒錄firmware時較麻煩,下次有空時再來談。或者看看這篇文章


同樣地,這個平台Micropython官方沒有編好的firmware, 必須自己編!

1. 先找個環境來做編譯的工作,可以是Linux, Mac OSX, 或是Raspberry pi; 之前我使用過Raspberry pi來編ST NUCLEO-F401RE開發板。這一次改用Mac來試試。依GitHub說明,要使用git clone指令把Micropython的source code都複製下來,但嘗試了幾次都沒有成功編譯,都會出現錯誤訊息,主要是編譯tinyusb時會有程式碼找不到!想來是開發中的版本還不太完整吧!於是就在官方網站(http://micropython.org/download/)如下圖箭頭所指處,下載1.12的原始程式:


解壓縮(放到micropython-1.12目錄去)後再編,果然就正常編成功了!
編譯方法:
% cd micropython-1.12
% make -C mpy-cross
% cd ports/nrf
% make BOARD=pca10056

註:這裡可能碰到一些問題,看一下錯誤訊息在說什麼,再去解就可以了。例如,可能會說沒有gcc-arm-none-eabi; 那就去安裝這個工具,我在之前的貼文有提到這個工具。這個工具裡有很多執行檔,例如ld, ar, cc1等等,因為Mac會阻擋未簽證的程式執行,所以要在系統偏好設定的安全性與隱私權畫面裡設定它們可以執行。

2. 準備soft device
編成功的話,會出現一個 build-pca10056 的目錄,這個目錄裡可以找到 firmware.hex 的檔案。不過不要急著把這個檔案燒到板子去,因為燒過去也不會動!nRF的firmware必須配合nordic提供的藍牙堆疊(soft device), 我們要先去把它下載下來

./drivers/bluetooth/download_ble_stack.sh
執行上面這一行,如果出現錯誤訊息,一樣去解,例如我碰到找不到wget這支程式,那就去安裝wget: %brew install wget

3. 編譯完整的nrf micropython firmware
在成功下載soft device後(會看到成功的訊息),下以下指令:
% make BOARD=pca10056 clean
% make BOARD=pca10056 SD=s140

4. 燒錄firmware到開發板nRF52840 DK(pca10056)
% make BOARD=pca10056 SD=s140 sd

5. 嘗試連線到開發板的序列埠,使用REPL:
% ls -l /dev/cu.*
crw-rw-rw-  1 root  wheel   18,   1  4  1 15:32 /dev/cu.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   5  4 14 11:28 /dev/cu.usbmodem0006831xxxxxx

% screen /dev/cu.usbmodem0006831xxxxxx 115200
�r��z�����j��j���5������ѡrI�¢�j
                               Type "help()" for more information.
>>>
MPY: soft reboot
MicroPython v1.12 on 2020-04-13; PCA10056 with NRF52840
Type "help()" for more information.
>>>

按個Enter, 如果什麼都沒看到的話!
看到>>>提示符號,應該就是成功了。
按Ctrl-D會soft reboot, 就可以看到micropython的版本,編譯日期和硬體資訊。

6. 跑一下藍牙scan
放micropython source code的地方也有一個examples目錄,點進去後,找倒數第二支程式ubluepy_scan.py。把程式打上去執行,就可以看到:
關於python程式碼複製貼上的作法, 就是在>>>提示符號下按Ctrl-E, 複製貼上後再按Ctrl-D的方式, 在Tony D!ony D!的影片中可以看到在Linux VM機器下是會有問題的。不幸的是, 我在Mac OS下測試也是會有問題的, 這樣就很不方便了! 後來把MSD的功能先關掉,問題就解決了!關掉或打開MSD的方法,可參看我之前的帖子
不過, 在Windows下MSD功能沒關掉時, 我用Putty, 發現是可以正常運作的! 下圖, 複製貼上前面提到的ubluepy_scan.py範例程式, 並且執行scan 名稱為74119F9的裝置, 確實可以找到。



用nRF Connect工具scan一次, 做個對比, 可以看到確實example code執行的結果是正確的, 找到的MAC ADDRESS兩者是相同的。不過, 我有修改第24行的程式, 把s.scan(100)改成s.scan(2000), 目的是叫開發板scan 2秒鐘, 而不是0.1秒。比較不會有scan不到的情形。

7. 建一個服務和特徵值
就是examples裡的倒數第一支程式ubluepy_temp.py
這裡的temp是temperature的縮寫,不是暫時的意思!
解決了貼上程式的問題後,要貼上這支程式到開發板去就很容易了。


此時,使用任何BLE程式,例如nRF Connect, scan一下,就會看到一台名稱叫做micr_temp的裝置,連線進去後可以看到有一個Environmental Sensing的服務,其下有一個Temperature的特徵值。點入通知後,就可以看到温度改變時,特徵值的值會即時改變。(其實是每5秒變一次)


真是太棒了, 現在寫藍牙的程式也可以很簡單了!

留言

這個網誌中的熱門文章

D-BUS學習筆記

關於藍牙裝置找尋(inquiry, scan)兩三事

Cisco Switch學習筆記: EtherChannel