僕は発展途上技術者

ラズベリーパイ(Raspberry Pi) + ScratchX を使って micro:bit に天気情報を表示する

micro:bit に天気情報を表示する方法は検索するといくつか見つかるのだが、ラズベリーパイ(RSコンポーネンツのページなどから購入できる)、さらに ScratchX を使った方法はみつからなかったので調べてみた。

※補足:RSコンポーネンツは、Raspberry Piの国内総代理店です。電子工作にも使われる加速度センサなどの部品等を50万点超取り扱っており、世界32ヵ国へオンライン販売をしています。

ラズベリーパイ上の ScratchX と micro:bit をつなげるには、

» micro:bit を Scratch から操作できる s2m が日本語に対応しました

で紹介した s2m などがあるが、今回は、ワイヤレスで接続することができる jaafreitas/scratch-microbit-extension: BBC micro:bit Scratch extension を使う。

ラズベリーパイでは Raspbian OS を使っているものとし、ターミナルを立ち上げ、

$ sudo apt install nodejs npm

を実行して、Node.js と npm をインストールする。

次に、scratch-microbit-extension のソースをダウンロードし、解凍する。

$ wget https://github.com/jaafreitas/scratch-microbit-extension/archive/master.zip
$ unzip master.zip

以下の通り実行して、extension を起動するまでの準備をおこなっておく。

$ cd scratch-microbit-extension-master
$ npm install

scratch-microbit-extension と micro:bit とが通信できるように、micro:bit 側には専用の hex ファイルをインストールする。

micro:bit に USB ケーブルをつなげ、ケーブルをラズベリーパイの USB ポートに挿す。micro:bit は /media/pi/MICROBIT にマウントされるので、以下のコマンドを実行して、firmware フォルダ以下の makecode-microbit-scratch-extension.hex ファイルを micro:bit にコピーする。

cp firmware/makecode-microbit-scratch-extension.hex /media/pi/MICROBIT/

コピーしたあと、micro:bit のリセットボタンを一度押しておくと、extension と接続しやすくなるようだ。

次に、ラズベリーパイ上で Chronium Web Browser を起動し、アドレス欄に

http://scratchx.org/?url=https://jaafreitas.github.io/scratch-microbit-extension/scratch_microbit.js&lang=en

を貼り付けて、ScratchX の extension を読み込む。

Extension を読み込んでよいのか許可を求めるダイアログが表示されるので、緑のボタンを押して許可すると、More Blocks カテゴリに、BBC micro:bit 用のブロックが追加される。

BBC micro:bit の横に赤丸が表示されており、まだ micro:bit との接続が確立されていないことを示している。

ターミナルに戻り、

$ sudo node index.js

を実行する。以下のキャプチャのように、ターミナル上に connected true と表示され、ScratchX 上では先ほどの BBC micro:bit の横の赤丸が緑色に変われば、接続がうまくいったことを示している。

接続がうまくいかないときには micro:bit のリセットボタンを押すとうまくいくことが多い。

ScratchX 上の「clear display」ブロックをクリックすると micro:bit の LED がまっさらになり、「display ?」のブロックをクリックすれば ? と LED 上に表示されることを確かめる。

micro:bit を USB ケーブルの代わりに電池ボックスなどで給電すれば、ScratchX 上から micro:bit をワイヤレスで操作できるようになった。

次に天気情報を取得するために、天気情報APIに接続する ScratchX エクステンションを読み込む。

» ScratchXを使って天気を取得するブロックを作成

で紹介されていた OpenWeatherMap API から天気情報を取得する ScratchX エクステンションを使わせてもらう。

上記スクリプトを ScratchX から読み込めるように Web サーバーに置く必要があるのだが、ローカルの Web サーバーでもよいので、Node.js の http-server を使う。

scratch-microbit-extension を起動しているターミナルとは別のターミナルを開き、

$ sudo npm install -g http-server

で http-server をインストールする。

適当な場所に myscript.js というファイルを用意し、先述したスクリプトの内容を貼り付ける。ファイルが置かれているディレクトリで、

$ http-server

を実行すれば、localhost:8080/myscript.js で天気情報取得エクステンションにアクセスできる。

ScratchX 上の More Blocks カテゴリを選び、Load Experimental Extension ボタンをクリックして、localhost:8080/myscript.js を Extension URL として入力すれば、以下のように天気情報を取得できるブロックが追加される。

「[ ]の天気を取得」ブロックの [ ] にアルファベットで地名を入力し、クリックすれば、その場所の天気の情報を取得できる。

以下のようなスクリプトを用意すれば、micro:bit の A ボタンを押せば、好きな場所の天気の情報が micro:bit の LED に表示される。

本日の調布の天気は雨、Rain と表示されるようになりました。

たとえば予報を取得するようにエクステンションを改造して、常に表示するようにした micro:bit を傘立ての近くに置いておけば役に立ちそうだ。(ScratchX とそのエクステンションの作り方については、スクラッチャーのためのScratchX入門 - その1 ScratchXとは?で解説している)

ScratchX のエクステンションはいくつも読み込むことができるので、組み合わせればいろいろなことができるし、ラズベリーパイならばどこにでも置いておくことができるので、様々な応用が考えられそうです。

Apple イベントで紹介された、バスケットボールのシュートを自動でトラッキングしてくれるアプリ Homecourt (ホームコート)に衝撃を受けた

先日の Apple イベントでは、iPhone XS や Apple Watch Series 4 の発表がおこなわれました。今回は上位機種へのアップグレードということで小さな進化という印象でしたが、これとは別に特に興味をひいたのは、iPhone XS のカメラの性能をデモするために紹介された Homecourt というアプリでした。

» Homecourt

このアプリ、バスケットボールのシュートを全自動でトラッキングしてくれて、シュートした各位置やその位置ごとの成功率を表示してくれるというもので、すでに公開されており App Store からダウンロードできます。カメラの性能がより良い XS で使うのが良いのかもしれませんが、iPhone X でも使うことができ、近所の公園で試したところ、あまりの素晴らしさにかなりの衝撃を受けたので、その様子を紹介しようと思います。

シュートのトラッキングを行うには、バスケットゴールとシュートを打つ人、そしてコート上ならば3ポイントシュートのラインが全部映る場所に iPhone のカメラを設置する必要があります。理想的には、ゴールの真ん前が良いようですが、試したのは近所の公園で他に遊んでいる人もいるので、僕は、ゴールのななめ前方、コートの外側に三脚を立てて、iPhone を三脚に取り付け立てました。

続いて、アプリ下側のタブバーから、Record を選び、Workout を選択します。

すると、ゴールとボードを含め、四角の枠の中に収めてくれ、という画面が出てくるので、指示通りカメラの向きを調整します。

次に、バスケットボールのコート上でなら、3ポイントシュートやフリースロー用のラインを検知するのかもしれませんが、公園のゴール前にはラインが引かれていなかったので、画面上に表示される仮想的な3ポイントシュートやフリースロー用のラインを指でドラッグし傾きや位置を適当に調整します。

事前の設定に必要なのはこれだけ。三脚さえあれば、iPhone の他には何の機器も必要ありません。

あとは存分にシュート練習をすれば良いだけです。

どこからシュートを打ったか、そしてもちろんゴールしたかどうかを自動でトラッキングしてくれて、シュート成功率などの分析結果をこのような形で表示してくれます。

こちらが詳細な分析結果です。

圧巻なのは、全シュートを自動的にシュート毎に区切ってくれて表示してくれる Shot-by-Shot の画面。

ゴールしたかどうかの結果(赤色のMakeがゴール、青色のMissがミス)とともにシュートごとのシーンを後から再生することができます。ちなみに、筆者はバスケットボールは全くの初心者です。おかしなフォームだとは思いますがご容赦ください。

2本目のショットはゴールをかすめており、パッと見「あれ入ったんじゃ?」と見間違えそうなのですが、ちゃんと機械学習による判定は Miss と判定しており、なかなかの精度だと思います。(これはカメラの性能によるのかもしれません)

Shot-by-Shot の画面では、スローモーションにできたり、プレーヤーにズームしてフォームをチェックできたりと、反省とこれからの改善に役立てることができるんじゃないかと思いました。

他にも今日のハイライトということで、連続してポイントできたシーンなどを自動的に切り取って表示してくれたりします。

さらに面白いのは、タブメニューから Feed を選ぶと、他の上手なプレーヤーの練習の様子も閲覧することができるところです。

こちら3ポイントシュートがかなりの確率で入っているおかたです。

Shot-by-Shot 画面で各シュートの様子も見ることができるので、上手な選手のフォームをチェックして参考にすることもできるのだと思います。

他にも Teams という機能では、仲間と一緒にチームを作ることができ、各々撮影した練習風景をチェックしたり、分析結果を共有して切磋琢磨することができるようです。

毎月300ショットまでは無料で利用でき、それ以上無制限で使いたければ月額の料金が発生するようです。(2018/9/18時点では月額880円)

バスケットボール超初心者の僕でもかなりワクワクするアプリなので、バスケットボールをやっている方にはとてもおすすめなんじゃないかと思いました。

» ‎HomeCourt - The Basketball App on the App Store

学習するデータが増えていけば精度はどんどん上がっていくのかもしれませんし、そのうちフォームなども、ここの部分をもう少し上げていい、といったように自動でアドバイスしてくれるようになるのかもしれません。

機械学習をとても上手く活用しているお手本のようなアプリだと思います。スポーツと機械学習はとても相性が良さそうで、大きな可能性を感じました。

学生時代にアーチェリーをやっていたのですが、当時、矢が当たった場所は自分でスコアカードに手書きで記録していました。そうした記録もこのようにカメラと機械学習をうまく活用すれば、自動で記録できるようになるのかもしれません。(作ってみたい :) )

機械学習を使ってどのようにコート、ゴール、プレイヤーを認識しているかなどの少し詳しい技術的な側面や、このアプリを開発した動機などを紹介している TED の動画があったので最後に紹介しておきます。

プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Scratchで楽しく学ぶ アート&サイエンスRaspberry Piではじめる どきどきプログラミングを書きました。

オンラインコンテンツ: 大人のためのScratch

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Email: webmaster at champierre dot com

Twitter @jishiha

最近のエントリー

アーカイブ