パックマンLEDピクセルパネルコスチューム
コンポーネントと消耗品
> |
| × | 1 |
必要なツールとマシン
> |
|
このプロジェクトについて
イントロ
まず、明らかなことを言いましょう。私たちは家族の衣装を着るのが好きです。
昨年、私たちはスペース「エイリアン」を行いました。これは、LEDストリップのアクセントが付いた銀色の服を着た人々のように見えました。 LEDはユニークで、夜に走り回っているときに子供たちが見やすいので、私たちは本当に気に入りました。再び点灯するようなことをすることにしましたが、どうなるかわかりませんでした。数週間前にボーリング場でナムコの宝石を最近プレイしたので、パックマンを提案したのは私の娘でした。その提案が私たちに必要なすべてでした。それは素晴らしいアイデアであり、それを実現する必要がありました。
計画
最初のステップは常に計画ですが、特に別の8ビット文字を実行したい場合は、注目に値します。
家族にはパックマンのキャラクターを選びました。パックマン、ミズパックマン、そして幽霊のブリンキーとピンキー。元の8ビットキャラクターに対して正確で本物であることを望んでいたので、元のゲームスプライトを調べることから始めました。
<図>これらは、正しいピクセルピクセルレイアウトを取得し、アニメーションの各フレームを表示するのに役立ちます。たとえば、上のスプライトには、あみだくじとパックマンの口のさまざまなフレームが表示されます。
次に、アニメーションの各フレームをExcelでレイアウトしたので、LEDの数と各ボードの全体的なレイアウトがわかります。 LEDの個々の番号は、後でArduinoボードをプログラミングするために必要になります。
<図>レイアウトから、ゴーストの高さは14ピクセル、幅は14ピクセルであることがわかります。パックマンは13x13で、ミズパックマンは14x14です。
ピクセルごとの幅と高さがわかったら、パネルの大きさを決定する必要があります。私はそれらすべてを互いに同じサイズにしたかったのです。つまり、各ピクセルは各コスチュームで同じサイズになります。それらを適切にスケーリングするために、私たちはそれが最小の家族、私の息子にとって適切なサイズになることを確認することから始めました。私は彼を測定し、段ボールの切り欠きをいくつか持ち上げて、彼がまだ快適に腕を上に置いて歩くことができるサイズを確認しました。幽霊の高さと幅のサイズは22インチになりました。
これにより、スケールが22 "/ 14ピクセル=1.57" /ピクセルに設定されました。
材料 <図>
コスチュームは比較的簡単に着られるようにしたかったので、耐久性のあるものではなく、軽い素材を選びました。
- ベース: 1/8 "段ボール、レーザーカット、熱接着
- 半透明のカバー: 製図用紙(ベラムまたはマイラー)
- LED: 12mm DC5V WS2811個別にアドレス指定可能なLED(50個のストリング)
- ボード: Ardunio Uno R3
- 力: 5V DCポータブル電源(携帯電話の充電器のような)+ USB-DCアダプター
- その他: DC電源ジャックアダプターブレッドボードジャンパー線DC5V電源、ベルクロ織ダクトストラップダクトテープのテスト用
ベース
幸いなことに、私はレーザーカッターを利用できるので、それを使ってレーザーカッターを作ることになると思いました。あなたはあなた自身のレーザーカッターを必要としないでしょう。レーザー切断を行う会社に送るか、手動ルートでPDFを印刷して段ボールにレイアウトし、手で切断することができます。
ベースは地元のアート/ホビーショップで購入した1/8 "の段ボールシートで作られています。レーザーカッターには32" x18 "のベッドがあるので、シートをそのサイズにカットしてもらいました。
パネル パネルは、ベース、スラット、カバー、ストラップなど、いくつかの主要部品で構成されています。ベースはLEDを保持し、スレートはパネルのピクセルと全体的な安定性を提供し、カバーは光を拡散し、ストラップはそれを持ち運び可能にします。
<図> <図> <図>
モデリング
レーザーカッターのファイルを作成するために、Rhinoを使用してベースをモデル化しました。レーザーカッターにできるだけ多くの作業を行わせるために、パネルのすべての部分を非常に正確にモデル化しました。
各パネルは、垂直フィンと水平フィンが互いにスライドし、ベースにも切り欠くように作成しました。このように設定すると、接着剤をあまり必要とせずにパネルのパーツをスライドさせてノッチを付けることができ、ピクセルに対して完全な正方形を確実に得ることができます。
<図> <図> <図>
レーザー切断
前述のように、レーザーカッターは32 "x18"であるため、レーザー切断を行うために作成したCADファイルはそのサイズに設定されています。 Ghostコスチュームの.dwgファイルを追加しました。自分でレーザーカットすることも、印刷して段ボールを手でカットするためのテンプレートとして使用することもできます。
手作業で行う場合は、これを簡単にレイアウトして、段ボールのストリップをカットできます。あなたはそれを自分で測定することができます、ピクセルは約1.5 "の正方形と2"の深さで、LEDのために中央に12mmの穴があります。提供されたPDFをカットのテンプレートとして使用することもできます。
アセンブリ
レーザーカッターベッドの小さい寸法は18 "で、ベースの22" x 22 "の寸法よりも小さいため、ベースを2つに切断する必要がありました。最初は、接合部に優れたoleダクトテープを使用して一緒に保ちました。これは、LEDとスラットを追加する間、実際にそれを所定の位置に維持するためです。スラットがベースに追加されると、真のサポートと安定性が提供されます。
各スラットは、水平(H)と垂直(V)の「H#」または「V#」のいずれかと、その番号(#)を順番にスコアリングすることによってラベル付けされます。 1/32 "のクリアランスを追加したので、スラットはうまくスライドします。最初のテストでは、スライドするスペースが大幅に少なくなり、すべてをまとめることができませんでした。すべてをスライドさせたら、スラットをベースに置きました。 。ベースのプラス記号の形をした穴がある場所に切り込みを入れました。ベースに取り付けたら、両端のベースにスラットをダクトテープで貼り付けました。次に、スラットが出会う左上隅にホットグルーの小さなビードを追加しました。それらを所定の位置に保ち、滑らないようにするためです。
スラットのノッチはベースを貫通しているため、ベースの背面に小さなタブがあります。また、これらのタブにホットグルーのビードを追加して、スラットをベースにしっかりと固定しました。
考えた後
3Dモデル図でわかるように、私はパネルの背面にエンクロージャーを計画していませんでした。 これは間違いでした! ダニや治療の数時間前にこれに気づき、急いで2.5インチの段ボールのストリップを切り取り、パネルの背面に追加して、LEDワイヤー以外のものを体に当てるようにしました。
これは役に立ちましたが、実際には完全に囲まれている必要がありました。背面を開いた状態でパネルを歩き回ると、LEDが押し込まれる傾向があります。一部の写真では、ピクセルが実際にはピクセルではなく、ポイントライトになっていることがわかります。ここでLEDが押し込まれたり、落ちたりしました。家族を数回止めて、一晩中、またはダニや治療でこれらを修正しました。
LEDレイアウト <図>
LEDストリングの計画は、Excelで行われ、ゴーストの場合は0から169の順に170個の個別のLEDを配置しました。
Excelレイアウト
注意すべき重要なことは、ピクセルと開始点の間の距離です。
事前に張られたライトを切断して再配線したくない場合は、シーケンスの1つの穴から別の穴に到達できることを確認する必要があります。私の場合、事前に張られたバンドルの個々のLED間の距離は約3インチ(75mm)です。つまり、ピクセルをレイアウトするときは、ピクセルを互いに隣接させる必要がありました。
出発点として、Arduinoと電源を取り付けることができる場所の近くにあることを確認してください。
<図>LEDの配置
Excelでレイアウトされたパターンに従って、LEDを背面から段ボールの所定の位置に押し込みます。
LEDには、LEDを所定の位置に保持する小さなフランジがあります。段ボールは少し薄っぺらなので、歩き回るときにLEDが少し動きました。それらをより安全に所定の位置に保持したい場合は、それらにホットグルーを少し塗ることができます。
配線 <図> <図>
電源
これに電力を供給する最良の方法は、5V DC充電式バッテリー(別名:携帯電話充電器)を使用することです。次に、USB-DCアダプターを使用してライトに接続します。ライトは、メスのDCアダプターで配線されているはずです。
間違えて、前年のコスチュームから持っていたオン/オフスイッチ付きの8xAAバッテリーパックを使用しました。これを書いている間だけ、12Vの出力があり、5VのLEDを使用していることに気づきました。 (私はロケット外科医ではありませんが、これは悪いことだと思います)。バッテリーパックを持っていたので、それを手に取って差し込んだだけで、すべてが機能し、それを二度と推測しませんでした¯\ _(ツ)_ /¯
興味深いことに、私が使用したバッテリーパックでは、約2時間のオンタイムしか得られませんでした。パネルの電源が正しくないことがわかった後、正しい5VDC携帯電話充電器でパネルをテストしたところ、はるかに長持ちしました。
私は2200mAhと7800mAhのポータブル充電器をテストし、パネルはそれぞれ3時間40分と12時間43分動作しました。これは、安価な「口紅充電器」を使用すると、4時間近くの時間に間に合うことを意味します。
LED
屋外看板には、12mmWS2811の個別にアドレス指定可能なLEDのストリングを使用しました。私はそれらをAmazonで購入し、50個の文字列で提供されました。
配線
ライト、次にボードへの電源の配線は、図と写真に示すように行われます。
最初のストリングのリードLEDには電源が接続されており、2本のワイヤー(ホット/赤とアース/白)があります。これらはメスの電源ジャックアダプタに接続されています。電源はこのアダプタに接続されています。次に、電源、アース、および最初のLEDからのデータをArduinoの5vおよびGND接続に接続し、DATA(中央)ワイヤをボードの3PINに接続します。
配線する前に、LEDのストリングを確認してください。私のLEDワイヤーは赤(5V)、緑(DATA)、白(GND)でしたが、あなたのLEDワイヤーは異なる場合があります。
コード <図>
すべての配線が完了すると、プラグを差し込んだときにライトは何もしません。たぶん、ライトが短時間点滅します。彼らは最初に何をすべきかを言われる必要があり、これが私がそれをした方法です。
Arduinoボードのプログラミング方法については説明していません。これを行う方法がわからない場合は、ArduinoのWebサイトにすばらしい記事があります:Arduino入門
FastLED
これらにはFastLEDライブラリを使用しました。その使いやすく、すべてを理解するのに役立つ例を見つけるのは簡単です。名前を使用して任意のLEDを任意の色に設定できるように、Webカラーを使用していると便利でした。
マイコード
以下はGhostのコードです。Arduinoコードファイルもアップロードしました。
ロジックの基本的な概要は、すべてのLEDをメインカラーで塗りつぶしてから、の色を変更し、LEDの個々のセットをオフにして、各「フレーム」を作成することです。アニメーションの「フレーム」ごとにセットを作成したら、それらをX速度X回ループして、アニメーション全体を構成します。これを行うためのより賢い方法があるかもしれませんが、これは私がそれをした方法であり、それは私のために働きました。
カバーを追加 <図> <図>
カバーは紙でできていて破れる可能性があるので、最後まで残しておくことをお勧めします。また、LEDを配置したり、調整したりするときに、正面からLEDに到達できると便利です。
私は横になっていた製図用紙のロールを使用しました。ベラムだと思いますが、マイラーかもしれません。いずれにせよ、全体をカバーするのに十分な幅のある半透明の紙にしたいので、継ぎ目を処理する必要はありません。製図用紙のロールは、アートストアまたはオンラインで入手できます。
紙を所定の位置に保つために、垂直フィンの上端に沿って通常の古いエルマーズ接着剤のラインを配置しました。あなたが本当に必要とするのは紙がほとんど定位置にとどまるためだけなので、私は水平のものをしませんでした。紙を接着したままにしておくと、グリッドが読み通され、パネルが個々のピクセルのように見えるようになります。
接着剤を下ろした後、紙を上に置き、本などの重いものを上に置いて所定の位置に保ち、接着剤をセットします。
接着剤が固まったら、余分な紙を切り落とすことができます。端の周りに少し余分な紙を残して、折りたたんでテープで留めます。これにより、端が剥がれたり緩んだりすることがなくなります。
ロードレディ <図> <図>
仕上げのステップとして、道路に出かける準備をします。
- ベルクロでArduinoと電源を背面に取り付けます
- 接続が緩まないように、接続をテープで固定します
- ストラップを追加して持ち運びます。私はこれに織りダクトストラップを使用しました(私がそれを持っていた製図紙のように)。
- パックマンの音楽と効果音を携帯電話にロードして、Bluetoothスピーカーを持参してください
利益 <図> <図>
すべて完了したら、8ビットの家族を近所に送り、近所の人に感動を与え、甘いお菓子の利益を集めることができます。
読んでくれてありがとう!ご不明な点がございましたら、お気軽にお問い合わせください。
コード
- LEDゴーストアニメーションコード
- ミズパックマン
- パックマン
LEDゴーストアニメーションコード Arduino
このコードは、Ghosts// ANIMATED PACMAN GHOST LED#include "FastLED.h" #define NUM_LEDS 170#define DATA_PIN 3CRGB leds [NUM_LEDS]; void setup(){delay(2000);のアニメーションを実行します。 FastLED.addLeds(leds、NUM_LEDS); FastLED.setBrightness(40); //番号0-255FastLED.clear();} //左目が見える_pixels_l [] ={17、20、21、24、37、38、39、40、41、47、48、49、94、102、 103、106、119、120、121、122、123、129、130、131}; intpupils_pixels_l [] ={15、16、22、23、92、93、104、105}; // rightinteyes_pixels_r [ ] ={38、39、40、46、47、48、49、50、63、66、67、75、120、121、122、128、129、130、131、132、145、148、149、152 }; intpupils_pixels_r [] ={64、65、76、77、146、147、153、154}; //フィートの周りのピクセルを削除intvoid_pixels_1 [] ={8、29、30、31、83、84、85、 86、138、139、140、161}; int void_pixels_2 [] ={7、31、55、56、57、112、113、114、138、162}; int sad_ghost [] ={11、26、35、 48、49、53、60、64、65、80、89、104、105、109、116、120、121、134、143、158}; int eyes_seconds =2; int reg_ghost_seconds =10; int feet_delay =120; //ミリ秒単位の遅延b / wフィートv1v2int eye_loop =(eyes_seconds * 1000)/ feet_delay; // int reg_ghost_loop =reg_ghost_seconds / eyes_seconds;を切り替える前に左右を見る回数。 int sad_ghost_loop =50; int sad_ghost_blink_loop =10; void loop(){for(int i =0; i MsPacman Arduino
// ANIMATED MS PACMAN LED#include "FastLED.h" #define NUM_LEDS 151#define DATA_PIN 3CRGB leds [NUM_LEDS]; void setup(){delay(2000); FastLED.addLeds(leds、NUM_LEDS); FastLED.setBrightness(40); //数値0-255FastLED.clear();} int void_pixels_opened [] ={6,7,22,23,24,25,26,27,28,29,30,43,44,45,46,47 、48、49、50、51、52、53、54、55、56、57、58、68、69、70、71、72、73、74、75、76、77、78、79、80、81 、82,83,84,85,86,98,99,100,101,102,103,104、105,106,107,108,109,127,128,129,130,131,132}; int void_pixels_mid [] ={5,150,45,46,47,48,49,50,51,52,53,54,55,56、 57,58,68,69,70,71,72、73,74,75,76,77,78,79,80,81,82,83,84,85,100,101,102,103,104}; int void_pixels_closed [] ={5,150}; INTはred_opened [] ={92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,5,8,133,150}; INT red_mid [] ={92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,27,26,105,106}; INT red_closed [] ={92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,50,76,77,78}; INT blue_opened [] ={120,139,96}; int blue_mid [] ={120,139,97}; int blue_closed [] ={120,139}; int black_opened [] ={40,95,111,112,124}; int black_mid [] ={40,9 6,110,111}; int black_closed [] ={40,95,96,97,98}; int frame_rate_ms =100; void loop(){// ---- MOUTH OPENED ---- //// fill bodyfill_solid(leds 、NUM_LEDS、CRGB ::Yellow); //マウスを削除します(int i =0; i <64; i ++){leds [void_pixels_opened [i]] =CRGB ::Black;} // set redfor(int i =0; i <20; i ++){leds [red_opened [i]] =CRGB ::Red;} // set bluefor(int i =0; i <3; i ++){leds [blue_opened [i]] =CRGB ::Blue;} // set blackfor(int i =0; i <5; i ++){leds [black_opened [ i]] =CRGB ::Purple;} FastLED.show(); delay(frame_rate_ms); // ---- MOUTH MID ---- //// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); //マウスを削除しますfor(int i =0; i <39; i ++){leds [void_pixels_mid [i]] =CRGB ::Black;} // set redfor(int i =0; i <20; i ++){leds [ red_mid [i]] =CRGB ::Red;} // set bluefor(int i =0; i <3; i ++){leds [blue_mid [i]] =CRGB ::Blue;} // set blackfor(int i =0; i <4; i ++){leds [black_mid [i]] =CRGB ::Purple;} FastLED.show(); delay(frame_rate_ms); // ---- MOUTH CLOSED ---- /// / fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); // mouthfor(int i =0; i <2; i ++){leds [void_pixels_closed [i]] =CRGB ::Black;} // set redfor(int i =0; i <20; i ++){leds [red_closed [i]] =CRGB ::Red;} // set bluefor(int i =0; i <2; i ++){leds [blue_closed [i]] =CRGB ::Blue;} // set blackfor(int i =0; i <5; i ++){leds [black_closed [i]] =CRGB ::Purple;} FastLED.show(); delay(frame_rate_ms); // ---- MOUTH MID ---- //// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); //マウスを削除(int i =0; i <39; i ++){leds [void_pixels_mid [i]] =CRGB ::Black;} // set redfor(int i =0; i <20; i ++){leds [red_mid [i]] =CRGB ::Red;} // set bluefor(int i =0; i <3; i ++){leds [blue_mid [i]] =CRGB ::Blue;} // set blackfor(int i =0; i <4; i ++){leds [black_mid [i]] =CRGB ::Purple;} FastLED.show(); delay(frame_rate_ms);} Pacman Arduino
// ANIMATED PACMAN LED#include "FastLED.h" #define NUM_LEDS 137#define DATA_PIN 3CRGB leds [NUM_LEDS]; void setup(){delay(2000); FastLED.addLeds(leds、NUM_LEDS); FastLED.setBrightness(40); //番号0-255FastLED.clear();} int void_pixels_opened [] ={19,20,21,22,23,24,25,26,27,28,29,42,43,44,45,46 、47、48、49、50、51、52、53、54、55、56、66、67、68、69、70、71、72、73、74、75、76、77、78、79、80 、81,82,94,95,96,97,98,99,100、101,102,103,104,105,121,122,123,124,125,126}; int void_pixels_mid [] ={46,47,48,49,50,51,52,53,54,66,67,68、 69,70,71,72,73,74,75,76,77,78,79,80,98,99,100}; int frame_rate_ms =100; void loop(){// ----口を開けた--- -//// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); //マウスを削除(int i =0; i <61; i ++){leds [void_pixels_opened [i]] =CRGB ::Black;} FastLED .show(); delay(frame_rate_ms); // ---- MOUTH MID ---- //// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); //マウスを削除for(int i =0; i <27; i ++){leds [void_pixels_mid [i]] =CRGB ::Black;} FastLED.show(); delay(frame_rate_ms); // ---- MOUTH CLOSED ---- //// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); FastLED.show(); delay(frame_rate_ms); // ---- MOUTH MID ---- //// fill bodyfill_solid(leds、NUM_LEDS、CRGB ::Yellow); //マウスを削除しますfor(int i =0; i <27; i ++){leds [void_pixels_mid [i]] =CRGB ::Black;} FastLED.show(); delay(frame_rate_ms);}
カスタムパーツとエンクロージャー
1/8 "の段ボールからゴーストコスチュームをレーザーカットするファイル。32" x18 "のレーザーカッターベッドサイズに設定されています。 回路図
LED、Ardunio、およびポータブル電源をプラグインする方法 製造プロセス