2018年10月13日土曜日

ESP32をBluetoothマウスにする

ゲームボーイを無線マウスにした際に、Bluetooth側はESP32を使って実装しました。キーボードのサンプルコードに記載の関数群でマウスまでまかなえたので、使い方を記載しておきます。

ESP-IDFを使う

ESP-IDFのBluetooth Low Energyサンプルのうち、HID over GATTを使います。

ESP-IDF BLE HID device demo

ble_hidd_demo_main.cではほとんどConsumer Keyの送信しかしていないのですが、esp_hidd_prf_api.hにはきちんと関数が実装されています。

  • void esp_hidd_send_consumer_value(uint16_t conn_id, uint8_t key_cmd, bool key_pressed);
  • void esp_hidd_send_keyboard_value(uint16_t conn_id, key_mask_t special_key_mask, uint8_t *keyboard_cmd, uint8_t num_key);
  • void esp_hidd_send_mouse_value(uint16_t conn_id, uint8_t mouse_button, int8_t mickeys_x, int8_t mickeys_y);

いずれも、キー操作情報等の最低限のデータを入れればよしなに成形して無線で飛ばしてくれます。

マウス利用時のmouse_buttonは、レポートディスクリプタの0バイト目にああたります。下位3ビットに3ボタンマウスのそれぞれが割り当てられています。下から右・左・中ボタンになります。

2018年10月9日火曜日

技術書典ふりかえり

技術書典に本を出す側で参加したのでその記録です。

出した内容

  • ゲームボーイのカートリッジ基板の作り方をまとめたPDF
  • 実際に作ったカセットのデモ

本はPDF版のみにし、購入もすべてBoothで行ってもらう方法にしました。なので、現場での授受はそのBoothのURLとQRコードを印刷したカードのみです。ひとりチームなので金銭のやりとりとか決裁のトラブルとか抱えたくないのと、今後更新を行うときに購入してくれた人に損がないようにと考えてPDF版のみかつBoothのプラットフォームで更新通知を容易にしたいなと思ってこういう形にしました。もともと自分が調べたことを忘れないように書いた本の内容に、今後調べたり試したりして新しいことがわかったらとか改良の余地がありまくるので、そういうのが増えたら追記・更新したいんですよね。

カードの裏面は著者(というかおれ)の名刺代わりにしたので、余ってもあとで名刺として配ってアピールできるなと。

当日の様子

机の上は見本として印刷したPDFの中身と、実際に動作するゲームボーイのデモを置いておきました。他の振り返りの記事にあった「見本誌は2冊あったほうがいい」という内容を、本とデモ機でうっかり満たした感じがしました。

個人的には本を買ってもらうよりも「俺が作ったものが超おもしろいからおまえらも見ろ」という感じでデモ推しの気持ちだったので、Bluetoothマウスにしたゲームボーイを触ってもらって、おもしろかったらカードを持ち帰ってもらう、みたいな流れに落ち着きました。特定の年齢層だけは、説明する前から操作方法がバッチリはまる様子に最高に笑いました。

その他電気の気付き

  • マウスのデモに使ったMacBook Proは終了の17時ちょうどに電池が切れたのでギリギリもった
  • Bluetoothに使ったESP32がおもいのほか大健闘
    • モバイルバッテリーから電源を取ったが、容量ゲージが減る気配がない。
    • 会場の電波が落ち着いていて混信がなく、常時問題なく動作。

ESP32はデータシート上だと電流がそんなに消費しないと書いてあって本当かよって思っていましたが、Bluetoothだけだと本当にそんなに消費しないっぽいです。今度測ってみます。

https://niccolli.booth.pm/items/1026724

もし当日の本に興味があれば、上記リンク先から購入ください。デモがないとおもしろいところがわかりにくいと思いますが、何らか参考になれば幸いです。カードを持ち帰りいただいた方から、結構な数の購入をいただいた通知が来まして、ありがたい限りです。

2018年9月29日土曜日

ゲームボーイを無線マウスにする

ひとつ前の投稿でゲームボーイのカセットを作って遊んでいましたが、カセット側のRAMに値を保存すれば周辺部品と通信できるという仕組みは正式な製品でもたくさんつかわれている手法らしい。なので実装に挑戦しました。

とりあえずやりやすそうだった無線マウスをやってみたところ、期待どおり動いて安心。カセット側RAMはマイコンの中にいるので、保存された値はマイコンからいじり放題です。そのカセット側RAMにキー操作情報を入れて、マイコンからESP32に飛ばしています。

というような話をPDFにまとめて、技術書典5で紹介します。なんらか操作できるものを置いておく予定なので、試して笑う程度でも歓迎です。

2018年6月23日土曜日

ゲームボーイのカセットをつくった

よくよく考えてみたら、ゲームのカセットは中身が基板なので、このご時世ならつくるのはたやすいのではないかと思ってやってみたら、遠回りをしつつもうまく動いた。

なぜゲームボーイにしたのか

手元にあったから

実家に置きっぱなしだったのを回収してきて以来、電源の確保が容易なのでずっと遊んでいる。最近はSwitchを買ってしまいスプラトゥーンとプリパラが楽しいのでほったらかしになってきた。

どうかしてる機能を積んだカセットが多かったから

ファミコンやスーパーファミコンは、拡張機能は本体のポートに専用コントローラーやサテラビューみたいなのをつないで実現していたけれど、ゲームボーイはその辺をカセットの延長でつくっていた印象があって。ポケットカメラやカービィの傾きセンサーなんかがその例(個人の感想です)。今やるならBluetoothとか各種無線通信を載せていきたい。

作り方

海外は作っている人が少なからずいるので、そのへんの人の作例を参考に。

http://www.happydaze.se/wolf/
https://github.com/dwaq/Homebrew-Gameboy-Cartridge

カセット側の動作は基本的に

  • 16ビットのアドレスを受けて対応する8ビットの値を
    • 返す (ROM/RAM)
    • 保存する (RAM)
  • バンクを切り替える

なので、このあたりの配線がつながっていればOK。速度が速度なので、等長配線を気にする必要もない。

https://dhole.github.io/post/gameboy_cartridge_emu_1/

dholeさんがSTM32F4Discoveryをつかって、バンク切り替えの任天堂ASICの擬態を行いつつROM/RAMまでSTM32マイコンでまかなう方法を書いてくれているので、この通りに信号線をつなぐとこうなります。

直したい点

穴位置を間違えた

基板の端子情報をライブラリにしてる人がいるのでそのデータを使おうとするも、Eagleが慣れないのでCircuitMakerに持ってくる際に、大きいほうの穴位置がずれたらしく、カートリッジの筐体にすんなりはまらない。次つくることがあったら直す。

電源の使い勝手

ふつうカセットは外から何かするわけじゃないので、ゲーム機から電源をもらって動くのは当たり前の動作だけど、ゲーム機の電源とカセットの電源を別にしておかないと、マイコン側のデバッグで困る。ゲームボーイ本体の電源が入っていないと動作をデバッグできない。ジャンパ等で切り替えられるようにしたい。

2017年12月9日土曜日

100円SIMのいいところと面倒なところ

2017年7月、NTTコミュニケーションズが100円SIMのサービスを発表しました。価格から惹かれるところがあり内容を伺ったところ、周囲の人からも「あれどう?」ときかれたことがあったのでメモを残しておきます。

Arcstar Universal Oneのオプションのような位置づけ

NTTコミュニケーションズのVPNサービスArcstar Universal Oneの契約が必須(VPNに接続する回線の設置工事等も必要)であり、100円SIM単独での利用はできません。さくらやSORACOMのようにSIMを購入して使うのではなく、VPNサービスへの入り口としてSIMが100円で提供されるというものです。

Arcstar Universal Oneは仮想とはいえ閉じているので、デバイスからのセンシティブなデータでも比較的安全に送信ができます。保存するデータベースは、NTTコミュニケーションズが提供するVPN内のサーバを使うパターンと、VPNからAWSやMicrosoft Azureなどの各種クラウドサービスに接続するパターンが用意されています。

大規模な業務用途向け

最低発注数量は100枚という記載もどこかにあったので、外部に絶対に流出させたくないセンサーデータを安全かつ大規模に収集するような用途等、業務用として使うものということでした。また、記載のような業務用なので、NTTコミュニケーションズの営業さんへの見積もりが必須です。個人もしくは小規模での3G/LTE回線がほしいという話ならば、sakura.ioやSORACOMの利用を検討したほうがよいと思います。

2017年2月13日月曜日

Web Bluetooth APIをつかうにあたって気になったこと

Chrome最新版でWeb Bluetooth APIが使えるようになり、実際に動かしてみました。コードを書いたり関連したドキュメントを読むにあたって、気になった箇所をまとめておきます。

なぜWeb Bluetooth APIを作ったのか

Until now, the ability to interact with bluetooth devices has been possible only for native apps. The Web Bluetooth API aims to change this and brings it to web browsers as well.
Interact with Bluetooth devices on the Web By François Beaufort

BLEに限らず、端末の各種ハードウェアを動かすにはネイティブアプリからでないと無理だった。Webアプリでもネイティブアプリがやっていることを実現できるようにしようとするのがこのAPIの目的です。WebGLやWeb Audioの流れと、これからUSBシリアル通信を実装しようとしている未来を考えれば、まあ実装するよねという感じがします。ブラウザがOSになろうとしていた時期の計画と野望を、着々と進めているんだなという印象です。

なぜ動作に制限が多いのか

コードを動作させるにあたって、(いま私が認識しているだけで)下記の制限があります。

  • HTTPでは動作しない(localhostを除く)。HTTPSやfile://では動作する。
  • クリック等のユーザーからのアクションがないと開始できない。onloadなどで自動的に開始するのは不可。
  • 一部接続しないサービスが定義されている

HTTPでは動作しない

localhostを除き、HTTP接続ではnavigator.bluetooth.requestDevice()を実行してもerrorとなります。HTTPでも許可されるのはlocalhostのみで、プライベートIPアドレスでもHTTPならerrorです。

これは、Web Bluetoothに限った話ではありません。ブラウザの強力な機能を使う際には、少なくともそのサーバの出処がはっきりしているものだけに制限しておきましょうというもので、"Secure Origins"と呼ばれています。

ユーザーからのアクションがないと開始できない

確実にユーザーの意思によって動作させる必要があります。ページ読み込みと同時にバックグラウンドで勝手に動かすのは不可です。たとえば、もしユーザーがBLEで座標を飛ばせるGPS受信機(こういうものはLocation and Navigation Serviceを使って飛ばしていると考えられます)を使っていたら、バックグラウンドでユーザーがどこにいるのかが結構な精度で取得されることも考えられます。

一部接続しないサービスが定義されている

キーボードやDFU等の特に扱いが敏感なサービスについては、そもそもAPIからブロックされています。ブロックリストはこちら。ちょっとした理由も含めて記載されています。

どのような場面で使うのがよいのか

スマホアプリの代用とした使い方がいいのかなと思います。ちょっとした機能としてのみ使うときに、わざわざ専用アプリをストアからインストールしてもらう必要がなくなります。特定の施設内に対応したビーコンを使うためとか、Amazon Dash Buttonのようなデバイスの接続設定を書き込むためとか、そのくらいの用途のためにわざわざアプリをインストールするとなると、面倒くさいからいいわとなるのを防げそうとは考えられます。

一方で、この「専用アプリをストアからインストールしない」が、そのまま脆弱性につながるように思います。どのサービス・キャラクタリスティックに接続しているかは、Webページが何もしなければ特に明示されません。ユーザーにきちんと明示しておくようと記載されています

参考文献

2017年1月20日金曜日

Intel Edisonのカーネルを自前でビルドして入れ替える方法

IntelのEdisonでfbtftを実行する方法が公開されていたので試してみようとしたら、カーネルビルドにすごい手間取ったので詰まった箇所をまとめておきます。

Intel配布の最新版は初回ビルドが通らない

これを書いているときの最新版はiot-devkit-yp-poky-edison-20160606.zipですが、bitbake edison-imageのコマンドでビルドを始めても、OpenJDKまで来るとビルドが止まります。フォーラムでキレている人自分でJavaを筆頭に最低限まで削ったソースを配布していますが、これは本当に最低限なのでNode.jsやconfigure_edison等は含まれません。とりあえずJavaだけなくなれば初回のビルドは通るので、ソースコード内の設定ファイルからOpenJDKとicedtea関係の箇所をどんどん削る必要がありました。どこをどう削ったかは忘れた。

それに加えて、iotkit-comm-jsとiotkit-comm-c-devも削る必要があります。これはIntelのIoT Analytics dashboardの運営が終了となったため、それにともなって対応するライブラリ群がIntelのGiuHubから削除されたことが原因になっています。修正箇所はフォーラムの記載を参照してください。

カーネルモジュールをビルドする

基本的にIntelが公開しているページの内容どおりです。が、上記最新版では.configの位置が build_edison/tmp/work/edison-poky-linux/linux-externalsrc/1.0-r2/linux-externalsrc-1.0/.config に、置き換えるdefconfigの位置が poky/linux-kernel/arch/x86/configs/i386_edison_defconfig にそれぞれ変わっています。

動きました

Intel Edison with TFT Display