最近、組み込み開発に寄っている144Labの入江田です。
組み込み向け開発を始めるにあたってどんなことを検討しているかなどをご紹介します。
組み込み開発といっても大きく2種に分かれます。
ここでは後者をターゲットにする場合を解説します。
アーキテクチャ選択肢
いまどきのオープンハードウェア向きな選択肢は以下の7シリーズ
- AVRシリーズ
- ATSAMDシリーズ
- USB-CDCやUSB-MSD機能をもっている点が良い
- USB-MSDの無いボードに書き込み機として載せられたり
- adafruitがこのシリーズの製品を多く出してる
- STMicroシリーズ
- ほとんどのラインナップで単コア無線無し
- コストパフォーマンスの高さで評判
- nRF5xシリーズ
- ESPシリーズ
- WiーFi機能付きで最安のシリーズ。
- USBフィーチャーを持っていない
- チップ単価が安いのでWi-Fiのないボードにモデムとして載せられるパターンが増えた
- u-bloxシリーズ
- RISC-Vアーキテクチャ
AVR、RISC-Vなどは独自のアーキテクチャ、特にESPはXtensaという名前のアーキテクチャです、それ以外はARMのCortex M0/M3/M4です。ARM派生プロセッサは他にもたくさんのメーカーが出してる。特にnRF5xシリーズは半導体をNordicが提供するんだけどモジュール化するサードパーティがたくさんある。そのためBLE内包タイプではNordicが世界シェアの50%を抑えてる。
ターゲットデバイスの選択
開発時のサイクルをどう回すかに関して以下のいずれかの機能が必要になります。
- インサーキットプログラミング機能の有無
- USBシリアル変換チップまたはUSB-CDC機能の有無
- USB-MSD機能の有無
1.に関しては今どきのマイコンデバイスは必ず内包していますが、概ね高価なプログラマが必要になります。量産する場合を除き、開発段階では2.か3.の機能がほしいところ。2.か3.があれば対応するブートローダーを予めファームウェアとして入れておくことでプログラマを必要とせずにアプリケーションの更新ができます。 また、2.の機能はアプリケーション実行時のログ出力に使えるので3.のUSB-MSDによるファームウェアアップデートは便利なんだけど、できれば2.もあったほうが良いでしょう。
あとは必要なマイコンスペック。
- フラッシュメモリ容量
- RAM容量
- CPU性能(クロック、コア数)
- 必要なファンクションがカバーされているか
開発時のみフラッシュメモリの大きいものを使うといったことが有効な場合もあります。(デバッグシンボルなどは容量がかさむので)
あと、IoTデバイスを実現するのであればネットワークインフラをどのように確保するか。
- 不要
- シリアル通信またはBLE経由シリアル通信
- Wi-Fi機能+動作現場に無線AP+インターネット回線
- X+Xゲートウェイ+インターネット回線
- 6LowPAN/Thread
- LoRa
- BLE Mesh
- Zigbee
- ANT+
実際の選択肢
- ATSAMD21/51
- USBサポート内蔵のため開発しやすいCPUの始祖
- CPU性能の引き上げ版を最近リリース
- STM32
- STM32は異常に価格が安く性能控えめという位置づけだった
- F4はCortex-M4相当で動作クロックを大幅に引き上げたが割高
- nRF52系のSIPまたはモジュール
- ESP8266
- 破格のWi-Fi内蔵チップ(@2ドル)
- IoT製品がたくさん生まれることになった火付け役
- ESP32
- 8266から複数コア化+Bluetooth機能を追加
- M5Stackに採用されて爆売れ
- 最近単コア版がリリース
処理系の選択
コンパイル型
インタープリタ型
- smartBASIC
- MicroPython
- CircuitPython
- Node.js
- mruby
Flash書き変え戦略
フル書き換え方式
ブートローダー方式
後者であるほどアプリケーションの更新が容易です。 フル書き換え方式も固定領域を予め書き込んでおいて部分的書き換えでアプリケーションの更新を行うこともできます。
組み込み開発に慣れた人がフル書き換え方式を使ってターゲットに適合するブートローダーをビルド。 ブートローダーを予め書き込んだ状態のターゲットをチーム内で共有してアプリケーションの開発をするという二段構えがおすすめです。
実際の選択肢
フル書き換え方式
- J-Link(下流:SWD/JTAG,上流:USB-CDC) <- お高いが高速&高機能
- ST-Link(下流:SWD/JTAG,上流:USB-CDC)
- DAP-Link(下流:SWD/JTAG,上流:USB-MSD)
- Blackmagic/Bumpy(下流:SWD,上流:USB-CDC)
ブートローダー方式
- Arduino
- nRF-Connect(USB-CDC, Nordic only)
- Adafruit-nRF52-Bootloader(USB-MSD)
- U-Boot
- mcuboot(zephyrなどが利用)
- nRF-SDKのdfuブートローダーサンプル
開発環境
コンパイル言語むけ環境
OSの選択
- OSなしでSDKのみで開発
- Zephyr
- NuttX
- FreeRTOS
VM言語環境
- CircuitPython
- mruby
- nodejs
開発の容易さは「VM系>>OSあり>>OSなし」で、マイコンリソース消費も同じく「VM系>>OSあり>>OSなし」です。
ただし、最近のチップベンダ提供のSDKは軽量なOSライク機能も提供していてそれで十分であればOSなしでもあまり困らないでしょう。他社のアーキテクチャとの移植性を確保したい時や複数アプリケーションの同居などが必要な場合にOSの採用を検討すると良いと思います。
あと、日本に限ってですが、ZephyrがNordicが提供するsoftdeviceを利用せずに独自のBLEスタック(bluez)をもってNordicチップから電波を吹くことについては技適の適用範囲を超える可能性があるので注意が必要です。
Flash書き変え戦略のおすすめ
- シリアル経由でDFUを可能にする
- BLE経由でDFUを可能にする
- USBデバイス経由でDFUを可能にする
ファーム開発する人や出荷する人などの全員に高価なプローブが必要な状況は避けたいので最低でも1.を確保したいところ。あとは2.や3.があるとよりファーム開発者の環境構築が容易になって助かるでしょう。
開発環境のおすすめ
SEGGER Embedded Studio
CircuitPython
- 準高機能
- コードがシンプルで入門しやすい
- 依存解決が楽で開発速度が早い
- メモリがしっかりあるターゲットに限定
- 用意されていないことをやるときにハードルが上がる
- 割り込みや省電力サポートが弱い
- あくまで動作実証用
ArduinoIDE
- 1.と2.の間くらい
- 本当は複雑な依存解決を簡単にしてくれる
- 裏方は結構複雑
- 豊富なライブラリ
- ちょっと深いことをするときはC++に踏み込む必要が出てくる
まとめ
今後触れることになるであろうデバイスの条件は
- BLE対応かLoRa、更に将来的にLTE-Mを使いたい
- PoCはCircuitPythonで
- 本格運用ではBLE-DFU対応ブートローダーで
- 上記条件からnRF52シリーズやその後継シリーズが望ましい
- だとするとSEGGER Embedded Studioが適してるっぽい
- 同シリーズがターゲットなら特にOSは不要
なのでSEGGER Embedded Studioをガッツリ使うときの奮闘記事を 今後順次書いていく予定です。