楽しく学べる電子工作:Arduino+WS2812B LEDテープライト

 子供たちに関心を持ってもらうための教材探しをやってみようと思い、一発目の投稿です。
ほぼ私の備忘録に近いので、ポイントだけ書いていこうと思います。

準備


【機器や材料】
  1. Arduino UNO <1個> ※学習用に購入した物
  2. WS2812B LEDテープライト <1個> ※Amazonから購入
  3. ジャンプワイヤー(オスーオス)  <3本> ※電子工作キットに入っていた物
  4. ワンタッチコネクター <3個> ※たまたま持っていた物
    →こちら(WFR-2BP)が使いやすそう
【結線図(略図)】 TINKERCADで作成


購入したLEDテープライトのケーブルコネクターのケーブル色
VCC:Red(赤)
GND:White(白)
DATA:Green(緑) →今回はArduinoの3番ピンに接続

LEDテープライトと付属のコネクターケーブル

ワンタッチコネクターを付属のコネクターケーブルにつないだところ

ArduinoとLEDテープライトをつないだところ

【Arduino IDEのプログラム】
  1. 「FastLED」と言うライブラリをインストール
  2. 「FastLED」のテンプレートを流用してプログラムを作成

1.「FastLED」と言うライブラリをインストール


メニューの「ツール」から「ライブラリを管理」を選択すると、ライブラリマネージャが起動する。

ライブラリマネージャの右上の枠に「FastLED」を入力すると、勝手に検索されてくる。
バージョンは気にせず最新で良いと思う。
「インストール」ボタンを押すと、インストール完了する。

2.「FastLED」のテンプレートを流用してプログラムを作成


メニューの「ファイル」から「スケッチ例」を選択し、「FastLED」を探していくとテンプレート(サンプルプログラム)が使用できます。
今回は、「Blink」を使ってみました。



参考:Blinkのスケッチ(そのまま貼付けました)
※使ったところに色付けしています。変更部分は赤字にしています。

【ポイント】
Arduinoの3番ピン使用、LEDテープライトにはLEDが60個ついている
 
#include <FastLED.h> 
 
// How many leds in your strip?
#define NUM_LEDS 1

// For led chips like WS2812, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
// Clock pin only needed for SPI based chipsets when not using hardware SPI
#define DATA_PIN 3
#define CLOCK_PIN 60

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
    // Uncomment/edit one of the following lines for your leds arrangement.
    // ## Clockless types ##
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // GRB ordering is assumed
    // FastLED.addLeds<SM16703, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1829, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1812, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS1904, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<UCS2903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2852, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<GS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SK6812, DATA_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<APA106, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<PL9823, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2813, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GE8822, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<LPD1886, DATA_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<LPD1886_8BIT, DATA_PIN, RGB>(leds, NUM_LEDS);
    // ## Clocked (SPI) types ##
    // FastLED.addLeds<LPD6803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // GRB ordering is typical
    // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<WS2803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
    // FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);  // BGR ordering is typical
}

void loop() { 
  // Turn the LED on, then pause
  leds[0] = CRGB::Red;
  FastLED.show();
  delay(500);
  // Now turn the LED off, then pause
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}

テンプレートのままで良いですが、ちょっとだけ改造してみました。
完成したプログラムです。
3色を高速(10ms)で流れるようにしてみました。(変更箇所を赤字にしています)

#include <FastLED.h>

#define NUM_LEDS 60
#define DATA_PIN 3

CRGB leds[NUM_LEDS];

void setup() { 
       FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}

void loop() { 
  
for(int i = 0; i<NUM_LEDS; i++){
  leds[i] = CRGB( 255, 0, 0);
  leds[i+1] = CRGB( 0, 255, 0);
  leds[i+2] = CRGB( 0, 0, 255);
  FastLED.show();
  delay(10);
  leds[i] = CRGB( 0, 0, 0);
  FastLED.show();
  }
  
}

【完成イメージ動画】


【補足】
色指定については、下記サイトを参考にする。


LEDを全部点灯させると、Arduinoからの電源容量が足りなくなる可能性があるので、注意が必要。

ネット情報によると、
5V駆動で1個のLED当り最大約50mA
60個:約3A
Arduino UNOの5Vは、約1Aまで供給可能らしい。


注意が必要なLEDテープライトだが、子供たちが楽しめる教材になりそうです。


コメント

このブログの人気の投稿

子供たちへの練習課題を、自分で作ってみました。

「ロボット体験教室」を1/30(日)の佐賀新聞広告欄に掲載していただきました。