Mbed-os5 runs on Arduino Nano 33 BLE Sense board

1.Arduino Nano 33 BLE Senseボードについて

Arduino Nano 33 BLE Senseボード(以下、単に本ボードと略)は、Arduinoの公式ページにて販売されているボードです。
https://store.arduino.cc/usa/nano-33-ble-sense
nRF52840のチップが搭載されており、更に複数のセンサーが実装されているために、本ボードを購入すれば追加のセンサー無しで面倒な配線も行わずに、即プログラムの作成に集中できます。
実は、本ボードにはMbedのOSを利用する仕組みがArduinoのデベロッパーの方々の努力で出来上がっています。
下記Arduinoのブログで、アナウンスされています。
https://blog.arduino.cc/2019/07/31/why-we-chose-to-build-the-arduino-nano-33-ble-core-on-mbed-os/
どの様に実装されているか興味のある方は、GitHubのソースコードをご覧ください。
https://github.com/arduino/ArduinoCore-nRF528x-mbedos
結果として、
Arduinoの正式ボードで、
Mbed OS(2020/2/13時点で、mbed-os-5.14.2)をコアとして、
Arduino開発環境下で、
通常のArduinoプログラムとして開発できる状況が整ったことになります。
Arduinoのデベロッパーの方々が、Arduino環境下でMbed OSをコアにシステム構築されたことに、敬意を表します。

2.何をしたいのか?

ズバリ、素のMbed OSでの動作を目指します。
ArduinoのIDEを使わずに、Mbed IDEで使用できる環境を構築することが目標です。
Mbedオンラインコンパイラで使用できることが最終目標です。

下記がMbedで使用する場合のピン接続です。
このピン接続情報は、Arduinoの環境では違う名称の可能性があるので注意願います。
/media/uploads/kenjiArai/pin_nano33ble.jpg

内蔵されているセンサーに接続されているI2Cの定義やセンサー電源の操作は下記に従って行います。

namepinMbed defined name
I2C SDA(Internal)P0_26I2C_SDA0
I2C SCL(Internal)P0_27I2C_SCL0
I2C(Internal) PullUp Resistor ON/OFFP1_0-
On board sensor power controlP0_22-
APDS power controlP0_20-

3.Mbed環境下でシステム構築に成功

・・・・・言い訳と前提条件

結果として、Mbed Studio(0.8.1)及びオンラインIDEで、mbed-os5.15.0を用いたサンプルプログラムの幾つかが、本ボード上で動作することが確認出来ました。
しかしいくつかの制限条件などがありますので、自分自身で試す場合には下記を注意願います。

注意点

(1) あくまでも自己責任として、対応できる方だけ実験してください。
(2) ボードにはArduino専用のBootloaderが書き込まれた状態で出荷されていますが、Mbed環境でプログラムを書き込むとBootloaderが上書きされて消えてしまいます。
Bootloaderの復活方法に関しては、私の方法を紹介しますが、復活を保証するものではありません。
(3) ボード搭載されているセンサーや機能をすべてMbed環境下で動作確認したわけではありません。Mbed上の動作保証しているわけではありません。
(4) Arduino用に開発されたボードですので、先ずはArduinoで動作させてみてください。
Bootloaderの復活には、Arduino開発環境が構築されていないと戻せませんので、その点もご注意願います。
(5) 私は、Windows10(64bit)とTera Termを中心にMbedの開発環境を構築しています。
他の環境での動作確認は行っていませんので、思いがけない不具合が発生するかも知れません。


USB機能に関しての言い訳
nRF52840はUSB制御機能を持っており、本ボードをArduinoのIDEで利用する場合には、このUSB経由でプログラムの書込みやシリアル通信を行うことが、基本コンセプトとして設計/販売されています。

これに対して、一般的なMbedボードでは、PCとの接続で仮想ドライブ(MSC)として認識させてドラッグ&ドロップでのプログラム書き込みが売りの一つで、インターフェイス用の別CPUが搭載されているのが通常です。
今回のMbed対応でも、本ボードへの書き込みはSWDライン(SWDIO+SWCLK)を利用して別ボードから行う方式です。
従って、書き込みとprintfを利用したDebugでは二つのボードをPCへ接続した状態で行います。
本ボードのUSB端子は、電源供給の為にPCへ接続して使用します。
nRF52840のUSB制御機能は、勿論プログラムで制御して活用出来ますし、Debugが終了すればインターフェイス用ボードとは切り離して本ボード単独で動作させることは可能です。

話は横道にそれますが、ワンチップでMbed対応しているボードも存在しています(存在していた?)。
https://os.mbed.com/platforms/mBuino/
mbed-os2で動作し、LPC11U24のUSB機能で自己のFLASHへの書き込みも制御しています。
スマートな方法ですので、この方式も広がって欲しいですが、オフライン環境で本格的なDebugとしてトレース機能を利用出来ない点がやはり普及の妨げでしょうか?

4.ハードウェア準備

ハードウェアは、本ボードと書き込み用LPC11U35ボードを用意する必要があります。
私は、下記を入手しました。
http://akizukidenshi.com/catalog/g/gK-12144/

ハードウェア結線

Arduino Nano 33 BLE SenseLPC11U35 Interface CPUコメント
J3:Pin2 (ボード裏のパッド)CN1:Pin3 P0_7SWDIO
J3:Pin3 (ボード裏のパッド)CN1:Pin4 P0_8SWCLK
JP3:Pin1  JP1_03CN2:Pin14 P0_18TX(Nano)->RX(DAPLink)
JP3:Pin2  P1_10CN2:Pin13 P0_19RX(Nano)<-TX(DAPLink)
JP2:Pin14  GNDCN2:Pin1 GNDGND

本ボードの回路図は、下記で公開されています。
https://content.arduino.cc/assets/NANO33BLE_V2.0_sch.pdf
/media/uploads/kenjiArai/nano_daplink.jpg
二つのボードからのmicroUSBは、2本ともPCに接続します。
SWD信号は大変ですが、ボードから直接はんだ付けして引き出す必要があります。
/media/uploads/kenjiArai/nano33ble_bottom.jpg

5.ソフトウェア開発環境の設定

1) LPC11U35の書込みプログラムの準備

今回は下記を使わせていただきました。
https://wiki.makerdiary.com/nrf52840-mdk/
紹介されているnRF52840-MDKには、DAPLinkとしてLPC11U35チップが使われており、コンパイル済のバイナリコードが下記で公開されています。
https://github.com/makerdiary/nrf52840-mdk/tree/master/firmware/daplink
LPC11U35への書込みは、SW1(ISP)を押したままSW2(RESET)を操作するとPCに「CRP DISABLD」という名称でマウントされるので、書込まれているfirmware.binを削除してから、上記のbinファイルをコピーすれば書き込みが行われます。
書込み完了後にSW1を押さずに起動すれば、「DAPLINK」として認識されます。
DETAILS.TXTでDAPLinkの内容を確認できます。

DETAILS.TXT

# DAPLink Firmware - see https://mbed.com/daplink
Unique ID: 1026000005a3b4e0000000000000000000000000??????
HIC ID: ???
Auto Reset: 1
Automation allowed: 1
Overflow detection: 1
Daplink Mode: Interface
Interface Version: 0253
Git SHA: 7b92e4c0ba84c1f9c914c162e0c56dcb4f7a4998
Local Mods: 1
USB Interfaces: MSD, CDC, HID, WebUSB
Interface CRC: 0x6c707f23
Remount count: 0
URL: https://wiki.makerdiary.com/nrf52840-mdk/

これで、DAPLinkの準備は完了です。

2) Mbed Studioによる開発環境

Mbed Studioをインストールしてください。
https://os.mbed.com/studio/
私は、0.8.1を使用しました。
起動後に[File]->[Import program]を選択し、プログラムをインポートします。
今回は、先ず下記テキストをコピー&ペーストしてURL部分に入力してください。
https://os.mbed.com/users/kenjiArai/code/Arduino_Nano33BLESense_examples/
下記のような画面になると思います。
/media/uploads/kenjiArai/1_2020-02-13.png
インポートが開始されるとダウンロードが始まりますが、すべてのファイルがローカルに落ちるまで結構時間がかかります。
ファイアウォールのプログラムの影響でうまくダウンロードできない可能性もあります。
私も最初はダウンロードされるファイルの一部が入手できずに苦労しました。
コーヒーブレイクしながら気長にお待ちください(画面右下の縁付近に回転するアイコンがあれば動作が継続しています)。
次に、下記画面でTargetに「ARDUINO_NANO33BLE」を探し出してください。
/media/uploads/kenjiArai/2_2020-02-13.png
Targetには、[Mbed OS platforms]、[Other platforms]、そして[MCUs and custom targets]に大分類されていますが、最後の[MCUs and custom targets]に入っていますので、かなり後半になります。
Search画面が現れますので、そちらで探すのも良いかもしれません。
見つからない場合には、ファイルのダウンロードが完了していないことも考えられます(私も一つの環境はすぐに見つけられましたが、別PCでは極端に時間がかかりました)。
準備が整えば、そのままコンパイルしてみてください。
warningはたくさん出ますが、エラーが発生せずにhexファイルが生成されれば成功です。
hexファイルは、
..\Mbed Programs\Arduino_Nano33BLESense_examples\BUILD\ARDUINO_NANO33BLE\ARMC6
のデレクトリー内に作られますので、そのhexファイルをDAPLINKのドライブにコピーすれば、通常のMbed動作と同じく書き込みが完了します。
ソースファイルを一切変更しないままコンパイルすれば、Lチカのプログラムが動き始めると思います。
サンプルプログラムには、複数のプログラムが入っていますので、select_example.hの中の数字を変更して各機能を確認してください。

select_example.h

#define EXAMPLE_NUMBER      0       // select 0 to 6

0以外に設定した場合には、TeraTermを起動して115200のボーレートでメッセージを表示して内容を確認出来ます。

3) On Line Compilerによる開発

本日(2020年2月13日)時点でMbedオンラインコンパイラで動作することが確認できましたが、確認作業にもう少し時間が必要なのでサンプルプログラムの公開は、今後とします。
やり方は、TYBLE-16の際と同様にターゲットボードを偽ってPinNameファイルなどを書き換えます。 今回の乗っ取りボードは、[nRF52840-DK]です。
https://os.mbed.com/platforms/Nordic-nRF52840-DK/
このボードは、nRF52840の世界では中心人物となるべき大切なボードのはずですが、Mbedのボード検索の下記からは見つけることが出来ません。
https://os.mbed.com/platforms/
どういう理由かは知りませんが、可哀そうな身の上です。
その割にはしっかりと個人のWebページは完成していて、オンラインコンパイラでボード指定できます。
質問で最古のものが11ヶ月経過しているので、一年近く放置されています。
Noridicさんは、MbedよりArduinoに力を入れているのでしょうか?

兎も角、サンプルプログラムを公開した時点でここの内容をアップデートします。

6.Arduino Bootloaderの復活

MbedのhexファイルをDAPLinkにて一度でも書き込んでしまうと、出荷時に書き込まれていたArduino専用の Bootloaderが上書きされて機能が失われてしまいます。
実は、Bootloaderのhexファイルは、下記に公開されています。
https://github.com/arduino/ArduinoCore-nRF528x-mbedos/tree/master/bootloaders/nano33ble
しかしながら、このhexファイルを上記で準備したMbedのDAPLinkで書き込んでもBootloaderは復活しませんでした。
私自身は、Arduinoに戻すことはないと思いますが、皆さん方の中にはArduinoに慣れ親しんだ方も多いと思いますので、Webで調べたところ、下記ブログを見つけました。
http://djynet.net/?p=969
ここのWalkerさんは、J-linkを使ってBootloaderを壊した時の対処法を述べています。
実は、彼の使っているファイルは、インストールしたArduinoの環境に関わるファイル群内に存在しているもので、皆さんも自分のPC内で探してください。
C:\Users\??????\AppData\Local\Arduino15\packages\arduino\hardware\mbed\1.1.4\bootloaders\nano33ble
私のPCでは、隠しファイル属性で上記に入っていました。
bootloader.hexを書き込んだところ、無事Arduinoで再び本ボードが使用できるようになりました。
これは復活を保証するわけでなく、たまたま私が上手く復活できたということを示しただけです。
私がインストールしているArduino IDEは、1.8.10です。
Mbedのプログラム書き込み前に、Arduinoにて必要なライブラリをインストールした上で動作確認を充分しておいてください。

7.サンプルプログラム

Mbed Studio用のサンプルプログラムは下記となります。

Import programArduino_Nano33BLESense_examples

Arduino board run on Mbed-os6.8.1 (only test purpose not official). Need Mbed Studio(1.3.1) not online compiler. If you compile on the online compiler, you can get a hex file but it does NOT work!!!

8.あるべき姿として

Mbedのソースファイルは、ご存じのようにオープンソースとしてGitHub上で公開されています。
https://github.com/ARMmbed/mbed-os
各ボードの対応はtargets内にあり、下記に興味深い場所があります。
https://github.com/ARMmbed/mbed-os/tree/master/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840
いかがですか?
TARGET_ARDUINO_NANO33BLE
の表記が見られます。
既にお判りのようにMbedのソースファイル内には、本ボードを使える準備が完璧に出来ています。
それでは何が足らないのでしょうか?
https://os.mbed.com/platforms/Nano_33_BLE_Sense/
のような個別のページ(上記はありませんのであしからず!!)とそのページ内に下記のボタンがあることです。
/media/uploads/kenjiArai/4_2020-02-13_191403.jpg
これさえ準備いただければ、Mbedオンライン上でも何の苦労もなく利用できます。
どなたかMbedの中の方が作業していただけると、良い環境になるのですが・・・・・期待しています。


Please log in to post comments.