Front_Page

             USBシャッター速度計の製作   (’11、02、20 掲載開始)

秋月電子通商が販売するUSBマイコンボード(PIC18F2550)を使って
高精度の銀塩カメラ用シャッター速度計を作った。



1 製作の目的
この製作には下記の三つの目的が在ります。

1-1 USBによるパソコンとの通信の体験
筆者は仕事と趣味でマイクロチップ社のワンチップマイコンを使う。
しかしUSBによる通信は未体験だった。

技術を学ぶべく何冊かの本を買ったのだが、
筆者がUSBを利用するための要点が、何処か判らない。
パラパラとめくって読む気が失せてしまった。

その後、手持ちのCCS社製Cコンパイラにサンプルソフトが付属しているのを知った。
さらに暁電子工房のホームページも参考にしてUSB通信に成功した。
http://www.akatsuki-lab.co.jp/Test/USB_Test.htm

1-2 工作の簡単なシャッター速度計の製作情報を提供
筆者は趣味で金属製銀塩カメラの修理を楽しんでいる。
機械式シャッターの整備には速度計が必要で以前に自作した。

その製作記事を見た方から譲渡の要請が在ったが断った。
もう一台作るのが面倒だったからだ。
この事で同好の士が困っているのが判った。

秋月電子通商が販売するUSBマイコンボードを使えば、
僅かな電子部品を追加するだけで高精度のシャッター速度計を作れる。

またUSB通信技術の勉強には好適な目標だった。
銀塩カメラを修理できるスキルが在る人ならば、
ワンチップマイコンに不慣れでも作れるようにソフトを開示した。

1-3 ubuntuによるホームページの製作
筆者はノートパソコンのOSをubuntuに移行しつつある。
まだWindowsと併用しているが、既にメールとWebの閲覧にはubuntuを使っている。
ubuntuは起動と停止が素早く短気な自分には合っている。
これが無料で提供されているのは驚きだ。

今、この製作記事はubuntuの環境で書いている。

HTMLエディターにはKompoZerとBluefish Editorを使っている。
まだ練習中だが、余計な機能が無く洗練された良い出来のソフトだ。
これも無料だが、今まで使っていた有償のHTMLエディターよりも使いやすい。


2 シャッター速度計本体の製作
2-1 USBマイコンボード
秋月電子通商のUSBマイコンボードを使った。
キットではなく完成品で売られている。

ジャンパー線の設定で、USBから供給される電力だけで動かせる。
小さいが、単独で動く優れ物だ。しかも僅か千円と廉価。

28pinDIPソケットに差し込める構造で、
基板にフラットパッケージのPIC18F2550が半田付けされている。
さらに水晶振動子やUSBミニコネクター等も搭載されている。
何も部品を追加せずにコンピューターとして機能する。

これに僅かな部品を追加してシャッター速度計を組み立てた。

2-2 回路図
下図のように4個の電子部品を接続するだけです。


VR1は、フォトトランジスタの感度調整用です。
LEDと抵抗はモニター用でフォトトランジスタに光が入射したときに光るようにプログラムしました。
感度調整作業の利便性に配慮したものですが、無くても測定できます。

2-3 部品表
殆どの部品は秋月電子通商で購入したが、ケースはラジオデパートの地下に在る奥沢で入手しました。
  USBマイコンボード   PIC18F2550      秋月電子通商    1,000円  
      TR1:フォトトランジスタ L-31ROPT1D2       秋月電子通商     20円 (200円/10個) 
      VR : 多回転半固定ボリューム  100kΩ  タテ型     秋月電子通商     80円
      LED : 発光ダイオード 3mm 黄色     秋月電子通商     6円  (550円/100個)
      R1 : 抵抗 1/4W 1/4W   330Ω     秋月電子通商     1円  (100円/100個)
      丸ピンDIPソケット 28ピ ン     秋月電子通商     80円
      ユニバーサル基板 片面紙 エポキシ Cタイプ     秋月電子通商     70円
      モールドケース
TB51  テイシン電機     奥沢   94円

2-4 電子回路の組み立て
下の写真の様にケースの大きさに合わせてユニバーサル基板を切り取り部品を載せ配線しました。
USBマイコンボードにはICソケットを使っています。プログラムの際にはソケットから抜きます。
なおユニバーサル基板は手持ちの物を使ったので部品表の物ではありません。



2-5 ケースの加工
プラスチックケースに4ヶ所の穴を開けた。ピンホール、モニターLED用、感度調整用、ミニUSB用です。
下の写真では感度調整用が写っていませんが、基板上の青い多回転半固定VRの位置です。


上の写真で中央のピンホールはフォトトランジスタへ光を導く。直径0.65mm。
穴が大きいとフォーカルプレーンシャッターの高速側で測定誤差が増えます。

右側の穴はLEDを差し込む為です。3mmの穴でLEDを接着しなくとも固定されました。
ケースは乳白色だったので光が透ける。
遮光のために内側に黒色のビニールテープを貼った。


3 組込みソフトの製作

CCS社製のCコンパイラを使ってソフトを書いた。
同コンパイラにはUSBをRS-232Cに化けさせるサンプルソフトが付属している。

これを基に不要な液晶駆動部分等を削り、シャッター速度を測る機能を追加した。
開発環境はマイクロチップ社製のMPLABを使いICD3と組み合わせてデバグ作業を行った。

以下はソースリストです。
////////////////////////////////////////////////////////////
////////     USB SHUTTER METER      //////
////////  Rev.0  2011,01,27 Y.Ogawa //////
////////////////////////////////////////////////////////////
////                   I/O LIST                     ////
////      RA0 : Photo transistor     in   ////
////      RB5 : Monitor LED          Out  ////
////      RC4 : USB                              ////
////      RC5 : USB                              ////
////////////////////////////////////////////////////////////

#include <18F2550.h>
#include <stdlib.h>     // Standard Library
#include <math.h>        // Math Library

//configure a 20MHz crystal to operate at 48MHz
#fuses HSPLL,WDT,PROTECT,NOLVP,DEBUG,USBDIV,PLL5,CPUDIV1,VREGEN

#use delay(clock=48000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <usb_cdc.h>    //9600bps->115200

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#zero_ram

int8    Status,Status_old,update;
int32    Counter,count_holder;
float    open_time;
int16    seisuu;
int8    syousuu;

float    Base_time =  0.021333;        // Interval timer0 (mS)

////////////////////////////////////////////////////////////
//////////    RTCC Interrupt Process        ///////
////////////////////////////////////////////////////////////
#int_timer0                    // Interrupt Process by timer0(RTCC)
rtcc_isr() {                    // Cycle : 21.333uS at 48MHz clock.
                   
    Status = input( Pin_A0 );
    output_bit( pin_B5,Status );    // Monitor LED
    if ( Status )     Counter++;
    else {
        if ( Status_old ) {
            count_holder = Counter;
            update = 1;
        }
        counter = 0;
    }
    Status_old = Status;
}                        // Finish interrupt

////////////////////////////////////////////////////////////
//////           Main Process              //////////
////////////////////////////////////////////////////////////
void main() {
    set_tris_A(0b00000001);            // Define port direction.
    set_tris_B(0b00000000);            // 0:Output 1:Input
    set_tris_C(0b00000000);

    setup_timer_0(RTCC_DIV_1|RTCC_8_BIT);

    enable_interrupts(int_timer0);        // Timer_0 INT Enable
    enable_interrupts(GLOBAL);         // Global INT Enable

    usb_cdc_init();                   // USB Initialize
    usb_init();

    while(!usb_cdc_connected()) {}

    printf(usb_cdc_putc,"USB SHUTTER SPEED METER\r\n");

////////////////////////////////////////////////////////////
//////////        Main routine             /////////
////////////////////////////////////////////////////////////
        while (1) {
            restart_WDT();            // Reset WDT.

            while(update) {
                update = 0;        // Reset job request flug.

                if ( count_holder > 10 ) {

                    open_time = count_holder * Base_time + 0.005;

                    seisuu = open_time;
                    syousuu = ( open_time - seisuu ) * 100;
                    printf(usb_cdc_putc,"%5lu.%02umS",seisuu,syousuu);
                    printf(usb_cdc_putc,"\n\r");

                    delay_ms(10);
                }
            }
        }            // Finish main routine.
    }                // Finish main process.


HTMLに貼ったところスペースとタブの位置が変になって見辛くなってしまいました。

Timer0を基準時計として使い、0.021333mS周期の割込み処理で
シャッターが開いている時間を積算します。

フォトトランジスタへの入射光が暗から明へと変わった瞬間から時間の積算を始め、
明から暗へと変わった時点で積算を終えUpdateの目印を1にします。

プログラムは動いていますが、我流なので無駄な記述があるかもしれません。


4 パソコン側のドライバー
書込みが済んだマイコンボードをWindowsで動くパソコンにUSBで繋ぐと
画面にドライバーを要求するメッセージが表示された。

ドライバーもCCS-Cに付属している物が、何もせずにそのまま使えた。
上述のドライバーを指定するとパソコンはUSBをCOM3に割り当てた。

その後、ハイパーターミナル(Windows XPに付属の通信ソフト)を起動した。
通信速度等はデフォルトで使用。
設定を変えても影響無く最高速度で動いた。

注:具体的な内容を追記する予定。


5 パソコン用ソフトの製作
ハイパーターミナルを使えば充分な機能が在るのでソフトを作る必要は無いのだが、
最近のノートパソコンはRS-232Cが無い物が殆どでハイパーターミナルも付属していない。

そこでVisual Basicを使って簡単なシャッター速度計用の通信ソフトを書いている。
近日公開の予定。



6 製作を通じて得られた知見
6-1 XHTMLへの非対応
従来はHTMLで書いていたが、ubuntuへの移行に伴い先進的なXHTMLで書きました。
ところが先輩からシャッター速度計のページが見えないとのメールを頂きました。
調べたところWindowsXPに搭載された一部のインターネットエクスプローラはXHTMLに対応しないようです。
対処方法が見つからなかったのでHTMLで書き直しました。
時期尚早でした。

6-2 CCS-CだとUSBも簡単
PIC でUSBを使う方法を解説した本が出版されていますが、
CCS-Cを使った解説書を見つけられませんでした。

暁 電子工房のホームページにも同様の記述があります。

CCS-Cではライブラリーが充実しており簡単にUSBを使えます。

穿った見方かもしれないが、CCS-Cでは本が薄い冊子程度の厚みになり、
薄くて本屋の棚に並べた際に周囲の本に埋没し目立ちません。
出版社も商売ですから売れない本は作らないでしょう。