HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2017/08/17

Raspberry Pi 3の Python BLE pygattlibライブラリで TIの SensorTagに接続して制御する方法 Raspberry Pi 3の Python BLE pygattlibライブラリで TIの SensorTagに接続して制御する方法

(ラズパイ3と Python BLE pygattlibで TIの SensorTagのセンサーの値を取得とボタン状態の通知を受信する)

Tags: [Raspberry Pi], [電子工作]





● Raspberry Pi 3 Model Bを遂に購入

 Raspberry Pi3 Model B RPI2 RPI3

 大人気の CPUボードの Raspberry Piに WiFiと Bluetoothが搭載されたモデルが新発売となりました。
 以前から Raspberry Pi 2を買おうかどうか迷っていましたが、Raspberry Pi 3 Model Bの発売を機に購入を決意してラズベリアンになる事にしました。

 ※ ラズパイの OS Raspbianはバージョンが上がる毎に過去の版と OSの内部の作りが変わり、過去に書かれた製作記事(例えば Raspbian Wheezyの時代の記事)がそのままではエラーが出たりして動かない事が有ります。
 ※ 当方のホームページのラズパイ記事は全て Raspberry Pi 3 Model Bと Raspbian Jessieの組み合わせで動作確認をしております。
(ただし、将来的に新しい Raspbian OSが出た場合に、当方の Raspbian Jessieを基にした内容がそのままでは動かない可能性が有ります。)
 ※ 2017/08/16から Raspbian OSは Raspbian Jessieから Raspbian Stretchに変わりました。
 ※ 2019/06/20から Raspbian OSは Raspbian Stretchから Raspbian Busterに変わりました。

Download Raspbian for Raspberry Pi

ちなみに、歴代のバージョンと名称は
Debianコードネーム年月備考(参考)Ubuntuでの該当名称
Debian 11Bullseye2021/08/14~2021/11からラズパイにリリースFocal Fossa 20.04 LTS ?
Debian 10Buster2019/06/20~2019/06からラズパイ4対応Bionic 18.04 LTS
Debian 9Stretch2017/08/16~2018/03からラズパイ3B+対応Xenial 16.04 LTS
Debian 8Jessie2015~2016/02からラズパイ3対応Trusty 14.04 LTS
Debian 7Wheezy2013~2016
Debian 6.0Squeeze2011~2014
Debian GNU/Linux 5.0Lenny2009~2012


●ラズパイ3 + Python + pybluezで BLEセントラルを作成し Bluetooth BLEのペリフェラル機器を制御する

 ラズパイ3 + Python + pybluezで BLEセントラルを作成して、Bluetooth BLEの周辺機器を制御します。
 Node.jsを使う場合の nobleに相当します。

 ここでは BLEや Python pybluezに慣れる為にサンプルを動かして BLEと pybluezに対して免疫をつけていきます。


●ラズパイ3に Python pybluezをインストールする方法

・ uname -aで環境を確認する。
 (RASPBIAN STRETCH WITH DESKTOP Release date:2017-08-16)
 使用した Raspbian OSのバージョン
$ uname -a
Linux raspberrypi 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.1 (stretch)
Release:        9.1
Codename:       stretch

$ python -V
Python 2.7.13
 2017/08版の Raspbian OSには Python 2.7.13がインストールされています。


●ラズパイ3に BLE pybluezライブラリをインストールする方法

 pybluez
karulis/pybluez - Bluetooth Python extension module

 pybluezが使用している pygattlibライブラリ
Oscar Acena / pygattlib

 pybluezの動作に必要な pygattlibライブラリで必要なライブラリを先にインストールします。
pygattlib DEPENDS
pygattlibが必要とするライブラリの一覧。いつもの apt-getでインストールします。
pkg-config
libboost-python-dev
libboost-thread-dev
libbluetooth-dev >= 4.101
libglib2.0-dev
python-dev

sudo apt-get update

sudo apt-get -y install libboost-python-dev libboost-thread-dev libbluetooth-dev libglib2.0-dev python-dev

 その後、pip install pybluez[ble]で pybluezや pygattlib等の諸々を一括してインストールします。
実際には pip install pybluez[ble]には sudoが必要です。(後述でエラーを説明します)
# pybluezやその他の一式を一括してインストール。
pip install pybluez[ble]
# PyBluez-0.22.zip
# gattlib-0.20150805.tar.gz

# pybluezのサンプルを gitからダウンロードします。
cd
git clone https://github.com/karulis/pybluez

# pybluezのサンプル一覧を表示。.pyファイルの一覧
cd
cd pybluez/examples
ls -l */*.py

・ pybluezの scan.pyサンプルを動かす
cd
cd pybluez/examples
python ./ble/scan.py

Traceback (most recent call last):
  File "./ble/scan.py", line 4, in <module>
    devices = service.discover(2)
RuntimeError: Set scan parameters failed (are you root?)
 sudoが無いと怒られます。

 sudoを付けます。
cd
cd pybluez/examples
sudo python ./ble/scan.py

Traceback (most recent call last):
  File "./ble/scan.py", line 1, in <module>
    from bluetooth.ble import DiscoveryService
ImportError: No module named bluetooth.ble
 bluetooth.bleが無いと怒られます。

 上記の pybluezや pygattlib等のライブラリを sudo pip install pybluez[ble]でインストールします。
sudo pip install pybluez[ble]

 改めて sudoを付けて scan.pyを実行します。
cd
cd pybluez/examples
sudo python ./ble/scan.pysudo python ./ble/scan.py
$ sudo python ./ble/scan.py
name: M62xxx  , address: 20:91:48:xx:xx:xx
name: SensorTag, address: BC:6A:29:xx:xx:xx
name: , address: 94:53:30:xx:xx:xx
 周辺の BLEの一覧を表示しました。


● pygattlibライブラリを確認したら pybluezの存在意義が分からなくなった。

 pygattlibライブラリをそのまま使っても私のしたい事が実現できそうなので pybluezを使わずに直接 pygattlibライブラリを使用する事にします。

 BLE通信の周辺機器としては TIの SensorTag CC2541DKを使用します。

 接続に使用する TI SensorTag キット。
 TIのページから直接 $29で PayPal支払いで簡単に購入できます。
IoT を容易に実現 - TI SensorTag キット

2014/08/01
TIの 8051マイコン内蔵の BLE CC2540/CC2541を使ってみる
TIの 8051マイコン内蔵の BLE CC2540/CC2541を使ってみる

  Bluetooth Low Energyの SensorTagや iBeacon、CC Debuggerの使い方など

 GATT Characteristicsの一覧表。Bluetooth SIGで決めた決まりきった UUIDの一覧表。
GATT Characteristics - Bluetooth SIG

 SensorTag User Guide CC2541DK SENSORの UUIDの一覧表。
SensorTag User Guide

 また、毎回 SensorTagの BLEアドレスを記述するのが面倒なので環境変数化します。
$ export TARGET_BLE=BC:6A:29:11:22:33
$ echo $TARGET_BLE
BC:6A:29:11:22:33
$ sudo echo $TARGET_BLE
BC:6A:29:11:22:33

・まずはコマンドラインで確認する。
# hciconfigでラズパイ側の BLEの状態を確認する
hciconfig

hci0:   Type: Primary  Bus: UART
        BD Address: 43:43:A1:xx:xx:xx  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING
        RX bytes:1303 acl:0 sco:0 events:77 errors:0
        TX bytes:4277 acl:0 sco:0 commands:63 errors:0

# sudo hcitool lescanで周辺の BLE機器を探索して一覧表示をする
sudo hcitool lescan

LE Scan ...
94:53:30:xx:xx:xx (unknown)
20:91:48:xx:xx:xx (unknown)
20:91:48:xx:xx:xx M36xxxxxx
BC:6A:29:xx:xx:xx (unknown)
BC:6A:29:xx:xx:xx SensorTag
20:91:48:xx:xx:xx (unknown)
20:91:48:xx:xx:xx M62xxxxxx
94:53:30:xx:xx:xx (unknown)
 スキャン結果に SensorTagが有る事を確認します。


・ Discovering devicesのサンプルを動かす

nano DiscoveryService.py
from gattlib import DiscoveryService

service = DiscoveryService("hci0")
devices = service.discover(2)

for address, name in devices.items():
    print("name: {}, address: {}".format(name, address))
sudo python DiscoveryService.py

$ sudo python DiscoveryService.py
name: M62xxxx  , address: 20:91:48:xx:xx:xx
name: M36xxxx  , address: 20:91:48:xx:xx:xx
name: , address: 94:53:30:xx:xx:xx
name: SensorTag, address: BC:6A:29:xx:xx:xx

・ Reading dataのサンプルを動かす

nano ReadingData.py
import sys
from gattlib import GATTRequester

req = GATTRequester(sys.argv[1])
name = req.read_by_uuid("00002a00-0000-1000-8000-00805f9b34fb")[0]
print("name: {}".format(name))
sudo python ReadingData.py $TARGET_BLE

$ sudo python ReadingData.py $TARGET_BLE
name: TI BLE Sensor Tag
 UUID 2A00の Device Nameを読み込んで表示します。

・ Reading data asynchronouslyのサンプルを動かす

 非同期読み込みのテスト

nano ReadingDataAsync.py
import sys
from time import sleep
from gattlib import GATTRequester, GATTResponse

class NotifyYourName(GATTResponse):
    def on_response(self, name):
        print("your name is: {}".format(name))

response = NotifyYourName()
req = GATTRequester(sys.argv[1])
# req.read_by_handle_async(0x0015, response)
req.read_by_uuid_async("00002a00-0000-1000-8000-00805f9b34fb", response)

while True:
    # here, do other interesting things
    print("wait.")
    sleep(1)
sudo python ReadingDataAsync.py $TARGET_BLE

$ sudo python ReadingDataAsync.py $TARGET_BLE
wait.
your name is: TI BLE Sensor Tag
wait.
wait.

・ Writing data Receiving notificationsのサンプルを動かす

 BLE Notificationsのテスト
 CC2541DK SensorTagのボタンを押すと BLE Notif通知を受信してボタンの状態を画面に表示します。

nano ReceivingNotif.py
import sys
from time import sleep
from gattlib import GATTRequester

class Requester(GATTRequester):
    def on_notification(self, handle, data):
        print("- notification on handle: {}\n".format(handle))

req = GATTRequester(sys.argv[1])
req.write_by_handle(0x006c, str(bytearray([0x01, 0x00])))
print("wait.")
sleep(5)
req.write_by_handle(0x006c, str(bytearray([0x00, 0x00])))
sudo python ReceivingNotif.py $TARGET_BLE

$ sudo python ReceivingNotif.py $TARGET_BLE
wait.
on notification, handle: 0x6b -> 00:02:
on notification, handle: 0x6b -> 00:00:
on notification, handle: 0x6b -> 00:02:
on notification, handle: 0x6b -> 00:03:
on notification, handle: 0x6b -> 00:01:
on notification, handle: 0x6b -> 00:00:



Tags: [Raspberry Pi], [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

TIの 8051マイコン内蔵の BLE CC2540/CC2541を使ってみる
TIの 8051マイコン内蔵の BLE CC2540/CC2541を使ってみる

  Bluetooth Low Energyの SensorTagや iBeacon、CC Debuggerの使い方など

Raspberry Pi 3の Bluetooth BLEで TI SensorTagと接続してセンサーの測定値を読み取る方法
Raspberry Pi 3の Bluetooth BLEで TI SensorTagと接続してセンサーの測定値を読み取る方法

  ラズパイ3の BLEと Node.jsで、TIの SensorTag CC2541DKに接続してセンサーの状態を取得

Raspberry Pi 3の gatttoolのコマンドラインで TIの SensorTagを直接操作する方法
Raspberry Pi 3の gatttoolのコマンドラインで TIの SensorTagを直接操作する方法

  ラズパイ3と gatttoolのコマンドラインで TIの SensorTagに直接接続して gatttoolの使い方を覚える

Raspberry Pi 3に Nodejs blenoをインストールして Bluetooth BLEのペリフェラルを作成する
Raspberry Pi 3に Nodejs blenoをインストールして Bluetooth BLEのペリフェラルを作成する

  ラズパイ3と Node.js blenoで Bluetooth BLEの周辺機器機能を実装する

Raspberry Pi 3の Nodejs blenoで BLE接続して GPIOで Lチカ制御やボタン状態を読み取る
Raspberry Pi 3の Nodejs blenoで BLE接続して GPIOで Lチカ制御やボタン状態を読み取る

  ラズパイ3と Node.js blenoで BLEの周辺機器機能を実装する GPIO編

Raspberry Pi 3に Bluetooth BlueZ Version 5.42 BLE
Raspberry Pi 3に Bluetooth BlueZ Version 5.42 BLE

  ラズパイで Bluetooth 4.0の BLE gatt通信を行なう TIの SensorTagや iBeacon実験など

Amazon Dash Buttonをハックして IoTボタンとして使う方法を解説
Amazon Dash Buttonをハックして IoTボタンとして使う方法を解説

  Amazon Dash Buttonをハック。ARP要求を監視、DNSハック、IPアドレスハック等。

Raspberry Piで Amazon Dash Buttonを自在にハックする方法。node-dash-button方法
Raspberry Piで Amazon Dash Buttonを自在にハックする方法。node-dash-button方法

  ラズパイ + Node.jsで Amazon Dash Buttonをハックして IoTボタンとして使う方法を解説

Raspberry Piで Amazon Dash Buttonを自在にハックする方法。tcpdump libpcap方法
Raspberry Piで Amazon Dash Buttonを自在にハックする方法。tcpdump libpcap方法

  ラズパイ + libpcap Packet Capture libraryで Amazon Dash Buttonをハックして IoTする

Raspberry Piで Amazon Dash Buttonを自在にハックする方法。Python Scapyライブラリ方法
Raspberry Piで Amazon Dash Buttonを自在にハックする方法。Python Scapyライブラリ方法

  ラズパイ + Python Scapyライブラリで ARPパケット検出からの Amazon Dash Buttonをハック

Raspberry Piで Amazon Dash Buttonを自在にハックする方法。Node.js Dasher方法
Raspberry Piで Amazon Dash Buttonを自在にハックする方法。Node.js Dasher方法

  ラズパイ + Node.js Dasherライブラリで ARPパケット検出からの Amazon Dash Buttonをハック

Raspberry Pi 3で安定して使える相性の無い最適な microSDカードの種類のまとめ
Raspberry Pi 3で安定して使える相性の無い最適な microSDカードの種類のまとめ

  ラズパイ3で安定して使える microSDカードを購入する Teamと SanDiskは絶対に買わない

Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ
Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ

  ラズパイの Raspbian OSのコマンドラインで使用する便利コマンド、負荷試験や CPUシリアル番号の確認方法等も

Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法
Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法

  ラズパイ3の GPIO端子の I2C機能を有効にして各種センサーを繋げる方法まとめ




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2017 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_python_ble_pygattlib/