google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

デジカメの絞りユニットをArduinoで動かす(ソフト作成と動作確認)

 前の記事で、ハードが完成したので、今回の記事ではソフトを作ります。と言っても全くスクラッチから作るのではなくて、以前作った(作りかけた)ポタ赤用のパルスモーターのドライブソフトをちょっと手直しして使うことにします。

▼絞りユニット
S110の絞りユニット
 前の記事の写真の使いまわしですみませんが、動かすのはこのユニットです。

 パルスモーターは1-2相励磁で動かすことにします。また、反射センサーによる原点位置の検出機能があるので、初期化の処理を行って絞り羽根の位置出しを行うことにしました。

▼プログラムは以下の通りです
/* コンデジの絞りユニットの動作テスト(ステッピングモーターを1-2相励磁)
フォトセンサーを使った自動原点登録機能付き 2017/7/8 ラジオペンチ 
http://radiopench.blog96.fc2.com/
*/

#define coilAp 2 // coil A + へ接続
#define coilAn 3 // coil A -
#define coilBp 4 // coil B +
#define coilBn 5 // coil B -
#define orgSens 6 // ホームポジションセンサ

unsigned int pos = 32000; // 回転位置記録用変数(回転範囲は約±3000パルス)
long tt = 16000; // パルスレート(単位:μs max16383) 最高速は500
int offset = 5; // 原点センサのオフセット補正量

void setup() {
Serial.begin(115200);
pinMode(coilAp, OUTPUT);
pinMode(coilAn, OUTPUT);
pinMode(coilBp, OUTPUT);
pinMode(coilBn, OUTPUT);
pinMode(orgSens, INPUT);
homeReturn(); // カムの原点登録
}

void loop() {
for (int j = 0; j < 5; j++) { // 指定回数
cw(33); // 30パルス閉じる
delay(500);
ccw(33); // 30パルス開ける
delay(500);
}
cw(15); // 15パルス閉じて終わり
while (1) {}
}

void homeReturn() { // 位置初期化
if (digitalRead(orgSens) == 1) { // もし原点センサがONなら
Serial.println("Org. SW. is ON. move +20");
cw(30); // 正回転してセンサーをOFFの領域に入れる
delay(200); // センサーが安定するまで待つ
}
Serial.print("Serching Org SW. ");
while (digitalRead(orgSens) == 0) { // センサーがONになるまで
ccwP(); // 1パルス逆回転
Serial.print("."); // 進度表示
delay(20); // センサーのレスポンス待ち
}
Serial.println(); Serial.println("Org SW. found");
cw(offset); // センサーとカム位置のオフセットを補正
delay(100);
}

void cw(int n) { // CW方向に指定パルス数回転
for (int i = 0; i < n; i++) {
cwP();
}
}

void ccw(int n) { // ccw方向に指定パルス数回転
for (int i = 0; i < n; i++) {
ccwP();
}
}

void cwP() { // CW方向へ1パルス
pos++;
PMdrive(pos);
}

void ccwP() { // CCW方向へ1パルス
pos--;
PMdrive(pos);
}

void PMdrive(unsigned int n) { // 1-2相励磁でパルスモータドライブ
int phase;
phase = n % 8; // 位相を求め
switch (phase) { // 相当する状態に通電
case 0:
digitalWrite(coilAp, HIGH); // A+
digitalWrite(coilAn, LOW);
digitalWrite(coilBp, LOW);
digitalWrite(coilBn, LOW);
break;
case 1:
digitalWrite(coilAp, HIGH); // A+
digitalWrite(coilAn, LOW);
digitalWrite(coilBp, HIGH); // B+
digitalWrite(coilBn, LOW);
break;
case 2:
digitalWrite(coilAp, LOW);
digitalWrite(coilAn, LOW);
digitalWrite(coilBp, HIGH); // B+
digitalWrite(coilBn, LOW);
break;
case 3:
digitalWrite(coilAp, LOW);
digitalWrite(coilAn, HIGH); // A-
digitalWrite(coilBp, HIGH); // B+
digitalWrite(coilBn, LOW);
break;
case 4:
digitalWrite(coilAp, LOW);
digitalWrite(coilAn, HIGH); // A-
digitalWrite(coilBp, LOW);
digitalWrite(coilBn, LOW);
break;
case 5:
digitalWrite(coilAp, LOW);
digitalWrite(coilAn, HIGH); // A-
digitalWrite(coilBp, LOW);
digitalWrite(coilBn, HIGH); // B-
break;
case 6:
digitalWrite(coilAp, LOW);
digitalWrite(coilAn, LOW);
digitalWrite(coilBp, LOW);
digitalWrite(coilBn, HIGH); // B-
break;
case 7:
digitalWrite(coilAp, HIGH); // A+
digitalWrite(coilAn, LOW);
digitalWrite(coilBp, LOW);
digitalWrite(coilBn, HIGH); // B-
break;
}
delayMicroseconds(tt); // 指定時間待つ
}
 homeReturn 関数で、絞り羽根の原点登録を行っています。絞りの開放側に原点スイッチがあるのですが、絞り羽根が全開になってから少し先の位置で原点スイッチが入ります。つまり原点位置には少しオフセットがあるので、その量を14行目のoffset で補正しています。
 まあ絞りを動かすデモだけならこんなことまでやる必要は無いのですが、後々のことを考えて真面目に作っておきました。

 ちなみにこのオフセット量には個体差があるはずなので、ひょっとしたらメーカーの出荷試験で、個別に調整が行われているのかも知れません(結果はEEPROMなどに保存)。もしそうなら、絞りユニットを交換するとオフセット量が合わなくなって、露出が少し狂うかも知れません。

 13行目の変数 tt でモーターのパルス間隔をμs 単位で指定しており、値が小さくなると高速で動きます。400μs くらいが限界だったので、少し余裕を見て500μsあたりまでで使うのが良さそうです。モーターの電流を増やせばもっと高速で動かせると思いますが、まあこれくらいの速度で動けば充分でしょう。
 一方で遅い方は、ここの数字を大きくすればいいのですが、delayMicroseconds 関数の制限から、16383μsより大きな値を入れることは出来ません。

 あと、説明が後になってしまいましたが、このモーターを1-2相励磁で使った場合、40パルスで1回転します。

 動作の様子は下記の動画をご覧下さい。

▼説明動画

 ちょっと愚痴ですが、動画のテロップは、以前はyoutube のアノテーション機能を使っていたのですが、それが1年前に廃止になり、仕方なく Windows Live Movie Maker を使っていました。ところがそれもいつの間にか動かなっていました。そんなことで、今回の動画の字幕は OpenShot Video Editer というフリーソフトで作りましたが、慣れるまで大変でした。

◆まとめ
 ということでめでたく絞りユニットを動かすことが出来ました。最高速だとものすごい速さで絞りが動きます。流石に完成された工業製品だけのことはあります。

 せっかくここまでやったのですが、とりあえずこの絞りの使い道はありません。まあ、持っていれば何かの時に役立つはずなので、安全に保管しておくことにします。ドキュメントはこのブログを読めば判るはずです。

 デジカメの修理から始まったこの話ですが、何か手を動かせば、それに関連した情報や経験を得ることが出来るということでしょうね。実際にやってみることは大切です。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード