ドリル [顕微鏡・機材など]
お久しぶりです、dumboです。
さて、時間が色々と必要で・・・
きょうは機材のお話です。
以前、ネジを撮影しました。
その時の機材では照明がやりづらいのなんのって・・・
結局、1から新調しまして(新品はとってもお高いので、リサイクルですが)今日はそのお話です。
いきなりですが、全体像です。
相変わらず手作りって感じで、カメラを横にスライドするように変更しました。
これで照明に不自由がなくなりました???
スライドはステッピングモーターで駆動して、全ステップ量と、1コマごとの量を指定し、
シャッターも自動にしてしまいました。
(スライドテーブルにモーターをつける部分は、こりコリと自作しています。)
なので、ボタンひと押しでピント位置の違う像達が撮影出来ます。
以前は2相でしたが今回は5相のステッピングモーターで、動きが滑らかですね。
さて、テストですから動かないもので、
ドリルを撮影します。
φ2.5mmです。
出来た画像は、
で、51枚からの深度合成です。
(合成ソフトは以前のままですが、いい仕事をしていますね。)
ドリルで手を切る事があるのですが、新品はカッターのように研がれているのですね。
これだけ鋭いと切れるのも納得です。
前の機材ではコマごとに、微妙に縦横ずれていたのですが、
さすが光学機器メーカーさんのものは中古でもピシッてしています。
動画では、
再生できない場合、ダウンロードは🎥こちらな感じで、
微妙ですがねっ。
もっと細かく枚数を重ねないといけません?
ご参考までに、駆動回路の回路図を示しておきましょう。
CW、CCW→ABCDEへの配線部分の、ステッピングモータードライバーは上図にはありません。
(初めは自作していたのですが、個々のモーター専用の方が発熱等も少なく良いですね。)
駆動プログラムは、PICの16F873で、メモリに余裕があるので、C言語です。
(リストは下記をご覧ください。
なお商業利用以外はご自由にして頂いて結構です。
その場合「<」と「>」は小角文字に変更してください。
商業で使用される方がおられるかどうかは?ですが・・・)
さて、時間が色々と必要で・・・
きょうは機材のお話です。
以前、ネジを撮影しました。
その時の機材では照明がやりづらいのなんのって・・・
結局、1から新調しまして(新品はとってもお高いので、リサイクルですが)今日はそのお話です。
いきなりですが、全体像です。
相変わらず手作りって感じで、カメラを横にスライドするように変更しました。
これで照明に不自由がなくなりました???
スライドはステッピングモーターで駆動して、全ステップ量と、1コマごとの量を指定し、
シャッターも自動にしてしまいました。
(スライドテーブルにモーターをつける部分は、こりコリと自作しています。)
なので、ボタンひと押しでピント位置の違う像達が撮影出来ます。
以前は2相でしたが今回は5相のステッピングモーターで、動きが滑らかですね。
さて、テストですから動かないもので、
ドリルを撮影します。
φ2.5mmです。
出来た画像は、
で、51枚からの深度合成です。
(合成ソフトは以前のままですが、いい仕事をしていますね。)
ドリルで手を切る事があるのですが、新品はカッターのように研がれているのですね。
これだけ鋭いと切れるのも納得です。
前の機材ではコマごとに、微妙に縦横ずれていたのですが、
さすが光学機器メーカーさんのものは中古でもピシッてしています。
動画では、
再生できない場合、ダウンロードは🎥こちら
微妙ですがねっ。
もっと細かく枚数を重ねないといけません?
ご参考までに、駆動回路の回路図を示しておきましょう。
CW、CCW→ABCDEへの配線部分の、ステッピングモータードライバーは上図にはありません。
(初めは自作していたのですが、個々のモーター専用の方が発熱等も少なく良いですね。)
駆動プログラムは、PICの16F873で、メモリに余裕があるので、C言語です。
(リストは下記をご覧ください。
なお商業利用以外はご自由にして頂いて結構です。
その場合「<」と「>」は小角文字に変更してください。
商業で使用される方がおられるかどうかは?ですが・・・)
#include <stdio.h> #include <htc.h> //------- コンフィギュレーションの設定 ------- // for PIC16F873 __CONFIG( CP_OFF & //フラッシュプログラムメモリコードプロテクションビット(コードプロテクトは行わない) DEBUG_OFF & //インサーキットデバッガモード(デバッガは使用しない) WRT_OFF & //フラッシュプログラムメモリライトイネーブル // (プロテクトされていないプログラムメモリはEECONコントロールによるライトが不可) CPD_OFF & //データ EEPROM メモリコードプロテクト(コードプロテクトは行わない) LVP_OFF & //低電圧プログラミングイネーブルビット(RB3をPGMピンとして使用しない、低電圧プログラミングを不可) BOREN_OFF & //ブラウンアウトリセットイネーブルビット(電源電圧がある程度まで下がった時にリセットがかかる機能) PWRTE_ON & //パワーアップタイマイネーブルビット(電源を入れてから72ms経過後プログラム動作開始する機能) WDTE_OFF & //ウォッチドッグタイマイネーブルビット(WDTを動作させない) FOSC_HS //オシレータセレクションビット(4MHz以上の外部発振子使用) ); #ifndef _XTAL_FREQ #define _XTAL_FREQ 20000000 // 20MHz = 2000 0000 #endif //_delay(n); //n=合計サイクル数が197,120以下? //_delay_us(x); //_delay_ms(x); (Max39msec@20MHz) // (Max78msec@10MHz) //------- 関数のプロトタイプ宣言 ------- void delay_100ms(int); long get_step_count(void); long get_count(void); void move_cw(long); void move_ccw(long); void shutter(void); void auto_shutter(void); //------- 変数の宣言 ------- //----------------------------------- // ステッピングモーターのプログラム //----------------------------------- int main(void) { //OPTION_REG = 0; //bit7=0 PORTB デジタルI/Oに内部プルアップ抵抗を使用する //INTCON = 0; //bit7(~3)=0 全ての割り込みを使用不可にする // I/O ポート設定値 0=出力 1=入力 PORTA = 0; TRISA = 0b00011111; // RA0-RA4 入力 RA5 出力(RA6,RA7無し) ADCON1 = 0b00000110; // ADC不使用 bit3~0 =011x PORTB = 0; TRISB = 0b00001111; // RB0-RB3 入力 RB4-RB7 出力 PORTC = 0; TRISC = 0b11110000; // RC0-RC3 出力 RC4-RC7 入力 // delay_100ms(10); while(1) { //ロータリーエンコーダー RC7,RC6 if (PORTCbits.RC7==0){ __delay_ms(1); //チャタリング分? if (PORTCbits.RC7 !=0){ //エッジの立ち上がり if (PORTCbits.RC6==0){ //CW??? move_cw(get_count()); }else{ //CCW??? move_ccw(get_count()); } //while(PORTCbits.RC7 !=0) { __delay_ms(1); //チャタリング分? //} } } //押しボタン if (PORTAbits.RA0==0){ move_cw(get_step_count()); while(PORTAbits.RA0==0) { __delay_ms(15); //チャタリング分? } } if (PORTAbits.RA1==0){ move_ccw(get_step_count()); while(PORTAbits.RA1==0) { __delay_ms(15); //チャタリング分? } } if (PORTCbits.RC5==0){ shutter(); while(PORTCbits.RC5==0) { __delay_ms(15); //チャタリング分? } } if (PORTCbits.RC4==0){ auto_shutter(); while(PORTCbits.RC4==0) { __delay_ms(15); //チャタリング分? } } } } //------- 関数定義 ------- void move_cw(long count){ long jj; for (jj=0;jj<count;jj=jj+1){ __delay_ms(1); if (PORTAbits.RA4==1){ if (PORTAbits.RA2==0) return; }else{ if (PORTAbits.RA2!=0) return; } PORTCbits.RC0 =1; __delay_ms(1); PORTCbits.RC0 =0; } } // void move_ccw(long count){ long jj; for (jj=0;jj<count;jj=jj+1){ __delay_ms(1); if (PORTAbits.RA4==1){ if (PORTAbits.RA3==0) return; }else{ if (PORTAbits.RA3!=0) return; } PORTCbits.RC1 =1; __delay_ms(1); PORTCbits.RC1 =0; } } // void delay_100ms(int time){ time = time*4; while(time){ __delay_ms(25); //25ms time = time-1; } return; } // long get_step_count(void){ long count; count =1; long a,b; PORTB = 0x0F; __delay_ms(1); a = PORTB; b = a & 0x0F; // PORTB = 0x1F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*10; // PORTB = 0x2F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*100; // PORTB = 0x3F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*1000;// PORTB = 0x4F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*10000;// if (b>0) count=b; return count; } long get_count(void){ long count; count =1; long a,b; b=0; PORTB = 0x5F; __delay_ms(1); a = PORTB; b = a & 0x0F; // PORTB = 0x6F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*10; // PORTB = 0x7F; __delay_ms(1); a = PORTB; b = b + (a & 0x0F)*100; // if (b>0) count=b; return count; } void shutter(void){ int a; PORTCbits.RC3 =1; __delay_ms(50); PORTCbits.RC2 =1; __delay_ms(200); PORTCbits.RC2 =0; __delay_ms(1); PORTCbits.RC3 =0; } void auto_shutter(void){ long cj,cjj; cj=get_count(); cjj=get_step_count(); long i; shutter(); for (i=0;i<cjj;i=i+cj){ move_cw(cj); __delay_ms(500); shutter(); } }
コメント 0