Howto

Armadillo-640 + BT/THオプションモジュールでLE Coded PHY(Long-range モード)

本HowtoではBT/THオプションモジュールのファームウェアを書き換え、LE Coded PHY(Long-range モード)による通信でのAdvertiseとConnectを行う手順について紹介します。

2021年7月現在、BT/THオプションモジュールに標準で書き込まれているBT用ファームウェアではLE Coded PHYでのAdvertiseは可能ですが、Connectには対応していません。

LE Coded PHYに対応した装置はまだ少ないので、本HowtoではセントラルとペリフェラルともにArmadilloを使っています。

Armadillo-640のOSがDebianかArmadillo Base OSかによって以降の手順が異なる場合があります。ご自身の環境に合った方の手順に沿って実施して下さい。

使用するもの

準備

本手順では、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_monitorheart_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上にダウンロードしてください。

pc-ble-driver用ファームウェア

以下のコマンドを実行してダウンロードしたアーカイブファイルを展開してください。

[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_monitorheart_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