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

LEDバッチの製作(MFT2018用)

 MFT2018が近付いてきましたが、たぶん土曜か日曜日のどちらかに行けそうです。MFTに行くと、ものすごく目立った格好をしている人がいますが、そこまでやらなくてもネームホルダーにLEDをチカチカさせている人とかいて、ああいうのいいなーと思っていました。

 そんなことで、LEDがチカチカ光るバッジを作ってみました。

▼LEDバッチ
ビニール袋に入れてバッチ化

 おなじみの秋月のC基板に組んだのですが、剥き出しのままでは危ないのでビニール袋に入れました。MFTの会場には小さな子供がいっぱいるので、こういう配慮は大事です。

▼部品面
全体
 基板の表はこうなっています。電源としてはボタン電池のCR2016を2個使い、コントローラーは私の記事ではおなじみのATmega328Pです。基板の右にあるのは5VのLDOな三端子レギュレーターです。

▼回路図(クリックで別窓に拡大図)
回路図
 これ、以前の記事と同じ物で、CPUのプルアップ抵抗でLEDを光らせています。こうすると外付け部品を減らせるので実装が楽になります。

▼LEDの配置検討図
LEDレイアウト検討
 クリスマスツリーの絵になっていますが、そのためのLEDの配置を検討した図です。LEDをハーフグリッド上に置くことで、表現の自由度を増やしています。

▼LED面(クリックで別窓に拡大図)
LED面(裏面)
 配線の様子が判ると思います。なお、使ったLEDは1608 です。(最近の超高輝度タイプを使わないと十分な明るさが得られません)

▼部品面
部品面

 プログラムはクロックが8MhzのArduino Pro/Pro mini用として作り、最後にCPUのヒューズを内蔵の8Mhz CRオシレーターに切り替えます。

 スケッチはこちら。LEDバッチのスケッチ

 新しい表示パターンを作りたかったのですが、実はこれ、以前作ったクリスマスツリーと同じものです。ただプログラムの中のディレイにdelayWDT2関数を使ってもう少し省エネ化しています。ちなみに、普通のdelay関数でやるとCPUの動作電流は8mA(@CPUクロック8MHz)くらい喰いますが、delayWDT2関数なら1/100以下に減らせます。とは言ってもLEDが全点灯するだけで2mAくらい消費するので、そこまでやる必要は無かったりします。

 ちなみに平均消費電流が1mA(半分のLEDが点灯)の場合、CR2016の電流容量が80mAhあるとすると、約80時間の連続点灯するはずです。

▼ヒューズ書き換え画面
ヒューズ書き換え
 内部8Mhzオシレーターで動くようにヒューズを書き換えます。久しぶりにAtmel Studio を立ち上げました。

▼動いている様子


◆まとめ
 C基板とAtmega328Pを使ったLEDバッチ作りは、なかなか面白い物が出来そうな気がします。何しろ17LEDを任意に点滅出来るので、固定部の絵を書き加えれば、簡易アニメのようなものが出来そうな気がします。

 このバッチを首から下げてMFT2018の会場に行く予定です。お気づきの方はお声がけいただくと嬉しいです。

【追記】
 MFT2018でLEDバッチの作者の方からお話を伺うことが出来たのですが、わざわざ5Vの電源を用意しなくても、コイン電池の3VでLEDを点灯させるだけで十分な輝度が得られるとのことです。但し、ダイナミック点灯させて平均電流を下げる必要がありす。今度やってみたいと思います。

デジカメの絞りユニットを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のソフト作りですが、長くなったので次の(たぶん明日の)記事に回すことにします。
カレンダー
10 | 2018/11 | 12
- - - - 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 -
プロフィール

ラジオペンチ

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

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