DWM3000EVBを用いたUWB位置測位② ~PCデモ編~

## 1. 本記事の目標
+ DWM3000EVB間でUWB通信を行う
+ UWB通信の様子をPC上で可視化する
![demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/6f297c8b-2ab7-1e98-3d8b-c83998ec9dc6.gif)

## 2. 準備物
+ セットアップ用PC (ここでは今回使用したものを記載)
    + Panasonic社 Let's note CF-SV1 (Windows 11)
+ 制御用マイコン
    + Nordic Semiconductor社 nRF52840 DK　2台
        + nRF52840を手軽に動かすためのキット
+ UWB信号受信デバイス
    + Qorvo社 DWM3000EVB 2台
        + DWM3000を手軽に動かすためのキット
+ アクセサリ
    + ケーブル (MicroUSB <-> USB Type-A)　4本
    + USB Type-A ハブ 1つ
+ PC上のソフトウェア (インストール手順も含めて後述します)
    + [Segger Embedded Studio (SES) for ARM V6.20](https://www.segger.com/downloads/embedded-studio/)
        + nRF52840にプログラムを書き込むための統合開発環境
    + [DWM3000 API Software and API Guide](https://www.qorvo.com/products/d/da007992)
        + UWB送受信デバイスをnRF52840で動作させるためのサンプルプログラム
    + [nRF52840のSoftware Development Kit (SDK)](https://www.nordicsemi.com/-/media/Software-and-other-downloads/SDKs/nRF5/Binaries/nRF5SDK160098a08e2.zip)
        + nRF52840でサンプルプログラムを動かすときに必要となるプログラム一式
    + Tera Term (Windowsのみ対応)
        + 画面を持たないnRF52840に仮想的な画面を用意して動作確認を行う 
        + Mac OSの場合はTerminalで代用可能
              
+ 本実験は電波暗室で実施

## 3. ソフトウェアのインストールなどはこちら
+ [DWM3000EVBを用いたUWB位置測位① ~セットアップ編~](https://qiita.com/tukurida/items/e17481a2f9a9c7532dc1)

## 4. SES上でのデモプロジェクトのビルド
+ デモプロジェクトを選択
    + File -> Open Solutionからデモプロジェクト (twr_demo_nRF52840.emProject) を選択
    + APIのルートディレクトリ\DW3xxx_QM33_XR6.0C\DW3xxx_XR6.0C_24Feb2022\Release_XR6.0C\Software\Slotted_TWR_Demo_ARM\nRF52840_DK\Sources\twr_demo\twr_demo\NRF_Juniper\twr_demoの中にある
    + プロジェクトファイルの中にビルドすべきプログラム一式が既に含まれている
    ![place_project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/6827a789-8e2d-a569-3479-2869f9c6262e.png)

+ デモプロジェクトをビルド
    + これでマイコンに書き込むための実行ファイルが完成する
    + Build -> Build twr_demo_nRF52840
    ![how_to_build_demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/fec5f2a1-2bcc-1fe1-7f14-1b6a8ec459a6.png)


## 5. デバイスのセットアップ
+ nRF52840 DKの各種スイッチを揃える
    + 下図に従ってセット
    + ①は電源スイッチなので最初はOFFにしておく
    + ②は電源供給スイッチで，真ん中のVDDにしておく
        + それ以外のスイッチだと電力不足で動作が不安定になる
    + ③はDEFAULTにしておく
        + 詳細は不明
    ![how_to_set_up_nRF52840DK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/20d5e1fb-cd70-7ef7-3f97-0439b913b5be.jpeg)

+ DWM3000EVBのスイッチを揃える
    + 下図に従ってセット
    + 3V3_Arduinoの方にジャンパを切り替えておく
    + ![DWM3000EVBのセットアップ](fig/manual/how_to_set_up_DWM3000EVB.png)
    ![how_to_set_up_DWM3000EVB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/b3881ec4-ebe5-8c04-ec7e-07c1870c14b8.png)




+ nRF52840 DKとDWM3000EVBを連結
    + ケーブルでピン同士を半田付けしなくてもOK
    + 下図の通り水平に押し込んでください
     ![how_to_joint_devices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/79277f6b-08f7-edda-6a5e-7b64e50423fe.png)

+ 上記手順を2セット分行う

## 6. デバイスへのデモプログラム書き込み
+ デバイス2台をPCに接続
    + nRF52840のアダプタ (microUSB) とPC (USB Type-A) をデバイスごとに2本のケーブルで接続
    + PC側のUSBポートが不足する場合は別途USBハブを用意してください
+ 各デバイスの電源をONにする
    + nRF52840の電源スイッチをONにする
    + 起動直後にLED4つが一定時間点滅すれば正常起動
+ 各デバイスをSESに接続
    + Target -> Connect J-Link
        + 2台繋いでいるとどちらと接続するか聞かれる
        + デバイス接続は1台ずつしかできないのでまずはどちらかを選択しましょう
    + Target -> Download twr_demo_nRF52840
        + ダウンロード=書き込みの意
        ![how_to_write_firmware.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/fd0a9b7c-2792-5f42-f5e5-26d4c64b89c5.png)

        + nRF52840にプログラムを書き込む
        + 下のステータスバーが黄色の警告のみで赤色のエラーが出なければOK
        ![build_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/1b7c1d10-2fdb-8b4c-b93c-a7eecfa00c20.png)

+ 上記手順をもう1台のデバイスでも行う
    + Connect J-Linkでは先ほど選択したものと別のものを選択
    + あとは上記とまったく同様です

## 7. Tera Termのインストール
+ [こちらのページ](https://osdn.net/projects/ttssh2/releases/)からexeをダウンロード
    + バージョンは最新でOK
    ![how_to_download_teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/4d79d8ca-dd95-dbd4-4b31-3df8ae7b43f6.png)

+ インストーラを用いてインストール
    + 各項目はデフォルトのままインストールを進めてください

## 8. サンプルプログラムの実行 (Windows)
+ Tera Term1つ目を起動
    + 開くとポートの選択を要求される
    + どのデバイスの仮想画面を作るかに相当
    + USBシリアルデバイス2つのうち1つを選択
    ![set_up_teraterm_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/336e3a4e-e61a-6d26-6806-abb3389996b9.png)

+ Tera Term2つ目を起動
    + もう一方のUSBシリアルデバイスを選択
+ Tera Term上での動作確認
    + 各ターミナル上で"help"と打ってEnterを押すとコマンド一覧が出てくる
    + 以後コマンドが実行されると"ok"と返答がある
    + 表示が重なることがあっても気にしない
    ![check_teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/0ef4e450-eb4a-6093-c9a9-9bc9ef61a0b3.png)

+ Tera Term1つ目をUWB信号受信側に設定
    + "listener"と入力してEnter
    + listenerは後述のtagが送信するUWBパケットを受信して表示するコマンド
    + コマンドが実行されるとDWM3000EVBのLED2が緑色で点滅
    + 実行を止めるときは"stop"を入力してEnter
+ Tera Term2つ目をUWB信号送信側に設定
    + "tag"と入力してEnter
    + tagはUWBパケットをひたすら送信するコマンド
    + 実行を止めるときは"stop"を入力してEnter
+ 通信が確立されていることを確認して喜ぶ
    + 下図のように通信の様子が出力される (左がlistener，右がtag)
    + 1秒に2回のペースでパケットの受信が確認できる
    ![check_communication.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/c4bbc7ed-f709-dd4c-18fc-8020df0ec46e.png)

## 9. サンプルプログラムの実行 (Mac OS)
+ Tera Termの代用としてTerminalを使用
+ Terminal1つ目を起動してdevディレクトリへ移動
  ```
  cd ../
  cd ../
  cd dev
  ```
+ devディレクトリ内で以下のコマンドを入力してTTYを確認
  ```
  ls -l tty.*
  ```
    + Tera Termで選択するUSBシリアルデバイスに相当するものがここに表示される
    ![check_tty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/ffb341bc-0daa-e608-7b76-cd93e1c4620c.png)
    + 今回はCOM6とCOM9がそれぞれ`tty.usbmodem0000000000001`と`tty.usbmodem6`に対応していた

+ 1つ目のTerminalでscreenコマンドを実行
  ```
  screen tty.usbmodem6
  ```
+ Terminal2つ目を起動して同じくdevディレクトリ内でscreenコマンドを実行
  ```
  screen tty.usbmodem0000000000001
  ```
+ 以降はWindowsと同様に"listener"と"tag"コマンドを入力してパケットの送受信を行う
    + パケットの送受信が確認できた
![check_communication_mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362010/21a2919e-6a11-3afc-a983-d48d26bf3ab0.png)

## 10. 関連記事
+ [DWM3000EVBを用いたUWB位置測位① ~セットアップ編~](https://qiita.com/tukurida/items/e17481a2f9a9c7532dc1)

+ [DWM3000EVBを用いたUWB位置測位③ ~iOSデモ編~](https://qiita.com/tukurida/items/4b8fd6bcae04b0c1fb58)
+ [DWM3000EVBを用いたUWB位置測位④ ~AirTag傍受編~](https://qiita.com/tukurida/items/cfc9ded74661956a613b)