Bluetooth LEと人生
この記事はエンジニアと人生 #2 Advent Calendar 2022の17日目の記事です。昨日はすぎーさんの「エンジニアになってからの5年間の振り返りとこれからの目標」でした。
僕が「エンジニアと人生コミュニティ」に入るきっかけとなった「Bluetooth LE」が、自分のエンジニア人生の中でどれだけ大きな割合を占めているかをこの機会に振り返ってみようと思い、アドベントカレンダーに参加することにしました。
コミュニティ参加はBluetooth LEがきっかけ
僕がこのコミュニティに入ったのは、Bluetooth LEで制御できるトースターをScratchからプログラミングできるようにする仕事を請けたのがきっかけでした。パナソニック社のSTEAM教育プロジェクトで使われているものです。
メルカリを退職してからしばらくソフトウェアエンジニアとしての仕事はやめていたのですが、久しぶりにフリーとして開発案件をやることになり、同じくフリーのエンジニアがたくさん所属しているこのコミュニティで刺激をもらおうと思い、参加することにしました。
コミュニティの主催である堤さんは共著で「iOS×BLE Core Bluetoothプログラミング」という本を出版されており、僕はこの本を読んでBluetooth LEプログラミングの基礎をすべて学びました。
Bluetooth LE以外でも、堤さんが書かれたiOSアプリ開発に関する記事やコードには以前より大変お世話になっており、コミュニティに入ればその堤さんに質問することもできるし、僕がこれまで学んできたことで貢献もできるかなという思いもありました。
Bluetooth LEにハマったきっかけはLEGO
ロンドン赴任中の2017年9月に「LEGO BOOST」というプログラミング可能なレゴのセットが発売されました。しかも英国を含む一部の国だけで先行発売です。
https://www.lego.com/ja-jp/product/boost-creative-toolbox-17101
調べてみると、自分で作ったレゴのロボットを、iPhoneやAndroidからBluetooth LEによる無線通信で制御できるとのこと。以前よりMINDSTORMSでレゴのプログラミングにハマっており、本まで書いたことのある身としては、ぜひすぐに手に入れて自分の手で制御してみたいと思いました。
そこでまず手に入れたのが、上記の「iOS×BLE Core Bluetoothプログラミング」です。それでBluetooth LEプログラミングを学びながらLEGO BOOSTの発売を待ち、発売されたらすぐに解析をはじめ、一ヶ月後には「Boost Remote」というリモコン制御アプリをリリースしていました。
Bluetooth LEがなぜ好きか
Bluetooth LEが好きな理由は、そのオープンさと自由度です。
Bluetooth LEを使った通信は、割と簡単に通信内容を見ることができます。macOSやiOSのアプリとBluetooth LEデバイス間の通信内容は、Additional Tools for Xcodeに同梱されている「PacketLogger」でキャプチャ可能です。Bluetooth LEデバイス同士の通信でも、「Bluefruit LE Sniffer」などのスニファーで内容を覗くことができます。
そのため、通信仕様が公開されていなくても、送受信されているデータとデバイスの挙動を観察することで、ある程度は仕様を推測可能なのです。あるBluetooth LEデバイスが気に入っても、それを制御する公式アプリの作りがよくないことや、もっと面白い使い方ができそうだと思いつくことがよくあります。そんなときでもBluetooth LEプログラミングができれば、自分の手で独自の制御アプリを作れるのです。最高じゃないですか?
また、どんなプラットフォームでもだいたい同じ感覚でプログラミングできる点も気に入っています。僕はiOSやmacOSで使えるCore Bluetoothフレームワークの利用頻度が一番高いですが、AndroidやWindows、Node.js、M5Stack、そしてWeb Bluetooth APIなども、iOSでの経験を活かしてちょっと勉強するだけですぐにプログラミングできるようになりました。
これまでのBluetooth LE活動
これまでにたくさんのBluetooth LEプログラミングをしてきましたが、その中でも代表的なものを簡単に紹介します。ほぼレゴ関係です。
プログラミングトースター専用のScratch環境
コミュニティに入るきっかけとなった開発案件です。オープンソースであるScratch 3.0のコードに独自のBluetooth LE拡張機能を追加する形で実装しました。現在パナソニック社が開催するワークショップなどで稼働中です。僕も息子たちと一緒に参加したことがありますが、大変面白いワークショップです。
レゴリモコンアプリ「Boost Remote」とBoostBLEKit
Bluetooth LEにハマるきっかけとなった自作アプリです。現在は通信仕様が「LEGO Wireless Protocol」としてLEGO社から公開されていますが、このアプリを作ったときには公式資料はなく、解析自体が楽しかったです。
アプリで使っている通信部分の実装は「BoostBLEKit」という名でSwift Packageとして切り出しています。アプリ本体のコードと合わせてオープンソースです。
Bluetooth LE対応レゴの解析まとめ
LEGO BOOST以降もBluetooth LE対応のレゴが次々にリリースされ、公式ドキュメントであるLEGO Wireless Protocolが登場するまでの間、それらを自分で解析してScrapboxにまとめていました。プログラミングなしでレゴトレインを走らせるやり方なども書いてます。
Scratch 3.0用のレゴ系拡張機能
Scratch 3.0にはLEGO BOOSTやWeDo 2.0、MINDSTORMS EV3用の拡張機能はあるのですが、それ以外のレゴ系拡張機能は一向に登場しないので、自分で全部作りました。以下のサイトで改造版Scratch 3.0として公開しています。レゴマリオやデュプロトレインまでプログラミングできます。
拡張機能のコードはもちろんオープンソースです。
Scratch専用ブラウザ「Scrub」
Scratch 3.0は「Scratch Link」というデスクトップアプリを仲介してBluetooth LEデバイスを制御するのですが、iPadではその仲介アプリがないのでBluetooth LE系拡張機能が動作しません。上記の拡張機能を使ってiPadでも気軽にプログラミングできないかなと思って、Scratch Linkの機能を内蔵したブラウザアプリを作りました。
これもオープンソースです。実装はtoio Doアプリを参考にしています。
Swift Playgroundsで動くレゴ用リモコン
Swift Playgroundsが4になってアプリを簡単に作れるになりました。そこでSwift Playgroundsからレゴを制御するプロジェクトを作ってみました。Bluetooth LEの実装にはAsyncBluetoothとBoostBLEKitを使っていて、少ないコードでレゴを制御できるようになっています。コードを改造して色々試すのにちょうどいいです。
M5Stackで動くレゴ用リモコン
Bluetooth LEはApple Watchや最近のマイコンなどでも制御プログラムを動かすことができます。これはM5Stackの画面とボタンを使ったレゴ用リモコンです。Arduino IDEでサクッとプログラミングできます。
コードはファイル1つに書いていてちょっと長いです。
iOSDC Japan 2022 LT 「Bluetoothでレゴをリモートプログラミングしよう」
これまでの知見をiOSDC Japan 2022にて「Bluetoothでレゴをリモートプログラミングしよう」というLTで発表しました。5分でBluetooth対応レゴの歴史からLEGO Wireless Protocolの概要、Swift Playgroundsによる実機デモまで見ることができます。場違いかと思ったのですが、割と好評でよかったです。
そのほか
上記以外にもBluetooth LE系のOSSにコントリビュートしたり、色々と作ったりしているので、興味のある方はGitHubやTwitterを見てみてください。
最後に
以上、かなり長くなりましたが、僕とBluetooth LEの関係について振り返ってみました。
最近はSwiftWasmに興味があり、上記の自作Swift Packageをそのまま使ってWebアプリとして動かす実験をしています。SwiftでWeb Bluetooth APIを使うコードを書けたりしてなかなか面白いです。
そういう個人開発の話も「エンジニアと人生コミュニティ」ではよくされているので、よかったら入ってみてください。