\r\n\r\n
今年もクリスマスがやってきました。一年で一番好きな祝日でも、冷や汗をかくような祝日でも、飾り付けはどんどん増えていきますね。今年は、デコレーションにDIYのテクニックを加えて、目立たせてみてはいかがでしょうか。
このプロジェクトでは、全天候型、モーション起動型の8×8 LEDマトリックスをゼロから作ります......。20ドル以下。一般的なクリスマス・ドアリースの中央に収まるようにデザインされていますが、家中どこでも使用可能です。また、電池式なので、遠くてもどこでもOK!
このプロジェクトに必要なものは、以下の通りです。
nanoには直接部品をはんだ付けできるので、厳密には必要ありませんが、小さな実験用プレートもテスト中にとても役に立ちました。ホットグルーガンは、すべてのパーツを組み立てるのにも役立ちます。
このプロジェクトは、多くのハンダ付けが必要で、初心者の私には難しく感じられました。私自身はまだハンダ付けの初心者ですが、見た目ほど難しくなく、時間もかからないと感じています。初めてはんだ付けをする方は、こちらのヒントを参考にしてください。
ハンダ付けがどうしても苦手な方は、LEDストリップや、ビギナーズキットに入っている既製のLEDマトリクスを使っても可能です。このルートで行く場合は、いくつかのコードの微調整が必要です。
まずはArduinoの回路図から、PIRセンサーとLEDマトリックスに配線を繋いでいきます。
さて、8×8のLEDマトリクスを**してみましょう。まず、行列の行と列を作成し、試作基板上の希望する位置に正確に配置されることを確認するのがよいでしょう。
上の写真では、すべてのLEDがアノード(長い方の正の足)をオリジナル基板の上側に向けて配置されています。これは、アノード(陽極)とカソード(陰極)を結合して、共通の柱を作るために重要です。今やっておくと、後々面倒なことにならずに済みます。
共通列のカソードマトリックスを構成し、この図にその接続方法を示します。
最初は少し難しく見えるかもしれませんが、非常にシンプルな構成です。各列では、すべてのカソードが右から左へ接続され、次にArduinoのピンのいずれかに接続されています。この後、陽極の各列に同じことをする。このように、どの列に電源を供給し、どの列を接地するかによって、アレイ内の個々のLEDを点灯させることができます。
まず、1列目のLEDを配置します。すべてのアノードが上を向いていることを確認し、裏返します。各コーナーにもう一つLEDを追加し、上にゴム紐でもう一枚のオリジナルボードを取り付けると、すべてを固定することができました。
次に、各LEDのカソード(短)の足を1つずつ、互いに重なるように左に曲げます。左から始めて、右から作業するのが最も簡単です。大きめのプロトボードを使う場合は、先にボードにはんだ付けしてからパッドで接続するとよいでしょう。カソードを基板上の他のラインやアノードに接続しないように注意してください。
この作業を8列すべてで繰り返し、完了すると次のようになります。
陽極柱はもう少し細かい。上図では、陽極が陰極の列を通過するたびに曲がっています。列には全く触れることができないからだ。陰極の列の上に陽極を折り曲げて、互いに接続しなければならないのです。ペンで脚を曲げるのも有効でしょう。
これをアノードの各列に行い、それぞれのトップアノードに抵抗を接続する。プロトボードの次の穴に抵抗を入れ、パッドをはんだで接続する方が簡単かもしれません。これで、このような状態になるはずです。
おめでとうございます!LEDマトリックスの完成です。この段階で、断線していないか、列が接触していないかなど、ハンダ付けを十分に確認してください。見栄えが悪くても気にしないでください!ただ、動くことが必要なのです。これで、任意の列の端に5Vを接続し、任意の行の端に接地することで、各LEDを確認することができます。
問題なければ、上図のように各列、行に接続線を接続し、Arduinoに接続します。
ArduinoIDEを開き、ボードとポートを選択します。Arduinoが初めての方は、こちらのGetting Started Guideをご覧ください。
このコードをエディタに入力します。もし、あなたがこれに慣れていないなら、かなりコードを必要としますが、どのように動作するかを理解するために、完全なコメントがここに提供されています。
c***t int row[8] = { 2,3,4,5,6,7,8,9 };c***t int col[8] ={ 10,11,12,14,15,16,17,18 };int pirPin = 19; int pirState = LOW; int val = 0; bool pirTrigger = false;c***t int pirLockTime = 12000; int pirCountdown = pirLockTime;int pixels[8][8];c***t int refreshSpeed = 500;int countDown = refreshSpeed;int currentCharIndex = 0;typedef bool CHAR_MAP_NAME[8][8];c***t CHAR_MAP_NAME blank = { {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},}; c***t CHAR_MAP_NAME threedownthreein = { {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 1 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},}; c***t int noOfFrames = 5;c***t CHAR_MAP_NAME *charMap[noOfFrames] ={&blank,&threedownthreein,&blank,&blank,&threedownthreein};void setup(){ for (int i=0;i<8;i++){ pinMode(row[i], OUTPUT); pinMode(col[i],OUTPUT); //motion sensor pinMode(pirPin, INPUT); digitalWrite(col[i], LOW); }}void screenSetup(){ c***t CHAR_MAP_NAME *thisMap = charMap[currentCharIndex]; for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { bool on = (*thisMap)[x][y]; if(on) { pixels[x][y] = HIGH; } else { pixels[x][y] = LOW; } } } currentCharIndex++; if(currentCharIndex>=noOfFrames){ currentCharIndex = 0; } }void refreshScreen(){ for (int currentRow = 0; currentRow < 8; currentRow++){ digitalWrite(row[currentRow], LOW); for (int currentCol = 0; currentCol < 8; currentCol++){ int thisPixel = pixels[currentRow][currentCol]; digitalWrite(col[currentCol], thisPixel); if (thisPixel == HIGH) { digitalWrite(col[currentCol], LOW); } } digitalWrite(row[currentRow], HIGH); } }void loop(){ val = digitalRead(pirPin); if (val == HIGH){ pirTrigger = true; } else if (val == LOW && pirCountdown <=0) { pirTrigger=false; pirCountdown = pirLockTime; } if(pirTrigger==true && pirCountdown > 0) { refreshScreen(); countDown--; pirCountdown--; if(countDown <= 0) { countDown = refreshSpeed; screenSetup(); } } }知っておくべき重要なパーツは以下の通りです。
リフレッシュスピードは、画面が更新されるまでの時間を決める変数で、数値が大きいほど待ち時間が長くなります。
表示するために配置する各キャラクターマッピングの名前(考えやすいところではフレーム)です。
noOfFrames 変数。フル再生時に表示されるフレーム数を決定します。キャラクターマップの枚数とは異なる場合がありますので、ご了承ください。例えば、「猫」を表示したい場合、空白、A、C、Tの4種類のフレームを定義するだけでよいのです。
人感センサーで動きを検知すると、LED画面が左上から下向きに3回、内向きに3回点滅するようになりました。表示がおかしい場合は、もう一度配線を確認してください自分で画像やメッセージを入れると、早く切れたり、再生に時間がかかったりすることがあります。希望の時間だけ再生されるまで、変数pirLockTimeを変更してみてください。
LEDディスプレイに各フレームを追加する作業は少し面倒なので、LEDマトリックス用のテキストと画像を作成するために、このスプレッドシートを作成しました(※※編集できるようにGoogleシートのコピーです)。
スプレッドシートを使えば、作成したものをそのままコードにコピーすることができます。
LEDマトリックスが動作するようになったので、それを冬の間も使えるようにする方法が必要です。この方法は、熱帯の嵐やプールでの水浴びには耐えられないかもしれませんが、悪天候からすべての電子機器を守るには十分な方法だと思います。
直径15cm、深さ6cmの丸いタッパーボックスが部品にぴったり合うので、それを使いました。蓋にはLEDマトリックスより少し大きめの窓を開け、その上に透明なラップを重ね、液体が入り込む隙間がないようにします。何かのパッケージの丈夫なプラスチックが一番効きますが、それは私が持っているものです。また、元の基板に多少の取り付けをすることもできますが、いずれも強力な防水テープを使用すれば簡単にできます。
次に、窓の下に小さな穴を開け、PIRセンサーがちょうど入るまで慎重にゆっくりと穴を広げます。なるべくぴったりとフィットさせたい。
PIRセンサーを接続し、見える隙間はテープやホットボンドで埋めてください。
箱の開閉を妨げるテープや接着剤などを取り除き、電池と一緒にすべての部品を箱に入れます。ここでは、単純な単三電池パックを使用し、直接**NanoのVCCピンを使用しました。リースの中央にある建物を吊り下げるために、囲いの外側に小さなコルク片をいくつか追加しました。
箱を封印したら、クリスマスリースと一緒に吊るして、20ドル以下のハイテクなパーソナルウェルカムに対する訪問者の反応を待ちましょう。さらに一歩進んで、家の中もDIYで素敵なデコレーションができますよ。
このプロジェクトでは、ゼロから自作したLEDマトリクスシステムは、モーション起動式で、屋外でも最悪の天候でも生き残ることができます。他のプロジェクトでも、この作り方は休みが終わった後もずっと使えますし、同じ手法で安価な耐候性エンクロージャーを作ることができます。
皆さんは、クリスマスをDIYで演出するものを作りましたか?今年は、DIYをテーマにしたクリスマスプレゼントを用意する予定ですか?下のコメント欄で教えてください