0

全天球アニメーションするRicoh THETAビューア作った

全天球写真が取れるリコーのTHETAの写真を、複数枚アニメーションするビューアを作った。
Three.jsOrbitControls.jsのサンプルをいじってたらできてた。


質問や機能要望はgithubのissuetwitterにお願いします

デモ

http://shokai.github.io/theta-viewer.js


ドラッグで視点移動、マウスホイールで拡大縮小
safariだと[開発]→[WebGLを有効にする]を設定しないとWebGLが動かない。
ChromeかFirefoxなら動く。
Nexus7のChromeでは動くけどAndroidでもHTC One Jのchromeだと動かない。
WebGLすごくて、ChromeのCPU使用率5%もいかないけど、まだ全てのブラウザで動くわけではない。

ソースコード

https://github.com/shokai/theta-viewer.js


使い方

theta-viewer.jsをダウンロードして、自分のサーバーに設置する。
Three.jsとasync.jsとOrbitControls.js(Three.jsのexamplesの中にある)も必要。
<script src="./lib/async.js"></script>
<script src="./lib/three.js"></script>
<script src="./lib/OrbitControls.js"></script>
<script src="./lib/theta-viewer.js"></script>

適当な描画用div等を作って
<body>
<div id="viewer" style="width: 100%; height: 100%;"></div>
</body>

var viewer = new ThetaViewer( document.getElementById("viewer") );
viewer.images = ["01.jpg", "02.jpg", "03.jpg"];
viewer.interval = 200; // ミリ秒
viewer.autoRotate = true;
viewer.load();
これで読み込める。

詳しくはgithubのREADMEや、index.htmlのソースコード見るとわかると思う。

それなりに簡単に設置できる。
設置しやすいようにasync.jsとthree.jsも一緒に1つのjsに固めてしまおうかと思ったけど、async.jsのライセンスがMIT Licenseのようで1行目にMIT Licenseと書いてないちょっとMIT Licenseじゃないライセンスだったのでやめた。

0

DigiSparkのフルカラーLED

使った

RGB Shield Kit – Digistump 295円


pin 0,1,2にR,G,Bが接続される。
ADコンバータはpin4なので干渉しない。



led_fullcolor.ino

#define PIN_RED 0
#define PIN_GREEN 1
#define PIN_BLUE 2
unsigned char led_r, led_g, led_b;
unsigned char count = 0;

void setup(){
pinMode(PIN_RED, true);
pinMode(PIN_GREEN, true);
pinMode(PIN_BLUE, true);
led_r = led_g = led_b = 0;
}

void loop(){
led_r += 10;
analogWrite(PIN_RED, led_r);
if(count % 2 == 0){
led_g += 10;
analogWrite(PIN_GREEN, led_g);
}
if(count % 3 == 0){
led_b += 10;
analogWrite(PIN_BLUE, led_b);
}
count += 1;

if(led_r >= 255) led_r = 0;
if(led_g >= 255) led_g = 0;
if(led_b >= 255) led_b = 0;
if(count >= 255) count = 0;
delay(50);
}

1

Jawbone UpのAPIで睡眠時間などを取得する

oauth2で認証してからjawbone gemを使う。

ここに置いてある
https://github.com/shokai/jawbone-up-api-study


腕輪型アクティビティロガーのAPI

腕輪型アクティビティロガーではJawbone Up、FitBit、FuelBandの3つが有名だと思う。どれもAPIがある。

JawboneがOAuth2、FitBitがOAuthで認証して詳細なデータが取得できて、APIもいろいろあって遊べる。作ったアプリを他人に使ってもらいやすい。
Nike FuelBandは野良開発者は自分のバンドしかデータが取れず、しかも詳細な数値はナイキのパートナーしか取得できないようだ。遊べない。

Jawbone Up24(Bluetooth LEでiPhone/Androidと同期するやつ)はwebhookのURLが登録できて、OAuth2で読み取り権限をくれたユーザーのデータがガンガン自分のwebアプリにサーバー間プッシュされるらしいので興味深い。例えば睡眠に入った、起きた、等のタイミングでpushされるらしい。普通のUpでも同期したタイミングでpushされてくるかなと思って試したけど、webhookされなかった。Up24がほしい。

俺が普通のJawbone Upを買ったのは3つのAPIドキュメントを比較してみて、Jawboneが一番面白そうだなと思ったからなんだけど、当時AndroidではUp24とbluetooth接続できなかったので普通のUpを買ったという次第。Up24ほしい。


まずアプリを登録する

https://jawbone.com/up/developer/

とりあえずローカルホストでアプリを作るのでcallbackをうけるためにlocalhost:5000で登録する。

Client IdとApp Secretをメモしておく。


認証する


これをSinatraで実装する
UP for Developers: Authentication

config.ru

require 'sinatra'
require 'oauth2'

CLIENT_ID="your-client-id"
APP_SECRET="your-app-secret"

require_relative 'main'

enable :sessions
set :session_secret, (ENV["SESSION_SECRET"] || "zanmai-kazusuke-kazudon-marutaka")

run Sinatra::Application

main.rb

def oauth_client
@client ||= OAuth2::Client.new(CLIENT_ID, APP_SECRET,
:site => 'https://jawbone.com',
:authorize_url => '/auth/oauth2/auth',
:token_url => '/auth/oauth2/token')
end

get '/' do
unless session[:oauth_token]
@mes = %Q{<p><a href="/login">login</a></p>}
else
@mes = %Q{<p><a href="/logout">logout</a></p>
<p>your token : #{session[:oauth_token]}</p>}
end
end

get '/login' do
scope = "extended_read sleep_read mood_read"
redirect oauth_client.auth_code.authorize_url(:scope => scope,
:redirect_uri => "http://localhost:5000/auth")
end

get '/auth' do
code = params["code"]
halt 400, 'code missing' unless code
begin
session[:oauth_token] = oauth_client.auth_code.get_token(code).token
rescue => e
STDERR.puts e.message
end
redirect "/"
end

get '/logout' do
session.delete :oauth_token
redirect "/"
end

起動

% bundle exec rackup config.ru -p 5000


loginするとjawboneのサイトに飛んでoauthで認証しlocalhost:5000に戻ってくる。


APIで睡眠データを取得する

/users/@me/sleeps
 を読む。

これが
UP for Developers: Endpoints

ラップされてjawbone gemになる

["move", "body_event", "workout", "sleep", "meal", "cardiac_event", "generic_event", "mood"]
が使える。


require 'jawbone'
require 'awesome_print'

OAUTH_TOKEN = "your-oauth-token"

client = Jawbone::Client.new OAUTH_TOKEN

ap client.user
ap client.sleeps
睡眠時間などを取得する


何時から何時まで寝たか(asleep_timeとawake_time)、深い眠り(deep)と浅い眠り(light)の長さ、ただ横になっているだけで寝ていない時間(awake)、二度寝を何回したか(awakenings)などがわかる。
単位は全て秒とunixtime。

0

Jawbone Upの再起動

最近Jawbone Up24というbluetoothで同期できる奴に、Androidアプリが対応したのでアップデートが来た。
アップデートしたら同期できなくなった。
再起動のハードリセットの方をしたら治った。



俺が持っているのは普通のJawbone Upで、Up24ではない。
イヤホンジャックに接続して同期する古いタイプ。
接続したら同期が始まって、「同期に失敗しました」と言われる。

再起動

Reset Your Up Band
に書いてある。

ソフトリセット

本体のいつも使うボタンを押したまま、USB充電器に接続。
しばらくすると、LEDが赤と黄色に点滅する。
データは消えない。


ハードリセット

(電池がそれなりにある状態で)
本体のボタンを10回連打、10回目はそのまま押し続ける。10秒押し続けるとLEDが点滅する。
こっちは記録したデータが消える。
Up24のbluetoothペアリング解除→別のケータイへの再ペアリングにも使える。

0

IRKitのファームウェアを改造してセンサー読めるようにする

読めるようにソフトウェアは改造してみたけど、肝心のセンサー自体はまだ何もつないでない。

IRKitはArduino派生のハードウェアなので、ファームウェアの改造もできる。
ファームウェアに関しては特にドキュメント読まなかった(というか何も無かった)けど、Arduinoの作法に従ってやればさくさくといじれた。プラットフォームは偉大。

とりあえずGET /messagesすると赤外線データだけでなくADコンバータ0〜5を読んでJSONに混ぜて返すようにできた

freqの次のsensorの配列がそれ。



Macでやる。多分Linuxでもできる。Windowsでは使ってるツール(ino)が動かなくて無理な気がする。


ソースをgithubからclone

https://github.com/irkit/device/wiki

% git clone git@github.com:irkit/device.git
% cd device

firmwareディレクトリ以下がソレ。

なお今いじってるリビジョンはMar 18 16:03:26 の 992a4a58b4d73d213f4083c285c8d7bac39533b3

なんか動かなくなったら
% git checkout v1.3.5
して安定版でビルドして書き込めば治せると思う。多分。


inoとは

ビルドとファームウェアの書き込みにはinoを使う。そういえば以前紹介してた。
ino使うとCUIでArduinoをビルドできて便利
inoはArduino.appを参照して使うpythonスクリプトなのでArduino.appもインストールしておく


update boards.txt

inoはboards.txtを読んでビルドや書き込み時の設定とするので、boards.txtにirkitを追加する。

それぞれ以下にある

Mac
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt

Ubuntu
/usr/share/arduino/hardware/arduino/boards.txt

% patch -u /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt < firmware/boards.txt.patch

irkitが使えるようになってるかチェック
% ino list-models


build


firmware/build.shを参考にした。しかし中でなんかrmしてたり、~/src/ino/bin/inoを使っていたりとハードコーディングしていたのでbuild.shを使わず手動でやった。
% cd firmware
% VERSION=`git describe --tags --long | sed -e "s/^v//" | sed -e "s/\-/./g"`
% sed -e "s/__VERSION__/$VERSION/" src/IRKit/version.template > src/IRKit/version.c
% ino build -m irkit
これでうまくいけばfirmware.hexができる。


upload hex

IRKitをMacにUSB接続してすぐ書き込む。
Arduinoは電源入ってから数秒間だけファームウェア書き込みを受け付ける為。
% ino upload -m irkit

※注意:ブートローダー破壊する可能性あり(追記)

28672 byte以上書き込むとbootloader領域破壊するので、書き込み前にhexのサイズを確認するべき。詳しくは→IRKitのブートローダーを破壊したので直した

serial monitor

なおシリアルモニタで見るとIRKitがDNSをlookupしたり色々通信しているのが見れる。
% ino serial
ctrl+a ctrl+xで終了。


ファームウェア改造


return analog sensor values on HTTP-GET /messages · 8a89128 · shokai/irkit-device


firmware/src/IRKit/IRKitHTTPHandler.cpp がHTTPのハンドラなので、
static int8_t on_get_messages_request関数にanalogReadを追加するなどした。
     gs.write("{\"format\":\"raw\",\"freq\":"); // format fixed to "raw" for now
gs.write(IrCtrl.freq);
+
+ gs.write(",\"sensor\":[");
+ for(char i = 0; i < 6; i++){
+ gs.write((uint8_t) analogRead(i));
+ if(i < 5) gs.write(",");
+ }
+ gs.write("]");
+
gs.write(",\"data\":[");
for (uint16_t i=0; i gs.write( IR_get() );

gs.write関数はGSwifi.cppに書かれている。