はじめに
3端子のフルカラーテープLEDをArduinoで制御する方法を説明したのち、Processingからシリアル通信を通じて制御する方法を説明します。
環境
Arduino IDE 1.8.*
Windows/Mac
フルカラーテープLEDについて
よくある砲弾型のフルカラーLEDとは異なり、マイコンで制御するLED。極小のRGBLEDが入っており、フルカラーで光らせることが可能。そして、数珠つなぎでたくさん制御可能な点が素晴らしい。
売られている商品には、端子の種類が3種類あり、
pin数 | 色 | 特徴 |
---|---|---|
2 | 単色 | ON OFFのみ |
3 | カラー | この記事で使えるもの5V |
4 | カラー | この記事では使えない |
※自分で買うときは注意。
電圧が5Vと、12Vがある。5VはUSBで動かせる。
電源がACアダプタの有無。USBから電源を供給するもの。
LEDが何個ついているか。間隔は何cmか。
リモコンの有無。
防水チューブの有無。
防水樹脂加工の有無。
両面テープの有無。
などの違いが商品ごとに異なる。
他にも、回路は直線であるが、LEDの配置が格子状のものも売られている。
壁のように大きなディスプレイ型のLED Wallもあり、グリーンバック合成の代わりに背景合成として使われている。
自分で制御する場合、「WS2812B」というLEDが乗っているものを買う。
そうすれば、Arduinoで制御に便利なライブラリを使える。
「WS2812B」は5mm角で、1個当たりの価格は約10円。
■ArduinoとテープLEDを接続する
この記事では、3ピンのテープLEDを4個単位でカットしたものに、端子をはんだ付けしたものを使う。
※4個である意味は特にありません。予算の都合です。
よく見ると「→」がみえる。電気が流れる方向が決められおり、数珠つなぎする向きが決まっている。
配線を4本配っています。バラさないように注意します。このうちの3本を差し込んで使います。
配線の色に注意しながら、
「5V」と「5V」
「GND」と「GND」
「D」と「6」
をつなぎます。
(基盤を作りました。〜〜〜〜図を追加します〜〜〜〜)
「5V」は電源のプラスのことです。USB端子から、5Vの電気が流れています。
「GND」は電源のマイナスのことです。
「D」はLEDを制御するための信号線です。
3端子LEDを扱うため、ライブラリの準備
ArduinoにLED制御のためのライブラリを追加します。
「ライブラリを管理」 から「Adafruit_NeoPixel」を検索し、インストールします。
似たようなものが、あるので、間違わないように。
Arduinoの構造はProcessingと似ている。
最初の1回だけ実行される。setup関数と、
繰り返し実行されるdraw関数ならぬ、loop関数がある。
「java」と「c」という言語の違いはあるが、文法はかなり似ている。
void setup() {
//一回だけ実行
}
void loop() {
//繰り返し実行
}
以下のプログラムをArduinoにコピーする。
ここで、2行目の「4」はテープLEDに配置されているLEDの総数である。
また、「6」は信号線をarduinoに刺した番号に対応している。
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels(4, 6, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
}
void loop() {
pixels.setPixelColor(0, pixels.Color(255,0,0));
pixels.setPixelColor(1, pixels.Color(0,255,0));
pixels.setPixelColor(2, pixels.Color(0,0,255));
pixels.setPixelColor(3, pixels.Color(255,255,255));
pixels.show();
delay(1000);
}
まだ、準備は整っていない。以下の2つの設定が必要。
まず、USBケーブルでMacとArduinoをつなげる。
USBケーブルは青いケーブルだ。
①ツール>ボード>Arduino Unoを選択する。
②ツール>シリアルポート>/dev/cu.usbmodem14201を選択する。
14201の数字は環境によって変わる。
usbmodemではなくて、usbserialの場合もある。
この場合は、Macだが、Windowsの場合COM10などの名称になる
.
.
.
準備が整ったら、左から2番目の右矢印のボタンを押す。
すると、プログラムが、Arduinoに書き込まれる(転送される)。
配線の問題がなく、arduinoの設定に問題がなく、プログラムにも問題がなければ、
LEDが手前から「赤、緑、青、白」に光る。
うまく行かないなら、なにかが間違っている。
もう一度、確認しよう。
※プログラムが書き込まれてしまえば、Arduinoはモバイルバッテリーでも動かすことができる。
setPixelColor命令は、制御したいLEDの番号(0はじまり)とRGBの色を指定します。
この命令の結果が、実際のLEDに反映されるのは、show命令が実行されるタイミングです。
delay命令は、ミリ秒待機する。ここでは、1000ミリ秒=1秒の待機としている。
LEDの色を徐々に変化させる
4個のLEDが黒から白に変化する例
変数counterを追加して、色を変化させている。
実行して、数値を変化させて、LEDの光ぐらいを確認しよう。
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels(4, 6, NEO_GRB + NEO_KHZ800);
int counter = 0;
void setup() {
pixels.begin();
}
void loop() {
for (int i = 0; i < 4; i++) {
pixels.setPixelColor(i, pixels.Color(counter%256, counter%256, counter%256));
}
pixels.show();
delay(10);
counter++;
}
授業中課題
LED2つを使って、歩行者用信号を表現しなさい。
(青が点灯、青が点滅、赤が点灯)のループ
提出:arduinoのプログラムをTeamsの提出フォルダにコピー(各自のフォルダを作ること)
その他
■消費電力について
USBが供給できる電力の関係で、この配線の場合は、10~20個ぐらいのLEDが制御可能です。
RGB(255,255,255)の場合、消費電力が多くなり、10個ぐらいが限界。
RGB(32,0,0)の場合、消費電力が少なくなり、20~30個ぐらいが限界?
■数珠つなぎする向きについて
自作する際に、LEDは必要な分だけ切ったり、または、数珠つなぎにしたり出来ますが、向き(→)があります。OUTとINを繋げること。
Serial通信とは
コンピュータ同士や、外部機器と通信する方法に「Serial通信」がある。Processingでも、Arduinoでも使うことができる。
例えば、Processingから100という数値を送信し、Arduinoで100という数値を受信したいとする。まず、通信のための識別番号みたいなportと呼ばれるものがあり、送信側と受信側で、一致させておく必要がある。portにデータを送信すると、しばらくはどんどんデータが溜まる。溜まったportからデータを受信すると、古いデータから(届いた順に)受信していく。portに一定以上データが溜まると、古いものから破棄される。
以下のプログラムでは/dev/cu.usbmodem14201
になっているが、自分の環境に合わせて、書き換える必要がある。数字の部分は、Arduinoを接続する際の手順で何番を使っているかわかる。9600は通信速度でこれも合わせる必要があるが、自由ではなく、ある程度の決まりがあり、とりあえず、9600を使って進める。
通信は基本byte単位で行われる。ここで、Byte型は-128〜127を扱える点に注意が必要である。数値100であれば、この範囲内なので問題ないが、200とかになると、工夫が必要になってくる。
import processing.serial.*;
Serial port;
void setup() {
port = new Serial(this, "/dev/cu.usbmodem14201", 9600);
}
void draw() {
byte[] data = {100};
port.write(data);//送信
}
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0 ) {// portが空なら何もしない
byte b = Serial.read();// portにデータがあるとき、1 Byte受信する
}
}
ProcessingからテープLEDを制御する
Processingから任意の色情報をArduinoへ送信し、Arduinoで色情報を受信して、LEDを制御することを考える。色情報なので、RGB各0〜255の値を3つ送ればよい。つまり、3 Byteで十分であるが、Byte型は-128〜127までしか扱えないので、送信したい値を-128してから、送信し、Arduinoで受信してから+128して使うこととする。
import processing.serial.*;
Serial port;
void setup() {
size(256, 256);
noSmooth();
//送信したいパレット色を描いておく
for (int y=0; y<256; y++) {
for (int x=0; x<256; x++) {
stroke(x, y, 255);
point(x, y);
}
}
port = new Serial(this, "/dev/cu.usbmodem14201", 9600);
}
void draw() {
byte[] data = new byte[3];// RGBの 3 Byte送信したい
color c = get(mouseX, mouseY);// マウス座標の色を取得
data[0]=(byte)(red(c)-128);// 赤成分に-128
data[1]=(byte)(green(c)-128);
data[2]=(byte)(blue(c)-128);
port.write(data); //送信
}
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels(4, 6, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
pixels.begin();
}
void loop() {
if (Serial.available() >= 3 ) {// 3 Byte以上データがあったら
int r = Serial.read()+128;// +128して、もとに戻す。
int g = Serial.read()+128;
int b = Serial.read()+128;
for (int i = 0; i < 4; i++) {
pixels.setPixelColor(i, pixels.Color(r, g, b));
}
pixels.show();
}
delay(10);
}
3本接続するだけで、たくさんのLEDを制御することができ、大変便利であるので、面白い使い方をぜひ見つけてほしい。