LoginSignup
10
8

More than 5 years have passed since last update.

NeoPixelをMaxで光らせるまで

Last updated at Posted at 2018-11-13

はじめに

LEDを光らせたい。

少しもらったNeoPixel

image.png

なぜか家にあったArduino Uno

image.png

これで光らせるまでの記録(備忘録)

まず光らせる

 Arduino IDEをダウンロード

しばらく使っていなかったので、何も環境がなかった。

環境:macOS High Sierra 10.13.6

image.png

起動した。

NeoPixcelのライブラリインストール

image.png

スケッチメニューから>ライブラリをインクルード>.ZIP形式の

でインストール

ライブラリはこれ
https://github.com/adafruit/Adafruit_NeoPixel

image.png

メニューの下の方にNeoPixelの文字が

image.png

コードを拝借

Arduinoに接続したNeoPixelの色と明るさをシリアル通信で制御する
のコードをお借りし、
コピペ

実行&エラー

image.png

ポートを指定する必要がありそう
って、でてきていない?

ポート認識していない原因はこんなだった

回路で5Vを使っていて、GRDに繋がっていなかったため、電圧足りなかったみたい。
3.3Vのところに回路を変えたらあっさり認識した。
(というか回路がちゃんと繋がっていない状態は危ないなこれ!)

image.png

ランダムウォークなライトを作ってみた

32個のLEDなので個数は32個に
ランダムな色が出るようにしたのと、
countで光の位置がうろうろするように変更してみた。

sketch_LEDTest20181113.ino

#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));
}

実際の動作

Maxで制御したい

Maxuinoを試すが失敗

ダウンロードしたものをdocument/Max 8/Libraryにインストール(コピー)
image.png

example

ファイルメニューからexampleを起動
image.png

しかし、
Maxuinoで直接PWMとかまだ難しそうなのでこれはちょっと諦める。

NeoPixcelのライブラリのありがたさを感じた。

Maxからserialで通信

NeoPixcelのライブラリをそのまま使って、
制御信号だけMaxから送ることに変更。

serialというオブジェクトで、直接arduinoとシリアル通信が行えそう。
これを使って、色を変えたりできるかも。

いろいろ試した結果こんな感じに

image.png

#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なので、ブロックされてしまうので注意。

Serial.setTimeout

短時間に大量に送るのはNG

あと、あまりに短時間で大量にserialを送ると、何か処理がたまって。遅延してしまうので、ほどほどに送るようにするのが良さそう。

動画再生の続きはこちらにまとめました
NeoPixelをMaxでSerial通信で動画を光らせるまで

こういうの使ったハッカソンを計画中

グローバルゲームジャム(2019/1/25-27)という、3日で同じテーマでゲームを作るハッカソンがあるのですが、
これを企画中です。

グローバルゲームジャムにはコントローラハックという部門もあるようで、arduinoとか電子工作を使ったゲームもありな様子。

興味あるかたは腕試しにどうぞ。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8