はじめに
LEDを光らせたい。
少しもらったNeoPixel
なぜか家にあったArduino Uno
これで光らせるまでの記録(備忘録)
まず光らせる
## Arduino IDEをダウンロード
しばらく使っていなかったので、何も環境がなかった。
環境:macOS High Sierra 10.13.6
起動した。
NeoPixcelのライブラリインストール
スケッチメニューから>ライブラリをインクルード>.ZIP形式の
でインストール
ライブラリはこれ
https://github.com/adafruit/Adafruit_NeoPixel
メニューの下の方にNeoPixelの文字が
コードを拝借
Arduinoに接続したNeoPixelの色と明るさをシリアル通信で制御する
のコードをお借りし、
コピペ
実行&エラー
ポートを指定する必要がありそう
って、でてきていない?
ポート認識していない原因はこんなだった
回路で5Vを使っていて、GRDに繋がっていなかったため、電圧足りなかったみたい。
3.3Vのところに回路を変えたらあっさり認識した。
(というか回路がちゃんと繋がっていない状態は危ないなこれ!)
ランダムウォークなライトを作ってみた
32個のLEDなので個数は32個に
ランダムな色が出るようにしたのと、
countで光の位置がうろうろするように変更してみた。
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6 //Arduinoで使うピン
#define NUMPIXELS 32 //LEDの数。
#define red 9
#define green 10
#define blue 11
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int tblue = 0;
int tgreen = 0;
int tred = 0;
int tbrightness = 0;
int count = 15;
int countdelta = 1;
int count2 = 0;
void setup() {
pixels.begin(); // ライブラリ使用開始
pinMode(blue, OUTPUT);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
Serial.begin(9600);
color(0,0,255,1);
}
void loop() {
if(Serial.available()>0){
tred=Serial.parseInt();
tgreen=Serial.parseInt();
tblue=Serial.parseInt();
tbrightness=Serial.parseInt();
//color(tred,tgreen,tblue, tbrightness);
Serial.println("red " + (String)tred + " green " + (String)tgreen + " blue " + (String)tblue + " brightness " + (String)tbrightness);
}
if(count %30 == 0){
count2+=countdelta;
color(random(8, 16)*8,random(8, 16)*8,random(8, 16)*8,200);
countdelta = random(-1,1);
if(countdelta == 0)countdelta = 1;
}
count++;
pixels.show();
}
void color(int cred, int cgreen, int cblue, int brightness) {
pixels.setBrightness(brightness);
for(int i=0; i < NUMPIXELS; i++){
pixels.setPixelColor(i,pixels.Color(0,0,0));
}
pixels.setPixelColor(count2%NUMPIXELS+2,pixels.Color(cred,cgreen,cblue));
}
実際の動作
ランダムウォークなライト pic.twitter.com/cRcp3wD8Nr
— tatmos (@tatmos) 2018年11月13日
Maxで制御したい
Maxuinoを試すが失敗
ダウンロードしたものをdocument/Max 8/Libraryにインストール(コピー)
example
しかし、
Maxuinoで直接PWMとかまだ難しそうなのでこれはちょっと諦める。
NeoPixcelのライブラリのありがたさを感じた。
Maxからserialで通信
NeoPixcelのライブラリをそのまま使って、
制御信号だけMaxから送ることに変更。
serialというオブジェクトで、直接arduinoとシリアル通信が行えそう。
これを使って、色を変えたりできるかも。
いろいろ試した結果こんな感じに
クラップに反応して赤く光る
— tatmos (@tatmos) 2018年11月16日
フェードアウトするように修正 pic.twitter.com/ejpmL73U9H
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6 //Arduinoで使うピン
#define NUMPIXELS 64 //LEDの数。
#define red 9
#define green 10
#define blue 11
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int tblue = 0;
int tgreen = 0;
int tred = 0;
int tbrightness = 0;
int count = 15;
int countdelta = 1;
int count2 = 0;
int started = 0; // シリアル入力を受信しているかどうかを示すフラグ
int clap = 255;
void setup() {
pixels.begin(); // ライブラリ使用開始
pinMode(blue, OUTPUT);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
Serial.begin(9600);
Serial.setTimeout(4);
color(0,0,255,1);
}
void loop() {
count+=countdelta;
if(Serial.available()>0){
started = 1; // set the started flag to on
}
if(started)
{
//tred=Serial.parseInt();
tgreen=0;//Serial.parseInt();
tblue=0;//Serial.parseInt();
tbrightness=200;//Serial.parseInt();
color(tred,tgreen,tblue, tbrightness);
clap = 255;
//Serial.println("red " + (String)tred + " green " + (String)tgreen + " blue " + (String)tblue + " brightness " + (String)tbrightness);
//delay(5); // 停止
while(Serial.read()!=-1)
{
Serial.read();
}
started = 0;
}
else {
if(clap >0){
tred=clap;//+((count/4)%3)*2;
clap-=2;
}
tgreen=0;//+((count/3)%3)*2;
tblue=0+((count/5)%3)*2;
tbrightness=80;
color(tred,tgreen,tblue, tbrightness);
}
if(count %1 == 0)
{
count2+=countdelta;
if(count2 > NUMPIXELS || count2 < 0)
{
countdelta = countdelta*-1;
}
}
if(Serial.read()==-1)pixels.show();
}
void color(int cred, int cgreen, int cblue, int brightness) {
pixels.setBrightness(brightness);
pixels.clear();
for(int i=0; i < NUMPIXELS; i++){
pixels.setPixelColor(i,pixels.Color(cred,cgreen,cblue));
}
pixels.setPixelColor(count2%NUMPIXELS,pixels.Color(255,255,255));
}
ポイント
タイムアウトの設定大事
Serial.setTimeout(4);
これがないと、デフォルト1000msecなので、ブロックされてしまうので注意。
短時間に大量に送るのはNG
あと、あまりに短時間で大量にserialを送ると、何か処理がたまって。遅延してしまうので、ほどほどに送るようにするのが良さそう。
Max8からserialでarduinoをコントロールしてみたところ pic.twitter.com/7q39GNl0c3
— tatmos (@tatmos) 2018年11月16日
動画再生の続きはこちらにまとめました
NeoPixelをMaxでSerial通信で動画を光らせるまで
こういうの使ったハッカソンを計画中
グローバルゲームジャム(2019/1/25-27)という、3日で同じテーマでゲームを作るハッカソンがあるのですが、
これを企画中です。
グローバルゲームジャムにはコントローラハックという部門もあるようで、arduinoとか電子工作を使ったゲームもありな様子。
興味あるかたは腕試しにどうぞ。