作品タイトル:糸なし糸電話 の作り方
表示名:遊舎工房
コンセプト・作品説明 |
---|
以前、ルネサスナイト7で発表しました「糸なし糸電話」の製作方法を記事にしたいと思います。この作品は、某マンガ(アニメ)に出てきた「未来のひみつ道具」にインスピレーションを得て製作したものです。内容としては子供のころに遊んだ糸電話の糸を無くしてしまえば離れたところでも会話できるのではないかというものですね。 糸(ケーブル)を使わず離れたところと会話ができるという意味では、既に無線機、トランシーバー、携帯電話など様々なものが日常にあふれています。この作品のキモは、糸を使わずに糸電話の本体である紙コップの振動をそのまま相手先の紙コップに伝えることで、糸電話の無線化を果たそうということになります。 |
仕組み
基本的な仕組みは非常に簡単です。
①まず紙コップ側の加工は圧電素子を底に貼るだけです。圧電素子は加えられた圧力を電圧に変換する効果があります。そのため紙コップに向かってしゃべると、声の振動が紙コップから圧電素子に伝わり、電圧の波が生まれます。つまり、声という空気の振動を電気の信号に変換していることになります。
②この電圧の変化をGR-KURUMIのアナログポートから読み込み、デジタルのデータに変換します。ここでは0Vから3.3vを256段階に分けて8bitのデータにしています。
③次にXBeeを使用して、相手のGR-KURUMIにデータを送ります。
④受信側では受け取ったデータをアナログ出力し電圧の変化に戻してあげます。先ほどは、圧電素子の変形を電圧に変換しましたが、逆に電圧をかけると変形するという効果もあります。そのため、圧電素子を通して紙コップが振動して声が再生されるということになります。
仕様を決める
Arduinoや他のGR基板を使ったことがあれば、先の仕組みの解説のみでどのようなスケッチを書けば良いか、おおよそわかるかもしれません。
やっていることは、送信側は「analogRead」で読み込んだ値をシリアルで「write」し、受信側でもシリアルで「read」した値を「analogWrite」しているだけです。特別なプロトコルやデータ形式を使わずシンプルな形になっています。
あとは最低限、音声をどれぐらいの頻度で何段階に分割するかということを決めなければなりません。今回は通信にXBeeのSeries1を使用しましたのでシリアルの速度は最大の115,200bpsにすることにしました。
電圧の分割(量子化)は256段階の8bitとすることにしましたので、最大で一秒間に14,400回の周期にすることが出来ますが、余裕をもって一秒間に4000回、つまりサンプリング周波数は4kHzとすることにしました。
ちなみに電話は量子化ビット数8bitでサンプリング周波数は8kHz程度とのことです。圧電素子を使用しているので音声品質には期待できませんが、なにを言っているか分かればよいと割り切ればこれぐらいで良いのではないかと思います。
XBeeではなく別の通信方法を使用する場合にはそれに合わせてが必要かもしれません。
◆決定した仕様
シリアル(XBee)のボーレート | 115200bps |
量子化 | 8bit |
サンプリング周波数 | 4kHz |
スイッチをつけたくない
なにせ「未来のひみつ道具」ですからスイッチなんて野暮なものは付けたくありません(笑) そこで若干強引ではありますが、使用している時の角度によってモードを切り替えるようにしました。
切り替えるモードは、「送信モード」「受信モード」「スリープモード」の3つになります。本来糸電話は、送信、受信と切り替える必要はありませんが、1つの圧電素子を共有しているため切り替えが必要になります。ただ、実際には喋った後で「どうぞ」などといって話す側と聞く側が交代するルール(?)がありますので、それ自体は問題にならないと思います。
実際には使う人によってこの通りの角度にならないこともあるので、使ってもらうときにはあらかじめ説明が必要かもしれませんね。
話している時は若干下を向いている
聞いている時には水平に近い
使用していない時は下に向ける
傾き角度の求め方
使用している時の傾き角度を得るために、加速度センサーを使用しました。
まず加速度センサーを紙コップの底面に水平になるように設置し、Z軸が上を向くようにします。
重力加速度は下になりますが、静止時には重力の反対方向に加速していることになるので、紙コップを上向きに置くと、センサーからはXとYがおよそ0で、Zが+の数値が得られます。(Zも0付近だと自由落下している状態になります。)
この状態で紙コップの傾き角度を求めるにはXY平面と加速度ベクトルとのなす角のθを求めればよいことになります。
θは下記のようなスケッチで求めることができます。
xy = (fabs(X)+fabs(Y)); // x-y面の加速度
if(xy){
seeta = atan(Z/xy)*180/PI; // z-xyの角度
}else{
seeta = (Z>0) ? 90 : -90;
}
この変数seetaは-90〜90度の値が得られます。
水平は0度なので、±20度程度の範囲に入っていれば受信モードということにします。また、下に向けて伏せている時は-90度なので、余裕を見て-80度以下であればスリープモードにします。最後にそれ以外の場合は送信モードとすることにします。
LEDによる演出
前章で送信モード、受信モード、スリープモードの切り替えができるようになりました。しかし、今現在どのモードになっているかが分からないと使うときに不便です。そこで、視覚的に現在のモードが分かるように、テープ型のフルカラーLEDを使用して光による演出を試みることにしました。
LED演出の動画はこちらです。
テープ型のフルカラーLED はこちらのものを使用しました。
非常に便利に使えるLEDコントローラがありますのでこちらを使用しています。
製品はキットになっていますが、実際にはキットの8ピンのICのみを使用しています。このコントローラ1つで32個までのWS2812を扱うことが出来ますので、1m(60個)のテープを半分に切って30個を2つにしています。そしてこのテープを紙コップに巻いて貼り付けました。光が流れる方向にデータが流れているという演出を試みました。
使用パーツ
さて、これまでの内容を製作するには以下のものが必要になります。
加速度センサーによるスイッチを使用しない場合は、モード切替のためのタクティカルスイッチなどお好きなスイッチをご用意ください。当然2つ作ることになりますので、2つずつ必要です。
・GR-KURUMI
・紙コップ(高さ8cm程度)
・圧電素子 7BB-35-3L0 リード付
(鈴商 http://www.suzushoweb.com/category_2.php?c2_id=189)
・Xbee Series 1
(秋月電子通商 http://akizukidenshi.com/catalog/g/gM-06505/)
・Lipoバッテリー
・3.3Vレギュレーター
・抵抗器(1MΩ )
・△ 加速度センサーADXL362
(ストロベリーリナックス https://strawberry-linux.com/catalog/items?code=12111)
・△ シリアルLEDテープ
(スイッチサイエンス https://www.switch-science.com/catalog/1399/)
・△ LEDコントローラ
(スイッチサイエンス https://www.switch-science.com/catalog/1740/)
※△はオプション
その他、ユニバーサル基板、各種コネクタ類、配線材なども適宜用意してください。
回路図
糸なし糸電話の回路図です。
青の破線で括られたものは次の章で説明するベース基板に含まれるものです。
ベース基板
本来はこの作品用ではありませんが、GR-KURUMIを使いやすくするためにXBee、Lipoバッテリー、microSDカードスロット、USBシリアル変換(FTDI)などを実装することが出来るプロトタイピング用ベース基板を作りました。この基板を使用することで配線がラクになりますので利用してみてください。
KURUMI BASE BOARD Ver.1.01 [ダウンロード]
基板データはそのまま基板発注に使えます。スイッチサイエンスPCB(https://www.switch-science.com/pcborder/)や、ELECROW(http://www.elecrow.com/5pcs-2-layer-pcb-p-1174.html)などが安くてお勧めです。基板サイズが5×5cmなのでそれぞれのサイトで一番安いサイズで注文できます。
この基板は色々な機能がありますが、必要な機能のパーツのみを実装して使用することが出来ます。同梱してあるBOMリストの「用途」の列にそのパーツを必要とする機能を記入してありますので、必要なパーツのみを選んで実装できます。
例えば、今回の作品では「本体」「LIPOバッテリ」「3.3Vレギュレータ」「USBシリアル変換」「XBee」のパーツを実装すればよいでしょう。また、USBシリアル変換機能を持たせてPCと直結したければ「USBシリアル変換」と「USBコネクタ」を、さらに同時にLIPOバッテリも充電したければ「LIPOチャージャ」を実装するなど用途に応じて拡張してください。
この作品の回路図ではGR-KURUMIのSerial1を使用してXBeeとシリアル通信しています。この基板ではジャンパのJ1、J2をショートしてください。これでGR-KURUMIとXBeeが繋がります。この基板にないパーツはユニバーサル基板で実装することになりますが、基板からのピンアウトはArduino互換のピン配列になっていますので、Arduino用ユニバーサル基板が使いやすくなっています。サンハヤトの「Arduino用ユニバーサル基板 UB-ARD03」がおすすめです。
XBeeの設定
XBeeのIDとボーレートを設定しましょう。購入時の設定は9600bpsですが、この作品ではボーレートを115200bpsにする必要があります。IDは混線を防ぐために設定しておきましょう。
通常XBeeの設定はXCTUというソフトで行います。ですが、IDとボーレートを設定するだけであればTeraTermなどのターミナルソフトを使用してATコマンドで行った方が楽なので私は好きです。好みの問題なので以下がめんどくさそうと思ったら素直にXCTUで設定してください。
XCTUダウンロードページ http://www.digi.com/support/productdetail?pid=3352
以下はWindowsによるTeraTermを使った説明です。Macを利用している場合は適宜読み替えていただくか、やはりXCTUを使ってください。
XBeeをUSBインターフェースキット(http://akizukidenshi.com/catalog/g/gK-06188/)などを使いPCに接続します。
TeraTermでXBeeに接続します。設定は以下のようにします。改行コードの受信をCR+LFに、ローカルエコーにチェックを入れます。
シリアルポート設定はデフォルトのままですが、念のために確認しておきます。
TeraTeam上で「+++」と入力し、改行しないで1秒待つと「OK」と帰ってきます。
+++OK
これでATコマンドを受け付けるようになりました。ただし10秒間何もしないとATコマンドモードが終了してしまいますので気を付けてください。反応しなくなったら再度「+++」と入力してATコマンドモードに入ってください。
次に「ATID」と入れ改行すると現在のIDが返ってきます。
ATID
0
IDとはPAN IDのことで、同一のIDでネットワークを形成するために使用されます。つまり2つのXBeeで通信をしたければ2とも同じIDにする必要があります。(最大4文字まで)
これを例えば1234に変更するには「ATID1234」と入れ改行します。
ATID1234
OK
確認してみます。
ATID
1234
続いてボーレートの設定です。「ATBD」で現在のボーレートの番号が返ってきます。
ATBD
3
「3」とは9600bpsのことです。ボーレートに対する数字はこのようになっています。 [0] 1200 / [1] 2400 / [2] 4800 / [3] 9600 / [4] 19200 / [5] 38400 / [6] 57600 / [7] 115200
変更したい115200bpsは「7」ですので「ATBD7」とします。
ATBD7
7
最後に「ATWR」で保存します。保存しないと再度電源を入れたときに元に戻ってしまいます。
ATWR
OK
これで設定が終わりました。もう一つのXBeeも同様に設定しましょう。ちなみにボーレートが変更されていますので再度設定をするときには、シリアルポート設定を115200bpsにする必要があることを忘れないようにしてください。
組み立て
紙コップと基板を固定するために3Dプリンタでケースを作りました。紙コップのサイズによってはそのまま使えないと思いますが、STLデータも用意しました。想定している紙コップは高さ8cm、幅7cmのものです。
STLファイル [ダウンロード]
ベース基板をネジで止めます。
電源スイッチは裏から出るようになっています。
ユニバーサル基板(シールド)を上にセットします。
紙コップにテープLEDと圧電素子を貼りつけ、ジャンパー線を繋げます。
上に乗せてジャンパー線を繋げれば本体の完成です。
フローチャート
まず最初に各デバイスの初期化を行います。そしてタイマー割り込みを設定して定期的にステータスの確認や送受信のフラグを立てるようにします。
メインループ内ではフラグやモードの状態やによって処理を切り替えるようにしています。
先のタイマー割り込みでは100ms毎に本体の角度を計測し、モードを決定します。そして、送信モードであれば、電圧の測定とXBeeへの送信を行い、受信モードであれば、XBeeから受信したデータをanalotWriteにてPWM出力という処理を250us毎に行っています。
スケッチ
スケッチは以下です。
/edDir/files/StringLessPhone.zip
IDE for GR を下記からダウンロードし実行してください。
http://gadget.renesas.com/ja/product/ide4gr.html
「ファイル>開く...」から、StringLessPhone.inoを開いてGR-KURUMIに書き込んでください。もし、加速度センサーやLEDコントローラを使用しない場合は、該当部分のコードを修正してください。
SerialポートはPCへの接続とLEDコントローラが共有になっています。LEDコントローラが接続されていると書き込みに失敗するようなので、一時的にLEDコントローラをソケットから外すようにしてください。
最後に
イベントに向けて一応動作するものが出来ましたが、音声についてはやはり聞き取りづらく、会話が成立するかというと少々難しいかな?という感じでした。とはいえ調整が十分に出来たわけではないので、まだ改善の余地はあると思います。アンプも無くこれだけの仕組みで実際に声が伝わるというのはなかなか面白いですし、基本の回路はとても単純なものですので、応用は色々できそうです。
あと、思い残したことといえば、フローチャートを見てわかる通り、ルネサスナイトでの発表時にはスリープモードが実装されていませんでした。一応考えていたのは、下を向けて置くと、GR-KURUMIとXBeeがスリープし待機モードになり、持ち上げると、加速度センサーからの割り込みでスリープ解除されるというものでした。ADXL362は使いこなせていませんが、超低消費電力で面白い使い方が出来そうです。
もう一つのアイデアは、スリープ待機の時に着信があるとLEDが光るというのも面白いかなと思いましたが、こちらも時間の関係で実現は出来ませんでした。
今回の作品は糸電話の糸を無くすとどうなるかという発想から、電話機の再発明をしているようになってきていますが、もし自分で作ってみたいという方がいらっしゃれば、枠に捕らわれないアイデアで自分なりの「糸なし糸電話」を作ってみていただければと思います。
趣味で電子工作をやってます。
GR-SAKURAのプロデューサーをしていたのでがじぇるねを使った作品が多いです。
http://yushakobo.jp