前回、モックアップで600pF位の物が出来そうだったので、実際に作ってみました(兎に角、内外差を縮めれば容量は上がりますが、それを駆動装置「ステップモーターとアクリルのフレーム」で動かせるか? が重要という事になります)。
試作機1) 19.05φのパイプ75mmに50μのカプトンテープを2重に張り付けた物に、0.1mm厚の銅シートを2回巻き付けて、手で内側のパイプがスムースに出し入れできる程度に調整してシートの外側の重なり部分を半田付けして固定しました。
結果20.3-20.5φ 80mm長のパイプとなりました。(外側のパイプの内径が正確に測れると、比誘電率を幾つにして計算させれば良いのか出せるのですが、0.05mm精度のノギスで素人が計測するのでは計測値が安定しないのと、銅シートを丸めてパイプ状する作業の精度も高くないので、「取り敢えずやってみる」方式ー>廃材がいっぱい出ます)
結果:
14.8pF - 525pF 推定耐圧32KV? の可変コンデンサが出来上がりました。 また、コア部が100x230mmに収まっています。
試作機2) 試作機1を上回る容量( >600pF)を目指し、19.05φ 100mmに50μのカプトンテープを3重に張り付け(推定48KV耐圧?)て、外側は試作機1と同様に0.1mm厚の銅シートを1.5重に巻き付けて外側シリンダー100mm長を作成しました。 外径は20.6-29.9φでした。
結果:
32pF - 528pF (残念!脱調が酷かったので外側シリンダを少し緩めに作り直した所為か? 600pFを超えられない!) 推定耐圧48KV?となりました。 コア部分で100x 270mmの大きさになっています。
駆動部のネジはコスト削減を目指し通常の4φの長ネジとM4つまみナット(外径10φ)を使用しました(1、2共通)ー>ネジとナットで380円也。3-4mmのユニバーサルジョイントは中華版で440円。
問題点、わかった事、今後の為に:
1)容量を大きくしようとしてシリンダの長さを長くすると、駆動部分の精度がクリティカルになって来るために、脱調しないように回転速度を遅くする必要があった。 試作機1、2共に安定した結果が出る様、
回転速度を1800に落としました。
3D的に内側、外側シリンダーの中心軸と、駆動用のネジ、モーターの中心軸を合わせるのは大変難しい、ですよね。 駆動側のシリンダを固定するアクリル板の底にすべり性を向上させる為にテフロンテープを張り付けていますが、このテープの厚み(数十μの単位)で動きがスムースになったり、ギクシャクしたりという事が発生しました。
シリンダを長くするよりも太くして容量を稼ぎ、
駆動距離は70-80mm程度にするのが良いように思われます(最終的な筐体の大きさも考えれば、この程度にとどめるべきでしょう)。
従ってシリンダの長さも90mm位まで。
2)カプトンテープの端の処理
内側シリンダーの先端部分でカプトンテープを折り返して、シリンダの内側で接着させてみたのですが、接着力が不足しており徐々に剥がれてきてしまいました。
色々方策を検討しましたが、最終的に手元にあった0.1mm厚のリン青銅板を5mm程度幅に切り、丸いバネを作って、これをパイプの内側に縮めて入れ、この広がろうとする力で固定しています。 (これって、放電リングになっていないだろうか?期待!)
3)接着剤
アクリル板と銅やカプトン等、接着したい部分がいくつかありますが、下の3Mの「強力瞬間接着剤 液状」が隙間にも入って行ってくれるので使い勝手が良かった。 アクリルにひび割れや一部の溶解が発生するので、見た目が悪くなることがありますが、小さい部分なら目立つこともなくOK?
4)ねじピッチ
ピッチと必要移動距離で最大値を計算させていますが、ネジの精度の所為か、脱調などによる誤差なのか、判然としませんが、最終的なソフトの微調整が必要になりました。
ー>脱調による誤差でした。 スピードを落として、測ってみましたら、実際の計測値と計算に使用した値が一致していました。
=== Manual Variable Capacitor No.1 ===
// 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.
//
// The firts one:
// Capacity : 14.8pF - 525.4pF
// Max voltage: 32KV ?
// Cylindar inner 19.05φ 80mm
// Outer 20.3-20.05φ 80mm 0.1mm sheet 2 ply
// Kapton usage : 50μ 2 ply
//
//
#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 0.75 // mm/rotate
#define LENGTH_2_MOVE 61 // mm 必要な移動距離 61mm
#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(){
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
resetCurrentPos2Zero(); // currentPositionを0に戻す(ZERO_SENSORがLOWになるまでCCWする
maxPosition = LENGTH_2_MOVE/PITCH*STEPS_PER_REV;
}
void loop(){
long start_t;
long end_t;
myStepper.setSpeed(1800); // 2500位まではOKの様です。
if( digitalRead(UP_BUTTON) == LOW || toggle1 == TRUE){
toggle1 = TRUE;
while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && currentPosition < maxPosition ){
myStepper.step(1);
currentPosition++;
}
end_t = millis();
}
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);
}
currentPosition = 0;
}
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;
}
}
=== Manual Variable Capacitor No.2 ===
// 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 bundled to the workable prototype hardware.
//
// The second one:
// Capacity : 32pF - 528pF
// Max Voltage : 48kv?
// Cylindar inner 19.05φ 100mm
// Outer 20.6-20.9φ 100mm
// Kapton usage : 50μ 3 ply
//
//
#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 0.75 // mm/rotate
#define LENGTH_2_MOVE 61 // mm 必要な移動距離 63mm
#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(){
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
resetCurrentPos2Zero(); // currentPositionを0に戻す(ZERO_SENSORがLOWになるまでCCWする
maxPosition = LENGTH_2_MOVE/PITCH*STEPS_PER_REV;
}
void loop(){
long start_t;
long end_t;
myStepper.setSpeed(1800); // 2500位まではOKの様です。
if( digitalRead(UP_BUTTON) == LOW || toggle1 == TRUE){
toggle1 = TRUE;
while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && currentPosition < maxPosition ){
myStepper.step(1);
currentPosition++;
}
end_t = millis();
}
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);
}
currentPosition = 0;
}
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;
}
}