赤外線通信をやってみました
先日引っ張り出してきたArduinoなるものからニンテンドーラボ側へ向けて画像データを送るというのをやってみました。
詳しくはこちらの動画にまとめました。
画像と言っても16×16程度のドット絵ではありますが、とにかく考えた通りに出来上がったので良かったです。
以下は動画の補足です。
概要について
概要としては、画像データをニンテンドーラボに送り込みたいというものです。
なので、この図でいう②~③のところをやるのが目標なのですが、画像を頭で考えて1100010101……みたいな光の点滅を直接プログラミングするのは無理なので、一旦Excelでドット絵を描いてからそれを変換するという仕組みにしました。
勝手にExcel × Arduino × NINTENDO LABOをコラボさせたような感じになりました。
赤外線LEDを10個使いました
赤外線の送信はArduinoで赤外線LEDを制御する形で実現しました。
最初は1個のLEDの点滅でやろうと考えていたのですけども、思いがけず大量の赤外線LEDを購入することになったので10個使いました。
※Arduinoについては前回のブログに書きました。
間違っているかもしれませんが、いわゆる「パラレル通信」と呼ばれる形になったのではないかと思います。
10個のLEDは以下の役割にしました。
No. | 役割 |
---|---|
1 | タイミング信号 →毎回光る。光る度にニンテンドーラボ側でNo.2~10の読み取りを行う。 |
2 | 命令信号 →リトライとドットごとの送信開始の合図に使う。 |
3~10 | データ →8桁の2進数として、0~255を表現する。 |
かっこつけて「タイミング信号」とか「命令信号」とか名前つけてしまいましたが、「命令」って言っても次の2パターンだけです。
命令 | LEDパターン | 内容 |
---|---|---|
リトライ | 1100010000 (タイミング+命令+データ”16″) | 「リトライ」ノードを実行する。 データ送信の始める前に初期化として実行する。 |
ドット送信開始 | 1100000001 (タイミング+命令+データ”1″) | この命令の後に続く3回のデータ通信(下記)を元に1ドット置く。 1:X座標の値 2:Y座標の値 3:色の番号 |
以上のような感じですが、結果的にLED1個だったら通信の仕組みが大掛かりになり、時間もかなりかかるようになっていた思います。
いっぱい使えて良かったです。
Arduinoの回路について
回路としては、Arduinoにつないだブレッドボード(穴の開いた板)にLEDやら抵抗器やらをプスプスと差し込んで作りました。
※この写真は、光り具合を確認するために赤外線LEDを普通のLEDに差し替えたものです。
オームの法則(V=RI)とかの電圧・電流・抵抗の関係についてはあまり詳しくないのですけども、Arduino的に100mA以上流れるのはよくないとかで、各LEDは10mAくらいになるようにそれぞれ510Ωの抵抗を入れました。(電圧は5V)
たぶん、壊れなかったので大丈夫だったはず……。しかし「Ω」ってすごい久しぶりに見ました。
あと、スタートボタンとしてボタンも取り付けました。
ここはこれまたよくわかっていませんが、とにかくでっかい抵抗を付けないとショートすると思うので1kΩか10kΩの抵抗を付けました。(忘れた)
最初、ボタンの取り付け方の向きがわからなくて相当悩みました。
そんな感じですが、今回遊んだことで最低限のことはわかってきた気がしないでもありません。
それにしても回路を組むっていうのはなかなかパズルゲームみたいなところがあってかなり悩みました。上の写真の配線もむちゃくちゃなつなぎ方かもしれません。
赤外線通信部の完成状態
というわけで、最後にJoy-Con(R)をブレッドボードの上に浮かせて物理的なところは完成です。
Joy-Con(R)の配置には、スマホのホルダーを使いました。
これはなかなか使い勝手が良く、いろいろ応用できそうでした。
少なくとも、先日の「そろばんToy-Con」もこれがあればかなりダンボール工作が省けたかもしれません……。
……いや、でもこのホルダー結構グラグラするから、そろばんのときくらいに激しい使い方するのであればきついですね。ダンボール工作は無駄ではなかった。
ニンテンドーラボのノードのコストの限界
今回はドット絵を描くというのを目指したわけですが、どうしてもノード、特に「モノを発射」の配置にかかるコストの限界がネックとなりました。
実は、上記の動画の最後に出てくるパターンは全部黒でいいので「モノを発射(10個)」を減らして「モノを発射(100個)」にすることで全体として使える直方体の数を増やしたりしたのですが、それでもちょっと足りていないのです。
それで実は7個ほど本来あるべきところに欠けているのですけども、アレ自体は少しであれば欠けていても読み取られるときに補正されるので、そこに賭けたという状況でした。
(私のスマホでは読めたのですが、読めない機械もあったりするかも……?)
とはいえ、2Dじゃなくて3Dの世界でいろいろできるニンテンドーラボVRなので、処理的には仕方ないことかと思います。
夢
そんなわけで、今回、とにかく赤外線通信ができました。
……ということは、もっといろいろ応用できる可能性があるのではないかと思いました。
今回はArduinoのプログラムに直接、赤外線の点滅パターンを書き込んで一旦Arduino部分を完成させてから通信に使いましたが、Arduinoにはシリアル通信の機能があります。
これを使うと、パソコンからArduinoに送った信号をリアルタイムでニンテンドーラボに送れるのではないかと思います。
これができると、Arduinoに書き込めるプログラムの量の限界も突破してさらに自由度が上がりそうだなと思いました。
例えば、パソコンから音楽ゲームの譜面データ(プレイヤーがボタンを押すタイミング)を送信してニンテンドーラボ側でそれに合わせてゲームを展開するということができそうです。
(もっともパソコン側で、信号を送信するようなプログラムを開発する必要がありそうですが)
実は以前、ニンテンドーラボでガッツリとした音楽ゲームを作ろうとしたら譜面データをどうやって処理しようか悩んでしまったことがあったのですが、こういうやり方なら回避できそうです。
あと、これに加えて、逆にJoy-ConのIRライトを光らせたのをArduinoで読み取ってパソコン側に返し、さらにパソコン側でしかるべきプログラムを開発すれば、ネットを介して他のプレイヤーとニンテンドーラボで対戦みたいなこともできるのかなと思いました。
作るとなるとかなり大変そうですが見てみたい気がします。
まとめ
というわけで、ニンテンドーラボとArduinoで遊んでみました。
ニンテンドーラボでのIRマーカーノードはまだまだたくさんの用途に応用できると思います。
何か思いついたらまた遊ぼうと思います。
おわり。
コメント