Vol.852 9.Sep.2022

ルーペ(拡大鏡)の倍率は? (N-9)ポイント制御

L ルーペ(拡大鏡)の倍率は?

by fjk

 「○○倍」と書かれたルーペ(Loupe)を使ってみると、その通りの倍率で見えないことがあります。この理由は以下のことが考えられます。

  1. 倍率表示が長さ比ではなく面積比となっている(広告でよくある表示)
     
  2. 観察対象物 ⇔ ルーペ ⇔ 眼 の距離によって倍率が変わる(レンズから眼まで25cmで計算)
     倍率 = (250÷ルーペの焦点距離)+1

 AmazonでGainExpreessのLED照明付き10倍ジュエリールーペ(2,490円)を購入したところ、レンズ径21mm、焦点距離25mmで、ほぼ10倍で観察することが出来ました(長さ比でした)。6個のLEDライトはレンズ周りにリング状に配置されており、むしろ明るすぎるくらい。レンズは色消し(アクロマティック)&非球面3枚ガラスレンズで、色収差が無く、レンズ周辺部まで歪が少なく、綺麗に見えます。電池はLR927(1.5V)×3個ですが、SR927(1.55V)で代用可。持ち運びに便利な専用革ケースも付属。(ストラップも取付可)

【主要仕様】 
形 式:折りたたみ式ルーペ
照 明:6x白色LED&UVライト
レンズ径:21mm、光学ガラス(Triplet)
光学補正:アクロマティック&非球面
倍 率:10倍(焦点距離25mm)
電 池:LR927ボタン電池x3個(付属)
ケース:専用合成皮革ケース(付属)
治 具:電池交換用ネジラッチキー(付属)
重 量:91g(フレームは金属)


10倍ライト付きルーペ
(白色LED点灯中)

ライト面(UV点灯中)、
キーと革ケース

SOP8チップICを拡大観察
 


N Nゲージ列車のデジタル運転(9) 〜ポイント制御

by fjk

 鉄道模型の走行にはポイントがつきものである。
 ポイント(TOMIX)制御は、多くの方が自作されている方法であるコンデンサ方式を採用した。(コンデンサの充放電時のみ電流が流れるので、ポイントコイルへの負担を軽減できる)
 ミニレール用ポイントPR140-30は12V/2200μFで動作したが、供給電流が不足すると、レールが完全に密着しなかった。そこで、電圧を14〜15Vにすると、切替えが確実に行われるが、電圧は15Vを超えないこと。
 コンデンサを3300μFに交換してみたが、切替動作に変わりは無く、しっかりと切り替えるには、コンデンサ容量を増やすより電圧/電流を増やす方が有効なようだ。この傾向はN-PR541-152ポイントでも同じだった


コンデンサを使ったポイント制御回路

正常動作時波形(12V、2200μF/35V)

電流不足時波形(12V、2200μF/35V)

 PICからポイントを制御する場合、ポイントは12〜15Vで動作するので、PICの5V信号を変換するためハーフブリッジドライバーMCP14A0901(秋月電子:I-15729、@80)とSIP変換基板(秋月電子:P-06554、@30)、L型8ピンヘッダー(秋月電子:C-12985、@10)を用いた。


MCP14A0901のブロック図
(Vdd<18V/9A、Vref=2.0V)

 PICは手持ちの12F1822を使ったが、12F1840や16F18313でも同じように利用可能。
 なお、12F1822/40でクロックを32MHzで動作させるには、SystemModelueでINTOSC、FOSCを選択しInternalClockを8MHz、PLL_Enableをチェックし8 MHz x 4=32 MHzにすること。


ポイント制御テスト回路
(PIC12F1822)

ポイント制御試作回路
(ポリスイッチは省略)

 プッシュスイッチ入力はRA4(Sw_A4)、ポイント出力はRA5(Pt_A5)とした。なお、RA2(Led_A2)に接続した赤LEDはテスト用で後段で使用。
 MCP14A0901ドライバーICのポイントへの出力波形を見てみると、トグルスイッチを使ったものと同じ波形が得られ、ポイントの切替が正常に行えた(供給電圧は12V、過電流保護用ポリスイッチは省略)。


ポジティブ側切替波形

ネガティブ側切替波形
include "mcc_generated_files/mcc.h"

void main(void)
{
    SYSTEM_Initialize();
   
    while (1)
    {
        if(Sw_A4_PORT == 0){
            __delay_ms(10);
            if(Sw_A4_PORT == 0){
                Pt_A5_Toggle();
                while(Sw_A4_PORT == 0);
            }
        }
    }
}

SystemModule設定

 

★★★
 機械的スイッチにはチャタリングが付きもので、その対策のため10msのディレイタイマを使ったが、この(ソフト)タイマ時間中は割り込み以外の処理を実行できない。そこで、TMR2の割り込み機能(10ms毎に設定)を使って以下のように処理、(TMR1を使う場合はカウンタ初期値を割り込み処理中で常に再セットが必要)

@ スイッチが押されたらTMR2をスタートし、10ms後の割り込みで、スイッチを再確認し、引き続き押されていたらスイッチ入力有り(PswF=1)とする。
A 10ms毎の割り込みで、引き続きスイッチが押されていたら、PsCtカウンタを増やす。
B スイッチが離されていたら、次の割り込みでスイッチを再確認し、離れていたらスイッチ入力終了(PswF=0)とし、TMR2タイマを止める。
C スイッチ入力信号PswFの立ち上がり時にポイント出力(PA5)を反転する。
D スイッチが4秒以上押されていたら、PswFの立ち下がり時に赤LED出力(PA2)を反転する。
【MCC設定】
ーPinModulerー
RA2:Led_A2 output
RA4:Sw_A4 input
RA5:Pt_A5 output
ーTMR2ー (clockは32MHz)
【グローバル変数】
PswF:チャタリングの無いスイッチ入力信号
PsSg:スイッチ入力ステージの状態
PsCt:スイッチ押下げ時間(10ms単位)
PsLs:直近のスイッチ入力状態
T2Flg:TMR2割り込みフラグ
【tmr2.c】
extern uint8_t T2Flg; と外部変数宣言し、TMR2_ISR関数内で T2Flg = 1; の記述を追加。

 スイッチ入力としてPswFを使うことでチャタリングの影響を排除でき、PswFの各エッジで実行させたい処理を記述すればよい。また、PsCt(最大約10分半)を使うことでスイッチの長押しの判断に利用できる。
 スイッチを短く押すとポイントが切り替わり、長押しするとポイント切り替わり後スイッチを離すと赤LEDがOn/Offした。

/*====  main.c (abc852.zip) =====*/

#include "mcc_generated_files/mcc.h"

uint8_t  PswF;
uint8_t  PsSg;
uint16_t PsCt;
uint8_t  PsLs;
uint8_t  T2Flg;

void tm2_my_isr(uint8_t ps){
    switch(PsSg){
        case 1:
            if(ps == 0){
                PswF = 1;
                PsSg = 2;
                PsCt++;
            }else{
                PsSg = 0;
            }
            break; 
        case 2:
            if(ps == 0){
                PsCt++;
            }else{
                PsSg = 3;
            }
            break;
        case 3:
            if(ps == 0){
                PsSg = 2;
                PsCt++;
            }else{
                TMR2_StopTimer();
                PswF = 0;
                PsSg=0;
            }
            break;
        default:
        	break;
    }
}

/* ===  Main application === */
void main(void)
{
    uint8_t ps;
    // initialize the device
    SYSTEM_Initialize();
    
    TMR2_StopTimer();

    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();

    while (1){
        ps = Sw_A4_PORT;
        if((PsSg == 0)&&(ps == 0)){
            TMR2 = 0x00;
            PsCt = 1;
            PsSg = 1;
            TMR2_StartTimer();   
        }
        if(T2Flg){
            tm2_my_isr(ps);
            T2Flg = 0;
        }
//       LATAbits.LATA2 = PswF;			//テスト用
        if(PsLs < PswF){     			//立ち上がり
            Pt_A5_Toggle();
        }else if(PsLs > PswF){			//立ち下がり
            if(PsCt > 400) Led_A2_Toggle;
        }
        PsLs = PswF;
    }
}

※== Trable ==※
 RA5の動作確認後、RA2の設定を追加したが、何故か赤LEDが点灯しなかった。MCCでRA2をデジタル入力に設定しGenerateしたのだが、PinModuleのRegistersで確認すると、ANSELA=0x03とならなければならないのに、ANSELA=0x07(RA2=アナログ)になっていた。そこで、MPLAB_X_IDEを再起動し、再度Generateしたところ、チャンとANSELA=0x03になった。ところが、TRISA=0x1F(RA2=入力)になっていた。仕方がないのでpin_manager.cのPin_MANAGER_Initialize関数内でTRISA=0x1B(RA2=出力)に修正したところ、赤LEDが正常に使えるようになった(MCC作成後は要check)。


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


ルーペ(拡大鏡)の倍率は? (N-9)ポイント制御