見出し画像

Arduino UNO R4 Wi-FiのLEDで遊んでみた。

はじめに

この記事は、熊本大学工学部公認サークルKuMA(Kumamoto university Metaverse Architect)のアドベントカレンダー第16日目の記事です。

KuMA(Kumamoto university Metaverse Architect)とは直訳で「熊本大学メタバース・アーキテクト」です。

その名の通り、メタバースでの新しいVRの在り方の研究・開発、それを応用したVRゲームの開発など、主にVR技術を中心に活動をしています。

HPはこちら




部室にArduinoが来たぞ!!

さて、本サークルの目的である、「VRに触感を付与することでより没入感を高める」ための方法は数多くの研究が存在し、本サークルにおいても、その技術を参考にし、日々開発に没頭しています。

しかし、様々な開発を通じ私は、ハードウェアに頼らないソフトウェア開発のみでは、満足のいくVR体験を得ることは難しいということを実感しました。

そこで

代表と相談し、ハードウェアの開発の足掛かりとして、Arduino、サーボモーター、各種センサーなどを購入していただきました。(部費で)

やったね!


Arduino UNO R4 Wi-Fiを見てみましょう。
本体になんかすごいブツブツがついてます。(写真)


本体の写真

これは実はLEDで、8×12マスの合計96個あります。
これを用いて様々な表示を行えるわけですね。

その他にも

名前にもありますが、Wi-Fiに接続して色々できるみたいですね。
おそらくですが、ラジコン飛行機のうち、可変翼機の機体の操縦などが遠隔でできるのかなぁなんて思います。多分。



LED使って制作をしてみよう

さて、このArduinoの扱い方に慣れるべく、何か作ってみましょう。

このArduinoの特徴は、何と言っても……


Wi-Fiです!!


本体のLED部分です!!

と、いうわけで

このArduinoのLED表示を用いて、アニメーションを作っていこうと思います。

仕様を調べてみよう

作ろうにも先立つものがなければどうしようもありません。
以下のサイトに、非常にわかりやすく解説、紹介してありました。

どうやら、Arduinoの公式サイト(英語)を日本語に翻訳していただいているかたもいらっしゃるみたいです。参考にさせていただきましょう。

オリジナルのサイト
日本語訳のサイト

さて、このArduinoのLEDの仕様についてまとめると、すべての点灯は0,1で管理されています。そしてLEDはすべて96マスあるので、すべてのLEDの点灯状態を96桁の2進数表現で表すことができます。

例えば
0行3列のLEDだけを付けたければ、

frame[0][3] = 1;

という風にし、あとはすべて0にすれば良いわけです。

しかし、これで管理するには非常にめんどくさいしメモリも使うということで、2進数ではなく16進数で管理してしまおうというわけです。

詳しくは上記のサイトを見ていただけるとわかると思いますが、超~~~ざっくり言えば、文字が長くなりすぎるので、圧縮してしまおうということです。

さて、

先程のサイトをさらに調べてみると、テトリス風のアニメーションのコードがありました。

オリジナルのサイト
日本語訳版

今回はそれを書き変えていくことで、アニメーションを作っていこうと思います。


作る前の準備

さて、私はテトリスが好きなので、作るアニメーションはテトリスのアニメーションにします。
具体的には、現在の一部対戦テトリス界隈で大人気の「山岳積み2号」という開幕テンプレートのアニメーションを作ります。
このテンプレはTST(T-Spin-Triple)→TSD(T-Spin-Double)と打った後に全消しが90%近く取れちゃうという、つよつよのテンプレなのですが、

よくわからない人は、「対戦が始まって何もしなかったら死ぬ。何かしてもだいたい死ぬ。」と覚えてください。

ほんで

実際にアニメーションを作っていくにあたり、任意のLEDの盤面を16進数に変更する必要があります。

これをすべて人力でやると、死人が出ますので機械に頼って楽をしたいと思います。


ツールを作った

というわけでツールを作成しました。

作ったツール

具体的には
左のチェックボックスにチェックに対応した隣の表で絵を0,1に変換し、それを4bitごとにconcatで結合し、さらに16進数変換をしたものをconcatで結合する。
という感じになっています。

初めは、Arduinoとspread-sheettの仕様に合わせて、0,1を8bitごとに結合しましたが、0の数でエラーを吐いた(0b0000,0000が0x0という表記になった)ので、4bitごとに分けました。

その他にもconcatの範囲を間違えるなどで、いろんな不具合が起きました。
えぇ、それはもうたくさんに。


ここからが本番でした

さて、

このツールにより、12×8上の任意のドット絵を、3つの8桁の16進数に変換、分割することが可能になりました。後は出てきたその値をプログラミングに書けば、Arduinoでアニメーションが作れるというわけです。

簡単になったとはいえ、アニメーションを作るわけですので、一つ一つコマ送りの描写をしないといけないわけです。

ひたすらにコピペと編集を繰り返し、確認し、間違ってたら修正する、ということを続けました。本当に、、何回も、、、


完成した!!

さてそんな、デス3時間の結果の完成品を見ていただきたいと思います。

こちらです。

キャプション1
キャプション2
キャプション3

思った以上にしっかりと作れていて満足でした。

まとめと感想

今回はArduinoのLEDを使って、一コマずつアニメーションを作成するということをやってみました。

100マス弱あるので、思ったより細かく表示できるます。したがってtetris、life-gameやピンポンなど、ちょっとしたゲームならLEDの本体上で動作するかもしれません。

アニメーションを一コマ一コマ作ることは、非常に達成感の強い経験でしたが、
単純作業かつ、1文字でも違ったら表示がかなり崩れてしまうという、繊細な作業でした。
脳みそのシナプスがプチプチする音が聞こえてきました。ほんとに。

もう二回目はいいかな……

ハードを触るのは、ゲームの開発とは違った刺激が得られますので、KuMAのメンバーもArduino触ってみてくださいね!


ところで

今回のツールを作るにあたって、チェックボックスの形からから0,1に変換するものを作ったのですが、その際に用いたコードが以下です。

コード

うーーーーーーーーーん、違和感がすごい


後、今回のコードは下のような形で1000行を超えています。
誰か簡単にできる方法を考えてくれ――!!

今回の僕の活動がメンバーの誰かの役に立つことを願っています。
おわり!!!

コードの最下層部分


この記事が気に入ったらサポートをしてみませんか?