取り敢えずアクリル板の工作でコアの部分だけアセンブルして、全体をまとめて採寸、容量測定などをしてみました。
結果;
最大容量 181.4 pF
最小容量 13.5 pF
最小容量から最大容量までにかかる時間 19 sec
という結果となりました。 容量の再現性は非常に高く、満足できるレベルでした。
10KV以上の耐圧を見込んでいるのですが、手元に試験装置が無いので、近々誰かに頼んで測定してみることにします。
アセンブルの過程で、駆動軸を、M3の長ネジ、4φのすべりネジ、M6の長ネジの3種類を実験してみましたが、
当然のことながら4φのすべりネジが最も快調でした。
M3の長ネジは動作はするのですが、ピッチが0.5mmと細かくステッピングモーターのメリットが相殺されてしまいます。
M6の長ネジはピッチが1mmと4φのすべりネジと同じなので期待したのですが、ステッピングモーターの軸3φとのジョイント用にフレキシブルジョイントが入手できなかった為か、スムースに動かず難があり、ちょっと使用できる状態にはなりませんでした。
すべりネジは高価なので、M4の長ネジ(ピッチ0.75mm)で代替できないか、現在実験中です。 うまくゆけば、これにしたいと考えています。
コアの部分で300X100X80mm位の大きさになりますので、全体として320X150X100mm位の大きさに収まる物が出来ると思います。
容量を除いて満足できる結果だったのですが、当初期待していた容量が出ていない(30pF ~ 350pFを期待していたのですが)ので、色々検討してみたのですが、どうも外と内のパイプの間隔が広すぎる為におこるようです。
20φ1mm厚のパイプの内径は18mm,内側のパイプは15.88φなので、中心が揃っていれば1.06mmの間隔ということになりますが、内側のパイプは外側のパイプにもたれ掛かる状態になりますので、最小:フィルムの厚み、最大:2.12mmということになります(
最初のあたり試験で単に寝かせた太いパイプにポリイミドフィルムを張り付けた細いパイプを入れて容量を測定ー中心を維持することはしていなかったことが原因で予想外の結果が出たようです)。
どうも2mm位で計算させるとラシイ値が出てきますので、容量を稼ごうとすると、パイプ径の組み合わせの再検討が必要となりそうです。 フィルムは50μなので接着層を加味して3~4重に巻いても高々300μ位ですので、20φの代わりに19.05φ0.8mm(内径17.45φ)に変更して月内に再度挑戦してみることにします。
Arduinoの方は実にすんなり、快調に動いてくれて、大満足です。 周波数プリセットや、SWRによる自動同調も組み込み可能だと思われますので、今後給電方法なども含めて検討課題となります。
// For use of DRV8835+SPG27-1101
// Author Ken Yamada, JA2IYJ
// Date: 2019 July 3rd. V0.5 Initial version.
// July 11th V1.0 Zero_sensor added and bandled to the workable protype hardware.
//
#include
#define TRUE 1
#define FALSE 0
#define MOTOR_1 8
#define MOTOR_2 9
#define MOTOR_3 10
#define MOTOR_4 11
// digital address それぞれをボタン、センサーにアサイン
#define ZERO_SENSOR 13
#define UP_BUTTON 2
#define DOWN_BUTTON 3
// 以下3つ重要!
#define PITCH 1.0 // mm/rotate
#define LENGTH_2_MOVE 93 // mm 必要な移動距離
#define STEPS_PER_REV 120 // SPG27-1101 specification
long currentPosition = 0; // 絶対値 ... 動作開始時にsetupで起点0にされる
long maxPosition; // setup()で、#defineに定義された数値から計算
boolean toggle1 = FALSE;
boolean toggle2 = FALSE;
// stepPerRotate は素のモーターの一回転当たりのstep数の様です(ギアの事汎用では顧慮できないもんね)
//const int stepsPerRotate = 20;// SPG20-1332ス テップ数 = 480 ギア比1:24 hence 20
const int stepsPerRotate = 12;// SPG27-1101 ステップ数 = 120 ギア比1:5 hence 24 でも12でないと動かない! 何故?
Stepper myStepper(stepsPerRotate, MOTOR_1, MOTOR_2, MOTOR_3, MOTOR_4);
void setup(){
long start_t;
long end_t;
Serial.begin(9600);
pinMode(ZERO_SENSOR, INPUT_PULLUP); //内部pullup抵抗でHighになっている
pinMode(UP_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High
pinMode(DOWN_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High
// start_t = millis();
resetCurrentPos2Zero(); // currentPositionを0に戻す(ZERO_SENSORがLOWになるまでCCWする
// end_t = millis();
// Serial.print( "== reset took ");
// Serial.print( end_t - start_t);
// Serial.println( " millisec");
maxPosition = LENGTH_2_MOVE/PITCH*STEPS_PER_REV;
}
void loop(){
long start_t;
long end_t;
myStepper.setSpeed(2500); // 2500位まではOKの様です。
//Serial.println("Start ... ");
// Serial.print( "toggle1 = ");
// Serial.print( toggle1 );
// Serial.print( " toggle2 = ");
// Serial.println( toggle2 );
// Serial.print( " currentPosition = ");
//Serial.print( currentPosition );
//Serial.print( " MaxPosition = ");
//Serial.println( maxPosition );
if( digitalRead(UP_BUTTON) == LOW || toggle1 == TRUE){
toggle1 = TRUE;
// start_t = millis();
while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && currentPosition < maxPosition ){
myStepper.step(1);
currentPosition++;
}
end_t = millis();
// Serial.print ( "....." );
// Serial.print ( end_t - start_t);
// Serial.println( " .... millisecond took");
// delay(10000);
}
if ( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE ){
toggle1 = FALSE;
while ( digitalRead(UP_BUTTON) == LOW && currentPosition < maxPosition){
myStepper.step(1);
currentPosition++;
}
}
if ( digitalRead(DOWN_BUTTON) == LOW || toggle2 == TRUE ){
toggle2 = TRUE;
while( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE && currentPosition > 0 && digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
currentPosition--;
}
}
if ( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE ){
toggle2 = FALSE;
while ( digitalRead(DOWN_BUTTON) == LOW && currentPosition > 0 && digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
currentPosition--;
}
}
stopMotor();
delay(100);
}
void stopMotor(){
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, LOW);
digitalWrite(MOTOR_3, LOW);
digitalWrite(MOTOR_4, LOW);
}
void resetCurrentPos2Zero(){
myStepper.setSpeed(2500); // As fast as possible
while ( digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
}
}
int moveAbsPos2(long pos){
if (pos < maxPosition) {
myStepper.step(currentPosition - pos);
currentPosition = pos;
} else {
return -1;
}
}
int incrementPosBy(long pos){
if (currentPosition + pos < maxPosition) {
myStepper.step(pos);
currentPosition = currentPosition+pos;
} else {
return -1;
}
}
int decrementPosby(long pos){
if (currentPosition - pos > 0 ){
myStepper.step(-pos);
currentPosition = currentPosition - pos;
} else {
return -1;
}
}
結果;
最大容量 181.4 pF
最小容量 13.5 pF
最小容量から最大容量までにかかる時間 19 sec
という結果となりました。 容量の再現性は非常に高く、満足できるレベルでした。
10KV以上の耐圧を見込んでいるのですが、手元に試験装置が無いので、近々誰かに頼んで測定してみることにします。
アセンブルの過程で、駆動軸を、M3の長ネジ、4φのすべりネジ、M6の長ネジの3種類を実験してみましたが、
当然のことながら4φのすべりネジが最も快調でした。
M3の長ネジは動作はするのですが、ピッチが0.5mmと細かくステッピングモーターのメリットが相殺されてしまいます。
M6の長ネジはピッチが1mmと4φのすべりネジと同じなので期待したのですが、ステッピングモーターの軸3φとのジョイント用にフレキシブルジョイントが入手できなかった為か、スムースに動かず難があり、ちょっと使用できる状態にはなりませんでした。
すべりネジは高価なので、M4の長ネジ(ピッチ0.75mm)で代替できないか、現在実験中です。 うまくゆけば、これにしたいと考えています。
コアの部分で300X100X80mm位の大きさになりますので、全体として320X150X100mm位の大きさに収まる物が出来ると思います。
容量を除いて満足できる結果だったのですが、当初期待していた容量が出ていない(30pF ~ 350pFを期待していたのですが)ので、色々検討してみたのですが、どうも外と内のパイプの間隔が広すぎる為におこるようです。
20φ1mm厚のパイプの内径は18mm,内側のパイプは15.88φなので、中心が揃っていれば1.06mmの間隔ということになりますが、内側のパイプは外側のパイプにもたれ掛かる状態になりますので、最小:フィルムの厚み、最大:2.12mmということになります(
最初のあたり試験で単に寝かせた太いパイプにポリイミドフィルムを張り付けた細いパイプを入れて容量を測定ー中心を維持することはしていなかったことが原因で予想外の結果が出たようです)。
どうも2mm位で計算させるとラシイ値が出てきますので、容量を稼ごうとすると、パイプ径の組み合わせの再検討が必要となりそうです。 フィルムは50μなので接着層を加味して3~4重に巻いても高々300μ位ですので、20φの代わりに19.05φ0.8mm(内径17.45φ)に変更して月内に再度挑戦してみることにします。
Arduinoの方は実にすんなり、快調に動いてくれて、大満足です。 周波数プリセットや、SWRによる自動同調も組み込み可能だと思われますので、今後給電方法なども含めて検討課題となります。
// For use of DRV8835+SPG27-1101
// Author Ken Yamada, JA2IYJ
// Date: 2019 July 3rd. V0.5 Initial version.
// July 11th V1.0 Zero_sensor added and bandled to the workable protype hardware.
//
#include
#define TRUE 1
#define FALSE 0
#define MOTOR_1 8
#define MOTOR_2 9
#define MOTOR_3 10
#define MOTOR_4 11
// digital address それぞれをボタン、センサーにアサイン
#define ZERO_SENSOR 13
#define UP_BUTTON 2
#define DOWN_BUTTON 3
// 以下3つ重要!
#define PITCH 1.0 // mm/rotate
#define LENGTH_2_MOVE 93 // mm 必要な移動距離
#define STEPS_PER_REV 120 // SPG27-1101 specification
long currentPosition = 0; // 絶対値 ... 動作開始時にsetupで起点0にされる
long maxPosition; // setup()で、#defineに定義された数値から計算
boolean toggle1 = FALSE;
boolean toggle2 = FALSE;
// stepPerRotate は素のモーターの一回転当たりのstep数の様です(ギアの事汎用では顧慮できないもんね)
//const int stepsPerRotate = 20;// SPG20-1332ス テップ数 = 480 ギア比1:24 hence 20
const int stepsPerRotate = 12;// SPG27-1101 ステップ数 = 120 ギア比1:5 hence 24 でも12でないと動かない! 何故?
Stepper myStepper(stepsPerRotate, MOTOR_1, MOTOR_2, MOTOR_3, MOTOR_4);
void setup(){
long start_t;
long end_t;
Serial.begin(9600);
pinMode(ZERO_SENSOR, INPUT_PULLUP); //内部pullup抵抗でHighになっている
pinMode(UP_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High
pinMode(DOWN_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High
// start_t = millis();
resetCurrentPos2Zero(); // currentPositionを0に戻す(ZERO_SENSORがLOWになるまでCCWする
// end_t = millis();
// Serial.print( "== reset took ");
// Serial.print( end_t - start_t);
// Serial.println( " millisec");
maxPosition = LENGTH_2_MOVE/PITCH*STEPS_PER_REV;
}
void loop(){
long start_t;
long end_t;
myStepper.setSpeed(2500); // 2500位まではOKの様です。
//Serial.println("Start ... ");
// Serial.print( "toggle1 = ");
// Serial.print( toggle1 );
// Serial.print( " toggle2 = ");
// Serial.println( toggle2 );
// Serial.print( " currentPosition = ");
//Serial.print( currentPosition );
//Serial.print( " MaxPosition = ");
//Serial.println( maxPosition );
if( digitalRead(UP_BUTTON) == LOW || toggle1 == TRUE){
toggle1 = TRUE;
// start_t = millis();
while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && currentPosition < maxPosition ){
myStepper.step(1);
currentPosition++;
}
end_t = millis();
// Serial.print ( "....." );
// Serial.print ( end_t - start_t);
// Serial.println( " .... millisecond took");
// delay(10000);
}
if ( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE ){
toggle1 = FALSE;
while ( digitalRead(UP_BUTTON) == LOW && currentPosition < maxPosition){
myStepper.step(1);
currentPosition++;
}
}
if ( digitalRead(DOWN_BUTTON) == LOW || toggle2 == TRUE ){
toggle2 = TRUE;
while( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE && currentPosition > 0 && digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
currentPosition--;
}
}
if ( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE ){
toggle2 = FALSE;
while ( digitalRead(DOWN_BUTTON) == LOW && currentPosition > 0 && digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
currentPosition--;
}
}
stopMotor();
delay(100);
}
void stopMotor(){
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, LOW);
digitalWrite(MOTOR_3, LOW);
digitalWrite(MOTOR_4, LOW);
}
void resetCurrentPos2Zero(){
myStepper.setSpeed(2500); // As fast as possible
while ( digitalRead(ZERO_SENSOR) == HIGH ){
myStepper.step(-1);
}
}
int moveAbsPos2(long pos){
if (pos < maxPosition) {
myStepper.step(currentPosition - pos);
currentPosition = pos;
} else {
return -1;
}
}
int incrementPosBy(long pos){
if (currentPosition + pos < maxPosition) {
myStepper.step(pos);
currentPosition = currentPosition+pos;
} else {
return -1;
}
}
int decrementPosby(long pos){
if (currentPosition - pos > 0 ){
myStepper.step(-pos);
currentPosition = currentPosition - pos;
} else {
return -1;
}
}
0 件のコメント:
コメントを投稿