chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

nRF52840 + CircuitPyton + BLEによるKindleページめくりボタン試作

iOS とペアリングできたので、次はiPadとペアリングさせた。iPadをどこかに立てかけて、Kindleアプリで本を読んでるとページめくりが面倒なので、BLE接続のページめくりボタンを作ってみた。ソースは以下

iOS上でKindleが動いている前提での) Kindleページめくり用ボタンの例

# original source:
# https://github.com/adafruit/Adafruit_CircuitPython_BLE/blob/main/examples/ble_hid_periph.py
#

# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

"""
This example acts as a keyboard to peer devices.
"""

import sys
import time
import board

from digitalio import DigitalInOut, Direction, Pull
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard import Keycode

import adafruit_ble
from adafruit_ble.advertising import Advertisement
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.standard.hid import HIDService
from adafruit_ble.services.standard.device_info import DeviceInfoService


#setup User button on board
btn = DigitalInOut(board.SWITCH)
btn.direction = Direction.INPUT
btn.pull = Pull.UP

# Use default HID descriptor
hid = HIDService()
device_info = DeviceInfoService(
    software_revision=adafruit_ble.__version__, manufacturer="Adafruit Industries"
)
advertisement = ProvideServicesAdvertisement(hid)
advertisement.appearance = 961
scan_response = Advertisement()

ble = adafruit_ble.BLERadio()
if ble.connected:
    for c in ble.connections:
        c.disconnect()

print("advertising")
ble.start_advertising(advertisement, scan_response)

kbd = Keyboard(hid.devices)

while True:
    while not ble.connected:
        pass
    print("Start typing:")
    while ble.connected:
        if not btn.value:          # if pushed
           kbd.send(Keycode.LEFT_ARROW)
           print("<-")
           time.sleep(0.5)     # to avoid chattering
        time.sleep(0.1)
    ble.start_advertising(advertisement)

Git上のAdafruit_CircuitPython_BLEのble_hid_periph.pyをベースに、nRF52840上のユーザボタンが押されたら、ARROW_LEFTのコードを送信するよう改修した。何が悪いのか分からないが、時々ボタン操作したのに反応しない。ポーリング方式だから?

上記コードをファイル名: code.py としてFlashに書き込むと、nRF52840の電源をOnした際に、自動的に実行される。

■追記
目的と手段がワケ分からずと言いながら、AdafruitのnRF52840を買いましたが、、いざ買ってみると、BLEデバイスがさくっと作れるのでこれはこれで面白い。CircuitPythonを使うことで、スマフォとペアリングできない!!といった悩みもなくなった。自力ではBLEペアリングの問題が解決できず他力なのだが。。

■ご参考
参考にしたソースは以下
https://github.com/adafruit/Adafruit_CircuitPython_BLE/blob/main/examples/ble_hid_periph.py