本HowtoではBT/THオプションモジュールのファームウェアを書き換え、LE Coded PHY(Long-range モード)による通信でのAdvertiseとConnectを行う手順について紹介します。
LE Coded PHYに対応した装置はまだ少ないので、本HowtoではセントラルとペリフェラルともにArmadilloを使っています。
Armadillo-640のOSがDebianかArmadillo Base OSかによって以降の手順が異なる場合があります。ご自身の環境に合った方の手順に沿って実施して下さい。
使用するもの
- Armadillo-640 + BT/THオプションモジュール を2セット
- Armadillo-640のOSがDebianの場合:ATDE8が使用できるPC
- Armadillo-640のOSがArmadillo Base OSの場合:ATDE9が使用できるPC
準備
本手順では、2台のArmadillo-640をそれぞれセントラル、ペリフェラルとして接続し、ペリフェラルから1秒ごとに送られてくるデータをセントラルで受信して表示するサンプルを実行します。
ATDEのセットアップ
本手順では、開発環境としてATDE8かATDE9を使用しています。 ATDE8のセットアップが完了していない場合は、 こちら を、ATDE9のセットアップが完了していない場合は、こちら を参考にセットアップを完了させてください。
ATDE起動後、以下のコマンドを実行し本手順で必要なパッケージをインストールしてください。
[ATDE]$ sudo dpkg --add-architecture armhf
[ATDE]$ sudo apt update && sudo apt upgrade -y
[ATDE]$ sudo apt install -y g++-arm-linux-gnueabihf libasio-dev libudev-dev libudev-dev:armhf
BT/THオプションモジュールの動作確認
次に、Armadillo-640+BT/THオプションモジュールが正しく動作することを確認します。
以下のマニュアルを参考に、BT/THオプションモジュールが正しくArmadillo-640に認識され、動作することを確認してください。
Debian の場合:Armadillo-640 製品マニュアル Armadillo-600シリーズ BT/THオプションモジュール
Armadillo Base OS の場合:Armadillo-640 製品マニュアル Armadillo-600 シリーズ BT/TH オプションモジュールを利用する
pc-ble-driverのダウンロード
以下の作業はATDE上で行ってください。
Armadilloがシリアル経由でBT/THオプションモジュールを操作するために、pc-ble-driverのセットアップを行います。
以下のコマンドを実行し、LE Coded PHY対応のpc-ble-driverのソースコードをcloneしてください。
[ATDE]$ git clone https://github.com/atmark-techno/pc-ble-driver.git -b armadillo
ビルド
以下のコマンドを実行してサンプルプログラムのビルドを行います。
[ATDE ~/pc-ble-driver]$ cd at_build
[ATDE ~/pc-ble-driver/at-build]$ make CROSS_COMPILE=arm-linux-gnueabihf-
ビルドが成功すると、Armadillo上で実行できるheart_rate_monitor
とheart_rate_collector
が生成されます。
[ATDE ~/pc-ble-driver/at-build]$ ls heart_rate_monitor heart_rate_collector
heart_rate_collector heart_rate_monitor
ファームウェアの書き込み
次に、生成したプログラムを実行するために、BT/THオプションモジュールのファームウェアを書き換えます。
以下の手順はBT/THオプションモジュールを接続したArmadillo-640上で行ってください。 Armadillo-640 の OS が Debian の場合はこちらを Armadillo BASE OS の場合はこちらの手順でファームウェアの書き換えを行って下さい。
Armadillo-640 の OS が Debian の場合
以下からファームウェアが含まれるアーカイブファイルをArmadillo-640上にダウンロードしてください。
以下のコマンドを実行してダウンロードしたアーカイブファイルを展開してください。
[armadillo]$ ls firmware.tar.gz
firmeare.tar.gz
[armadillo]$ tar xf firmware.tar.gz
[armadillo]$ ls firmware/connectivity_1.0.0_usb_with_s140_6.1.1.hex
firmware/connectivity_1.0.0_usb_with_s140_6.1.1.hex // ファームウェア本体
以下のコマンドを実行し、BT/THオプションモジュールにファームウェアを書き込むために必要なパッケージをインストールします。
[armadillo]$ sudo apt update && sudo apt upgrade -y
[armadillo]$ sudo apt install -y openocd-imx
次に以下のコマンドを実行し、BT/THオプションモジュールにconnectivity_1.0.0_usb_with_s140_6.1.1.hex
を書き込みます。
[armadillo]$ cd firmware
[armadillo ~/firmware]$ sudo openocd -f interface/imx6-armadillo-640-con9.cfg -c \
"transport select swd; set WORKAREASIZE 10; adapter_nsrst_delay 100; \
adapter_nsrst_assert_width 100; source [find target/nrf52.cfg]" -c \
"init; targets; halt;" -c "nrf51 mass_erase" -c "flash write_image \
connectivity_1.0.0_usb_with_s140_6.1.1.hex 0; reset halt; targets; verify_image \
connectivity_1.0.0_usb_with_s140_6.1.1.hex 0; reset run; targets; exit"
成功すると、BT/THオプションモジュールが/dev/ttyACM*
(*は数字)として認識されます。
この手順を、もう1台のArmadillo-640+BT/THオプションモジュールでも行ってください。
Armadillo-640 の OS が ABOS の場合
以下のコマンドを実行して、Armadillo-640上にファームウェアを書き込むためのコンテナをダウンロードしてください。
[armadillo ~]# curl -s https://download.atmark-techno.com/misc/howto_long-range-on-armadillo-640/firmware-at-pc-ble-driver-writer-v1.0.0.tar | podman load
次に以下のコマンドを実行して、BT/THオプションモジュールのファームウェアを書き換えます。
[armadillo ~]# podman run --privileged --cap-add=CAP_SYS_RWIO localhost/firmware-at-pc-ble-driver-writer
最後にコンテナイメージを削除します。
[armadillo ~]# podman rmi localhost/firmware-at-pc-ble-driver-writer
動作確認
以下、セントラル側のArmadillo-640を「セントラル」、ペリフェラル側のArmadillo-640を「ペリフェラル」と表記します。
Armadillo-640 の OS が Debian の場合はこちらを Armadillo BASE OS の場合はこちらの手順で動作確認を行って下さい。
Armadillo-640 の OS が Debian の場合
ATDEから、セントラルにはheart_rate_collector
を、ペリフェラルにはheart_rate_monitor
を転送してください。
プログラムの実行のために、セントラル・ペリフェラルそれぞれで以下のコマンドを実行してください。[username]は適宜読み替えてください。
[armadillo]$ chmod +x heart_rate_*
[armadillo]$ sudo usermod -a -G dialout [username]
[armadillo]$ logout
ログアウト後に再度ログインしてから、セントラル、ペリフェラルそれぞれでサンプルプログラムを実行して下さい。
Armadillo-640 の OS が Armadillo Base OS の場合
セントラル・ペリフェラルそれぞれで以下のコマンドを実行して、動作確認用のコンテナを用意します。
動作確認用コンテナの設定ファイルを作成します。
[armadillo ~]# cat /etc/atmark/containers/pc-ble-driver_example.conf
set_image docker.io/debian
set_command sleep infinity
add_devices /dev/ttyACM0
コンテナを起動します。
[armadillo ~]# podman pull docker.io/debian
[armadillo ~]# podman_start pc-ble-driver_example
コンテナ内で/bin/bashを起動してログインします。
[armadillo ~]# podman exec -it pc-ble-driver_example /bin/bash
[container /]#
ATDEからコンテナ内に、セントラルにはheart_rate_collector
を、ペリフェラルにはheart_rate_monitor
を転送してください。
動作確認の実行例
サンプルプログラムを実行することで、LE Coded PHYでペリフェラルがアドバタイズを、セントラルがスキャンを始め、セントラルがペリフェラルを見つけると自動的に接続し、毎秒3ずつ増加していく値を送受信し続けます。
- プログラム実行例: ペリフェラル
[armadillo]$ ./heart_rate_monitor /dev/ttyACM0
Serial port used: /dev/ttyACM0
Baud rate used: 1000000
Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none.
Status: 6, message: Target Reset performed
Status: 7, message: Connection active
Advertising data set
Services initiated
Characteristics initiated
Started advertising
Connected, connection handle 0x0001 // セントラルと接続すると出力される
- プログラム実行例: セントラル
[armadillo]$ ./heart_rate_collector /dev/ttyACM0
Baud rate used: 1000000
Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none.
Status: 6, message: Target Reset performed
Status: 7, message: Connection active
Scan started
// 以下はペリフェラルがアドバタイズし、それを見つけると出力される
Received advertisement report with device address: 0xAAAAAAAAAAAA
Connection established
Discovering primary services
Received service discovery response
Discovered heart rate service. UUID: 0x180D, start handle: 0x000E, end handle: 0xFFFF
Discovering characteristics
Received characteristic discovery response, characteristics count: 1
Characteristic handle: 0x000F, UUID: 0x2A37
Discovering characteristic's descriptors
Received descriptor discovery response, descriptor count: 3
Descriptor handle: 0x000F, UUID: 0x2803
Descriptor handle: 0x0010, UUID: 0x2A37
Descriptor handle: 0x0011, UUID: 0x2902
Press enter to toggle notifications on the HRM characteristic // Enterを押下
Setting HRM CCCD
Received write response.
Received heart rate measurement: 68 // 1秒ごとに値がペリフェラルから送られてくる
Received heart rate measurement: 71
Received heart rate measurement: 74
Received heart rate measurement: 77
Received heart rate measurement: 80
Received heart rate measurement: 83
: (以下略)
Appendix
プログラムの編集
本手順で生成したheart_rate_monitor
とheart_rate_collector
のソースコードは、pc-ble-driver/examples/内にあります。
APIの仕様などはpc-ble-driverの公式ドキュメントを参照してください。
BT/THオプションモジュールのファームウェアをもとに戻す
BT/THオプションモジュールのファームウェアを、標準のBT用ファームウェアに戻す際は、 Armadillo-640 の OS が Debian の場合はこちらを Armadillo BASE OS の場合はこちらのコマンドを実行してください。
Armadillo-640 の OS が Debian の場合
[armadillo]$ sudo apt reinstall firmware-at-bt
Armadillo-640 の OS が Armadillo Base OS の場合
[armadillo ~]# curl -s https://armadillo.atmark-techno.com/files/downloads/armadillo-640/container/firmware-at-bt-writer-latest.tar | podman load
[armadillo ~]# podman run --privileged --cap-add=CAP_SYS_RWIO localhost/firmware-at-bt-writer
[armadillo ~]# podman rmi localhost/firmware-at-bt-writer