組み込み開発奮闘記(1)

最近、組み込み開発に寄っている144Labの入江田です。

f:id:irieda:20190625103805p:plain

組み込み向け開発を始めるにあたってどんなことを検討しているかなどをご紹介します。

組み込み開発といっても大きく2種に分かれます。

  • RaspberryPiなどのLinuxカーネルを載せたPC-OS上にアプリケーションを置くもの
  • 組込み用OSまたはOSなしでもっと省電力分野に向いたマイコンベースの上にアプリケーションを置くもの

ここでは後者をターゲットにする場合を解説します。

アーキテクチャ選択肢

いまどきのオープンハードウェア向きな選択肢は以下の7シリーズ

  • AVRシリーズ
    • オープンハードウェアの火付け役Arduinoで採用
    • 素直なアーキテクチャと当時の価格帯の割に大きめのメモリ
    • なのでブートローダー方式が実装しやすかった
    • ESPが出てしまってからは性能、コストともに負けてる
    • 古参だけに拡張ボードの豊富さはダントツ
  • ATSAMDシリーズ
    • USB-CDCやUSB-MSD機能をもっている点が良い
    • USB-MSDの無いボードに書き込み機として載せられたり
    • adafruitがこのシリーズの製品を多く出してる
  • STMicroシリーズ
    • ほとんどのラインナップで単コア無線無し
    • コストパフォーマンスの高さで評判
  • nRF5xシリーズ
    • BLE機能内包タイプの定番、SDKの品質を含めトップランナー
    • nRF52840はUSB-CDCやUSB-MSD機能があります(なのでadafruitが採用製品をいくつか出してる)
  • ESPシリーズ
    • WiーFi機能付きで最安のシリーズ。
    • USBフィーチャーを持っていない
    • チップ単価が安いのでWi-Fiのないボードにモデムとして載せられるパターンが増えた
  • u-bloxシリーズ
    • Wi-Fi機能付き、BLE機能付きなどがある
    • ESPに比べ省電力
    • Wi-Fi付きにしては価格がESPよりは高いが他社のよりは安い
  • RISC-Vアーキテクチャ
    • 製品はまだ少ないがARM一色に傾倒しそうな世に対するカウンター
    • BSDライセンスでライセンス料が不要なアーキテクチャ
    • ESPのように低コストでSoCを提供するところがチラホラ

AVR、RISC-Vなどは独自のアーキテクチャ、特にESPはXtensaという名前のアーキテクチャです、それ以外はARMのCortex M0/M3/M4です。ARM派生プロセッサは他にもたくさんのメーカーが出してる。特にnRF5xシリーズは半導体をNordicが提供するんだけどモジュール化するサードパーティがたくさんある。そのためBLE内包タイプではNordicが世界シェアの50%を抑えてる。

ターゲットデバイスの選択

開発時のサイクルをどう回すかに関して以下のいずれかの機能が必要になります。

  1. インサーキットプログラミング機能の有無
  2. USBシリアル変換チップまたはUSB-CDC機能の有無
  3. 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またはモジュール
    • USBサポート内蔵のため開発しやすい
    • NFC/Bluetooth5/CryptoProcessorなどてんこもり
    • 最新の後継ラインナップにLoRa対応、LTE-M対応がある
    • ISP1807
      • SIP
      • アンテナ内蔵で最もコンパクト
      • 技適あり
    • MDBT50Q
      • モジュールパッケージ
      • 技適あり
    • BL654
  • ESP8266
    • 破格のWi-Fi内蔵チップ(@2ドル)
    • IoT製品がたくさん生まれることになった火付け役
  • ESP32
    • 8266から複数コア化+Bluetooth機能を追加
    • M5Stackに採用されて爆売れ
    • 最近単コア版がリリース

処理系の選択

コンパイル

インタープリタ

  • smartBASIC
  • MicroPython
  • CircuitPython
  • Node.js
  • mruby

Flash書き変え戦略

  • フル書き換え方式

    • 先頭から必要なバイナリをすべて書き込む
    • SWD/JTAG-USB-CDCの中継機(デバッガ)を使う
    • 保護領域や電源管理領域などあらゆる領域を上書きできる
    • おおむね高価なデバッガが必須
  • ブートローダー方式

    • フラッシュメモリの後方に居座らせる
    • シリアルやUSB-CDCまたはUSB-MSD経由で書き換え可能
    • 通常のアプリケーションの書き込みではブートローダー本体を書き換えできないようにしている
  • ブートローダー+VMランタイム方式

後者であるほどアプリケーションの更新が容易です。 フル書き換え方式も固定領域を予め書き込んでおいて部分的書き換えでアプリケーションの更新を行うこともできます。

組み込み開発に慣れた人がフル書き換え方式を使ってターゲットに適合するブートローダーをビルド。 ブートローダーを予め書き込んだ状態のターゲットをチーム内で共有してアプリケーションの開発をするという二段構えがおすすめです。

実際の選択肢

フル書き換え方式

  • 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書き変え戦略のおすすめ

  1. シリアル経由でDFUを可能にする
  2. BLE経由でDFUを可能にする
  3. USBデバイス経由でDFUを可能にする

ファーム開発する人や出荷する人などの全員に高価なプローブが必要な状況は避けたいので最低でも1.を確保したいところ。あとは2.や3.があるとよりファーム開発者の環境構築が容易になって助かるでしょう。

開発環境のおすすめ

  1. SEGGER Embedded Studio

    • 裏方はGNU-C+nRF-SDK
    • nRF-SDK利用のためある機能はほぼ使える
    • 軽快
    • 安定動作
    • ターゲット選択に制約が少ない
    • nRF51、nRF52シリーズに限り無料で商用利用可能
    • J-Link連携が強力
  2. CircuitPython

    • 準高機能
    • コードがシンプルで入門しやすい
    • 依存解決が楽で開発速度が早い
    • メモリがしっかりあるターゲットに限定
    • 用意されていないことをやるときにハードルが上がる
    • 割り込みや省電力サポートが弱い
    • あくまで動作実証用
  3. ArduinoIDE

    • 1.と2.の間くらい
    • 本当は複雑な依存解決を簡単にしてくれる
    • 裏方は結構複雑
    • 豊富なライブラリ
    • ちょっと深いことをするときはC++に踏み込む必要が出てくる

まとめ

今後触れることになるであろうデバイスの条件は

  • BLE対応かLoRa、更に将来的にLTE-Mを使いたい
  • PoCはCircuitPythonで
  • 本格運用ではBLE-DFU対応ブートローダーで
  • 上記条件からnRF52シリーズやその後継シリーズが望ましい
  • だとするとSEGGER Embedded Studioが適してるっぽい
  • 同シリーズがターゲットなら特にOSは不要

なのでSEGGER Embedded Studioをガッツリ使うときの奮闘記事を 今後順次書いていく予定です。