maaash.jp

what I create

Wi-Fi機能を備えたデバイスのセットアップ、そしてモールスWi-Fiセットアップについて

IRKitのように、スマートフォンとWi-Fiで接続するデバイスをつくる際には、
どのように家のWi-FiのSSIDやセキュリティの設定(WPA2なのかWEPなのか等)、パスワードをどのようにスマートフォンからデバイスに伝えるのか、ということが問題になる。

スマフォからは同時に1つのWi-Fiアクセスポイントにしか接続できないのだから、
家でも使うデバイスなのであれば、デバイスが家のWi-Fiアクセスポイントに接続することになる。

だがデバイスには入力用のインターフェースがない。

一番思いつきやすいのが、デバイスがWi-Fiアクセスポイントになり、スマフォからそれに接続して家のWi-Fiアクセスポイントの情報を伝える、という方法。
だがこれでは自分のアプリ内でセットアップが完結しない。iOSであれば一度設定アプリを開き、Wi-Fiの設定からデバイスのアクセスポイントを選択し、、となる。

興味深い事例をいくつかご紹介すると、
Eye-Fiカードでは、一度PCにつなぎ、PC上のセットアップツールを使い、Eye-Fiカードが接続するアクセスポイントの情報を直接カードに書き込む。

この方法だとアクセスポイントはプルダウンメニューから選択できるのでSSID等を手入力せずに済むし、Wi-Fiに接続できなかった場合にデバイスからのフィードバックもあるが、PCにつながくてもセットアップできるとなおよい。

Electric Imp というWi-Fiモジュールでは、光の点滅をデジタル信号のようにして使う BlinkUp Technology を使う。

スマフォのディスプレイがチカチカするのだ。かっこいい。
オープンソースにはなっていないし、Wi-FiモジュールとしてElectric Impを採用する必要があったがIRKitではそれは別の理由でできない。TELECも2014年3月現在取得していない。

IRKitをつくるときには、他のWi-Fiモジュールを使いつつこれをぱくろうかと最初は思ったが、
Patent Pendingと強調されているし、探すと申請中の特許 Optically configured modularized control system to enable wireless network control and sensing of other devices も見つかったのでびびってやめておいた。

光がだめなら音はどうか。
モールス信号はかっこいい。

(中略)ということで音でいこうと決めた。

Arduinoでモールス信号の送受信を試している人も何人かいて google: arduino morse 、それらを参考に組んでみた。

モールス信号 は、長音と短音、無音区間の比率を規定するもので、速度は WPM という単位を使い、可変である。
WPM は Words Per Minute の略。
Word は “PARIS” を基準とする場合が多い。
つまり .__. ._ ._. .. ... (ただし ‘_’ が長音, ‘.’ が短音, ‘ ’ が文字区切りとする) の長さである。
長音1つは短音3つに相当し、
各音の間には1短音分、文字区切りは3短音分、単語区切りは7短音分の無音区間があるので、
“PARIS” は 50短音分の長さがあり、
WPM は 1分間で 50短音分の長さ をいくつ再生できるのか、という速度の単位である。

SSIDとパスワード+アルファを送ろうとするのに、何分もかかるようでは困る。
ということで IRKit で採用する際には高速化をはかった。

まずは鳴らす側、iPhoneアプリではモールス音を高速に鳴らすライブラリは無かったので、書くことにした。
できあがったものはこちら。
IRMorsePlayerOperation.m
モールス信号をサイン波のサンプルから生成し、ローパスフィルターを通し(サイン波を鳴らしたり無音にしたりする境目で発生するノイズを落とすため)、マイクから鳴らす。
AudioUnit, AUGraphを使った。

Arduino側はこちら。
morse.cpp

モールス信号は、長音と短音の組み合わせにアルファベットをマッピングしていく。
その表はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// # standard morse tree
// T _    M _ _    O _ _ _    CH _ _ _ _
//                            Ö _ _ _ .
//                 G _ _ .    Q _ _ . _
//                            Z _ _ . .
//        N _ .    K _ . _    Y _ . _ _
//                            C _ . _ .
//                 D _ . .    X _ . . _
//                            B _ . . .
// E .    A . _    W . _ _    J . _ _ _
//                            P . _ _ .
//                 R . _ .    Ä . _ . _
//                            L . _ . .
//        I . .    U . . _    Ü . . _ _
//                            F . . _ .
//                 S . . .    V . . . _
//                            H . . . .

ところがSSIDには日本語が使えてしまうので、SSIDをモールスで送ろうとすると困る。

IRKitでは以下のように [0-9A-F] と区切り用に ‘/’ に特化したマッピングを採用した。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// # hex+/ morse tree
// # 4,5 should be used more frequently than others because they're used in ascii alphabet
// 4 _    3 _ _    0 _ _ _    ? _ _ _ _
//                            ? _ _ _ .
//                 1 _ _ .    ? _ _ . _
//                            ? _ _ . .
//        6 _ .    8 _ . _    ? _ . _ _
//                            ? _ . _ .
//                 9 _ . .    ? _ . . _
//                            A _ . . .
// 5 .    2 . _    B . _ _    ? . _ _ _
//                            ? . _ _ .
//                 C . _ .    ? . _ . _
//                            ? . _ . .
//        7 . .    D . . _    ? . . _ _
//                            ? . . _ .
//                 E . . .    F . . . _
//                            / . . . .

これで厳密にはモールス信号ではないのだろうが、しょうがない。
文字列はUTF-8にエンコードしたものを16進にして4bitずつ1文字として送る。
例: “あ” -> “E38182” -> ... __ _._ __. _._ ._

iPhoneアプリでモールス音を再生し、Arduinoでデコードする。
安定して認識できた速度 100 WPM を採用した。
これでそこそこ長いSSIDとパスワードの組み合わせ+アルファを送るのに 12 秒。
セーフか。

こんなふうにして再生する、 100 WPM のモールス信号の音を参考までに置いておく。

この方式を モールスWi-Fiセットアップ と勝手に呼んでいた。

dstat経由でredis infoを眺めfluentdを通してgrowthforecastでグラフにする

dstat が万能なのでredis infoのキーを眺められるプラグインをつくった。

redis-cli info の total_commands_processed を眺める場合。

DSTAT_REDIS_* な環境変数を設定することでなんでもできるし
fluentd-plugin-dstatを使う場合には環境変数がいじりにくかったので同じディレクトリにある設定ファイルを使ってもいい。

次にこれを fluent-plugin-dstat を使い fluentd に流し込み、fluent-plugin-growthforecast を使って GrowthForecast でグラフにしよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# td-agent/templates/default/td-agent.conf.erb
<source>
  type dstat
  tag dstat.<%= node[:hostname] %>
  option --redis
  delay 30
</source>

<match dstat.*>
  type map
  tag  "mapped." + tag
  time time
  record record["dstat"]
</match>

<match mapped.dstat.*>
  type           flatten_hash
  add_tag_prefix flattened.
</match>

<match flattened.mapped.dstat.**>
  type growthforecast
  gfapi_url http://growthforecast/api/
  service dstat
  tag_for section
  remove_prefix flattened.mapped.dstat
  name_key_pattern .*
</match>

と、こうなる

このプラグインの組み合わせにたどり着くまで大変だった!
けど、これで <%= node[:hostname] %> 毎にgrowthforecastの section ができるので捗る気がする。

dstatのプラグイン は公式のものがたくさんあるのでそれらを参考にすればわりと簡単に書ける。
dstat,fluentd,growthforecast最高!

kazeburo wareなアラートシステムを心待ちにしております

IRKitリリース!そして再入荷予定について

IRKit (Amazon) の再入荷予定はこのページの一番上に最新情報を掲載する形でしばらく更新していきます。
IRKit (switch-science) でも販売を開始いたしました。


第5ロットを製造中です。
現在Amazon,switch-scienceともに在庫がありませんが今週中には出荷予定です。
少々お待ちくださいませ。

2014-08-05 13:30追記


第3ロットを製造中&随時Amazonおよびswitch-scienceへ納品中です。
一時的に在庫が無い場合もありますが数日中には補充されると思います。

2014-04-01 10:30追記


第2ロットが売り切れました!
ありがとうございます。

第3ロットの部品はほぼそろっていまして、1-2週間で出荷できる予定です。
しばらくお待ちくださいませ。

2014-03-18 11:30追記


基板の実装は完了したのですが検査プログラムに問題があり、出荷までもう少々かかりそうです。
もう少々お待ちを…

2014-02-28 15:20追記


次のロットに向けた全部品がそろいそうです。
在庫補充は3月1日頃を予定しています。
部品についてご連絡いただいた方、お待ちいただいている方、ありがとうございます!
2014-02-18 12:20追記


非常に残念ですが、2月14日頃の入荷はなくなりました。
必要な部品 (ATMEGA32U4-AUというAtmel社のマイコン) が手に入りにくいためです。
購入後 1月24日 納期を待っていたものが 2月26日 納期に延期になり、さらに先ほど5月になってしまいました!!
なんということでしょう。
様々なみなさまのご協力により少しずつかき集めて作りたいと思っていますが
再入荷予定は、確実に見えてからまた更新するようにいたします。
もし ATMEGA32U4-AU を入手できる方がいらっしゃいましたらご紹介ください。お願いいたします。
2014-02-13 00:00追記


再入荷についてですが、最速で2月14日頃になりそうです。
またこちらを更新する形でお知らせいたします。
2014-02-01 18:30追記


IRKitAmazonで販売開始しました

が、2014-01-15 13:00現在在庫がありません。
残念です。。

製造と在庫の補充予定について。
最初に100個/ロットつくりまして、様子を見てゆっくり100個/ロットを回していくか、
それとも数を増やしていくかを考えようという予定でした。

最初の100個のうち、20個ばかりがお試し期間中にお問い合わせいただいたり、
こちらからお願いしてデバッグのような感じで(すんなり動かなかった方は本当にご協力ありがとうございました)
先行販売/差し上げて使っていただきました。

残り80個を 24 x 3 に分けて、
ファームウェアに不具合があれば最後の最後に書き換えられるように(結局、書き換えていませんが)
少しずつAmazonへ出荷しようと考えていて、その最初の24個が売り切れ、
次の24個が到着、Amazonの納品作業待ちです。
今日中には購入いただけるようになるでしょう。


こちら納品完了し、売り切れました!ありがとうございますー
2014-01-15 14:00追記

最後の24個はまだ家にありまして後ほど発送しますので、
週末中には購入いただけるようになるでしょう。


こちら納品完了し、売り切れました!ありがとうございますー
2014-01-29 11:00追記

その後はしばらく品切れのまま、数を増やしたロットが1月末か2月頭にできあがるはずです。
それまで熱がさめてしまわないことを祈ります!
申し訳ありませんがしばらくお待ちを…


こちら1月末は難しくなりました。残念です。。
2月初旬にできあがる予定ですがまだ日程が確定できる段階ではありませんのでまたこちらを更新してお知らせいたします。
2014-01-29 11:00追記

ではかっこいい写真を見ていってください。
撮影協力 Thanks @_somtd手縫いの革小物屋さん collocollo

IRKit Internet HTTP APIと販売開始に向けて

外出先からエアコンつけたいですよね。
そうですよね。

IRKit同じWiFiアクセスポイントにつながっている時に、HTTP POSTで赤外線信号をIRKitに送ってもらうAPI仕様 についてはもう書いてあったんですが、
外出先から赤外線信号を送ってもらうためのAPIについても書きました。
IRKit Internet HTTP API と言います。(ちょっと長いですよね, でもデバイス側もHTTPサーバだしなんとも…)

赤外線信号を送るためのAPIは POST /1/messages です。
そのパラメータには送り元のクライアントを認証する clientkey と、
赤外線を送信するIRKitデバイスを特定するIDである deviceid が必要です。
どうやってこれらを手に入れましょうか。

よくある使い方として考えているのは、
IRKitを買っていただいて、公式アプリを使ってWiFiにつないで、普通に使えた!という後に、
せっかくもっと楽しめるんだからインターネット越しに使ってみよう、という方。
この場合には簡単です。

デバイスに POST /keys とやると、一時的に有効な clienttoken というのをもらえます。
これをサーバ側に POST /1/keys で送ると、
サーバ側でこのIRKitデバイスと新しいクライアントの情報を関連づけて記録して deviceid, clientkey をもらえます。
これをつけて POST /1/messages すれば、messageをサーバ経由でデバイスに届けて、赤外線を送ってくれます。

このやり方は clienttoken を使うことでデバイスとクライアントを関連づける、デバイス -> クライアント のやり方です。
クライアント -> デバイスのルートで関連づけを行うやり方もありまして、これが公式アプリやiOS SDKから使うモールス信号を使ったやり方ですが、、、

ちなみに、IRKitは来週15日水曜日Amazonで販売開始予定です。
試用はこの辺りで受付を中止いたします。試用していただいた方はありがとうございましたー!

dkdk

IRKitを試したい人〜

IRKitについていくつか記事を書いてきました。
IRKitの基板実装工場に行ってきた
fablabkamakuraでIRKitのプログラム書き込み用治具をつくった
Yamaguchi Mini Maker Faire 2013

ようやくできあがってきたので、
IRKitとは何なのか、ちょっと恥ずかしい動画でご紹介いたします。ご覧ください。

やってみたかったんだよねー、こういう海外だとよくありそうな、開発者がしゃべる動画。

詳しいことは IRKitのwebsite にも書きましたが、こちらの最後にも転載します。

2014/1月の初めに AmazonのIRKitの商品ページ から で購入できるようになるかと思いますが、

早く使ってみたい!という方がいらっしゃいましたら
お渡ししますので試してください!

試していただけた方には、amazonを通さない分かなりお安くできるほか、場合によってはそのまま差し上げるかもしれません! ぜひご興味があれば、以下までご連絡お願いしますー。

@maaash
o.masakazu@gmail.com


IRKitとは

IRKitは、WiFi機能の付いたオープンソースな赤外線リモコンデバイス。
家庭のエアコンやテレビ、ライトなど、赤外線で操作できる家電を、
WiFiをとおして、iPhoneやiPadなどから操作できるようにするものです。

IRKitは、公式のリモコンアプリ(coming soon!)から操作できるほか、
IRKit iOS-SDKを使えば、
任意のタイミングで赤外線信号を送ることのできるiOSアプリを簡単につくることができます。

例えば

  • 位置情報を使いiPhoneが家の近くに来たら自動でエアコンを付けるアプリ
  • 1ボタンで家中の家電の電源を消すアプリ(寝る前に便利)
  • ソーシャルと連携してFacebook友だちの見ているテレビにチャンネルを合わせるアプリ

など、家電を操作する様々なアプリの可能性があるでしょう。

また、JavaScriptを使ってブラウザから赤外線信号を送ったり
curlを使って黒い画面(Terminal)から赤外線信号を送ることもできます。

IRKitデバイス自体にHTTPサーバがあり、
JSON形式の赤外線情報を HTTP POSTリクエストにのせて送ることで、赤外線信号を送ることができるのです。
また、IRKitと同じWiFiにいなくても、外出先から赤外線信号を送るための、インターネット上にあるサーバのAPIも公開しています。

IRKitデバイスは、Arduino Derivative(派生)のプロダクトです。
未使用のピンは引き出してあるので、温度センサや明るさセンサなどを追加し、ArduinoIDEを使ってプログラムを書き込めば、
よりスマートなリモコンをつくることもできます。

リモコンのどんなところを、諦めていましたか?
どんなふうに家電を操作したいですか?


IRKit iOS SDK

It’s as simple as:

#import <IRKit/IRKit.h>

[_signal sendWithCompletion:^(NSError *error) {
    NSLog( @"sent with error: %@", error );
}];

See more on irkit/ios-sdk


IRKit Device Hardware

See more on irkit/device/hardware


IRKit Device Firmware

See irkit/device/firmware


IRKit Device HTTP API

IRKitデバイスは、Bonjourを使ってIPアドレスを求めることができます。

% dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Sat 28 Dec 2013---
23:12:55.623  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
23:12:55.768  Add        2   4 local.               _irkit._tcp.         irkitd2a4
^C

% dns-sd -G v4 irkitd2a4.local
DATE: ---Sat 28 Dec 2013---
23:16:29.698  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
23:16:29.818  Add     2  4 irkitd2a4.local.                       10.0.1.2                                     10
^C

IPアドレスがわかったら、以下のHTTP APIにアクセスしましょう。
* SafariなどBonjourの.localホスト名を解決するクライアントから以下のHTTPリクエストをする場合には上記は不要です。

GET /messages

最も新しい受信した赤外線信号を返します。

% curl -i "http://10.0.1.2/messages"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/1.3.0.182.gaf86b44
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}

POST /messages

赤外線信号を送ります。

% curl -i "http://10.0.1.2/messages" -d '{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/1.3.0.182.gaf86b44
Content-Type: text/plain

赤外線信号を表すJSONについて

赤外線信号は↑のようなJSONで表します。以下のキーを持ちます。

Key Description
format “raw”のみ
freq 赤外線信号のサブキャリア周波数を表します。38 または 40 のみ。単位 [kHz]
data 赤外線信号は、サブキャリア周波数のオン・オフからなります。IRKitデバイスはオン→オフ間の時間、オフ→オン間の時間を 2MHz のカウンタで数えます。dataには、カウンタで数えた数をオン・オフの回数分ならびます。

IRKit Server HTTP API

IRKit Device HTTP API は、IRKit Deviceと同じWiFiにつないでいる時のみ、アクセス可能です。
同じWiFiにいない場合には、インターネットからIRKit Deviceに赤外線を送ってもらうには、以下のようにします。
coming soon!!

IRKitの基板実装工場に行ってきた

Merry Christmas!

クリスマスイブにはIRKitの基板実装工場の近く、岐阜のビジネスホテルに泊まった。
12/24 IN, 12/25 OUT
今年の自分らしいね。

IRKitの基板は、 久田見製作所 に製造、実装、検査をお願いしています。
基板にたくさん助言をくれた 基板設計者 加藤木さん も12/24なのにごいっしょしてくれました。
岐阜県にある町工場に初めての訪問。

クリスマスイブには、部品実装。
マウンターで高速に基板上に置かれる部品達。
ダダダダダダ

リード部品(赤外線LED, 赤外線受信器, マイク, カラーLED) は指した後にハンダ槽を通す。

そしてケースも ミヨシの杉山さん から、金型で出した仕上げ前のプロトタイプが届く!
かっこいいよ 佐々木さん
もりあがってきたー

トラブルもあったけれど、その場でアイディアを出し合って、創意工夫して解決していく。
そういうプロセスに参加するプロの表情。安心できる。
このメンバーと組んでよかった!

あともうちょっと!

fablabkamakuraでIRKitのプログラム書き込み用治具をつくった

IRKitというリモコンをつくっています。

先週は工場でプログラム書き込み、電気検査を行う時に、 実装(=ハンダ付け)済の基板を置くための治具をつくりました。

かっこいいですね。

IRKitは Arduino派生 で、
ATmega32U4マイコンへのプログラムの書き込みにはよくArduino ICSPヘッダと言われる6本のピンを使います。
また、Wifiモジュールへのプログラム書き込みには別の8本のピンを使います。

工場では、これらのピンを通して基板にプログラムを書き込みます。

基板にはピンヘッダもソケットも実装せず、ユーザーが実装できるようにスルーホールだけ空いている。
そんなスルーホールに対して電気的な接触を一時的にするための部品として、
switch-scienceさんで販売しているコンスルー と、sparkfunさんで販売しているPogo Pin というのがあります。

Pogo Pinはこちらから買うと安いとのこと
P75-E2 Dia 1.02mm 100g Spring Test Probe Pogo Pin 100PCS/lot (thanks, tonu)

それぞれ自分のところで製造している基板の書き込みに使われている様子。 Testbed + Pogopins = Pogobed (sparkfun)
良記事。

両方試して知人も使用経験のある後者を使おうと思っています。
どちらでもよさそうな。
こんな部品の存在も自分がこれを使うことになることも半年前には想像もしていなかった!

IRKitの基板を上にのっけて、板で上から押さえつけるようにすると、ICSPの6本とWiFi用の8本が接触する。

そしてavrdudeやらを呼び出す batファイル を書けば、1ダブルクリックで基板に息が吹き込まれる。
2013年内に batファイル の書き方をこんなにぐぐることになるとも想像していなかった。

ケースは、fablabkamakuraで、4mmの合板をレーザーカッターで切り出してつくりました。

Rhinoでモデリングし、イラレで合板を効率よく使うように配置した後、WindowsPCから 印刷 を行うと、レーザーカッターが合板を切り抜いてくれます。
印刷 コマンドとはね。

レーザーカッターは3Dプリンタに加えて、なんでもつくれる全能感を与えてくれる工作機械。
ぜひお試しいただくとよいかと思います。
思いついたものをすぐ作れるfablab最高。

KonashiでiPhoneに無線でつながるデバイスのプロトタイピング

カヤックを退職し、リモコンと歯ブラシをつくっています。

今日は歯ブラシの方、シャカシャカブラシの話をしましょう。

Engadgetの 「電子工作部」、スマホ連係ガジェットを作ろう! というイベントに(しばらく前に)行ってきました。 思うに、おもしろいな〜と思うサービスは必ず物理的なデバイスを伴うものであることが増えてきたように感じていて、 自分でもつくろうと思い立ちました。

このイベントは、konashi を使って「スマートフォンと連係するガジェットを作る」ワークショップ。 チームに分かれて、ブレストをして (間をはしょって) つくってものがこちら。

この動画、感動ものですね。

うちの子も歯磨きが苦手な時期があって、歯磨きをする時といえばいつも、
床に座って自分のまたの間に子供を寝かせて、足で腕を抑えて抵抗できないようにして、泣き叫びながら、口の中に指を入れて噛まれないように注意しながら歯磨きしていて、 ほんと虫歯を防ぐためでなければやりたくないです。

まさにこれ

シャカシャカブラシは、歯ブラシにつけたクマの形をしたガジェットで歯ブラシの動きを検出して、それをBLEでiPhone/iPadに送り、クマさんやきりんさんが出てくるゲームぽいアプリを子供に見せて歯磨きが終わるまで楽しんでもらおう、というもの。

DSCN4440.JPG

konashi Amazonでも買えるみたい は BLEを使ってプロトタイピングをするためのツールキットで、
Arduinoみたくデジタルやアナログの入出力のピンがあって、それにセンサなどをつなぐと、BLEを通してiPhoneから見えるようになる、というもの。

このクマの歯ブラシには、歯磨きする時の動きをとるために、加速度センサをつけています。 加速度センサで取得した加速度を、konashiを使ってiPhoneに送ります。

発表まで一週間と時間もないので、加速度センサは @SOMTD が持っていた(thanks!)、秋月でも売っていた(過去形…) KXM-1050 を使いました。3軸加速度センサモジュール KXR94-2050 が同じ仕様の後継かな??

KXM-1050 は、3.3V を電源電圧として与えると、中央の 1.65V を 0G として感度 660mV/G で X,Y,Z 軸のアナログ電圧を出力してくれます。 これを konashi のアナログ入力電圧範囲 0-1.3V の範囲内に抵抗で分圧して収めます。

電源は konashi のピンにある 3V (2.7-5.5VまでOK) を使い、 出力抵抗が 32k もあるので (これに気づかずしばらくはまりましたが…)

3 x ( X / (32k + X) ) <= 1.3

22k の抵抗を選び

3 x (22k / (32k + 22k)) = 1.22 [V]

を狙います。

これで 0G の時には 1.22 / 2 = 0.61[V] くらい, 感度も

1
2
3.3:0.66 = 1.22:X
X = 0.66 x 1.22 / 3.3 = 0.244 [V/g]

ハンダ付けして基板を縦置き、横置き、とかしながらテスターで測ると

1
2
3
+1G: 0.877V
 0G: 0.621V
-1G: 0.394V

なのでほぼ狙いどおり。

同チームにいた プロトタイピングに強い樹脂成形のミヨシ さんがあっというまに削りだしでつくってくれたケースに収めるとこんな感じ。

DSCN4442.JPG

加速度センサのデータは、konashiを経由して読み取ります。 konashiをiPhoneから使うには、2種類の開発方法をとることができます。

  • jsdo.it 上にJavaScriptコードを投稿し、konashi.js アプリ上で実行する方法。
  • Objective-Cを書いて、ネイティブiOSアプリを書く方法。

今回は Storyboard で画面遷移をつくると速そうだったので後者を選択。

konashi-ios-sdk は cocoapods を使い Podfile に書いて pod install すれば入ります。

1
2
3
platform :ios, "6.1"
pod "konashi-ios-sdk"
xcodeproj "CuteBrush/CuteBrush.xcodeproj"

最初の ViewController で #import <konashi-ios-sdk/Konashi.h> した後

konashiの発見と、加速度センサの3軸分のアナログ入力の設定をします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (void)viewDidLoad {
    [super viewDidLoad];

    if ( ! [Konashi isReady]) {
        [Konashi initialize];
        [Konashi addObserver:self selector:@selector(konashiReady) name:KONASHI_EVENT_READY];
        [Konashi find];
    }
    ...

}

- (void) konashiReady {
    LOG_CURRENT_METHOD;
    [Konashi removeObserver:self];

    [Konashi pinMode:KONASHI_GSENSOR_PINX mode:INPUT];
    [Konashi pinMode:KONASHI_GSENSOR_PINY mode:INPUT];
    [Konashi pinMode:KONASHI_GSENSOR_PINZ mode:INPUT];

    [self performSegueWithIdentifier:@"didStartSegue" sender:self];
}

segueで遷移した先の ViewController では歯ブラシの動きにしたがって、ゲームを進行します。

X軸方向と、Y軸方向のアナログデータを交互に読み取ります。 (実際に歯磨きをする時には、Z軸方向=歯ブラシの糸方向 には歯ブラシを動かさないので)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- (void)viewDidLoad {
    [super viewDidLoad];

    _pins = @[ [NSNumber numberWithInt:KONASHI_GSENSOR_PINX],
               [NSNumber numberWithInt:KONASHI_GSENSOR_PINY] ];
    _pinIndex = 0;
    [self issueNextReadRequest];

    [Konashi addObserver:self selector:@selector(readGSensorX) name:KONASHI_EVENT_UPDATE_ANALOG_VALUE_AIO0];
    [Konashi addObserver:self selector:@selector(readGSensorY) name:KONASHI_EVENT_UPDATE_ANALOG_VALUE_AIO1];
}

- (void)issueNextReadRequest {
    _pinIndex ++;
    if (_pinIndex >= _pins.count) {
        _pinIndex = 0;
    }
    [Konashi analogReadRequest: [_pins[_pinIndex] intValue]];
}

- (void)readGSensorX {
    int x = [Konashi analogRead:KONASHI_GSENSOR_PINX];
    LOG(@"x,y,z: %d,%d,%d", x,[Konashi analogRead:KONASHI_GSENSOR_PINY],0);
    [_triggerX input:x];
    [self issueNextReadRequest];
}

- (void)readGSensorY {
    int y = [Konashi analogRead:KONASHI_GSENSOR_PINY];
    LOG(@"x,y,z: %d,%d,%d", [Konashi analogRead:KONASHI_GSENSOR_PINX],y,0);
    [_triggerY input:y];
    [self issueNextReadRequest];
}

_triggerX, _triggerY はアナログ入力から、歯ブラシの反転時のGを検出して画面に反映するイベントを発行するオブジェクト(省略)。

こんなふうに、最初の動画のプロトタイプをつくりました。簡単ですね〜

この歯ブラシプロジェクトは、引き続き開発を進めていきますので、 もしお子さんのいる方で共感していただける方は Facebook シャカシャカブラシ ページ への いいね お願いします!