iOSアプリと連携させて使えるデバイスたち

第1回「konashi」iOSアプリを連携させる

はじめに

iPhoneやiPadは、あたりまえですが画面があって音も出て、インターネットにもつながり、さらにはGPSや加速度センサも付いていて、スマートフォンアプリに必要な機能を実現するにはかなり「揃っている」デバイスです。ただ、それでもiPhoneからにおいは出せませんし、脳波はとれませんし、時計のように腕に巻くことはできませんし、直接電子回路をつなげることはできません。

そういった「iOSデバイスにない機能」を使うには、外部デバイスに頼る必要があります。嬉しいことに、昨今のスマホアプリ開発人気のおかげで、iOSアプリと連携させて使えるデバイス、すなわちiOSアプリと連携させるためのSDKや、Web APIが用意されているデバイスが色々と市販され始めています。

本連載では、そういった「iOSアプリの可能性を広げるデバイス」を毎回1つずつ取り上げ、その特長や、連携させるためのアプリ側の実装方法などを紹介していきます。

konashiについて

記念すべき第1回は、国産フィジカルコンピューティングデバイス「konashi」を紹介したいと思います。

konashi
konashi

konashiとは

konashi(こなし)は、iPhone/iPadのための、フィジカル・コンピューティングツールキットです。iOSから簡単にハードウェアにアクセスする開発環境を提供し、マイコン側のファームウェア開発をすることなくソフトウェアエンジニア・デザイナ・アーティストが手軽にプロトタイピングを行うツールとしてお使いいただけます。

ユカイ工学のkonashi紹介ページより

本連載向けにざっくりいうと、konashiを使うことで、自分で電子回路を組んで、それをiPhone/iPadアプリと連携させることができます。

フィジカルコンピューティング向けのデバイスとしてよく使われているArduino(とくに最もメジャーなUno)との主な違いとしては、

  • Bluetooth Low Energyを搭載しており、拡張なしでiPhoneやiPadと無線接続できる
  • JavaScriptやObjective-Cで開発できるようライブラリが整備されている

といった点です。つまり、スマホアプリとの連携に重点を置いたプロダクトになっています。

konashiを使うことで、たとえば、次のようなものを実現できるようになります。

iPhoneを持った人物が近づくと作動する電球や扇風機
iPhoneを持った人物が近づくと作動する電球や扇風機
歯を磨く動作に合わせ、iPhoneアプリ内のキャラがキレイになっていく歯ブラシ
装着し続けている間、遠隔のiPhoneに位置やアドレス帳の更新情報を送り続ける指輪

装着し続けている間、遠隔のiPhoneに位置やアドレス帳の更新情報を送り続ける指輪

購入方法

konashiは、ユカイ工学のショップで購入することができます。

ユカイ工学
ユカイ工学

販売価格は9,980円(2013年11月現在)です。

基本的な使い方

iOS SDKの取得、導入から、Lチカ(LEDを光らせる)までの手順です。ここはほぼ公式サイトのGetting Started通り。

なお、本記事のすべてのサンプルコードは、こちらよりダウンロードしていただけます。

1.konashi-ios-sdkを取得する

下記のGitHubリポジトリから cloneするか、zipでdownloadします。

CocoaPodsからの取得&導入にも対応しています。Podfileに以下のように書き、

platform :ios, "6.1"
pod "konashi-ios-sdk"

ターミナルからpod installします。

$ pod install

2.SDKをプロジェクトに追加する

konashi-ios-sdk/Konashiフォルダごとプロジェクトに追加し、依存フレームワークであるCoreBluetooth.framework をプロジェクトにリンクします。

3.コードを書く

  • konashiを探して接続する
  • LEDを光らせる

というコードを書きます。

ViewController.m で、ヘッダをインポートしておきます。

#import "Konashi.h"

viewDidLoadで、Konashiオブジェクトを初期化し、 konashiとの接続完了イベントの監視を開始します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Konashiオブジェクトを初期化
    [Konashi initialize];
    
    // konashiとの接続完了時に発行されるイベントを監視する
    [Konashi addObserver:self
                selector:@selector(flashLED)
                    name:KONASHI_EVENT_READY];
}

接続完了イベント(KONASHI_EVENT_READY)発行時に実行するメソッドを実装します。

- (void)flashLED {
    
    [Konashi pinMode:LED2
                mode:OUTPUT];
    
    [Konashi digitalWrite:LED2
                    value:HIGH];
}

上記のflashLEDメソッドではLEDを点灯させる処理を行っています。

konashiとの接続を開始するアクションメソッドを用意し、

- (IBAction)pressFind {
    
    [Konashi find];
}

Interface BuilderでUIButtonオブジェクトと接続します。

ボタンの作成
ボタンの作成

ここではボタンのタイトルを「konashiを探す」としました。

動かしてみる

konashiに付属のボタン電池をセットするか、USBケーブルをつないで電源を供給します。iOSデバイス(iPhoneかiPad)側ではiOSの「設定」からBluetoothをOnにしておき、

設定
設定

作成したアプリの「konashiを探す」ボタンを押します。

近くにkonashiがあれば次のようにピッカーが出てきます。

ピッカーの表示
ピッカーの表示

ここでDoneボタンを押すと、konashiとの接続が開始され、接続完了するとLEDが点灯します。

LEDの点灯
LEDの点灯

スイッチをトリガにiOSアプリで処理を行う

konashiはフィジカルコンピューティング用途のデバイスなので、自分で組んだ電子回路や市販の拡張ボードとつなげて使うことを前提としたものですが、本体だけでもすぐに試せるよう、ここでは標準搭載されているスイッチとLEDを使ってiOSアプリと連携する方法をいくつか紹介します。

konashiのスイッチ
konashiのスイッチ

konashiスイッチ押下をiOSアプリ側で検知する

まず、konashiのスイッチが押されたことをiOSアプリ側で検知する方法を紹介します。先ほど実装したサンプルのviewDidLoadで、次のようにKONASHI_EVENT_UPDATE_PIO_INPUTイベントの監視を開始します。

[Konashi addObserver:self
            selector:@selector(pioInputUpdated)
                name:KONASHI_EVENT_UPDATE_PIO_INPUT];

KONASHI_EVENT_UPDATE_PIO_INPUTは、 PIO(Digital I/O)の入力の状態が変化した時に発行されるイベントで、次の図からわかるように、konashiのスイッチはPIO 0に接続されているので、

レイアウトスイッチの図
レイアウトスイッチの図

スイッチの状態が変わると、KONASHI_EVENT_UPDATE_PIO_INPUTイベントが発行される、というわけです。

KONASHI_EVENT_UPDATE_PIO_INPUT発行時に実行するメソッドを、次のように実装します。

- (void)pioInputUpdated {
    
    if ([Konashi digitalRead:S1] == HIGH) {

        NSString *title = @"スイッチが押されました";
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                        message:nil
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}

上記では、digitalRead:` メソッドでスイッチの入力状態を取得し、HIGH、つまり押された状態であれば、アラートを表示するようにしています。これで、konashiとiOSアプリを接続した状態でスイッチを押すと、アラートが表示されるようになります。

アラートの表示
アラートの表示

konashiのスイッチ+LEDでアプリのメニュー選択操作を行う

konashiにはPIOに4つのLEDが搭載されているので、それらを利用して、konashiのスイッチからメニュー選択を行うサンプルを紹介します。

konashiのスイッチを押すたびに4つのLEDが順番に切り替わり、スイッチを長押しすることでメニュー決定、となります。

メニュー
メニュー

まず、選択されているメニュー(LEDのピン番号)を保持するためのint型のメンバ変数と、スイッチ長押しを判別するためのNSTimeInterval型のメンバ変数を宣言しておきます。

@interface ViewController ()
{
    int currentLED;
    NSTimeInterval startTime;
}
@end

LEDを点灯させるメソッドを次のように実装します。

- (void)flashLED:(int)led {
    
    [Konashi pinMode:led
                mode:OUTPUT];
    
    [Konashi digitalWrite:led
                    value:HIGH];
}

上記メソッドでは、引数に指定したピン番号のLEDを点灯させる処理をおこなっています。

すべてのLEDを消灯させるメソッドを次のように実装します。

- (void)turnOffAll {
    
    for (int i=LED2; i

viewDidLoadでイベント監視の開始を次のように行い、

[Konashi addObserver:self
            selector:@selector(ready)
                name:KONASHI_EVENT_READY];

[Konashi addObserver:self
            selector:@selector(pioInputUpdated)
                name:KONASHI_EVENT_UPDATE_PIO_INPUT];

各イベントハンドラを次のように実装します。

- (void)ready {

    // 接続完了したらまずLED2をオン
    currentLED = LED2;
    [self flashLED:currentLED];
}
- (void)pioInputUpdated {
    
    [Konashi pinMode:S1
                mode:INPUT];
    
    // スイッチが押された
    if ([Konashi digitalRead:S1] == HIGH) {

        startTime = [[NSDate date] timeIntervalSince1970];
    }
    // スイッチが離された
    else {
        
        NSTimeInterval current = [[NSDate date] timeIntervalSince1970];
        NSTimeInterval interval = current - startTime;

        // 長押し
        if (interval > 1.0) {
            
            NSString *title = [NSString stringWithFormat:@"メニュー %d が選択されました", currentLED];
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                            message:nil
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
        }
        // クリック
        else {
            
            // 全てのLEDをオフ
            [self turnOffAll];

            // 次のLEDへ
            currentLED++;
            
            // LED5の次はLED2
            if (currentLED > LED5) {
                
                currentLED = LED2;
            }
            
            // 次のLEDをオン
            [self flashLED:currentLED];
        }
    }
}

上記の、スイッチが押された/離されたときに呼ばれるイベントハンドラpioInputUpdatedでは、スイッチが押されている時間を計測し、

  • 短く押された場合はメニューの切り替え(点灯するLEDを切り替える)
  • 長押しされた場合はメニューの決定(選択されたメニューをアラート表示する)

という処理を行っています。

以上の実装で、スイッチを短く押すごとにメニューが切り替わっていることをLEDで確認でき、長押しするとアプリ側にアラートが出て選択されたメニューが表示されるようになります。

メニューが切り替わる
メニューが切り替わる

さまざまなセンサやアクチュエータを簡単に使う

konashi単体ですぐに試せるよう、前項ではkonashiに標準搭載されているLEDとスイッチを使ってiOSアプリを制御する方法を取り上げましたが、konashiは自分でセンサやアクチュエータを使用した回路を組んで接続することでよりその可能性を発揮するものです。

ただ、はんだづけは作業としてのハードルが高いし、ブレッドボード上に回線を組むにしても、相応の電気/電子の知識が必要になります。

そこで、ここではより簡単に、コネクタを挿すだけでセンサやアクチュエータを使用した回路を作成できるようになる拡張ボード「konashi GROVE拡張ボード」を紹介します。

拡張ボード
拡張ボード

ユカイ工学のプレスリリースには、

弊社製品konashiに対し、Seeed Studio社のモジュールキット GROVEの接続を可能にする拡張ボードです。これにより、電子工作初心者でもブロックを組み立てるような感覚で、ブレッドボードよりも簡単に回路を作成することができます。

とあります。

konashi本体同様、ユカイ工学のショップで購入することができます。税込2,980円です。

GROVE拡張ボードの使い方

ボードの準備としては、konashiの上に拡張ボードをかぶせるだけです。

GROVE拡張ボードの使い方
GROVE拡張ボードの使い方

ちょうどkonashiの上下10本ずつ端子に拡張ボードのピンが挿さるようになっています。注意点としては、ボード背面の『ユカイ』というロゴの向きを合わせること。

あとは、GROVEモジュールのコネクタをそれぞれデジタル/アナログの端子に挿すだけです。

コネクタを挿す(上から見たところ)
コネクタを挿す(上から見たところ)

たとえばデジタル端子に挿せるモジュールとしては、タッチセンサがあります。

タッチセンサ
タッチセンサ

このモジュールはタッチしている間、出力がHIGHになります。プログラムからの扱いとしては、前述したスイッチと同様、KONASHI_EVENT_UPDATE_PIO_INPUTイベントを監視し、タッチセンサを挿しているピン(拡張ボードのCN1はピンS1に相当)の値を読み取ればOKです。

またアナログ端子に挿して使うモジュールとしては、光センサがあります。

光センサ
光センサ

アナログ端子の値はそれぞれ端子ごとにイベント名が定義されており、AIO0の値の変化を読み取る場合は、KONASHI_EVENT_UPDATE_ANALOG_VALUE_AIO0を監視します。

[Konashi addObserver:self
            selector:@selector(analogInputUpdated)
                name:KONASHI_EVENT_UPDATE_ANALOG_VALUE_AIO0];

analogReadRequest:を呼んで読み取りをリクエストすると、

- (IBAction)requestReadAio0 {
    [Konashi analogReadRequest:AIO0];
}

KONASHI_EVENT_UPDATE_ANALOG_VALUE_AIO0が発行されイベントハンドラで値を取得することができます。

- (void)analogInputUpdated {
    NSLog(@"READ_AIO0: %d", [Konashi analogRead:AIO0]);
}

GROVEモジュールの種類

上で触れたタッチセンサや光センサ以外にも、GROVEモジュールには、非常に多くの種類があります。

ほんの一例を挙げると、次のようなものがあります。

またGROVE拡張ボードにはPIO6、7がI2C通信用の端子として設けられています(図の赤い部分⁠⁠。I2C方式の通信を利用することで、より高機能なセンサにつなぐことができます。I2Cで接続するセンサモジュールには次のようなものがあります。

スイッチサイエンスのショップのSeeed Studioカテゴリや、海外サイトになってしまいますが、販売元のSeeed Studio社のGROVEページでもっと多くのモジュールを見つけることができるので、色々と探してみてください。

まとめ

iPhone/iPadと簡単に連携できるフィジカルコンピューティングデバイス「konashi」を紹介しました。ぜひ、konashiを使用して、iOSアプリの可能性を広げるアプリおよびデバイス作りに挑戦してみてください。

なお、今回の記事執筆にあたり、ユカイ工学主任研究員であり、konashiを企画/開発された松村礼央氏に内容のチェックと、ご助言をいただきました。この場を借りてお礼申し上げます。

次回はまた別の「iOSアプリと連携して使えるデバイス」を取り上げます。お楽しみに!

おすすめ記事

記事・ニュース一覧