LEDテープの自由な操作のために、前は速いマイコン(Teensy4.0)を使いましたが、今回はArduino-UnoでLEDテープをディスプレイ代りに使えるかのごく簡単な実験です。よって記事も短いですが。
前回の記事は次です。
カラーLEDテープ照明を自由にコントロール - 勝手な電子工作・・
その後、ネットで次のような密なLEDテープ(の半端1m)を入手しました。
ほぼ長さ7mmに1つのRGB-LED (SMD-5050) が並んでいて、コントロール用のIC(WS2812B)もそれぞれに組み込まれているという密なLEDテープです。
こうなると、これでどうしてもDisplayを作ってみたくなってしまいます^^;
しかしそれにはテープを切り崩さなければならないうえ、配線にもちょっとした手間がかかりそう。いい方法がないかなあ・・思っていたら、既にプレート状に配線されている手ごろなのをみつけました。
これを並べる方がテープを切って並べるよりは簡単かな?しかし4x4のエレメントではどうにもなりません。そうはいっても数字を出す実験なら最低4x6でできそうだから、モノは試し、やってみよう・・・
というわけで、4つを次のように組み合わせてみます。
Arduinoからの信号線は1本。これでもかなり速度の速い表示が可能ですからやってみる価値はありますね。今回はFastLEDライブラリーを使います。
適当につなぎましたが、ややこしいことに次の接続順序になってます。
各行を左から右へとつなぐと使いやすいでしょうが、まあ、これでもよいとします。どっちみちソフトでコントロールするわけだから。
というわけで、2桁の数値を表示してみます。どうせならカウントダウン装置にしてみます。最小の4x6を2桁表示すると下に2行あまるわけなので、ここに下線を入れ、残り秒数が少なくなるにつれて下線の色が変わるとか・・
LEDがあまりにも明るくて写真が撮りにくいのなんの・・・
というわけできれいな実物と違って、次の動画も周りは暗く映らざるを得ませんが。
LEDの明るさ設定コントロールと撮影のテクニックでもっときれいに撮れるように思いますが、とりあえずはご勘弁くださいm(_ _ )m
Unoのテスト用スケッチは次の通りです。
/********************************************************
* LED tape panel using FastLED for Arduini-UNO *
* Test version 00 Aug.1, 2021 by A.Tominaga *
*********************************************************/
#include "FastLED.h"
#define nLEDs 64 // number of total LEDs
#define dPin 14 // data pin D14=A0
CRGB myTp[nLEDs]; // construct myTp array
// define pattern of numeric char
const byte Num[10][3] = {{0x69, 0x99, 0x96}, {0x26, 0x22, 0x27},
{0x69, 0x12, 0x4F}, {0xF1, 0x21, 0x96}, {0x22, 0x6A, 0xF2},
{0xF8, 0xE1, 0x1E}, {0x24, 0x8E, 0x9E}, {0xF1, 0x12, 0x48},
{0x69, 0x69, 0x96}, {0x69, 0x71, 0x24}
};
// define color
#define White (18,18,18)
#define Blue (0,0,24)
#define Green (0,24,0)
#define Yellow (20,20,0)
#define Red (24,0,0)
#define Black (0,0,0)
// for count-down 50 to 0
int8_t Nr = 50; // number from 50 to 0
uint8_t lNr, rNr; // left & right digit of Nr
void setup() { // ***** Arsuino setup() *****
Serial.begin(9600);
delay(2000);
FastLED.addLeds<WS2812, dPin, GRB>(myTp, nLEDs);
clrLED();
}
void loop() { // ***** Arduino loop() *****
lNr = Nr / 10; // left digit
rNr = Nr - lNr * 10; // right digit
editPat('L', lNr); // edit left digit
editPat('R', rNr); // edit right digit
drawBar(); // draw under-bar
FastLED.show(); // and show them
delay(1000);
if (Nr==0){ // if counted done
delay(5000); // add long delay
}
Nr = Nr - 1; // update number
if (Nr < 0) {
Nr = 50;
}
clrLED(); // clear LED tape
}
void editPat(byte LR, uint8_t Su) {
for (uint8_t i = 0; i < 3; i++) {
byte Byt = Num[Su][i]; // get row i
for (uint8_t j = 0; j < 8; j++) { // column j
uint8_t mask = B10000000 >> j; // set mask
if (mask & Byt) { // if Num[Su,bit] on,
uint8_t k = i * 8 + j; // then calc. position
// if row 1,3,5,.. byte-sequences are opposite
uint8_t l = k;
if ((k / 4) % 2 == 1) { // if rows 1,3,5,..
l = k + 3 - (k % 4) * 2; // reverse sequences
}
if (LR == 'L') { // for left digit
myTp[l].setRGB White;
} else { // for right digit
myTp[l + nLEDs / 2].setRGB White;
}
}
}
}
}
void drawBar(void) {
for (uint8_t l = 28; l < 64; l++) {
if ((l < 32) | (l >= 60)) {
myTp[l].setRGB Blue;
if (Nr < 40) {
myTp[l].setRGB Green;
}
if (Nr < 30) {
myTp[l].setRGB Yellow;
}
if (Nr < 20) {
myTp[l].setRGB Yellow;
}
if (Nr < 10) {
myTp[l].setRGB Red;
}
}
}
}
void clrLED(void) {
for (int i = 0; i < nLEDs; i++) {
myTp[i].setRGB(0, 0, 0);
}
FastLED.show();
}
エレメントをどんどん増やせば明るくて見やすいきれいなディスプレイができますね!ただ、この状態でもLEDテープは100mAほど消耗しますから、エレメント数を大幅に増やすときは、別電源から供給する必要があります。
以上、ごく簡単ですが、どうしてもやってみたかったので^^ ・・・ 簡単ですが記録として残しておきます。
もしもお役にたてば幸いです。
©2021 Akira Tominaga, All rights reserved.