SSブログ

ドリル [顕微鏡・機材など]

お久しぶりです、dumboです。

さて、時間が色々と必要で・・・
きょうは機材のお話です。

以前、ネジを撮影しました。
その時の機材では照明がやりづらいのなんのって・・・
結局、1から新調しまして(新品はとってもお高いので、リサイクルですが)今日はそのお話です。

いきなりですが、全体像です。
drill_P1090074.jpg
相変わらず手作りって感じで、カメラを横にスライドするように変更しました。
これで照明に不自由がなくなりました???

スライドはステッピングモーターで駆動して、全ステップ量と、1コマごとの量を指定し、
シャッターも自動にしてしまいました。
(スライドテーブルにモーターをつける部分は、こりコリと自作しています。)

なので、ボタンひと押しでピント位置の違う像達が撮影出来ます。
以前は2相でしたが今回は5相のステッピングモーターで、動きが滑らかですね。

さて、テストですから動かないもので、
drill_P1090075.jpg
ドリルを撮影します。
φ2.5mmです。

出来た画像は、
drill.jpg
で、51枚からの深度合成です。
(合成ソフトは以前のままですが、いい仕事をしていますね。)

ドリルで手を切る事があるのですが、新品はカッターのように研がれているのですね。
これだけ鋭いと切れるのも納得です。


前の機材ではコマごとに、微妙に縦横ずれていたのですが、
さすが光学機器メーカーさんのものは中古でもピシッてしています。

動画では、
な感じで、
微妙ですがねっ。
もっと細かく枚数を重ねないといけません?



ご参考までに、駆動回路の回路図を示しておきましょう。
ステッピングモーター.png
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();
	}
}


nice!(7)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 7

にほんブログ村 教育ブログへ

コメント 0

コメントを書く

お名前:
URL:[必須]
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

トラックバックの受付は締め切りました