カヤックを退職し、リモコンと歯ブラシをつくっています。
今日は歯ブラシの方、シャカシャカブラシの話をしましょう。
Engadgetの 「電子工作部」、スマホ連係ガジェットを作ろう! というイベントに(しばらく前に)行ってきました。 思うに、おもしろいな〜と思うサービスは必ず物理的なデバイスを伴うものであることが増えてきたように感じていて、 自分でもつくろうと思い立ちました。
このイベントは、konashi を使って「スマートフォンと連係するガジェットを作る」ワークショップ。 チームに分かれて、ブレストをして (間をはしょって) つくってものがこちら。
この動画、感動ものですね。
うちの子も歯磨きが苦手な時期があって、歯磨きをする時といえばいつも、
床に座って自分のまたの間に子供を寝かせて、足で腕を抑えて抵抗できないようにして、泣き叫びながら、口の中に指を入れて噛まれないように注意しながら歯磨きしていて、
ほんと虫歯を防ぐためでなければやりたくないです。
シャカシャカブラシは、歯ブラシにつけたクマの形をしたガジェットで歯ブラシの動きを検出して、それをBLEでiPhone/iPadに送り、クマさんやきりんさんが出てくるゲームぽいアプリを子供に見せて歯磨きが終わるまで楽しんでもらおう、というもの。
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] くらい, 感度も
3.3:0.66 = 1.22:X
X = 0.66 x 1.22 / 3.3 = 0.244 [V/g]
ハンダ付けして基板を縦置き、横置き、とかしながらテスターで測ると
+1G: 0.877V
0G: 0.621V
-1G: 0.394V
なのでほぼ狙いどおり。
同チームにいた プロトタイピングに強い樹脂成形のミヨシ さんがあっというまに削りだしでつくってくれたケースに収めるとこんな感じ。
加速度センサのデータは、konashiを経由して読み取ります。 konashiをiPhoneから使うには、2種類の開発方法をとることができます。
- jsdo.it 上にJavaScriptコードを投稿し、konashi.js アプリ上で実行する方法。
- Objective-Cを書いて、ネイティブiOSアプリを書く方法。
今回は Storyboard で画面遷移をつくると速そうだったので後者を選択。
konashi-ios-sdk は cocoapods を使い Podfile に書いて pod install すれば入ります。
platform :ios, "6.1"
pod "konashi-ios-sdk"
xcodeproj "CuteBrush/CuteBrush.xcodeproj"
最初の ViewController で #import <konashi-ios-sdk/Konashi.h> した後
konashiの発見と、加速度センサの3軸分のアナログ入力の設定をします。
- (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軸方向=歯ブラシの糸方向 には歯ブラシを動かさないので)
- (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 シャカシャカブラシ ページ への いいね お願いします!

