こんにちは。アプリケーションエンジニアの中村です。
MKZ4も発売してからしばらく経ちまして、買ってしばらく遊んだものの、ホコリを被っているお宅もあるのではないでしょうか。かくいう私もそうだったのですが、子供のころ見ていたミニ四駆のアニメで、声でミニ四駆を操っていたのを思い出しましたので、MKZ4とスマホアプリを使って再現を試みてみました。
まずはiPhoneアプリを作成してみましたので、ご紹介したいと思います。追ってAndroidでの作成方法も記事にしようと考えています。
また、「INTERNET Watch」、「AKIBA PC Hotline!」にてリレー形式で掲載している – 触れてみよう電子工作×IoT 第2回 IoTで「パンツァー・フォー!」 1/48重戦車タイガーIを改造してスマホで遠隔操作してみた<前編><後編> – でご紹介した、1/48戦車をコントロールするカスタマイズ方法も後日ご紹介します。
必要な機材、ソフトウェア
- Mac (macOS 10.11.5以降が動作しているもの)
- MKZ4を取り付けたミニ四駆
- iPhone (iPhone 6 Plus, iPhone 7で動作確認。どちらもiOSバージョンは10.2.1。)
- Xcode Version 8.2.1 (App Storeからインストール)
- サンプルアプリのソースコード (GitHubからダウンロード)
iPhoneアプリはMacでXcodeを使って作成できます。最新のXcodeのバージョンは8.2.1で、macOS 10.11.5以降で動作しますので、このOSが動作するMacを使用します。(名前で言うと、OS X El Capitan v10.11.5以降や、macOS Sierraですね。)
iPhoneはモバイルデータ通信が有効になっている必要があります。音声認識には、インターネット接続が必要なのですが、iPhoneをMKZ4のWi-Fiに接続すると、Wi-Fiではインターネット接続できなくなってしまうためです。
もちろんMKZ4も必要です。まだお持ちでない場合は、作例を 文系新卒でもIoTに入門できるのか?! 改造ミニ四駆製作キット「MKZ4」に挑戦 でご紹介していますので、ご参照ください。
事前準備
Xcodeのインストール
- XcodeをMacのApp Storeアプリからインストールします。App Storeを開いて、Xcodeを検索し、「入手」ボタンを押してインストールしてください。
- インストールが終わったら、「開く」ボタンをクリックして、Xcodeを起動します。Xcode and iOS SDK Licence Agreementに同意して次に進みます。
- 「Welcome to Xcode」と表示されたら、Xcodeは準備完了です。
サンプルアプリのソースコードをダウンロード
- https://github.com/cerevo/MKZ4_VoiceCommander_iOS を開きます。
- 「Clone or download」ボタンを押し、開いたダイアログのDownload ZIPを選択してダウンロードします。
- ダウンロードしたファイルをクリックして、展開します。これでソースコードの準備は完了です。
実行してみる
設定を修正する
- ソースコードのフォルダ内にある VoiceCommander.xcodeproj をXcodeで開きます。
- 下図を参考に設定を修正します。
- (1)をクリックしてプロジェクトの設定を開きます。
- (2)をクリックして、「PROJECT」と「TARGETS」を表示します。
- (3)をクリックして、「VoiceCommander」を選択します。
- (4)の「Add account」ボタンをクリック します。(表示されていない場合はスキップして6へ)
- Apple IDを入力し、(5)の「Sign in」ボタンをクリックします。
- (6)のTeamのプルダウンメニューをクリックします。
- (5)で入力したApple IDのPersonal Teamを選択します。(7)
- (8)のようになることを確認します。
- iPhoneをMacにLightning – USBケーブルを使って接続します。(9)のようなステータスが表示されていたら、接続することで、解消すると思います。
- iPhoneの画面をみると、「このコンピュータを信頼しますか?」と確認されるので、信頼をタップします。
- (10)のインストール先をクリックし、接続したiPhoneを選択します。(11)
- (9)の部分が更新され、(12)のようになれば完了です。
iPhoneにインストールする
- (1)のRunボタンをクリックします。
- 開発者モードを有効にしますか?と聞かれたら、Enableをクリックします。
- Processing symbol files というメッセージが表示されたら、OKをクリックし、しばらく(5分程度)待ってから、(1)のRunボタンを再度押して下さい。
- アプリを起動できないというメッセージが表示されたら、メッセージに従ってiPhoneを操作します。
- iPhoneの設定アプリを開きます。
- 一般をタップし、下の方にスクロールして、プロファイルとデバイス管理をタップします。
- デベロッパAppセクションにご自分のApple IDが表示されていると思いますので、そちらをタップします。
- 表示されたダイアログ内の「信頼」をタップします。
- 再度、XcodeのRunボタンをクリックします。
アプリを使ってみる
- アプリが起動すると、音声認識へのアクセス許可を求められますので、同意します。
- 音声認識を開始するボタンを押すと、今度はマイクへのアクセス許可を求められますので、こちらにも同意します。
- 再度、音声認識を開始するボタンを押しながら、iPhoneに向かって何か言ってみます。言い終わったところでボタンを離すと、認識結果を表示します。下図では「スタート」と言ったのを認識しています。
MKZ4の電源を入れる
- 本アプリが想定しているMKZ4本体のプログラムは、製品の説明書の手順通り書き込むサンプルプログラムのままで、特にカスタマイズの必要はありません。もし、何かカスタマイズしていた場合は、以下のサンプルプログラムを書き込んでください。
- すでにサンプルプログラムを書き込み済みの場合は、電源を入れて下さい。
iPhoneをMKZ4に接続して操作してみる
- iPhoneのWi-Fi設定を開き、「MKZ4」のネットワークに接続します。
- 下記のコマンド表を参考に、キーワードを言って、操作します。
コマンド | キーワード |
前進 | 進め、行け、いけ、スタート |
後退 | 後退、下がれ |
左折 | 左 |
右折 | 右 |
停止 | 止まれ、ストップ |
実装のポイント
以上で、動かしてみることはできるようになったかと思います。以下では、実装について説明したいと思います。
- ソースコードの構成
- App Transport Security (ATS) の設定
- マイクと音声認識を有効にする
ソースコードの構成
Xcodeのナビゲーターエリアを見ながら、主要なファイルについて説明します。
- ViewController.swift
- アプリ起動後に表示される、メインの画面の動作が書かれています。
- 画面の初期化、音声認識の初期化、音声認識したキーワードの処理などを行っています。
- 音声認識のキーワードとコマンドの対応を編集したい場合は、こちらを修正してみて下さい。
- Mkz4ApiCaller.swift
- MKZ4へコマンドを送信する処理が書かれています。
- ViewController.swiftから使っています。
- Main.storyboard
- メイン画面の要素の配置を行っています。
- ViewController.swiftから、このファイル内のボタンやテキストを参照しています。
- Info.plist
- アプリの設定が書かれています。
- 後述の、App Transport Security (ATS) の設定や、マイクと音声認識を有効にする設定については、このファイルに保存します。
- Localizable.strings
- 多言語対応の辞書です。
- ViewController.swiftから、後述のLocalizedStringという関数を使って利用しています。
- LocalizedString.swift
- NSLocalizedStringという、多言語化辞書から文言を取得するための関数を、簡単に使えるようにするLocalizedStringという関数が書かれています。
App Transport Security (ATS) の設定
iPhoneからMKZ4にコマンドを送信するときに、HTTPで通信を行っています。ATSの設定がデフォルトのままだと、HTTPで通信できないため、設定を変更しています。Info.plist を開くと、「App Transport Security Settings」に「NSAllowsLocalNetworking = YES」という設定を行っているのが確認できると思います。こうすることで、同じネットワークにつながっているiPhoneとMKZ4でHTTPでの通信ができるようになります。
マイクと音声認識を有効にする
iPhoneのマイクや音声認識をアプリから利用するには、ユーザーに許可を求める必要があります。許可を求めるダイアログを表示する際に、理由を表示する必要があり、理由を設定していない場合は、許可を求めようとしたタイミングでアプリが終了してしまいます。Info.plist を開くと、マイクは「Privacy – Microphone Usage Description」、音声認識は「Privacy – Speech Recognition Usage Description」に設定していることが確認できると思います。
参考: NSMicrophoneUsageDescription, NSSpeechRecognitionUsageDescription
終わりに
いかがでしたでしょうか。MKZ4、iPhone、Mac、Xcodeと、準備が少し大変かもしれませんが、一度準備が整えば、自分好みに修正していろいろと遊べると思います。今回の構成では、音声認識の結果を得るまでと、MKZ4にコマンドを送信終わるまでの時間が必要なため、どうしても応答性が悪く、残念に思うこともあるかもしれません。そのあたりは、今後の技術の発展が解決してくれることを祈りつつ、まずは音声で操作することを楽しんでいただければ幸いです。