B-U585I-IOT02A RGBDイメージングと組み込みウェブサーバのデモ

概要

図1: カメラドーターボードコネクタにカメラ
モジュールUM1379を装着したB-U585I-IOT02A
ディスカバリボード

STMicroelectronicsのB-U585I-IOT02Aディスカバリボードには、注目のSTM32U5 MCUに組み込まれた拡張機能を強調するために選択された、様々なセンサ、接続オプション、その他の機能が搭載されています。標準的なLEDやプッシュボタンの他に、以下のようなものがあります。

  • 外部メモリ
    • 512Mビット クアッドSPIフラッシュ
    • 64Mビット オクトSPI PSRAMM
    • 256Kビット I2C EEPROM
  • MEMSセンサ
    • デジタルマイクロフォン 2個
    • 相対湿度・温度センサ
    • 3軸磁力計
    • 3D加速度センサおよび3Dジャイロセンサ
    • 圧力センサ
    • Time-of-flight(ToF)およびジェスチャ検知型センサ
    • 周囲光センサ
  • RFモジュール
    • 802.11 b/g/n準拠のMXCHIP製Wi-Fi®モジュール
    • STMicroelectronicsのBluetooth® Low Energy
  • ボードコネクタ
    • USB Type-C®
    • ARDUINO® Uno V3拡張コネクタ
    • カメラモジュール拡張コネクタ
    • STMod+ 拡張コネクタ 2個
    • Pmod™ 拡張コネクタ
  • STSAFE-A110 セキュリティ・認証ソリューション
  • USB再エニュメレーション機能を備えた、オンボードSTLINK-V3Eデバッガ/プログラマ:マスストレージ、バーチャルCOMポート、デバッグポート

カメラモジュールコネクタ、ToFセンサ、USB Type-Cコネクタの特長を活用し、B-U585I-IOT02Aを初歩的なRGBD(RGB+Depth)撮像デバイスとして利用するデモアプリケーションを作成しました。このアプリケーションを実現するために、B-U585I-IOT02AとカメラモジュールMB1379(B-CAMS-OMVキットにバンドル)を図1のように組み合わせました。超低消費電力デバイスが実現した優れたパフォーマンスの一例として、STM32U5 MCUはこのモジュールからRGB画像を収集し、同じシーンのToF測距データとともに、接続されたPCにリアルタイムで送信していることがあげられます。これは、仮想ネットワークアダプタとして構成されたUSB Type-Cポート経由でアクセス可能な組み込みウェブサーバをホストすることによって実現されています。これにより、画像データの供給とフォーマットのための普遍的なフレームワークを提供するだけでなく、以下の図2に示すようなユーザーインターフェースの容易な作成をサポートします。

u5_demo_final

図2: B-U585I-IOT02AデモアプリケーションのためにHTML、CSS、
JavaScriptを使用して作成したユーザーインターフェース

キーコンポーネント

このデモアプリケーションはかなり複雑で、上記の結果を得るために、いくつかの外部ハードウェア、高度なMCUペリフェラル、および組み込みソフトウェアコンポーネントを使用しています。このセクションでは、同様のものを実装することに興味がある人のために、これらの要素のうち最も注目すべきものについて簡単に説明します。もし、もっと詳しく説明した方が良いと思われるトピックがあれば、この投稿に返信でお知らせください!

Azure RTOS ThreadX

2021年現在、Microsoft® Azure® RTOS組み込みソフトウェアコンポーネントは、すべての新しいSTM32シリーズ(STM32U5シリーズなど)のSTM32Cube MCUパッケージに直接統合されています。つまり、Azure RTOS ThreadXは、FreeRTOSに代わって、STM32アプリケーションに最適なRTOSとなりました。NetX Duo、USBX、FileX、LevelXといった他のAzure RTOSコンポーネントも、LwIP、mbedTLS、ST USB、FatFSといったソフトウェアスタックに代わって、STミドルウェアソリューションの重要な位置を占めています。このデモ・アプリケーションは、STM32CubeMXによる高度な設定可能性があり、これらのコンポーネントとSTM32Cubeエコシステムへの緊密な統合を最大限に活用しています。

組み込み型ウェブサーバ

このアプリケーションの中心は、Azure RTOS NetX DuoネットワークスタックのWeb HTTPアドオンを使って作成した組み込みWebサーバです。これによって、2つのサーバインスタンスが作成されます。1つのインスタンス(ポート81)は、カメラモジュールからクライアントにJPEG画像を継続的に送信するために使用されます。その際、MJPEGビデオストリームが作成されます。2番目のサーバインスタンス(デフォルトのポート80)は、ToFセンサからの最新の測距データの提供、ビデオストリームの有効化/無効化、ディスカバリボードの赤色LEDの状態の切り替えなど、その他のすべてのクライアント要求を処理します。これら2つのサーバインスタンスは、すべてのオペレーションを同時に実行するために必要です。対応するコードは、app_netxduo.cファイルにあります。

ウェブサーバのファイルは、MCUの内部フラッシュメモリにある組み込みファイルシステムに格納されています。このファイルシステムは、Azure RTOS FileXを使用して構築されたものです。ファイルシステムがフラッシュメモリに作成される典型的なシナリオでは、NAND/NORメモリで利用可能な消去操作の数が限られているため、ウェアレベリング方式が実装されることに留意してください。Azure RTOSは、まさにこの目的のためにLevelXコンポーネントを提供しています。しかし、このアプリケーションでは、ウェブファイルはファイルシステムから読み取るだけで、書き込んだり変更したりしないので、ウェアレベリングは必要ありません。したがって、Azure RTOSのLevelXは使用されていません。

ネットワークの接続性

ディスカバリボードとのネットワーク接続を確立するために、USB Type-Cポートは、USB Communications Device Class(CDC)を使用して仮想ネットワークアダプタとして構成されました。より具体的には、Ethernet制御モデルサブクラス(ECM)を使用して、USB上でのEthernetパケット転送を容易にしました。CDC-ECMデバイスクラスは、Azure RTOS USBXプロトコルスタックでサポートされており、Azure RTOS NetXおよびNetX Duoネットワークスタックと連携して組み込みウェブサーバへのアクセスを提供します。STM32CubeMXのコードコンフィギュレータを使えば、プロジェクトにUSBXコンポーネントを追加し、USBデバイスフレームワークにCDC-ECMデバイスクラスを選択するのが非常に簡単です。プロジェクトのGitHubリポジトリにあるSTM32CubeMXの設定ファイル(b-u585i-iot02a_camera_demo.ioc)を開いて、ご自身で確認してください。

なお、Linux、MacOSともにUSB CDC-ECMクラスのネイティブサポートを提供していることに注意して下さい。ただし、WindowsのPCで本ディスカバリボードとネットワーク接続する場合は、サードパーティ製のCDC-ECMドライバが必要です。

カメラビデオストリーム

B-U585I-IOT02Aディスカバリー ボードを使ってカメラ モジュールを操作する」で示した使用方法と同様に、STM32U5 のDCMIペリフェラルを使用して、カメラモジュールとインターフェースし、提供される画像をキャプチャします。ただし、このデモアプリケーションでは、イメージセンサ(MB1379カメラモジュール上のOV5640)は、JPEG形式の画像を提供するように設定されています。これらの画像は、RGB565形式の画像に比べてサイズが非常に小さいため、1)内部SRAMの境界を超えることなくダブルバッファリング方式を使用でき、2)画像をタイムリーにウェブクライアントに送ることができます。ダブルバッファリング方式では、DMAペリフェラルは、前の画像がウェブサーバから送信されている間に、新しい画像をメモリに並行して格納することができます。

VL53L5CXデプスマップデータストリーム

VL53L5CX ToFセンサの使用方法」で説明した手順で、VL53L5CX マルチゾーン測距ToFセンサ用のドライバをプロジェクトに追加しました。その後、APIを使用して、8×8の解像度で測距データを継続的に取得し、ウェブクライアントからの要求があるたびにこのデータを読み取るようにセンサを設定しました。

測距データのストリームは、定期的に実行されるJavaScript関数を使用して作成され、最新のデータ値を要求し、それらを使用して図2および8に示す色分けされた深度マップを更新します。この深度マップは、HTMLのキャンバス要素を使用してレンダリングされ、2つのテキストボックス入力により、いくつかの視覚化パラメータが設定されます。「Frequency」パラメータで深度マップ画像のフレームレートを、「Max Distance」パラメータでカラースケールで表現できる最大距離を設定することができます。これらの結果を生成するJavaScriptコードは、プロジェクトのGitHubリポジトリにあるindex.htmlファイル内にあります。

自分でやってみる

ハードウェアを入手し、開発ツールをインストールすれば、このデモアプリケーションを自分で実行し、それを基に開発を開始することができます。要件は以下の通りです。

手順

  1. project’s GitHub repositoryからソースコードをダウンロードします。

  2. プロジェクトディレクトリの .projectファイルをダブルクリックします(図3を参照)。STM32CubeIDE が起動し、ワークスペースとしてディレクトリを選択するよう要求されるはずです。希望のディレクトリを選択し、「Launch」をクリックします。プロジェクトがワークスペースに正常にインポートされるはずです。

openProject

図3: STM32CubeIDEで.projectファイルをダブルクリックして、デモプロジェクトを開く

  1. プロジェクトエクスプローラでプロジェクトを選択し、Project > Build Projectを選択します。図4に示すように、プロジェクトはエラーなく正常にビルドされるはずです。

図4: STM32CubeIDEを使用して、デモプロジェクトをビルドする

  1. 図1に示すように、MB1379 カメラモジュールをB-U585I-IOT02Aディスカバリボードに接続します。STLKマイクロB USBコネクタ(CN8)を使用して、ディスカバリボードをPCに接続します。JP4ジャンパはデフォルトの「5V_USB_STLK」の位置にあることに注意してください。

  2. STM32CubeIDEで、Run > Runを選択します。アプリケーションの初回実行なので、「Edit Configuration」ウィンドウが表示されるはずです。設定を変更しないまま、「OK」をクリックします。ダウンロードが完了するのを待ちます。

  3. STM32CubeProgrammerアプリケーションを起動します。ディスカバリボードをPCに接続したまま、「Connect」ボタンをクリックしてボードに接続します。

  4. +」タブをクリックし、「 Open File」を選択します。プロジェクトディレクトリに移動し、web content/web_server.binファイルを選択します。

  5. 図5に示すように、「Download」ボタンの隣にあるドロップダウン矢印をクリックします。アドレスの値を 0x08100000に変更します。アドレスを変更したら、「Download」ボタンをクリックします。図6に示すように、内部メモリのセクタ[128 255]のみが消去されたことが確認できます。

図5: WebサーバのバイナリファイルをMCUにダウンロードする前に、メモリアドレスを変更する


図6: メモリセクタ[128 255]のみを変更すること

  1. ファイルのダウンロードが完了したら、「Disconnect」ボタンをクリックしてボードの接続を切断します。

  2. ターミナルアプリケーション(Tera Termなど)を開き、STLink Virtual Comポートを開きます。つぎにボーレートを115200に変更し、改行動作を期待通りの結果になるように変更します(例えばTera Termで Setup > Terminal… を選び、Receiveオプションを「AUTO」に変更)。

  3. 基板上の黒いリセットボタンを押し、USB Type-Cコネクタ(CN1)を使用してLinuxまたはMacOSを実行しているPCに接続します。Windowsを実行しているPCを使用したい場合は、サードパーティのCDC-ECMドライバをインストールするか、仮想マシンを使用する必要があります。図7のようなターミナル出力が表示されるはずです。次のステップのために、IPアドレスをメモしておいてください。

getIPAddress

図7: ネットワーク接続が確立されると、端末に出力される

  1. 後に、CN1に接続されたPCでウェブブラウザを開きます。アドレスバーに、ターミナル出力で提供されたIPアドレスを使用して、<ip_address>/index.htmlと入力します。例えば10.42.0.86/index.htmlというアドレスを使用します。図8に示すように、デモのユーザーインターフェースが表示されるはずです。「Start Stream」ボタンを押すと、ビデオのストリーミングが始まります。

図8: デモアプリケーションの動作




オリジナル・ソース(English)