Lab. of Voynich Code
2020年アルゼンチン皆既日食のたくらみ
偏光撮像装置の製作と実験ステッピングモーターの台形制御用ファーム製作&回路の製作 その1
2019.09.16 Open

偏光フィルタターレット駆動用ステッピングモータの制御

 偏光フィルターのターレットはステッピングモーターで直接駆動するが、そのまま急停止すると大きなブレが出る。そこで台形制御をするとよいというアドバイスを某所より頂いた。また、モータードライバーを使うと楽に制御ができるとも教わったのだが、素人では何とも…と思って居た。
 先ず、台形制御について調べてみると、モーターの回転速度を徐々に加速させ、最高速を保って目的のところ付近まで回転させ、徐々に減速して止める、というモノであると判明。
 次にステッピングモータードライバとは?と調べて行って見ると、PICやArduinoから1本の線でパルスを受けて4本線のバイポーラ・ステッピングモーターを駆動する代物、という事が判った。で、Amazonで検索したらこんなものが引っ掛かった。
 という事で、ここでの課題は、
1.台形制御に必要な徐々にパルス幅(或いは周波数?)を可変するPIC用のファームウェアを作る
2.その信号を受けたモータードライバが対応した速度でステッピングモーターを回す回路を作る
 の2点になると考えた。

1.台形制御のファームウェア製作

 ファームウェアは等比数列になっていると良いのか?と考え、ファームウェアの製作を開始したけれど、全くうまく行かない。そこで色々なHPやらブログを探って行ったら、8bitのPICでは浮動小数点計算は出来ないと考えた方がイイ(不可能ではないがメモリをやたら食うらしい)。また、__delay_us(x) を使う場合、xには変数を入れられない、という事を今更ながら知った。というか2013年にPICを使いだしてから、知るのに6年もかかっていたというこの衝撃!であった。また、XC8のpic.hの中身をチョイと変更もしなくてはいけない、との事。148行目を
#ifdef __PICC__

 にするのだそうだ。加えて書き込みが出来ないフォルダ&ファイルなので、プロパティを見てフルコントロールが効くように変更する必要があった。
 そんなこんなで取り敢えず1/4回転したら停止、1秒ほど待って、また1/4回転する、を延々繰り返すファームウェアを作りました。
 これにシャッターを切るルーチンを加えると完成、の筈、ですが…
 偏光撮像用のオリンパスE-M10 mkIIのシャッター速度は1/60秒でHDRモードの2EV間隔7段にする。1~1/4000秒で撮像されるので、3秒シャッターを切る設定にする。
 回転速度と加減速の具合、シャッターを切り続ける時間などはチューニングしていく必要があります。

◆ファームウェアのプログラムリストはページの一番下
 

◆ダウンロード…その1.

PICの出力パルス

ドライバの出力

2.ステッピングモーターを駆動するための回路の製作

  
 回路図
 1 /*
 2  * File:   main.c
 3  * Author: M_shi
 4  *
 5  * Created on 2019/08/24, 20:18
 6  */
 7 
 8 #include <pic.h>
 9 #include <xc.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 //#include <math.h>
13 //#include <delays.h>
14 
15 
16 #pragma config WDTE = OFF
17 #pragma config PWRTE = ON
18 #pragma config MCLRE = OFF
19 #pragma config CP = OFF
20 #pragma config CPD = OFF
21 #pragma config BOREN = OFF
22 #pragma config IESO = OFF
23 #pragma config FCMEN = OFF
24 //#pragma config FOSC = HS
25 #pragma config FOSC = INTOSCIO
26 #define _XTAL_FREQ 4000000
27 //#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/400UL)))
28 
29 
30 
31 
32 void main(void) {
33     
34     static int i, j, k, t;
35     
36     TRISIO = 0b00001000;
37     ANSEL  = 0b01100000;
38     WPU    = 0b00001100;
39     CMCON0 = 0x07;
40     
41     for(i = 20; i>= 1; i-=1)
42     {
43             GP2 = 1;
44             for(j=0; j<i; j++){
45                 __delay_us(1500);
46             }
47             __delay_ms(20);
48             GP2 = 0;
49             for(j=0; j<i; j++){
50                 __delay_us(1500);
51             }
52             __delay_ms(20);
53     }
54     
55     for(i = 20; i>= 1; i-=1)
56     {
57             GP2 = 1;
58             for(j=0; j<20-i; j++){
59                 __delay_us(1500);
60             }
61             __delay_ms(20);
62             GP2 = 0;
63             for(j=0; j<20-i; j++){
64                 __delay_us(1500);
65             }
66             __delay_ms(20);
67     } 
68     __delay_ms(500);
69     
70     
71     
72     return;
73 }

inserted by FC2 system