LEDテープで光る衣装を作る

※この記事は、mast Advent Calendar 2019の10日目の記事です。
9日目はITF_onukiさんの記事「僕はサンタクロースを信じている。」でした。

 

何を作ったか

f:id:koroyu:20191207201634p:plainf:id:koroyu:20191207201712p:plain

 


雙峰祭前夜祭パフォーマンスショー「ゆらぎ」ダイジェスト版 (2019年)

12秒あたりから出てくる光る衣装を作成しました。

 

フルバージョン


ゆらぎ part02「光る衣装とダンス」

 

この記事では、大まかな仕組みやプロトタイピングについて話そうと思います。

 

経緯

昨年の12月あたりに次の雙峰祭(大学の学園祭)でばちばち系の演出が欲しいと相談を受ける

→LEDの服が欲しいらしい

→売ってないので作る

 

プロトタイピング

ダンスにLEDを合わせてみた(1月)

LEDテープ初めて & Arduino hello worldぐらいの時に撮った

クオリティ...

(快く踊るのを引き受けてくれたT君thx)

 

Launch Party(4月)


ようやく服の形になってきた...

 

INTRINSIC

岩壁音楽祭(2019)でIさんにお声かけ頂き、脳波で音楽を奏でるINTRINSICの衣装を担当する機会を頂きました。


 かなりいい感じではないでしょうか...!

システム

f:id:koroyu:20191207210300p:plain

しかしここで問題が発生。

全体を単色で光らせたり、腕の部分は何色に光らせるとかは簡単だったけど、全身をグラデーションにするとかが難しい。LEDはパネルのように規則的に並んでいる訳ではないので、LEDの位置を保持して、その上から映像を重ねたりしてコンテンツの作り込みのクオリティを上げつつ作業を単純化しないとやばい...

確かにLED Mapper系のソフトウェアはあるけどDMXとかだし(今回はダンスと合わせるのが目的なのでルーターやらSPI decoderとかは勘弁)無理。

mplusplusさんとかどうやってるんだろう...LEDの数少ないのは映像を重ねている感じはしないし、LEDの数が多いのはFPGAとかでLEDパネルに映像を映す感じなのかなぁと思いつつ、俺はその間じゃん

やべえ...これはソフトを自作するしかない...!

 

夏休み(8~9月) 怒涛の作りこみ

 


 なんとか映像を服に重ねるのに成功...!

oFで服の中のLEDの座標を取得するソフトとその座標を元にLEDの光るべき値を書き出すソフトを作成

Raspberry piで1k byte/secほどのデータを読み込んで再生するソフトを作成

f:id:koroyu:20191207210448p:plain

とにかく夏休みはソフトウェアの作りこみをしました。まさかこれが本当にできると思わなかったのでびっくり

 

 

10月(直前期)

ここら辺からダンサーさんも入ってダンスと合わせるように

(筑波大学ダンス部の皆さん本当にありがとうございました!)

 

後、OSCとか諸々で全体のタイムラインに合わせて光るようにソフトの作りこみをしました。UIはmaxで作りました。(時刻同期とかソフトのアドバイスとかくれたnami君ありがとう)

 

f:id:koroyu:20191207210845p:plain

ダンサーさんのボタン、僕のオペPCからのOSC、メインシステムの時刻同期の3つのうちどれかが動けば光るようにしました。その前の準備とかでも何かでミスがあったりすると光らないこともあったのでドキドキ...

 

そして本番へ(11月)

1年弱かけて開発を続けてきましたが、ここで光らなければ努力がパー!怖...

そして...

 

f:id:koroyu:20191207201634p:plain

 

光った!!!

 

感想

  • 1年前から開発を始められたのがよかった。
  • 場数踏んでPCDA回せた。
  • 知見がネットの海に殆どない
  • TPartyの皆さんが神だった。
  • お金を集めるのは大変。
  • 大赤字は苦しい。
  • ダンスと光る衣装を合わせるのは難しい(音とか動きに合わせて光をハメたりイメージを色にしたりはできたが、概念的な表現のところまで到達できなかった。反省。)
  • 金子さんの音が神...
  • ダンス部さんはプロ。
  • ダンス部さんはプロ。(大事なので二回言いました)

感謝

  • TPartyの皆さん
  • 音作って頂いた金子先輩
  • 出演頂いたダンス部のYさん
  • 撮影、編集をして頂いた小貫先輩
  • 雙峰祭実行委員会、雙峰祭関係者の皆さん
  • クラファンでご支援頂いている皆さん
  • 光る服を早い段階で試すチャンスを下さった方々

など、感謝してもし切れません...ありがとうございます!!!

 

expからsincを取り出す

expからsincを取り出したい場面に出会ったのでメモしておきます。

音響とか信号処理とかで使うかも???

 

 

$$\begin{align}e^{x}&=(e^{x}-1)+1\\&=e^{\frac{x}{2}}(e^{\frac{x}{2}}-e^{-\frac{x}{2}})+1\\&=e^{\frac{x}{2}}2jsin\frac{x}{2}+1\\&=e^{\frac{x}{2}}2j\frac{x}{2}\frac{sin\frac{x}{2}}{\frac{x}{2}}+1\\&=e^{\frac{x}{2}}jxsinc\frac{x}{2}+1\end{align}$$

 

列挙型enumを使いこなす

お恥ずかしながら、何か似たような種類の固定の変数や状態などに数値を割り当てるとき、毎回変数を宣言しました。どうやら列挙型enumを使うともっとうまくやれるらしい。

 

 まずは使用例を示します。

#include <stdio.h>

typedef enum Country{
    USA,
    CHINA,
    JAPAN,
    KOLIA,
    
    COUNTRY_NUM
}country;

int main(void) {
    country myCountry=JAPAN;
    printf("myCounty number is %d\n",myCountry);
    printf("The total number of countries is %d\n",COUNTRY_NUM);
    return 0;
}

この出力は

myCounty number is 2
The total number of countries is 4

となります。

つまり、USAから順番に0,1,...と数字が振られ、COUNTRY_NUMに4が振られます。 このように、同じような種類のものをenumでまとめて宣言すると、数字をつけてくれるというイメージです。よく使われる手法ですが、最後に~NUMと入れてenumに入っている数を表したりします。今回だと確かに4ヶ国あります。

注意事項として、

typedef enum Country{
    USA=1,
    CHINA,
    JAPAN,
    KOLIA
}

のようにすると、CHINA=2, JAPAN=3, KOLIA=4と数字が上がってしまうので~NUMで総数をカウントできなくなります。

この列挙型の嬉しいところは、

if(myCountry==0)hoge();//アメリカのとき

とコメントで説明しなくても、

if(myCountry==USA)hoge();

とすれば明らかです。

使いどころは

  • state(OFF=0, ON=1, OTHER=2)
  • direction(CENTER=0, UP= 1, RIGHT=2, DOWN=3, LEFT=4)
  • sex(FEMALE=0, MALE=1, OTHER=2) とかでしょうか。明らかなflagとかはboolで管理した方がいい気もします。

なお、今回はtypedefを用いてenumを使いましたが、様々なenumの宣言方法があります。 Kazuya Hirumaさんの記事:C言語についてメモ

ちなみに、関数の返り値をenum型にすることもできるようです。

#include <stdio.h>

typedef enum Country{
    USA,
    CHINA,
    JAPAN,
    KOLIA,
    
    COUNTRY_NUM
}country;

country hoge_function(int hoge){
    if(hoggee)return USA;
    else if(hogeee)return JAPAN;
    return COUNTRY_NUM;
}

フレネル近似、フラウンホーファー近似

光や音の回折現象において用いるフレネル近似、フラウンホーファー近似について、それらがどういったものなのか簡単に理解できる資料が少なかったのでまとめてみました。今回は回折現象のものよりも近似の部分に注目した資料になります。誤植等がありましたらご連絡ください。

前提

$$(1+\alpha)^{m}$$のマクローリン展開

\begin{align}(1+\alpha)=1+\alpha x + \frac{\alpha(\alpha-1)}{2!}x^2+\cdots\end{align}

 

本題

f:id:koroyu:20191129191656j:plain

ホイヘンスの原理により微小な隙間である点Pで新たに二次元波ができ、これをA面で観測するとする。この波のA面への投影成分は

\begin{align}
U(x_{t},y_{t},z_{t})=\frac{j}{\lambda}\frac{e^{-jk_{0}r}}{r}cos\theta U(x_{s},y_{s},0)
\end{align}

となる。

ここの導出については参考資料をご覧ください。

次に、A面(z_{t}=z)において点Pからでる2次元波の重ね合わせを考えると、

\begin{align}
U(x_{t},y_{t},z)=\frac{j}{\lambda} \iint_A U(x_{s},y_{s},0) \frac{e^{-jk_{0}r}}{r}cos\theta dx_{s} dy_{s}
\end{align}

この式について3点気になる。 

  1.  cos\thetaの値
  2.  \frac{1}{r}の値
  3.  e^{r}の値

 cos\thetaの値

PQがz軸に対して平行に近いと、

$$cos\theta\approx 1$$

が成り立つ。

これを近軸近似という。

 \frac{1}{r}の値 

近軸近似を考えると、1/rと1/zの値はほぼ一致することがわかる。

$$\frac{1}{r}\approx \frac{1}{z}$$

しかし、この値は光や音波、電磁波などではeの指数関数内ではこの近似をしてはならない。

ここまでで一旦式を簡潔にすると

$$U(x_{t},y_{t},z)=\frac{j}{\lambda} \iint_A U(x_{s},y_{s},0) \frac{e^{-jk_{0}r}}{z} dx_{s} dy_{s}$$

となる。

e^rの値

eの指数関数内でのrの近似で登場するのがこれからのべるフレネル近似(Fresnel approximation )とフラウンホーファー近似(Fraunhofer approximation)である。

$$r=\sqrt{(x_{t}-x_{s})^2+(y_{t}-y_{s})^2+z^2}$$

この式の平方根の中からzを取り出し、$$(1+\alpha)^{m}$$のマクローリン展開を用いて式変形を行う。

$$\begin{eqnarray}r&=&z\left\{1+\frac{(x_{t}-x_{s})^2-(y_{t}-y_{s})^2}{2z^2}\right\}^{1/2}\\&=&z+\frac{(x_{t}-x_{s})^2-(y_{t}-y_{s})^2}{2z}\\&=&z+\frac{x_{t}^2-y_{t}^2}{2z}-\frac{x_{t}x_{s}+y_{t}y_{s}}{z}+\frac{x_{s}^2-y_{s}^2}{2z}+\cdots\end{eqnarray}$$

となる。

ここで気になるのは$$\frac{x_{s}^2-y_{s}^2}{2z}$$この項を0に近似して良いかである。

この点は常にz軸付近にある訳ではない。z軸から少し離れている場合もある。(ただしcosの近似は成り立つものとして考える)

この項を0として強く近似したものがフラウンホーファー近似、0としない弱い近似がフレネル近似である。 

ここでフレネル近似によるフレネル回折の式を求めていく。

まず

$$e^{r}=e^{z}e^{\frac{x_{t}^2-y_{t}^2}{2z}}e^{-\frac{x_{t}x_{s}+y_{t}y_{s}}{z}}e^{\frac{x_{s}^2-y_{s}^2}{2z}}$$

であり、積分変数が微小な穴での座標$$x_{s},y_{s}$$であるから、それを含む変数は積分の外に出せないことに注意して、上のUの式は

$$U(x_{t},y_{t},z)=\frac{je^{jk_{0}z}}{\lambda z}e^{-jk_{0}\frac{x_{t}^2+y_{t}^2}{z}}\iint_A U(x_{s},y_{s},0)e^{jk_{0}\frac{x_{t}x_{s}+y_{t}y_{s}}{z}}e^{-jk_{0}\frac{x_{s}^2+y_{s}^2}{z}}dx_{s}dy_{s}$$

となる。

参考

https://www.osc-japan.com/wp-content/uploads/2013/03/ODN27.pdf

http://www.hikari.scphys.kyoto-u.ac.jp/jp/index.php?plugin=attach&refer=%E9%9B%BB%E7%A3%81%E6%B0%97%E5%AD%A64%202012%E8%AC%9B%E7%BE%A9%E3%83%8E%E3%83%BC%E3%83%88&openfile=4th.pdf