上下に動くムービングライト作ってみた。

上下に動くムービングライト作ってみた。

Arduinoでステッピングモーターを使って、上下に動くLedのムービングライトを作ってみましたー!
(そして、”maruccolight”(まるっこらいと)と名付けてみたりした。)

動いてる様子はこちら。

こんな感じで上下に動きます。動く速さは変える事が出来て、
Ledも自由自在に明るさを変えられます。
白色Ledを使ってるので、色は1色のみですが…。

で、この動いてる本体がこちら。

IMG_1710

ガチャガチャのやつです。
中にLedPinが1つだけ入ってます。

この上に、ナイロンの糸って言うのかしら?
ビーズとか作る時に使う用テグス(普通より太いver)を付けてあって…
下記のような仕組みになっています。

IMG_1708

こんな感じで、ステッピングモーターに下糸ボビンを付けて巻き取ってます。

 

全体的にはこのようになっています。

IMG_1706

Led専用のArduinoと、モーター専用のArduinoと分けてあります。
(本当は1つにまとめたいのですが、スケッチが上手く出来なかったので…)

 

こっちがLed専用。

IMG_1714

この白と黒のジャンピングワイヤが下に伸びてる先がライトの下部分に繋がっています。

 

こっちがステッピングモーターを動かしてる機構。IMG_1715

 

ステッピングモーター〜ドライバーの配線はコレを見てやりました。
ドライバー〜Arduinoはこちらのページを参考にさせて頂きました。

 

Maxで制御できるようにArduinoのスケッチもそれに対応させました。
こっから先が長い道のりでした。。。

できたArduinoのスケッチがこちらです。

●Led側 ////////////////////////////////////////////////////////////////////////

スクリーンショット 2015-03-21 23.03.44

このスケッチはこちらのページを参考にさせて頂きました。
フルカラー用のスケッチだったので、1色分にして余計なものは消しています。

 

●ステッピングモーター側///////////////////////////////////////////////////////

#include

// ピン定義。
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10

void setup()
{
Serial.begin(38400);
delay(2000);

// ピン設定。
pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(PIN_SPI_SS, OUTPUT);
digitalWrite(PIN_SPI_SS, HIGH);
//SPI通信開始
SPI.begin();
SPI.setDataMode(SPI_MODE3);//SCKの立ち上がりでテータを送受信&アイドル時はpinをHIGHに設定
SPI.setBitOrder(MSBFIRST);//MSBから送信

//前のコマンドの引数を消去
L6470_send(0x00);//nop
L6470_send(0x00);
L6470_send(0x00);
L6470_send(0x00);
//デバイスリセットコマンド
L6470_send(0xc0);//ResetRevice

L6470_setup();//L6470を設定

delay(100);
//連続運転
L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転
L6470_send(0x00);//SPD値(20bit)
L6470_send(0x10);
L6470_send(0x00);
delay(100);
//L6470_send(0xB0);//SoftStop
delay(100);

L6470_send(0x70);//GoHome
delay(100);
}

long _speed=10000;
int rotateDIR=1;

void loop()
{
//0:stop、1:left、2:right
if (Serial.available() > 0)
{
long reading = Serial.read();
if(reading<101){
_speed = reading * 1000;
}
else if(reading==111)
{
//Maxで111を送った時左周り
rotateDIR=1;
}
else if(reading==112)
{
//Maxで112を送った時右周り
rotateDIR=2;
}
else if(reading==113)
{
//Maxで113を送った時STOP
rotateDIR=0;
}

}

// ステッピングモーターをある回転方向とスピードで回転させる
turn_stepper(rotateDIR, _speed);
}

//
// ステッピングモーターを回す方向とスピードを決める関数
//
void turn_stepper(int dir, int speed)
{
long first = speed/65536;
long second = (speed % 65536)/256;
long third = speed % 256;

if(dir == 1){
//right(1)のとき
L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転
}
else if(dir == 2){
//left(2)のとき
L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転
}
if(dir != 0){//stop(0)じゃないとき
L6470_send(first);//100000
L6470_send(second);//1000
L6470_send(third);//10
}
else{
L6470_send(0x51);
L6470_send(0);//100000
L6470_send(0);//1000
L6470_send(0);//10
}
}

// モーターへの命令送信関数
//
void L6470_send(unsigned char add_or_val){
digitalWrite(PIN_SPI_SS, LOW);
SPI.transfer(add_or_val); // アドレスもしくはデータ送信。
digitalWrite(PIN_SPI_SS, HIGH);
}

//
// モーターの初期設定
//
void L6470_setup(){
//最大回転スピード
L6470_send(0x07);//レジスタアドレス
L6470_send(0x00);//値(10bit),デフォルト0x41
L6470_send(0x41);

//最小回転スピード
L6470_send(0x08);//レジスタアドレス
L6470_send(0x00);//値(10bit),デフォルト0x41
L6470_send(0x01);

//モータ停止中の電圧設定
L6470_send(0x09);//レジスタアドレス
L6470_send(0x20);//値(8bit),デフォルト0x29

//モータ定速回転時の電圧設定
L6470_send(0x0a);//レジスタアドレス
L6470_send(0x29);//値(8bit),デフォルト0x29

//加速中の電圧設定
L6470_send(0x0b);//レジスタアドレス
L6470_send(0x40);//値(8bit),デフォルト0x29

//減速中の電圧設定
L6470_send(0x0c);//レジスタアドレス
L6470_send(0x40);//値(8bit),デフォルト0x29

//加速係数
L6470_send(0x05);//レジスタアドレス
L6470_send(0x0f);//値(12bit)—最速
L6470_send(0xfe);//!!!!feじゃないとだめ

//減速係数
L6470_send(0x06);//レジスタアドレス
L6470_send(0x0f);//値(12bit)—最速
L6470_send(0xfe);//!!!!!feじゃないとだめ

//フ ル ス テ ッ プ,ハ ー フ ス テ ッ プ,1/4, 1/8,…,1/128 ステップの設定
L6470_send(0x16);//レジスタアドレス
L6470_send(0xff);//値(8bit)

}

////////////////////////////////////////////////////////////////////////////////

ステッピングモーター側のスケッチは頂いたものから作り替えてもらったりした部分もあり、
自分で理解してる部分とそうじゃない部分がありますが…。

 

んで、出来たMaxパッチがこちらです。

スクリーンショット 2015-03-22 12.47.32

 

Arduinoを2つ使ってるので、Maxでもポートを分けて命令を送信しています。

●モーター側は…
・101よりも小さい値を送った時、それがステッピングモーターのスピードになるように設定。
・111、112、113 の値をそれぞれ送った時、up、down、stopする。

モーターの速度は65が最速でした。それ以降は反対に遅くなります。

 

●Led側は…
・Maxから送る値が「255」が1文字目で、2文字目が0~254の値だった時、それが明るさの値になるように設定。
(そして、スライダーの色をArduinoカラーにしてみた…!)

なぜ255を1文字目にしてるかというと…
参考にしたこのページに書いてあったから…!!

もしかしたら、1色使いの場合は、こんな工夫しなくても良かったかもしれませんが…
今後フルカラーにしたかったので、このままでやってみました◎
…といったような指定をArduinoのスケッチ・Maxパッチでそれぞれしています。

ちなみに、このニンジャーライトというライトが欲しくて、
でも買えない…ので作ってみました。

なんとか、ここまで形には出来ましたが、
・RGBのカラーを出したい
・糸ではなくケーブルを巻き取るシステムにして、電源ケーブルを下から垂らすのなくしたい。
・もうちょっと明るくさせたい
・信号を送る部分は無線にして、離れた所からも制御したい。
・Arduinoを1つにまとめたい

 

っていうのが今後の課題です。