このところエイプリルフールのGoogleのパタパタネタとか、大人の科学のパタパタ電波時計とかでお茶を濁してきましたが、とりあえず空港のパタパタも一段落させたいと思い「空港のパタパタがスイッチを押すと動く」というものを作りました。

前回は、Arduinoにケースをつけて、パタパタと一体化させましたが、それにプラスして、スイッチを複数つけてパタパタを自在に(?)操作できるようにしています。

スイッチを作るにあたっては、こことかここを参考にしました。

こんな外観をしています。
58


Arduinoから引っ張ってきている3Vの電気を並列につなげて、それぞれGNDに逃がす途中でArduinoのDIGITAL INに値を返すようにしています(という書き方でいいのかな?)
スイッチは4つで、それぞれ下記のような動きをするように設定しています。

46

・タクトスイッチ(左):押し続けている間、フリップが動く。
・タクトスイッチ(右):フリップが一周して、一つ先のフリップで止まる
・トグルスイッチ(左):スイッチOnの時の間、フリップが動く。(タクト左と同じプログラム)
・トグルスイッチ(右):トグルスイッチ(左)と同じ

プログラムはこんな感じです。相当適当なので、何の参考にもならないと思いますが…

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

void setup()
{ delay(2000); // ピン設定。
pinMode(2,INPUT) ;
pinMode(3,INPUT) ;
pinMode(4,INPUT) ;
pinMode(5,INPUT) ;
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();
// シリアル通信。
Serial.begin(9600);

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を設定
}

void loop(){
//以下に動きを書くとその通りに動く
int i = 0; //一度押すと、61枚送るスイッチ
if (digitalRead(2) == HIGH) { //2番ピンとつながってるスイッチがonになったら下記を実行
while(i < 61){//ここの数字ぶんパタパタする。
L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転L6470_send(0x00);//SPD値(20bit)ここから下の3行でスピードの20bitを表現しているらしい
L6470_send(0x20);//ここの数字を下げると遅くなる
L6470_send(0x00); delay(133);//この数字の時間だけ動作する i++;
}
L6470_send(0xB8);//HradStop_急停止
}

//押している間、パタパタする
if (digitalRead(3) == HIGH) {//3番ピンとつながってるスイッチがonになったら下記を実行
while(i < 1){
L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転
L6470_send(0x00);//SPD値(20bit)ここから下の3行でスピードの20bitを表現しているらしい
L6470_send(0x20);//ここの数字を下げると遅くなる
L6470_send(0x00); delay(133);//この数字の時間だけ動作する i++; }
L6470_send(0xB8);//HradStop_急停止 }

//押している間、パタパタする
if (digitalRead(4) == HIGH) {//4番ピンとつながってるスイッチがonになったら下記を実行
while(i < 1){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 
L6470_send(0x00);//SPD値(20bit)ここから下の3行でスピードの20bitを表現しているらしい
L6470_send(0x20);//ここの数字を下げると遅くなる
L6470_send(0x00); delay(133);//この数字の時間だけ動作する i++; }
L6470_send(0xB8);//HradStop_急停止}

//押している間、パタパタする
if (digitalRead(5) == HIGH) {//5番ピンとつながってるスイッチがonになったら下記を実行
while(i < 1){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 
L6470_send(0x00);//SPD値(20bit)ここから下の3行でスピードの20bitを表現しているらしい
L6470_send(0x20);//ここの数字を下げると遅くなる
L6470_send(0x00); delay(133);//この数字の時間だけ動作する i++; }
L6470_send(0xB8);//HradStop_急停止
 }
//ここまで

}

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(0x30); //モータ停止中の電圧設定 L6470_send(0x09);//レジスタアドレス
L6470_send(0x20);//値(8bit),デフォルト0x29
//モータ定速回転時の電圧設定
L6470_send(0x0a);//レジスタアドレス
L6470_send(0x40);//値(8bit),デフォルト0x29
//加速中の電圧設定
L6470_send(0x0b);//レジスタアドレス
L6470_send(0x40);//値(8bit),デフォルト0x29
//減速中の電圧設定
L6470_send(0x0c);//レジスタアドレス
L6470_send(0x40);//値(8bit),デフォルト0x29
//フ ル ス テ ッ プ,ハ ー フ ス テ ッ プ,1/4, 1/8,…,1/128 ステップの設定
L6470_send(0x16);//レジスタアドレス
L6470_send(0x00);//値(8bit)
}


回路図的な物はこんな感じ。回路図を描くツール、Fritzingを初めて使ってみました。
130504_bread


これで、とりあえずですがパタパタを動かして楽しむことはできるようになりました。





課題は

・スイッチを押し続けるとフリップを送り続けてしまうが、「押しつづけていても1枚だけめくって止まる」という仕組みを作りたい

・正確に1周するようにしたい(現在は時間で歯車を動かしているため、どうしてもずれが生じる)

・12Vの電源アダプタが2個必要なのがかっこわるい

・大人の科学の電子時計みたいに、時を刻むパタパタにしてもいいかも

・見た目にブレッドボードだったり、配線がぐちゃぐちゃでかっこわるいので、もう少しきれいにしたい

などなど。山積みです。
最後のやつ以外は、独力では解決できないかもしれませんが、またいろいろと調べつつ、地味にやって行こうと思います。

 次回は外観を少しきれいにしてみます。