EMC_Fastest
簡易な早押し判定機システムの製作例のご紹介です。
押しボタンの入力インターフェイスにArduinoボード、判定処理や表示インターフェイスにPCやスマホ上のTcl/Tkスクリプトを使い、お手軽ながらもそこそこ高機能なシステムを試作してみました。
能書き(経緯)
ちょいちょい参加してるカラオケオフがあるのですが(mixi 谷山浩子コミュニティー)。関西開催のもので近年幹事を担ってくださってる方がサービス精神旺盛な人で、折に触れて余興を設けたりしてくれるのですね。そんな余興のひとつとして一時期「イントロクイズ」をやってたことがあって。その際また凝ったことに、単に挙手で済ませるんじゃなくて、市販キットの早押し判定機を用意して来られたのです(共立プロダクツ ワンダーキット「早押し判定2」を箱に収めたもの)。
これ。実務的には挙手で充分と思うのだけれども、思いの外、気持ち的な盛り上がりに寄与した印象でした。なんとなくクイズ大会やってる気分が高まった気が(笑)。「早押し判定機って、思ってたより楽しいかもな」、と。
なのですが…その判定機には実用上少々難がありまして…。
- 標準実装では出題側手元の判定機基板上のLEDでしか判定結果が表示されず、回答者から視認できない。
- 標準実装では判定時のチャイム音が小さく回答者に聞こえない。
つまり、あってもなくても実のところあんまり変わんない!(爆)
そこで刺激を受けた自分が色気を出し、キットに用意されてる出力端子を使って、外部スピーカー繋いでみたり、外部出力をArduinoボードで取り込んでPCで画面表示してみたりして(ランプ表示させたりするのは機材や電源の準備が大変なので)遊んでいたのですが…。
Arduinoボード使うなら、キットの機能は単独でまるっと実装できちゃいそうですよね…。キット自体、主要機能の実装にはPICマイコン(PIC16F886)を使ってるみたいだし。更に、どうせ表示の拡張にPC使うなら、Arduinoボードの役割は接点入力に限定して、処理は全部PCでやっちゃってもいいんじゃない? プログラムの自由度も高いし。と。
そんなこんなで…、発端となったカラオケオフはさておいて、意外と面白みのありそうな早押し判定機システムを市販キット使わず自前で試作してみたのが本記事の製作例です。
コンセプトは「なるべく自分で作らない」。回路設計とかしない。なるべく工作しない。抜ける手は抜く。そして機材はなるべくコンパクトに。そんな方針。
前述の市販キットもキットはキットなので、組み上げはもちろん、ケースや押しボタンなど機構部品の選定・加工の手間はどうしても要ってくるのですよね…。
では完成市販品はどうかというと、これが意外と選択肢ないみたいで。探した範囲では1商品しか見当たらなくて、ある程度の回答者数に対応しようとすると、コストやら荷物やらが嵩んできそう。
Bluetoothなどで相互接続して使うスマホアプリなんてのもあるようで、それはそれで使えるならいいですが、スマホ持ってない人は?とか、互換性は?とか、接続設定手間取らない?とか、自分の感覚ではそれはそれで面倒そうにも。事前動作確認とかやんにくいですしね…。
そんな中で。実用に耐える性能があるかどうかは相当に怪しいけれども(笑)、比較的手軽な早押し判定機システム構築事例として、どなたかの参考になれば幸いなところです。
概要
機能
- 早押し判定機能
- 17入力対応(Nano互換機による製作例の場合)。
- 判定はホストコンピューター側で処理。
- 結果表示機能
- ホストコンピューターのディスプレイに判定結果ランキングをグラフィカル表示。
- 番号だけでなく名前も表示可。
- ホストコンピューターの機能により外部ディスプレイ(大画面テレビなど)への表示出力が可能。(ミラキャストなどではタイムラグが大きいですが。)
- 全画面表示、サブ画面表示対応。(表示ウインドウと操作ウインドウの分離およびキーボードバインドの実装。)
- 効果音機能
- 押しボタン押下検出時にホストコンピューターで効果音を鳴らす機能実装(WAVファイル再生による)。
- ついでに正答・誤答時などを想定した簡易な効果音ポン出し機能も実装。
特徴
- ハードウェアの設計・工作要素が少ない。
- 工作は押しボタン周りの機構部品とそれに関連してのケース加工だけ。…その辺りは市販キットでも必要な手間ですし(キットなら更に基板の組み上げが必要に)。
- ホストコンピューターを使うことで表示や効果音に関連する工作が不要。
- ハードウェアが比較的安価。
- 電子部品はArduinoボード一つで、安価な互換ボードなど利用すれば数百円でOK。
- ケースやケーブルも廃材や100円ショップ利用などで工夫できる。
- 高コストなのは押しボタンやコネクター(機構部品は価格が高く、数も要る)。そこが工夫のしどころ。
- 一番お高いのはホストコンピューターですが…、既に手持ちなら追加投資は不要。
- ソフトウェアの再開発も比較的手軽でプラットフォームの自由度が高い。
- 処理の大部分はホストコンピューター側で行っており、またそれもスクリプト言語で作成しているので、改修の際もコンパイルや書き込みが不要で手軽かつ柔軟。マイコンの制約にも縛られなくていい。
- Arduinoボードとの通信は単純なUSB仮想シリアル(それもテキスト受信のみ)なので、本記事の試作スクリプトでは不足な場合でも、ソフトの自力再開発が比較的容易で、多くのプラットフォームで実装可。
- 試作スクリプト自体もTcl/Tk言語採用で移植性が高い(製作例ではWindowsとAndroidで動作確認)。
- そこそこ高機能。
- 1ユニットで対応できる入力数が市販品より多い。(ただし増設はハードル高。作者は必要ないので今のところやる気なし。)
- ホストコンピューターの利用により、結果の大画面表示や効果音を鳴らすことが可能。表示は番号だけでなく名前も。
- コンパクトな機材構成が可能。
- ArduinoボードはNanoで充分。電子部品はそれだけ。後は機構部品に工夫の余地。
- ホストコンピューターはノートPC、タブレット、スマホなどお好みで。
- 表示画面は出先のTVやディスプレイも活用可。
システム構成
- ホストコンピューター
- Tcl/Tkと、Arduinoボードと通信可能なUSB仮想シリアルポートの使えるコンピューター。
- 動作確認済コンピューター
(キーボードとマウスなどの使用推奨です。タッチパネルだけでも使えなくはないですが、かなり使いにくいです。)
- HP ENVY x360 Convertible 13-ag0010AU with Windows 10 Home 64bit
- SONY Xperia Z5 SoftBank 501SO with Android 6.0 (upgrade)
- 動作確認済Tcl/Tkインタープリタ(バージョン違いの互換性は未調査)
- Windows OS
- vanillawish (AndroWishのWindows版)(undroidwishは動作が確認できていません。)
- TclKit (拡張パッケージ環境の整備を自分で行う必要があります。上級者向け。)
- Android OS
- その他 OS
- 未確認(もしかしたら動くかも。ただしポート指定は手打ち。)
- 使用Tcl/Tk拡張パッケージ(ライブラリ)
- Snack (sound) (Androwish/vanillawishでは標準構成に含まれています。効果音機能用。)
- vfs (Androwish/vanillawish/TclKit共、標準構成に含まれています。アーカイブ内ファイル参照用。)
- registry (for Windows only) (vanillawish/TclKit共、標準構成に含まれています。仮想COMポート取得用。)
- Usbserial (for Android only) (Androwishの標準構成に含まれています。USB仮想シリアル通信用。)
- rfcomm (for Android only) (Androwishの標準構成に含まれています。M5StickC BluetoothSerial.hによる無線化支援の試み用。)
- インターフェイスボックス(要工作)
- 押しボタンの接点をArduinoボードに接続するための機構ユニット。試作例は後述。
- 使用Arduinoボード
- Nano互換機 ( ATmega328P + CH340 )
- 2-12,14-19番の計17ピンを使います(0,1はUSB通信のため、13はオンボードLEDが接続されていて、使えません)。
動作確認していませんが、恐らく同じピン番号のデジタル入力が使えるUnoなどでも動作すると思います。
- 押しボタン(要工作)
- 回答者が押すための押しボタン。試作例は後述。
- 押しボタンの接点をインターフェイスボックスまで引き回すためのケーブル。試作では市販のオーディオ延長ケーブルを100円ショップなどで購入して済ませます。
基本的には、Arduinoボードに押しボタンスイッチを繋ぐだけのハードです。工作は機構周りだけ。
なので各々好きなように作れば良くて、いくらも工夫のしようがあろうと思います。自由に作りましょう。
ここではあくまで試作例の紹介だけ。
ケース加工と接点信号の配線です。
ブレッドボードを使うことでArduinoボードの固定加工と基板配線を端折ってます。
試作例では他用途への流用を念頭に、接点入力端子数をEMC_Fastestの対応入力数より多い20とし、QIコネクターを使ってピンアサイン変更の余地を残しています。
- 使用部材
- マイコンボード:Nano互換機 ( ATmega328P + CH340 )
- 基板:小型ブレッドボード
- ケース:おかず箱 ポリプロピレン製(100円ショップで購入)
- 押しボタン接点入力端子:3.5mmφモノラルPhoneジャック パネル取付型(マル信無線電機 MJ-164H)
- 配線材:QIコネクター(1pinメス 自前圧着)、ピンヘッダー、フラットケーブルを割いたもの、スズメッキ線
- その他:厚手両面テープ(ブレッドボード嵩上げ貼り付け用)
- 留意事項
- 押しボタンから受けた接点をArduinoボードの2-12,14-19番ピンに接続しますが、GNDピンの数が限られるので、予め束ねておく必要があります。
- 試作品写真
スイッチの加工と配線です。
スイッチとコネクターを直結することで信号ケーブルなどの配線加工を端折ってます。信号ケーブルには市販のオーディオ延長ケーブル(ステレオ可)を使います。
市販のものをコネクター変換(ないし付け替え)して使ってもいいかも知れません。
- 使用部材
- 押しボタン:プッシュスイッチ プッシュON/モーメンタリ(マル信無線電機 MS-400)
- 押しボタン接点出力端子:3.5mmφモノラルPhoneプラグ(マル信無線電機 MP-105AC)
- スイッチカバー:厚手水道ホース 内径8mm程?(記録漏れ)
- 信号ケーブル:3.5mmφオーディオ延長ケーブル(ステレオ可)(100円ショップなどで購入)
- 試作品写真
- EMC_FastestX 配布アーカイブ 20200325版 [ZIP 12938.9kB]
- ソフトウェア一式の配布アーカイブです。ダウンロードし、適当な場所で解凍して下さい。インストール手順は後述。
- ライセンスについては勉強不足でまだよく理解できてないのですが、差し当たって…
- Tcl/Tkスクリプト
- 「クリエイティブ・コモンズ・ライセンス」の「CC BY-NC-SA(表示-非営利-継承)」相当くらい?でお願いします。(追ってちゃんと考えられるといいなぁ…。)
- Arduinoスケッチとバッチファイル
- パブリック・ドメインでいいと思います。
- ドキュメント類
- 「クリエイティブ・コモンズ・ライセンス」の「CC BY-NC-ND(表示-非営利-改変禁止)」で。
- 配布アーカイブには効果音のデモ用サンプルとしてフリー音源をバンドルしています(OtoLogic (CC BY 4.0) https://otologic.jp)。
すぐに機能を試していただけますが、ライセンス管理上、実用の際には各々お持ちの音源に挿し替えていただくことをお勧めします。ただし各音源のライセンスの範囲内においてはそのままご利用いただけると思います。
詳しくはアーカイブ同梱の「License Information - Bundled SE.txt」(UTF-8)を御覧ください。
- 「X」の添字は開発ステップの名残です。当初「なるべく自分で作らない」を追求して、ホストコンピューター-Arduinoボード間通信にFirmataプロトコルを使う設計としていました(それによりArduinoスケッチの開発が不要になります)。しかしながら諸々試行錯誤している中で、M5StickC BluetoothSerial.hによる無線化支援の試みが同プロトコル利用では思うように行かず、また動作の重さや拡張パッケージ使用による動作環境の制約も懸念されることから、最終的にFirmataの使用を断念し、区別のためFirmata不使用版に「X」の添字をつけることにしました。
Arduinoスケッチ
「sketchbook」フォルダ内の「EMC_Arduino_FastestX_????????.ino」をArduino IDEで開いてArduinoボードにコンパイル・書き込みしてください。
0-19番ピンをプルアップされたデジタル入力に設定し、順次ループチェックして(ただし0,1,13番はスキップ)今回ON(0)かつ前回値と違っていればピン番号をシリアル通信に流すだけのシンプルなスケッチです。
Arduino Megaなど多ピンボード対応に拡張する場合は改修が必要です。
ホストコンピューター Tcl/Tkスクリプト
スクリプト自体は特別のインストール操作は不要ですが、Tcl/Tkインタープリタが未導入の場合はそのインストールが必要です。詳細はここでは割愛しますが、WindowsとAndroidの場合についてだけ、簡易にご紹介しておきます。なおここで紹介するインタープリタには本スクリプトで使用している拡張パッケージが同梱されていますので別途の導入は不要です。
- Windows OSの場合
- AndroWishのDownloadsページから、「vanillawish」をダウンロードします。
- ファイルサイズは27MBほどです。
- バージョンはどれでも大丈夫と思いますが、まぁ新しいものが良いでしょう。
- ダウンロードリンクの場所がちょっと分かりにくいのですが、各リリース節の一番下に「Vanilla」で始まる段落があります。その中に並ぶリンクの中から、ご自身の環境に合ったものを選んでください。
- 「Windows (32bit)」なら32bit/64bitどちらの環境でも動くので差し当たって融通が利きます。
- ダウンロードしたインタープリタファイルを、先程解凍したフォルダー(バッチファイルのあるフォルダー)にコピーし、ファイル名を「wish.exe」に書き換えます。
(やりようはいろいろありますが、ここでは簡便のためこの方法で紹介しておきます。慣れた方はご自由にどうぞ。)
- Android OSの場合
- Playストアとかを通していない野良アプリなので自己責任でひとつ。気が進まなければやめておきましょう。まぁ…大丈夫と思いますが。
- AndroWishのDownloadsページから、「AndroWish」をダウンロードします。
- ファイルサイズは35MBほどです。
- バージョンはどれでも大丈夫と思いますが、まぁ新しいものが良いでしょう。
- ダウンロードリンクがいっぱいあって分かりにくいのですが、「Android package, signed with a debug key」("Eppur si muove"なら「AndroWish-6e2085e6e4-debug.apk」)が目的のインストールファイルです。
- PCでダウンロードした場合は、ダウンロードしたインストールファイルをAndroid端末にコピーします。ダウンロードフォルダへ置くのがいいでしょう。コピーの方法はここでは割愛します。
- ダウンロードしたインストールファイルをAndroid上で実行します。実行方法はここでは割愛します。筆者はファイラーから行いました。「Tetra Free」というファイラーを使っています。
- 画面の表示に従って進めればさっくり入ります。
使い方
- 機器接続
- 機器を接続し、ArduinoボードをホストコンピューターのOSに認識させます。
- 差し当たってはホストコンピューターとインターフェイスボックス、テスト用に押しボタンが幾つか繋がっていればOKです。
- Windowsの場合、当該Arduinoボードの開発をArduino IDEで行えているのであれば既に環境は整っています。
そうでなくても通常は自動で認識し、仮想COMポートが構築されます。デバイスマネージャーで確認ください。上手く行かない場合の対応はここでは割愛します。
- Androidの場合、接続のたびに手動で「USB機器を検出」させる必要があるようです(少なくとも手元のスマホでは)。設定などから実施ください。操作方法の説明はここでは割愛します。
参考動画:USB機器を検出 [MP4 7096kB 18s]
- 設定ファイル書き換え
- 諸々の設定はファイル記述で指定する仕様となっています。ファイル形式は全てTSV(タブ区切りのテキストデータ)です。専用の編集機能などは用意していません。適宜テキストエディターやTSVエディターをご利用下さい。
- テキストによる表データとしてはCSVがより一般的で、当初はそちらを採用していたのですが、取り扱いやすさを優先してTSVに変更しました。
- CSVでは「,(カンマ)」や「"(ダブルクォーテーション)」といった文字が特別な意味を持つため、格納値の中にこれらが含まれているとかなり面倒な処理が必要となり、その処理を自分で実装するのは大変なのでライブラリ(拡張パッケージ)を使う必要が出てきます。本システムはなるべくシンプルな作りにしたくて、拡張パッケージの使用数を減らしたい考えがあったため、取り扱いがグッと楽なTSVを採用することとしました。タブ文字を格納値に含めないといけないケースは稀で、少なくとも本システムで必要になるとは思われません。
- 取扱アプリケーションも、CSVを扱えるものの多くで、TSVもサポートされているのではないかと思います。
- 恐縮ながら作者の利用ツールの利便上、設定ファイルの文字コードはCP932(Shift-JIS系)指定としています。ご容赦下さい。記載内容に多バイト文字が含まれていなければ問題ありません。またTcl/Tkスクリプト(こちらはAndrowish対応のためUTF-8です 爆)の書き換えにより他のコードに変更することは可能です(「setVN encoding.setting.tsv {cp932}」の箇所。UTF-8なら{utf-8}に)。
- 各設定ファイルは次のとおりです。
- setting.tsv
-
- 最初に読み込まれる基本事項の設定ファイルです。
- 乱暴なくらいかなりいろんなことが出来る危ない設計になっていますが、使いこなしには本体スクリプトとTcl/Tkの理解が必要になり、書ききれないので詳細説明は割愛します(爆)。
- 利用価値高いのは、他の設定ファイルのファイル名の変更や(使い分けに便利です)、フォントの変更ですかね…。
- フォントと言えば、文字サイズの自動調整は実装していなくて(面倒で 爆)、手動指定です。配布状態では作者手元のWindows OS環境に合わせているのですが(「font.sub」=「gothic 50」)、それだとAndroidスマホでは極端に大きすぎるようです。各自の環境に合わせて適宜調整をお願いします。手元の環境では「font.sub」=「gothic 20」くらいにすると良さげでした。
- participant.tsv(setting.tsvで別ファイル名の指定可)
-
- 入力番号-参加者表示名対応表、要は参加者(回答者)リストです。
- 入力番号は上から順番に割り振られます。
- 2列ありますが、使ってるのは1列目だけです。
- pin.tsv(setting.tsvで別ファイル名の指定可)
-
- 入力番号-Arduinoデジタル入力ピン番号対応表、要はピンアサイン定義です。
- 入力番号は上から順番に割り振られます。
- 2列ありますが、使ってるのは1列目だけです。
- sound.tsv(setting.tsvで別ファイル名の指定可)
-
- 効果音の音源定義です。
- ポン出しボタンへの表示名、音源ファイル名、音量、を指定します。
- 一番上の音源が、押しボタン押下検出時に鳴る効果音になります。
- 音源ファイルのデータ形式はWAV限定です(Androwish同梱のSnackパッケージの制約による)。
- 音量は0-100で設定します。音量調整と言うよりは音源間のバランス調整用と理解下さい。
- 起動
- Windows OSの場合
- 「EMC FastestX.bat」を実行します。
- Android OSの場合
- 「EMC FastestX.tcl」を実行します。
実のところ筆者不慣れでよく分かってないのですが…(苦笑)。筆者はファイラー(前述の「Tetra Free」)から実行しています。
- 実行すると送り先のアプリケーションをどれにするか問われます。どうやらAndroWishのインストールで関連付けが行われているようで、その選択肢の中にAndroWishが含まれていると思いますので、それを選択すると起動します。
- 表示用と操作用の2つのウインドウが開きます。
- ホストコンピューター-Arduino間通信開始
- 「ポート:」欄(起動時は「(プルダウンで選択 or 直接入力)」と表示)で目的のArduinoボードに対応するUSB仮想シリアル通信のポートを指定します。
- WindowsとAndroid(AndroWish)では起動時に利用可能なシリアルポートが自動でリストアップされ、コンボボックスに設定されます。右端のタブをプルダウンして目的のポートを選択します。
- 直接ポート名を書き込むことも可能です。「(プルダウンで選択 or 直接入力)」の文字を消して、ポート名を書き込んでください。
WindowsやAndroid以外の環境でも、この方法で動作させることが出来るかも知れません(未確認)。
- 「開始」ボタンを押します。
- Androidの場合、(少なくとも初回は)USB機器へのアクセスの是非を問うダイアログが表示されるでしょう。「OK」を選び、処理を進めます。
- ポートの指定が不適切だと動作がバグるかも知れません。ろくに保護していません。その時は諦めて強制終了とかしてください(苦笑)。
- うまく接続されれば、「開始」ボタンが「停止」表示に、表示ウインドウの表示が「通信開始指示待機中」から「判定中」に変わります。
- 「停止」ボタンを押せば通信が切れて待機状態に戻ります。…そのような操作が必要かどうかは分かりませんが。
- 早押し判定
- 以上で準備は完了です。いざ判定。
- 適宜押しボタンを押して下さい。押しボタン押下検出の効果音が鳴り、該当する参加者名がランキング表示されていきます。
- 画面表示で操作ウインドウが前面表示されているのは邪魔でしょう。後述の操作で、表示ウインドウを前面かつ全画面表示にすることが出来ます。
- そうすると操作ウインドウの操作が出来なくなってしまいますので、キーボードバインドでカバーします。
- PCなどで2画面拡張表示出来る場合は、表示ウインドウと操作ウインドウを別画面に配置する方法もあるでしょう。
- 運用操作
- 画面表示
-
- 前面表示ウインドウを一挙動でトグル切り替え出来ます。
- 操作方法は3つあります。メニューの「画面表示」の押下、キーボードの「F11」の押下、表示ウインドウのタッチ、です。
- 表示ウインドウを前面表示にすると、同ウインドウは全画面表示となります。
- リセット
-
- ランキングのリセット方法は2つあります。メニューの「リセット」の押下、キーボードの「Del」の押下、です。
- 取消
-
- 押しボタンの誤押下を取り消したいこともあると思います。最後に押されたものから順番に遡って取り消すことが出来ます。
- 操作方法は2つあります。メニューの「取消」の押下、キーボードの「Back Space」の押下、です。
- 効果音
-
- 設定ファイルsound.tsvで定義した効果音の簡易ポン出しが可能です。
- 操作方法は2つあります。操作ウインドウに表示されている該当ボタンの押下、そのボタンの左端に表示されている文字(数字かアルファベット)のキーボードの押下、です。
- 再始動
-
- 参加者リストを再読み込みしたかったり、Arduinoボードとの通信がおかしくなって再起動したいこともあると思います。そんな時はもちろん再起動するのが最善なのですが、面倒くさい時には一挙動で簡易に再起動相当の動作をさせることが出来ます。
- 操作方法は3つあります。メニューの「再始動」の押下、キーボードの「F5」または「Ctrl+r」の押下、です。
- 実際に再起動しているわけではなく、バグの残っている可能性もあること、ご容赦下さい。
- 終了
-
- 終了方法は3つあります。メニューの「終了」の押下、キーボードの「Esc」または「Alt+F4」の押下、です。
- OS機能からの終了(ウインドウクローズなど)も利用できるでしょう。
- コンソール表示
-
- Tcl/Tkインタープリタのコマンドコンソールを表示することが出来ます。バグ取りなどの開発用です。が、計算もできたりしてちょっと便利です。
- 操作方法は2つあります。メニューの「コンソール表示」の押下、キーボードの「F1」の押下、です。
- コンソール表示の消去方法は2つあります。コンソールのコマンドプロンプトで「console hide」と入力、操作ウインドウか表示ウインドウがフォーカスされている状態でキーボードの「F2」の押下、です。
- OS機能からの終了(ウインドウクローズなど)も利用できるでしょう。
- 動作状況動画
- 総合動作(Androidスマホ) [MP4 32868kB 86s]
ファイラーからのスクリプト起動(Androwish渡し) → ポート選択 → 通信開始 → USB機器アクセス承認 → GUI操作による効果音 → 表示ウインドウタッチによる画面表示切り替え → 押しボタン押下による判定 → キーボード操作による効果音 → 追加判定 → 表示ウインドウタッチによる画面表示切り替え → キーボード操作による判定取消 → キーボード操作によるリセット → キーボード操作による終了
- ミラキャストによる外部ディスプレイ表示(Androidスマホ) [MP4 9574kB 25s]
本体表示とのタイムラグの参考に。
M5StickC BluetoothSerial.hによる無線化支援の試み
見栄えはさておき、まずまずのものが出来たかな…と思ってはいるのですが…(自画自賛)。一点心残りがありまして…。「システム全部有線接続は、利用環境によってちょっと配線が邪魔くさいかな…?」っていう(まぁ外部ディスプレイや外部スピーカーは無線化可能ですが)。それで少し色気を出して、部分的な無線化を模索してみました。
無線機能の乗った小型でピンが多くて安価なArduinoボードは制作時点で国内では流通していなくて、どうもボード選択で対応する道は見つからなさそう。外付けの無線モジュールは特殊な仕様(TWELITEとかXBeeとか)のものが多くて、PCやスマホと直接話せる仕様(BluetoothとかWLANとか)で手軽なものが少なそう。
そんな中で出会ったのが風雲児 M5StickC。「これは…」というわけです。
M5StickCはGPIOが少ないので単品で早押し判定機を構成するには不向きですが、Arduinoボードと組み合わせれば多入力化出来ます。むしろM5StickCにはシリアル通信の無線化中継に専念してもらえば、製作済みの早押し判定機を無改造で無線化出来るんじゃ…。という目論見で試してみたのが本章の取組です。
システム構成
前述システムのインターフェイスボックスとホストコンピューターの間にM5StickCを割り込ませます。
- 無線通信方式(M5StickC-ホストコンピューター間)
- Bluetooth仮想シリアル通信(SPP)を選定。既存システムのUSB仮想シリアル通信を単純に置き換えます。そのためハード・ソフト共ほぼ無改造で対応可能(シリアルポートの選択が変わるだけ)。
- こういう用途のためにM5StickC入手後早々に試していた方式であり、ハードルが低かったということもあります。
- ボード間接続(M5StickC-Arduinoボード間)
- Arduinoボード側の信号接続はUSB通信用GPIOポート(TX1)をかすります。物理的に分離していないUSBシリアル変換回路との競合を心配しましたが、結果としては問題なく動いてくれました。
- M5StickC側の接続はGROVE I/Fを使います。GROVEユニットにはUART通信のものもあってハードウェアシリアルのポートとして実績があり、またコネクター接続にまとまっていて安定感もあります。
- ちなみに本システムのシリアル通信はArduinoボード→ホストコンピューターの一方通行なので、Arduino-M5StickC間の信号線接続は1本でOKです。(配線はGND,5Vと合わせてGROVEの4本中3本でOK。)
- Arduinoボードの電源もGROVE I/Fから5V供給してもらいます。M5StickCには小さいながらもバッテリーが搭載されているので、別途の電源手配が不要です(長時間運用の場合はM5StickCへの外部電源供給が必要となります)。
- 工作
- M5StickCはケース入りなので、見栄えを気にしなければ追加のケース加工などもなくおもむろに配線接続するだけで機能追加できます。お手軽。
写真ではインターフェイスボックスのケースを外して接続していますが、配線をUSBコネクター用の穴の隙間に通すなどすれば蓋を閉めることも出来ると思います。もちろんケースに専用の端子を設けるのもありでしょう。
- 配線だけは加工の必要があります。今回は市販のGROVEケーブル(両端コネクター付き)を半分に切ってQIコネクターを圧着しています。QIコネクターの代わりにピンヘッダーを使ってもいいと思います。
- 参考:考えられる他のシステム構成
- ところでM5StickCには押しボタンが搭載されています。
- 1対N通信が出来るらしいBLEやWLANを使えば、M5StickC自体を押しボタンとして使うことで、押しボタン側を無線化することも出来そうです(GPIOを使って外部接点を繋ぐことも出来るでしょう)。
- が…。モノの割に安価とは言え、普段使いもしないM5StickCを回答者人数分(10人以上を想定)買い揃えて死蔵しておくのももったいないので、今のところ挑戦する予定はありませぬ。
- BLEにはあまり興味なくて挑戦できておらず、ハードルが高いということもあります。
前掲の配布アーカイブに含まれています。別途のダウンロードは必要ありません。
Arduinoボード用のArduinoスケッチとホストコンピューター Tcl/Tkスクリプトの取り扱いも同じです。
M5StickCのソフトウェアは「sketchbook」フォルダ内の「EMC_M5StickC_BTSerialBridge_????????.ino」をArduino IDEで開いてM5StickCにコンパイル・書き込みしてください。
Arduino IDEについてくるサンプルスケッチの「SerialPassthrough」をベースに、BluetoothSerial.hによるBluetoothシリアルポートとGROVE I/Fのハードウェアシリアルを115200bpsでブリッジするだけのスケッチです。
動作視認用にLEDを点灯させる機能を追加しています。同様の目的でM5StickCのディスプレイ表示を記述したコードを書いていますがバッテリーの消耗を抑える目的で、コメントアウトしています。
また使っていない標準シリアルポートとハードウェアシリアルポートを初期化するコマンドが残っていますが、コメントアウトが面倒だっただけです、気にしないで下さい(爆)。
有線版と同じです。ポートの選択で目的のM5StickCに対応するBluetoothの仮想シリアルポートを指定するだけの違い。
条件が定かでないのですが、作者のWindows環境(Windows 10 Home)ではM5StickCをBluetoothペアリングすると仮想COMポートが2つないし3つ出来、実際に使えるのはその中のどれか1つ、という状況になります。
原因究明できておらず、とりあえず「そんなものなのかな?」とその都度場当たりで適当に選んで試しながら使ってます(苦笑)。
思った以上に普通に動きます。少し試した印象では、遅延もあまり気になりません。
回答者と出題者の席が離れている場合など、利用価値あるかも知れません。
ホストコンピューター-Arduinoボード間通信にFirmataプロトコルを使った実装
「なるべく自分で作らない」をコンセプトにしている本システム。当初はArduinoボードのスケッチも作らずありもので済ませる方針でした。つまりホストコンピューター-Arduino間通信に既存の標準プロトコルを使う。そういう目的のためにArduinoで標準的に利用されているプロトコルに「Firmata」というものがあり、本システムでも概ね機能実装が完了するまで、それを使って開発を進めていました。
が。試行錯誤を重ねる中で幾つかのデメリットがメリットを上回ることが分かってきたため、最終的にFirmataの使用を断念し、区別のためFirmata使用版に「F」、不使用版に「X」の添字をつけることにしました。
廃止した実装なので紹介の意味はろくにないのですが、Firmataという特徴的な技術を使ってみた例として、参考までに供養しておこうと思います。
ホストコンピューター-Arduinoボード間通信にFirmataプロトコルを使うメリットとデメリット
- メリット
-
- Arduinoスケッチを自作しなくて良い。
- Arduinoボードのソフトウェアは、Arduino IDE付属サンプルスケッチの「StandardFirmata.ino」を使います。プロトコル設計含め、自作が不要になります。
- とはいえFirmata不使用版のArduinoスケッチはほんの30行程の簡易なもので済んでいるので、実際には大したメリットにはなりませんでした。
- 裏で何かいろいろやってるっぽい。
- 何をしているのか追求していませんが、誤り訂正などやってるのだとすれば、安定動作とか期待できるかも知れません。
- Firmataを使う練習ができる(爆)。
- デメリット
-
- 前章「M5StickC BluetoothSerial.hによる無線化支援の試み」が機能しない。
- Firmataのプラットフォームは仮想シリアル通信なのでM5StickCでブリッジできると踏んでいたのですが、何故かこれを機能させることが出来ないでいます(通信速度をあわせてもダメで、単純な仮想シリアル通信なら機能する)。
- 通信確立の処理が重い。
- 何をしているのか追求していませんが、単純な仮想シリアル通信と比べてハンドシェイクにかなり時間がかかります。我慢できないほどではないですが、割とストレスあります。
- ホストコンピューター側ソフトウェアでFirmataプロトコルのライブラリ(拡張パッケージ)が必要になる。
- 裏で難しい処理をしている(らしい)プロトコルなので、利用にはホストコンピューター側にもライブラリが要ってきます。
- 幸いTclにもtfirmataという拡張パッケージが存在するのですが、使用ライブラリがひとつ増えてしまうのと、いかんせんそのtfirmataの配布サイトがいつからかNot Foundになってしまって正規の配布を入手できなくなり(vanillawishには同梱されているので使えますが)、オススメしにくくなってしまいました…。
- EMC_FastestF 配布アーカイブ 20200325版 [ZIP 12937.0kB]
- Firmata使用版ソフトウェア一式の配布アーカイブです。ダウンロードし、適当な場所で解凍して下さい。
- ライセンスおよびホストコンピューター Tcl/Tkスクリプトのインストール手順はFirmata不使用版と同じです。
- Arduinoスケッチは、Arduino IDE付属のサンプルスケッチ「StandardFirmata.ino」を開いてArduinoボードにコンパイル・書き込みしてください。
Firmata不使用版と同じです。ソフトウェアの処理が違うだけ。
なおFirmata使用版は開発終了で、以後の手直しはありません。
開発履歴(だいたい)
- 2020-03-25 EMC_FastestX_20200325
- ドキュメント差替。(ソフトウェアはバージョン表示も含めてEMC_FastestX_20200321から変わりありません。)
- 2020-03-25 EMC_FastestF_20200325
- 配布アーカイブ化整理。
- snackパッケージの呼び出しをsnack化(soundではAndrowishでエラーを生じる現象が確認されたため切り戻し:旧版での動作状況謎)。
- 2020-03-21 EMC_FastestX_20200321
- 配布アーカイブ化整理。
- snackパッケージの呼び出しをsnack化(soundではAndrowishでエラーを生じる現象が確認されたため切り戻し:旧版での動作状況謎)。
- 2020-03-10 EMC_FastestX_20200310
- Firmata(tfirmataパッケージ)廃止。
- M5StickC BluetoothSerial.hによる無線化支援の試み。
- 2020-03-10 EMC_FastestF_20200310
- 2020-03-07 EMC_Fastest_20200307
- フリー音源バンドル化(OtoLogic)。
- 大規模リファクタリング。
- Androwish対応(Usbserial,borgパッケージ使用)。
- ポート指定のコンボボックス化(registry,borgパッケージ使用)。
- 定義ファイルのTSV化(csv,struct::matrixパッケージ廃止)。
- アーカイブ内音源読込対応化(vfsパッケージ使用)。
- snackパッケージの呼び出しをsound化(Androwishでの動作確認不良?)。
- 2019-10-04 EMC_Fastest_20191004
- Tcl/Tkスクリプトソースコード UTF-8化。 他
- 全画面表示切替機能実装。
- 描画サイズ調整機能廃止。
- 2019-06-24 EMC_Fastest_20190624
- 自前早押し判定機 初版。
- 2ウィンドウ化。
- 効果音実装(snackパッケージ使用)。(音源はWindowsバンドルのシステム音源利用。)
- Windows バッチファイル起動化。
- アーカイブ内パッケージ読込対応化(vfsパッケージ使用)。
- 定義ファイルのCSV化(csv,struct::matrixパッケージ使用、fileutil,cmdlineパッケージ廃止)。
- 2018-09-05 EMC ワンダーキット早押し判定2 判定結果表示ツール 20180905
- 効果音実装テスト(テスト動作のみ)(snackパッケージ使用)。
- 拡張パッケージ配置のローカル化(システムフォルダではなくスクリプトフォルダへの配置を基本に)。
- 2016-03-14 EMC ワンダーキット早押し判定2 判定結果表示ツール 20160314
- 効果音実装テスト(テスト動作のみ)。
- Firmata(tfirmataパッケージ)使用。
- 定義ファイル読込にfileutil(および間接的にcmdline)パッケージ使用。
更新履歴(だいたい)
- 2020-05-19
- 2020-03-25
- 「M5StickC BluetoothSerial.hによる無線化支援の試み」「ホストコンピューター-Arduinoボード間通信にFirmataプロトコルを使った実装」「開発履歴」追記。
- システム構成図差替。
- 他。
- 2020-03-21
このページから抜ける→
いさな工房HP トップ
/
@nifty
サイト管理者:岩橋伴典 as いさな
(E-mail:jo3emc@jarl.com / Twitter:@jo3emc)