google-site-verification: google3bd66dd162ef54c7.html

デジカメの絞りユニットを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 というフリーソフトで作りましたが、慣れるまで大変でした。

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

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

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

デジカメの絞りユニットをArduinoで動かす(ハード製作)

 レンズエラーが出て動かなくなったデジカメ (キャノン PowerShot S110) を修理したのですが、この時に絞りユニットを交換しました。そんなことで、フレキのケーブルが断線した絞りユニットが手元に残りました。

▼絞りユニット
S110の絞りユニット
 これ、パルスモータで動くのですが、原点センサが付いていてメカとしては完成形になっています。写真ではうまく映っていませんが、フォトインタラプタと書いた矢印の先が原点センサーで、その横に原点センサー用の反射板が付いています。

▼絞り駆動モーター
絞り駆動用パルスモーター
 外径がφ5mmくらいの小さなステッピングモーターで、見た感じではクローポール型だと思います。溶接ナゲットの色や形から判断すると、レーザー溶接で組み立てられているようです。コイルは2つあって、各々が独立した端子で引き出されています。つまり、バイポーラ駆動が可能です。なおコイルの抵抗は23Ω、インダクタンスは1.2mHでした。

▼反対面
絞りユニット裏面
 緑矢印の先にモーターのピニオンギアが見えますが、これでリングギアを動かして絞りの羽根を動かす仕掛けになっています。なお、絞りは6枚羽根です。

 これを見ていると、実際に動かしてみたくなりました。Arduinoを使えば割と簡単に出来そうです。

 以下、動作テストのための準備です。まずは、ハードの組み立てから始めます。

 フレキの断線は、断線個所にはんだを盛れば簡単に修理出来ます。その時の写真を撮り忘れましたが、この記事の写真と同じです。

 そのままでは扱い難いので、秋月のC基板の上にホットボンドで固定しました。基板には穴を開けておいて、絞りの開口部を見通せるようにしておきました。こうすれば後で良いことがあるかも知れません。

▼C基板の上に絞りユニットを固定
絞りユニットをC基板に載せる
 フレキはテープで基板に固定し、信号線を右上のピンソケットから出します。

▼配線引出し部拡大
フレキとの接続
 フレキのコネクタパッドから線を引き出して 2.54mm ピッチのピンソケットに接続しました。使ったのは芯線径φ0.26のテフロン線ですが、もう少し細い線の方が作業がやり易いので、今度秋葉原に行った時にでも探してみたいと思います。

 ともかく、普通のピンソケットに引き出してしまえば後の配線は簡単になります。なお、この写真の右端のピンが、次の回路図に出てくるコネクタの1番ピンです。

▼Aduinoで動かすための回路
Arduinoで絞りユニットを動かす回路図
 絞りユニット内は推定です。

 本来なら、フルブリッジのドライバーでパルスモーターを駆動すべきなのですが、手抜きしてI/Oポート直結で行くことにしました。R1,R2はポートに流れる電流を制限するために入れていますが、この抵抗が入るために、モーターには0.8Vくらいの電圧しかかかりません。ということで、モーターのトルクはかなり小さくなってしまうのですが、とりあえず動作確認が出来れば良いということで、妥協しました。

 R3,R4の値は現物のカットアンドトライで決めました。反射型のセンサーなので、最適値の範囲はかなり狭かったです。なお、Q1の回路は原点検出をLEDで表示する回路なので、省略しても大丈夫です。

▼ブレッドボード
ブレッドボード
 ブレッドボードを経由して Arduino に接続します。

▼全体
レンズ絞りをArduinoで動かす

◆まとめ
 これでハードの準備は出来ました。次はArduinoのソフト作りですが、長くなったので次の(たぶん明日の)記事に回すことにします。

Ambientにアナレンマを描くプログラムを修正

 2017年12月から Ambient にデーターを送ってアナレンマのグラフを描く試みを行っています。仕組みとしては、太陽電池パネルの電圧変化から日の出と日の入り時刻を推定し、ESP8266を使ってAmbientnにデーターを送るようになっています。

▼Ambientにアナレンマを描く試みのページ
アンビエントのページ
  実際のページはこちら→日の出・日の入り時刻でアナレンマを描く (チャネルID: 200)のページ

 アナレンマのグラフを全部描くには1年かかるのですが、今年の1月に最初のサイクルを無事終えることが出来、何とかアナレンマの図形のプロットが完成しました。この時点でいったん終了にしても良かったのですが、特に手間がかかる訳では無いのでそのままにしています。(上のリンク先の下の方に最新のグラフがあります)

 アナレンマのグラフのプロットは天候の具合でばらつきが出るので、出来るだけ長期間のプロットを行った方がグラフの品質が上がるはずです。ということで、どこかが壊れて継続不能になるまで運転を継続することにしました。

 ただここで気になるのは、アナレンマのデーターと同時にアップロードしている太陽電池パネルの電圧データーです。このデーターは1分間隔でアップロードしているので、1ケ月分でデーターサイズは約1Mバイトになります。

▼パネル電圧のログのページ
パネル電圧のグラフ
 実際のページは、ソーラーパネル電圧 (チャネルID: 202) 

 これがあると、発電状況をネット経由で監視できるので便利なのですが、最近はほとんど使っていません。ただ、ここを見ればシステムが正常動作しているかが判るので、そういう点ではまだ利用価値はあります。ただ、そういう使い方ならデーターの更新頻度をもっとを間引いても問題ありません。

 ということで、データーの更新間隔を1分から30分間隔に延長することにしました。

▼ESP8266のデーターのプログラム書き換え
ESP8266のプログラム書き換え
 ESP8266のプログラムを書き換えるのは1年半ぶりなので、いろいろと忘れていることが多くて一苦労しました。覚え書きとしてtoolのメニューの内容を記録しておきます。

▼ArduinoIDEのtoolメニュー
20180607ArduinoIdeSetting

▼書き込みに使ったUSBシリアルアダプタに相性問題があった模様
ESP8266プログラム書き換えのUSBアダプタ
 下側のFT232RLではプログラムの書き込みがうまくいきませんでした。そこで、上のPL2303HXの入っているアダプタを使いました。なおこのアダプタはWindows10のアップデートがかかる度にドライバが無効にされてしまうという、厄介なやつで、USB Code 10Fixというプログラムを使って復活させて使いました。

 新しいプログラムはこちら。_20180607_AnaLtest-IP28_final2.ino なお、プライベートな情報は削除しています。また、ネットの環境によってはこのままではうまく動かない可能性があります。

 これでパネル電圧のログが30分間隔になったので、Ambient に余計な負荷を掛けないで済みそうです。

 せっかくの機会なのでグラフを少し見て行きます。

▼現在のアナレンマ
アナレンマ
 現在八の字の上部を右向きに進行中です。

▼日の出、日の入り時刻
日の出日の入り時刻
 左が日の出、右が日の入り時刻のグラフです。グラフをよく見ると上昇と下降の傾きが違っていて、どちらのグラフも下降の方の傾きが急になっています。(こうなる理由は自分で調べて下さい)

 もうじき夏至を迎えますが、日の出時刻は夏至の10日くらい前が一番早くなります。左のグラフを見ると日の出時刻が急角度で極小値に近づいていることが良く判ります。

 右の日の入り時刻のグラフで、右下がりの赤矢印は 「秋の日は釣瓶落とし」 と言われる、日暮れの時刻がどんどん早くなる様子を表しています。そう言うのだったら、左側の日の出のグラフの急傾斜の部分(赤矢印)にも何か言ってやってもいいような気がします。例えば、「春の日はうなぎ登り」とか、、w

◆まとめ
 これでアナレンマのグラフをメンテナンスフリーで作図できるようになりました。いつまで続けることが出来るか判りませんが、できるだけ続くように頑張ってみたいと思います。

 アナレンマの作図に関してはアナレンマのカテゴリに関連記事をまとめています。興味にある方はご覧ください。
カレンダー
06 | 2018/07 | 08
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コード