見出し画像

スキャナカメラ2020の作成(後編)

挨拶

どうもTakahashi Toshioです。
この内容は、スキャナカメラ2020の作成(前編)の続きになります。もし興味ある方は、前編も御覧下さい。


スキャナカメラ2020の概要

前編に書いたように、従来から使用しているスキャナカメラを改造する方式の方が現実的と分かりました。しかしスキャナのセンサを動かすプログラムを弄ることはできません。だからといって、センサ部分だけをスライダーで動かすことも大型化に繋がり現実的ではありません。

そこでハッと思いつきました。現在使用しているスキャナカメラは、元のスキャナについているステッピングモーターを流用しています。このステッピングモーター自体をハックすれば、今回の目的に合う作成が出来るのではないかと。

要するに、モータードライバからの信号を、元のスキャナ側と新しいドライバで分けて使用するということです。図で書くと分かるかな。

画像1

なんと単純明快。何故こんな単純な事に気づかなかったのか…。ステッピングモーターはよくあるバイポーラ型だろうから、4pのトグルスイッチで切り替えて上げれば理論上は動くはずです。

ドライバは小型なものが欲しかったのでA4988系で行いましたが、レビューにもあるように高出力なものには対応できないかもです。

あとはArduinoでスケッチを書き、配線組めば完成。従来のスキャナカメラから高さ10mm上昇程度で済ませました(全景写真を撮りたかったのですが、あまりにも反りが酷くカッコ悪いので躊躇っております)。

ここに載せているのが、今回の肝となるArduinoからのマニュアル動作スイッチ軍団。マニュアルでの左右操作、スピード調整用のボリューム、オートでのシーケンススイッチ等を盛り込んでおります。ちなみに使ってないスイッチ類もありますが、その辺りは拡張性の問題ですので、現在は不要でございます。Arduinoでの制御なので、いざとなればスケッチをイジって簡単に機能を変えれるのは良いです。
あとどうでもいいですけど、トグルスイッチやボリュームは男のロマンなので、邪魔でも載せたかった(笑)

一応スケッチも書いておきますが、なんとも情けないプログラムですし、作者の性格が見えて恥ずかしい。とはいえステッピングモーターを回す参考になれば。

#define MAN 6  //マニュアルモード
#define AUTO 7  //オートモード
#define RIGHT 8  //右スイッチ
#define LEFT 9 //左スイッチ
#define ONS 10 //多目的スイッチ
#define DIR 12 //stepping direction
#define PUL 13 //stepping step

const int spd = A0;//マニュアルスピード変更値
int spd2 = 2115;
int spd3 = 2115;

void setup() {
 Serial.begin(9600);
 pinMode(MAN,INPUT);
 pinMode(AUTO,INPUT);
 pinMode(RIGHT,INPUT);
 pinMode(LEFT,INPUT);
 pinMode(ONS,INPUT);
 pinMode(DIR,OUTPUT); //direction
 pinMode(PUL,OUTPUT); //step
 pinMode(spd,INPUT);//

}

void loop() {

//++++++++++マニュアルモード測定++++++++++//

 if(digitalRead(MAN) == HIGH){          

   if(digitalRead(ONS) == HIGH){      
     for(int w=0; w<10000; w++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(550);
       digitalWrite(PUL,LOW);
       delayMicroseconds(550);
     }
   }

   
   spd2 = analogRead(spd);
   spd3 = map(spd2,0,1023,550,2115);//
   //Serial.println(spd3);
   if(digitalRead(RIGHT) == HIGH){      
       digitalWrite(DIR,LOW);
       digitalWrite(PUL,HIGH);
       delayMicroseconds(spd3);
       digitalWrite(PUL,LOW);
       delayMicroseconds(spd3);
   }
   else if(digitalRead(LEFT) == HIGH){     
       digitalWrite(DIR,HIGH);
       digitalWrite(PUL,HIGH);
       delayMicroseconds(spd3);
       digitalWrite(PUL,LOW);
       delayMicroseconds(spd3);
  }
 }

//++++++++++オートモード測定++++++++++//

 if(digitalRead(AUTO) == HIGH){      
   if(digitalRead(ONS) == HIGH){     
     digitalWrite(DIR,LOW);

     for(int i=0; i<10000; i++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(550);
       digitalWrite(PUL,LOW);
       delayMicroseconds(550);
     }

     delay(17000);

     for(int j=0; j<150; j++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(10000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(10000);
     }

     for(int k=0; k<200; k++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(8000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(8000);
     }

     for(int l=0; l<300; l++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(7000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(7000);
     }

     for(int m=0; m<500; m++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(6000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(6000);
     }


     for(int p=0; p<9500; p++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(2115);
       digitalWrite(PUL,LOW);
       delayMicroseconds(2115);
     }
     
     for(int s=0; s<500; s++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(6000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(6000);
     }
     for(int t=0; t<300; t++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(7000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(7000);
     }
     for(int u=0; u<200; u++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(8000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(8000);
     }
     for(int v=0; v<150; v++){
       digitalWrite(PUL,HIGH);
       delayMicroseconds(10000);
       digitalWrite(PUL,LOW);
       delayMicroseconds(10000);
     }


     delay(17000);
     
     
   }
 
 }
 
}

↑ステッピングスピードが550〜2115となっているのは、550が脱調しないスピード最大値、2115が1200dpiでのスキャンと同等のスピードだから。もし同じような考えで作る人がいらっしゃいましたら、部分的に修正して下さいな。
オートシーケンスで走らせる時のスピードを、もう少しスマートにしたいのですが、綺麗にまとめると出来上がりの写真が綺麗じゃないという本末転倒な状態になって、細かくfor文で区切っています。


作例

作例になります。マニュアルで動かしたもの、オートで動かしたものをそれぞれ載せています。

画像2

↑の写真は、マニュアルで動かしたもの。虹色に見えている箇所はセンサを止めている部分。左端でミラーのように反転しているのは、センサの動きを反転した結果。

画像3

↑の写真は、オートシーケンスで撮影。実は失敗作で、途中脱調してしまい、変な動きが見えてしまっている。波の連続性は変わらないのに、他の風景は動きが見える、個人的に撮りたかったのがコレ。


問題点

作って修正することなく放置している問題点がいくつかあります。

1)回転数によってはモーターが脱調する、異音がする
2)思った以上にオートモードが綺麗に撮れない
3)内蔵パソコンが貧弱

1)は現状調査中。ドライバとの相性だと考えています。最大電流値が違うとか、インピーダンスマッチングされていないのか。ステッピングモーターでインピーダンスって関係あるのかな。最大ステップ値の違いもありそうです。
特に早いスピードには一切ついてこないので、何か良い方法がないか調べていきたいところ。

2)は正直今後撮っていくことできっと解決していくでしょう!写真は撮らないとうまくなりません。

3)は今回完全スルー案件なので無視。3回スキャンしたらメモリハングするので、毎回再起動しましょう!(笑)


次回作について

さて今年度モデルはこれにて完成とします。問題点は、来年度モデルに引き継ぐ予定です。

さて来年度は、いよいよHasselbladのデジタルバックとして使用できるようにしようと思います。今までもデジタルバッグで使用したいという考えはありましたが、技術を含めた様々な理由により避けておりました。今回のステッピングモーターを別で動かすことができるようになり、解決の糸口とすることができそうです。

今年もなかなか時間がないことが予想されますが、いよいよスキャナカメラも7代目(5代目は名刺ハンディスキャナ、6代目はA4ハンディスキャナ)。撮る作品も、カメラに合わせて今後更に進化と深化していくと思われます。お楽しみに!!





自作で機材作ったり、展示物のギミック作るとお金かかるんです…。ストレスで甘いもの食べまくるから…。そんなわけで、俺に少しでも甘いもの食べてもらいたいって人はよろしくお願いします!