ブログ

Armadillo-640:BLEのUSBドングルを使ってみる

at_kazutaka.bito
2018年10月23日 15時29分

Armadillo-640で、下記のBLEのUSBドングルを使ってみました。
 USB-BT40LE(アイ・オー・データ)
 BSBT4D100(バッファロー)
 MM-BTUD43(サンワサプライ)
 LBT-UAN05C1(エレコム)
例として、BLE通信のセンサータグ「CC2650」(テキサスインスツルメンツ)との接続を確認しました。

1.Bluetoothのデバイスドライバの有効化

Armadillo-640 製品マニュアル
18.2. イメージをカスタマイズする
を参考に、Bluetoothのデバイスドライバを有効にしたカーネルイメージを作成します。

カーネルコンフィギュレーションの画面を開きます。

atmark@atde7:~/linux-v4.14-at[version]$ make ARCH=arm armadillo-640_defconfig
atmark@atde7:~/linux-v4.14-at[version]$ make ARCH=arm menuconfig

下記の★の箇所を有効(カーソルを合わせて"y"キーを押す)にします。
(下記は、設定箇所の付近のみ抜粋しています。)

[*] Networking support  --->
  [*]   Bluetooth subsystem support  --->   ★有効にする
    Bluetooth device drivers  --->
      [*] HCI USB driver                    ★有効にする
      [*]   Broadcom protocol support (NEW)
      [*]   Realtek protocol support (NEW)

ビルドします。

atmark@atde7:~/linux-v4.14-at[version]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
atmark@atde7:~/linux-v4.14-at[version]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

上記手順で生成されたuImage

atmark@atde7:~/linux-v4.14-at[version]$ ls arch/arm/boot/uImage
uImage

で、Armadillo-640のカーネルイメージを書き換えます。

参考)カーネルイメージの書き換え方
Armadillo-640 製品マニュアル
11.2.2. Linuxカーネルイメージの書き換え

2.Bluetooth通信に必要なパッケージのインストール

上記1の手順のカーネルを書き込んだArmadillo-640をインターネットに接続できるネットワークに有線LANで接続します。
以下、Armadillo-640のコンソール上での操作になります。

root@armadillo:~# apt-get update
root@armadillo:~# apt-get upgrade
root@armadillo:~# apt-get install usbutils
root@armadillo:~# apt-get install bluetooth

補足)usbutilsは、Bluetooth通信と直接関係はありませんが、
 下記でBLEデバイス確認にlsusbコマンドを使用するためにインストールしてます。

3.Armadillo-640にBLEのUSBドングルを装着

BLEのUSBドングル
 USB-BT40LE(アイ・オー・データ)
 BSBT4D100(バッファロー)
 MM-BTUD43(サンワサプライ)
 LBT-UAN05C1(エレコム)
のいずれかをArmadillo-640のUSBコネクタに装着します。

※)USB-BT40LEのみ

[ 3195.592336] Bluetooth: hci0: BCM: chip id 63
[ 3195.598308] Bluetooth: hci0: BCM: features 0x07
[ 3195.634347] Bluetooth: hci0: BCM20702A
[ 3195.639347] Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
[ 3195.645526] bluetooth hci0: Direct firmware load for brcm/BCM20702A1-0a5c-21e8.hcd failed with error -2
[ 3195.654995] Bluetooth: hci0: BCM: Patch brcm/BCM20702A1-0a5c-21e8.hcd not found

というファームウェアのロードに関するメッセージがでます。
(BCM20702A1-0a5c-21e8.hcdの箇所は、ファームウェアの時期によって違う場合があると思われます。)
Broadcom Bluetooth firmware for Linux kernel を参考に、
BCM20702A1-0a5c-21e8.hcdをインターネットからダウンロードして、

root@armadillo:~# mkdir -p /lib/firmware/brcm

で作成した/lib/firmware/brcmに置きます。
USB-BT40LEをUSBコネクタに装着し直すと

[ 3515.010327] Bluetooth: hci0: BCM: chip id 63
[ 3515.016307] Bluetooth: hci0: BCM: features 0x07
[ 3515.051336] Bluetooth: hci0: BCM20702A
[ 3515.056347] Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
[ 3516.199344] Bluetooth: hci0: BCM20702A1 (001.002.014) build 1764
[ 3516.239340] Bluetooth: hci0: Broadcom Bluetooth Device

のようにファームウェアのロードに関するメッセージは解消されます。

補足)USB-BT40LEと、BSBT4D100、MM-BTUD43、LBT-UAN05C1で装着時のメッセージが異なるのは、
BLEデバイスの違いとかんがえられます。

BLEデバイスは、lsusbコマンドで確認できます。
USB-BT40LEの場合、

root@armadillo:~# 
Bus 002 Device 003: ID 0a5c:21e8 Broadcom Corp. BCM20702A0 Bluetooth 4.0

BSBT4D100、MM-BTUD43、LBT-UAN05C1の場合、

root@armadillo:~# 
Bus 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)


4.BLE通信のセンサータグ「CC2650」との通信を確認

スキャンして、CC2650が見えることを確認します。
(以下の説明では、CC2650のMACアドレスを[CC:CC:CC:CC:CC:CC]としています。)

root@armadillo:~# hcitool lescan
(略)
[CC:CC:CC:CC:CC:CC] CC2650 SensorTag

gatttoolで接続します。

root@armadillo:~# gatttool -b [CC:CC:CC:CC:CC:CC] -I
[[CC:CC:CC:CC:CC:CC]][LE]> connect
Attempting to connect to [CC:CC:CC:CC:CC:CC]
Connection successful

プライマリサービスを確認します。

[[CC:CC:CC:CC:CC:CC]][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0009, end grp handle: 0x001b uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x001c, end grp handle: 0x0021 uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x0022, end grp handle: 0x0029 uuid: f000aa00-0451-4000-b000-000000000000
attr handle: 0x002a, end grp handle: 0x0031 uuid: f000aa20-0451-4000-b000-000000000000
attr handle: 0x0032, end grp handle: 0x0039 uuid: f000aa40-0451-4000-b000-000000000000
attr handle: 0x003a, end grp handle: 0x0041 uuid: f000aa80-0451-4000-b000-000000000000
attr handle: 0x0042, end grp handle: 0x0049 uuid: f000aa70-0451-4000-b000-000000000000
attr handle: 0x004a, end grp handle: 0x004e uuid: 0000ffe0-0000-1000-8000-00805f9b34fb
attr handle: 0x004f, end grp handle: 0x0053 uuid: f000aa64-0451-4000-b000-000000000000
attr handle: 0x0054, end grp handle: 0x005a uuid: f000ac00-0451-4000-b000-000000000000
attr handle: 0x005b, end grp handle: 0x0062 uuid: f000ccc0-0451-4000-b000-000000000000
attr handle: 0x0063, end grp handle: 0xffff uuid: f000ffc0-0451-4000-b000-000000000000

ハンドルされているプロファイルのUUIDを確認します。
(下記は、0x20-0x30の場合)

[[CC:CC:CC:CC:CC:CC]][LE]> char-desc 20 30
handle: 0x0020, uuid: 00002908-0000-1000-8000-00805f9b34fb
handle: 0x0021, uuid: 00002904-0000-1000-8000-00805f9b34fb
handle: 0x0022, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0023, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0024, uuid: f000aa01-0451-4000-b000-000000000000
handle: 0x0025, uuid: 00002902-0000-1000-8000-00805f9b34fb
handle: 0x0026, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0027, uuid: f000aa02-0451-4000-b000-000000000000
handle: 0x0028, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0029, uuid: f000aa03-0451-4000-b000-000000000000
handle: 0x002a, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x002b, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x002c, uuid: f000aa21-0451-4000-b000-000000000000
handle: 0x002d, uuid: 00002902-0000-1000-8000-00805f9b34fb
handle: 0x002e, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x002f, uuid: f000aa22-0451-4000-b000-000000000000
handle: 0x0030, uuid: 00002803-0000-1000-8000-00805f9b34fb

温度センサの有効化のハンドルと、温度データのハンドルを確認します。
CC2650 SensorTag User's Guide

IR Temperature Sensor
の項目より、

UUID:AA01(温度データ)
UUID:AA02(0x01:有効、0x00:無効)

と記載されています。

上記のUUIDの確認の結果より、

handle: 0x0024, uuid: f000aa01-0451-4000-b000-000000000000

UUID:AA01(温度データ)のハンドルは、0x24

handle: 0x0027, uuid: f000aa02-0451-4000-b000-000000000000

UUID:AA02(0x01:有効、0x00:無効)のハンドルは、0x27
であることがわかります。

温度センサーを有効にします。

[[CC:CC:CC:CC:CC:CC]][LE]> char-write-req 27 01

温度データを読み込みます。

[[CC:CC:CC:CC:CC:CC]][LE]> char-read-hnd 24
Characteristic value/descriptor: f0 0a dc 0d

(ここでは、生データから、温度(℃)への変換は省略します。)