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

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

この記事を読むのに必要な時間:およそ 5 分

スイッチをトリガに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<=LED5; i++) {
        
        [Konashi pinMode:i
                    mode:OUTPUT];
        
        [Konashi digitalWrite:i
                        value:LOW];
    }
}

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で確認でき,長押しするとアプリ側にアラートが出て選択されたメニューが表示されるようになります。

メニューが切り替わる

メニューが切り替わる

著者プロフィール

堤修一(つつみしゅういち)

1978年生まれ。京都大学工学部を卒業後,同大学院修了。その後,NTTデータにて音声認識技術の研究開発,キヤノンにて画像処理機能の設計に携わる。

2010年より面白法人カヤックに入社。3年間ほぼiOSアプリ開発に専念し,フルスクラッチで開発しリリースしたアプリは30本以上。代表作は150万ユーザを突破した「バウンドモンスターズ」,AppStore Best of 2012を獲得した「タップ忍者」,カンヌ国際広告祭でブロンズを獲得した「Domino's App」など。

現在は,米国シリコンバレーのマウンテンビューにあるAppSocially社の一員として活躍中。

著書=『iOSアプリ開発 達人のレシピ100―開発現場で実証された実用コード集』

ブログ=Over&Outその後

Github=shu223

Twitter=shu223

コメント

コメントの記入