0

Moto360にBluetoothデバッグでアプリを書き込む

ふつうAndroid Wear用に作った自作アプリをWearに書き込む時は、充電用のUSBポートでPCと接続すればAndroid Studioのターゲットデバイスに表示されるらしい。しかしMoto360はQiによる無線充電なので、USBポートが無い。

PC–(USB)–スマホ–(Bluetooth)–Moto360 と接続すれば、スマホを中継して自作アプリを書き込んだりlogcatを見たりできる。

参考:Debugging over Bluetooth | Android Developers

手順


スマホ側で、「開発者向けオプション」を開いて(無ければ端末情報のバージョン情報を7回タップで出る)「USBデバッグ」を有効にする

Moto360の「開発者向けオプション」を開いて(こっちも無ければWearのバージョン情報7回タップ)「Bluetooth経由でデバッグ」を有効にする

スマホの「Android Wear」アプリの設定で、「Bluetooth経由のデバッグ」を有効にする。「ホスト:未接続」と「ターゲット:接続済み」になればok

AndroidStudioでDevicesにスマホが認識されているか確認する。なければそのままUSB抜き差しすると認識されるはず。


ターミナルで以下を実行
adb forward tcp:4444 localabstract:/adb-hub
adb connect localhost:4444

するとスマホのAndroid Wearアプリで「ホスト:接続済み」「ターゲット:接続済み」になる。
PCのAndroid StudioでもMoto360が認識されているはず

あとは普通にWear用のプロジェクトを作って書き込む時にMoto360を選べば書き込める。

書き込むとこうなって4分ぐらい待たされるが、気長に待つ。
Waiting for device.
Target device: motorola-moto_360-localhost:4444
Uploading file


4分待つの長いし、何もプログレスとか出ないのですごい不安になる。USB接続だともっと速いんだろうか・・・


deployment – Moto 360 Deploying from Android Studio extremely slow – Stack Overflowを見ると、「書き込みに10分かかるんだけど」という質問に対して「adb debugを再起動するとよくなる」っていう解答がある。
試しに再起動しても3,4分かかった。

0

Web+DB Press vol.85でRICOH THETAについて書いた

Nodeから定期的にシャッター切ってSocket.IOで配信してWebGLでビューア作ってライブカメラ化した


WEB+DB PRESS Vol.85
WEB+DB PRESS Vol.85
posted with amazlet at 15.03.06
菅原 元気 磯辺 和彦 山口 与力 澤登 亨彦 濱田 章吾 宮田 淳平 松本 亮介 海野 弘成 佐藤 歩 泉水 翔吾 佐藤 太一 hide_o_55 青木 良樹 武本 将英 道井 俊介 伊藤 直也 橋本 翔 渡邊 恵太 舘野 祐一 中島 聡 はまちや2 竹原 牧 大輔 工藤 春奈
技術評論社
売り上げランキング: 806

書いた


1週間前に発売のWeb+DB Press 85号で全天球カメラ RICOH THETAのAPIについて書きました。

  1. THETAのAPIをNode.jsのricoh-theta npmから使う
  2. 全天球画像をブラウザで見れるビューアをWebGL(Three.js)で作った
  3. 応用例:全天球Webカメラを作る

という話を書いた。


全天球Webカメラ

リモートから1分毎に撮影してその画像をPCに取り込み、Socket.IOでクライアント(webブラウザ)に配信して表示させるというもの。
こんな感じで撮影した画像をパラパラと切り替え、繰り返す。時間が立つとどんどん新しい写真が追加されてくるので面白い。視点もぐりぐり回せるし、Androidのchromeからも見れる。

ソースコードはここ
https://github.com/shokai/theta-live-viewer
サーバー・クライアント合わせてcoffeeで130行ぐらい(ライブラリは含まず)なので改造とかもしやすいと思う

不満

THETAは充電しながらWiFiからAPIを使うことができない。バッテリーだけでAPI使ってるとだいたい1〜2時間で電池が切れてしまう。

USBケーブル接続して充電するんだけど、ただのACアダプタに接続してもPCに接続された時の写真読み取り待ちモード(と言えばいいのかな?)になってしまい、APIが使えない。USB-ACアダプタ等を使って充電されている時はデータ線が結線されていないはずだから、そこを判別して写真読み取り待ちモードにならずにWiFi APIを有効にしてほしい。

0

philips-hue npm作った

Node.jsとMIDIコントローラでHueを調光するの中で使っていたhueライブラリを切り出してnpmにした。

https://www.npmjs.com/package/philips-hue
https://github.com/shokai/node-philips-hue

なんで作ったかちゃんと思い出せないんだけど、たしかRubyのhue gemについているコマンドが引数多くて使いにくかったり、他のコマンドだと全ランプにまとめてeffect:colorloopを設定するのが面倒だったり、Nodeのライブラリだと色々あるけどAPIの抽象化方法に違和感あったりで満足するのが無かったからだったと思う。


インストール

% npm install philips-hue -g


コマンド

philips-hueというコマンドが付いている。


–lightで番号を指定しなければ全てのランプに指令を送る。


ライブラリ


ふつうにhue.getBridge()やhue.auth()で認証プロセスを組み立てるのもできるけど、アプリ作る時に認証情報を保存して次回起動時に読み出すのが面倒だったので、loadConfigFileという設定ファイルを読み出す(ファイル無ければ認証して作る)便利関数を用意しておいた。
var Hue = require('philips-hue');
var hue = new Hue();

var conf_file = process.env.HOME+'/.philips-hue.json'; // 設定ファイル
hue.loadConfigFile(conf_file, function(err, conf){
var light = hue.light(1);
light.on(); // 点灯

var state = {bri: 200, sat: 120, hue: 50000};
light.setState(state, function(err, res){
if(err) return console.log(err);
console.log(res);
});

hue.light(2).off(function(err, res){ // 消灯
if(err) return console.error(err);
console.log(res);
});
});


ご意見ご感想


バグや質問はtwittergithub issueへどうぞ

0

AndroidタブレットでWeb MIDI API

前:Node.jsとMIDIコントローラでHueを調光する

音楽やる気はないけどMIDIデバイスは入出力デバイスとして面白い。スライダーとかツマミとか色々あるし、MIDIで制御できるドラム叩きロボットとかもある。
とりあえず電子工作なしで買ってきたデバイス接続するだけでPCでもスマホでもWebブラウザから使えるというのは面白い。


Web MIDI API

Web MIDI APIはブラウザでMIDIデバイスが使えるHTML5のAPIで、現在はGoogle Chromeだけが対応している。
chrome://flags でWebMIDIを有効にし、MIDIデバイスを接続してからChromeを再起動する必要がある。
Chrome起動後にMIDIデバイスつなげても認識しないので注意。


試した

http://shokai.github.io/WebMidiAPIStudy/


Android版Chromeも対応しているので、USBホストケーブルでNexus7に接続して試してみた。
流れてきたデータを全部表示するだけだけど、Nodeのmidi npmで試した時とほぼ同じ手順でMIDIデバイスに接続できる。流れてくるデータもnode版はArrayでWebMIDIはUInt8Arrayなだけなので、MIDIデバイス用のラッパーライブラリ作るとしたらブラウザ・Nodeの両対応は簡単そう。



Mac版Chromeでも動く。Android版では取得できなかったデバイスのmanifacturerとnameプロパティがちゃんと取れた。


実装

https://github.com/shokai/WebMidiAPIStudyにある。

requestMIDIAccessはPromiseで使う
return if typeof navigator.requestMIDIAccess isnt 'function'

navigator.requestMIDIAccess()
.then (midi) ->
return new Promise (resolve, reject) ->
console.log "#{midi.inputs.size} input devices"
console.log "#{midi.outputs.size} output devices"
it = midi.inputs.values() # inputデバイスのリストがiteratorでくる
loop
input = it.next()
break if input.done
return resolve input.value # デバイス発見した
reject "input device not found"

.then (input) ->
console.log "Input Device found: #{input.manufacturer} - #{input.name}"
input.onmidimessage = (msg) ->
console.log msg.data # UInt8Arrayでデータが読める

.catch (err) ->
console.error err


気づいたこと


充電できない

AndroidではMIDIデバイスを使っているとUSBポートが埋まるので充電できない。Qiでなら充電できるかと思ったけどNexus5とNexus7ではMIDIと同時に充電は無理だった。


複数アプリから1つのMIDIデバイスを使える

Macでは複数のブラウザウィンドウで同時に1つのMIDIデバイスからのデータが読めた。またブラウザと同時にNode.jsからも使えた。
Macでは /System/Library/Frameworks/CoreMIDI.framework/MIDIServer が仲介しているっぽい。


参考になった

0

AppleScriptでMacの音量を設定する

Yosemiteにアップデートしていないのでまだapplescript使ってる。

# 音量設定取得
% osascript -e "get volume settings"
output volume:40, input volume:50, alert volume:100, output muted:true

# 音量だけを取得、0〜100で返ってくる
% osascript -e "(get volume settings)'s output volume"

# 音量を50に設定
% osascript -e "set volume 50/100*7"

# ミュートされているか確認、true/falseで返ってくる
% osascript -e "(get volume settings)'s output muted"

# ミュートする
% osascript -e "set volume with output muted"

# ミュート解除
% osascript -e "set volume without output muted"

音量取得が0〜100で返ってくるのに設定は0〜7でやるという謎のAPI


参考

起動音ジャーンの音量を自在にコントロールしたい! – ザリガニが見ていた…。