2019年7月30日火曜日

取り敢えず失敗

高耐圧バリコンをカプトンの絶縁体で作ろうという試みは敢え無く失敗!
JR1OAO小嶋氏に耐圧実験をお願いしていましたが、先ほどメールがあり、1.2KV近辺のところでコロナ放電を起こしているようです。

200pFに設定して136kHzの共振電流を入れ次第に上げて行ったところ、0.15Arms(RF) 位流れたところで止まってしまい、チー音と共にイオンの匂いがしました。単純計算では1.2kVpeakの耐圧しかない事になります。
......
やはりコロナ放電だと思います。

カプトンは絶縁破壊電圧は高いのにコロナ放電開始電圧は500~900V程度なので、常に高圧に晒されるような使用は出来ませんね。 レガシィなシステムでなく、今時のハイテックな数百ボルト以下で動くようなシステムの為の物ですね。

このまま引き下がるのも癪なので、PTFEのテープ(ニトフロンNo.903 0.13mm 2ply)で同様の物を作って、容量の測定をしてみましたが、20φ 10cm位で210pF程度は取れていますので、置き換えは可能みたいです。 PTFEは柔らかいので、外側の銅のシリンダのエッジは処理をしておかないと、簡単にPTFEがピーリングしてしまいます。 取り敢えずポリイミドの25μのフィルムで覆ってみました。 滑り性は抜群なので、内側と外側をかなり密着させることができ、容量は思ったより稼げました。 
あとは耐圧がどの位取れるか? 今度再度中島氏にお願いしてみるつもりです。 

これでもダメなら、幅広0.23mm厚のニトフロンで一重巻きにしてみるか、後はPTFE熱収縮チューブか、PTFEチューブを検討するか、、、 いずれもそれなりに資金が必要なので、取り敢えずサマージャンボを購入、、、。

真空バリコン同等の物を作ろうというのは簡単な事では無いですね~。

大量のアクリルのごみが出来てしまった!! 毎度の事ながら、もう少し慎重に仕事を進めないと、、、反省!!



 

うまくないかな? 高耐圧バリコン

東レデュポンのカプトンの資料見ていたら、「絶対絶縁破壊電圧」と「コロナ放電開始電圧」というのがあり、前者はべら棒に高いが、後者はそこそこの値なので、ちょっと気になっていて、「これってなんだ」という事で調べてみました。 
「コロナ放電開始電圧」(というより「部分放電開始電圧」なのでしょうが)、絶縁破壊電圧が破壊検査(壊れるところまでやる)のに対して、「コロナ、、」はNDT(非破壊検査)で微小放電が始まる電圧、という事の様です。 「コロナ放電とか始まったら、絶縁状態じゃないじゃーん」と思っていましたが、これなら意味は分かったような気がします。

で、カプトンのコロナ放電開始電圧が高くないのは、成膜方法の所為?で内部にボイドが出来る為なのだと思いますが、PTFEについては「部分(コロナ)放電開始電圧」のデータが見当たりません。 ボイドが無い!とは考えられないんですが、、、

いずれにせよ、内容は理解したと考えると、現在の複数のフィルムを重ね貼りする方法は、空気の間隙、接着剤(シリコーン)層等、無数のボイドの集団(それも作るたびに違う)を相手にすることになり、一定の耐圧を保証できるような物にはなりそうもありませんね~(ガッカリ)。 
シミュレーションで、複数のコンデンサが直列に繋がり、それらが同じ電荷量をもつので、小さい容量の物には大きな電圧がかかり、そこから破壊される、というのは分かるのですが、間隔が小さければ容量が増えるので、トータルでどうなるん?  
よく分かりません! なんか、パンドラの箱を開けてしまったような、、、、。

素人製品で、取り敢えず「結果オーライ」で我慢することになりそうです。
ニトフロンの0.13mm厚のPTFEテープで同じようなものを作ってみました。これと、カプトンテープの物とを比べてみる事にしょうと思っています。  
滑りは圧倒的に良いので、内側と外側の間隔を密にすることが出来ますが、表面が柔らかいので、外側のシリンダーの端等が尖っていると簡単にPTFEがピーリング(皮むき)されてしまい、一工夫必要です。

PTFEの方が良ければ、どこかで、PTFE熱収縮チューブを銅パイプに被せた物を作って貰い(工業用のオーブンが必要なので、素人では出来そうもない)、それで作成してみることも一手ではあります(接着剤やバブルの混入を抑えることが出来れば、少しは定量的な考えが出来るかもしれません)。

2019年7月27日土曜日

想定しているMLA

コンデンサの実験ばかりしていますが、前提となるMLAは以下の仕様のつもり;
直径1.3m 2回巻きの15mmアルミパイプのループで1.9から7Mhzまで500Wでの運用を可能にするために必要なコンデンサは? 10D-SFA-Liteとか12D-SFA-Liteとかで外皮側だけ使って作る?だと銅パイプの計算で効率がちょっと上がるけど、丸く形状を維持出来るかな?
25pF~500pFの可変領域で耐圧が20KV以上(30KV必要?)
 どうもQSTの記事等見ていると真空バリコンで10KVの物を使っており、諸要件の制約により、ここまでQが上がっていないことで、耐圧的に救われているのかもしれません。 Q > 2000って!!な世界ですねー。
下はここでの計算のコピーです。

2019年7月25日木曜日

続続)MLA用高耐圧コンデンサの試作

前回、モックアップで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;
  }
}


2019年7月22日月曜日

続)MLA用高耐圧コンデンサーの試作

市販の銅パイプの色々な組み合わせで容量を増やすことを検討したが、思うようにゆかず、外側をパイプでは無く銅の薄板で作ったらどうだろうか?検討してみました。 

取り敢えずは、手元にある15.88φのパイプに寺岡製作所の50μのカプトンテープ20mm幅を張り付けてみました。 左写真の横方向にテープを10mmの重なりで張ってゆきますが、今回は皴を発生させることなくきれいに張ることが出来ました。 また、カプトンのアンバー色が1重、2重、3重とかなりはっきり違う為、張り付け処理は結構スムースに思い通りに出来ました。
右の写真は、左3本は3重に重ねたもの、右3本は2重に重ねたものですが、遠目にもかなりはっきり違いが判ります。







次に、外側の導体ですが0.1mm厚の銅板があったので、それを必要な寸法に切って出来上がった内側のパイプに巻き付けて、「出来るだけ密着して、且つ内側のパイプが動くような」巻き径にして、セロテープで固定し、接続用の銅テープを巻き付けて接合部分を半田付けしてみました。
結果15.88φ 11cm の場合1本当り10pF~200pF程度になり、ほぼ必要な容量(20pF~600pF)が確保できるものが出来ることが確認できました。 カプトン自身の表面強度やすべり性から、あまり、潤滑剤ですべりが良くなることは期待していませんでしたが、実験してみました。 
->結果、5-56ではカプトン裏面の粘着剤(シリコーン系)が全く接着力を失ってしまうために、少なくとも5-56は使えませんでした。 またすべり性の向上もありませんでした。 外側のパイプを作るときに細心の注意をする必要があります(ゆるく作ると容量が減り、キチキチに作ると容量は増えるが、内側パイプの出し入れに力が必要)。
5-56って剥がれにくい粘着剤の除去に使えるのかも?


手持ちアクリル材料の関係で、15.88φのパイプ(内側が16.??φ、外側が18~19φ)の組み合わせ(パイプの可変距離が11cm程度)が中心で、実験してみましたが、「どうせ外側のパイプは銅板で自作なら、内側のパイプをもっと太くすれば表面積をとれて小型化が図れるのでは?」ということで、19.05φのパイプで計算してみると、6cm位の出し入れで10pF~250pF位まで行けそうなので、実際に作ってみました。
結果、69pF~550pFというものが出来ました。
外側のパイプを銅板で作る方法が有効であることは確認でき、必要な移動距離も60mm程度で小型化出来る事は確認できましたが、パイプの出し入れに力が掛かるので、パイプを固定する支持板(アクリル)に十分な強度で夫々のパイプを接着できるか強度の確認が必要になりました。 後は、外側パイプのエッジが鋭いので、放電のリスクも高まるのかも、、、  耐圧試験も早急にしないといけません。

銅パイプの山とアクリル板の山が出来そうです。


















2019年7月11日木曜日

MLA用コンデンサ ver 0.9

取り敢えずアクリル板の工作でコアの部分だけアセンブルして、全体をまとめて採寸、容量測定などをしてみました。
 
結果; 
 最大容量 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;
  }
}


 

2019年7月8日月曜日

MLA用コンデンサの制作(銅パイプへの半田付け)

予備的に、BBQ等の時に使うプロパンバーナーで加熱して半田付けを試みましたが、バーナーの当たっているところの温度だけが上昇しすぎて、バーナーだけでの半田付けはうまくゆきませんでした。 で、色々能内シミュレーションしてみましたが、ひょっとして七輪で温めておいて、半田ごてで半田付けする方が良いのでは?と思い付き早速実験。

飲み屋などでよく見るお一人様七輪があったのを思い出し、これに炭をおこして実験。 はんだをのせたい所にフラックスを塗り、クリップで取り付け位置に銅リボンを固定し、七輪に入れ、温まるのをしばし待ち、半田ごてと半田を半田付けする部分にあてると、「おー、素晴らしい!」。実に綺麗に半田が流れて期待したような半田付けが出来ました。 
ただ問題点がいくつか;
 1)位置の固定が温度上昇によって少しずれてくるので、ここは工夫が必要。今のクリップで良いのか?
 2)七輪の中でパイプが動いてしまうので、何か固定できるようなことを考える必要がある。
 3)一度失敗して半田が残っている部分に再度付けようとすると、残っていた半田の厚みなどで銅リボンが緩んで位置ずれをおこすので、マニュアルで調整することが必要。
 4)あまり暖め過ぎると、銅パイプの変色が著しいので、適当な時間で処理を終える必要がありそう。

いずれにせよ、出来ることが分かったので、今週中に3セット位作って、プロトタイプを完成させようと思います。

2019年7月3日水曜日

MLA用の高耐圧コンデンサと駆動装置の実験

小暮さんから、MLAの設計シミュレータの情報がMLに回っていたので、早速160mで作るとどうなるのか、シミュレーションしてみましたが、QSTにVKの局が載せていたものでも、2-30KVの耐圧のコンデンサが必要との結果。 記事では10KVの真空バリコンでしたが、ほんとに500W入れて大丈夫? (Qが設計理論値よりかなり低くて、電圧も低いのでは? との意見もありますが、、)。
いずれにせよ、高耐圧の可変コンデンサが必要であることは確かなので、銅パイプのシリンダの出し入れで検討してみました。
20φと16φの銅パイプ10cm程度の出し入れで、カプトン3重巻きにして、15pFから120pF位までのコンデンサは出来そうです。 カプトンは厚みにより違いますが、380KV/mm程度の絶縁破壊電圧が示されているので、50μのテープを3重、4重にすれば、20KV程度は行けるのでは? と「取らぬ狸の皮算用」で、高価なポリイミドテープを購入。 ところが、3本の銅パイプを接続する為の半田付けは、ちょっと簡単には出来そうもない! 最近流行りのプロパンボンベのトーチで炙りながら半田ごてで半田付け、ということになりそうで、目下準備中。
2)駆動エンジンとしてステッピングモーターの検討
その間に、このシリンダを動かすメカの部分とこれを動かすためのソフトの部分について検討。 秋月等見るとステッピングモーターは安価なものがあるし、Arduinoも安価で使い易いので、Arduino+Stepping Motorに挑戦。 
まず手始めに、SPG20-1332+DRV8835の組み合わせ(秋月)と、28BYJ-48+ULN2003の組み合わせ(Amazon)についてWEBでググりながら動作の確認。 SPG20も28BYJもギア比から些かスピードが遅いので、モーターは変えなければならなさそうですが、ドライバのUNL2003やDRV8835は使えそうです。 
DRV8835は小さくて良さそうですし、VM <11v p="">が11Vとなっていますが、12Vでも今のところ問題なく使えています。
3)SPG27-1101+DRV8835+Arduino Unoで実験用の駆動装置の作成
Arduino Unoのシールドとして、上に乗っけてやろうと、部品箱を漁ってみたら、5V regulator, シールド用のスルーホール万能基板、トグルスイッチ等全て揃っていたので、早速12V単一電源供給のシールドを作成して、以降の実験に使うことにしました。 単純にUp/Downのトグルスイッチで制御するだけですので、「DCモーターで作ればいいじゃん」とも言えますが、ArduinoUnoにはA/Dコンバーターもついていますし、SDカードも使えますので、自動化にも対応でき、拡張性からもこの選択をしました。 回転ー>横方向の移動には一般に”すべりネジ”が使われますが高価なので、躊躇していましたがJR1OAO中島さんより「長ネジで大丈夫」との知見をいただきましたので、長ネジで挑戦してみることにし、長ネジのピッチ(M3で0.5mm)から、10cm動かすために200回転必要になることから、実験装置は200回回転させる事を考慮してデザインすることにしました。   
左は、Stepperライブラリを使ってwhileループで1ステップづつ200回回転させた時と、Stepper.step(XX)で一挙に200回転させた時にかかった時間を測定したものですが、1ステップづつ送っても、問題が無いことが確認されましたので、stepper.step()には1或いは-1を指定して、1ステップづつ送ることとしました。
また、Stepper.setSpeed()では2500位までは指定しても大丈夫ですが、ギアの回る音がやたらとうるさくなり、3000を超えると不安定になって、脱調を起こすようです。【3000回でも大丈夫ですが、時々おかしくなりました】  2300程度で使うのが安全でした。
<11v p="">M6(1mmピッチ)で100回転か、30度台形ネジ(すべりネジ)でないと、チューニングにやたら時間がかかってステッピングモーターの価値が半減しそうです。
<11v p=""> 
4)Arduino Unoのスケッチの作成
 2)のところで、色々なライブラリを試してみましたが、結局は標準のStepper.hをつかい、global変数にcurrentPositionを作り、setup()で必ずposition 0 に戻す事にしました。またmaxPositionは計算値、或いは実測値で求め、ソフト的に一定の範囲で動作するようにし、ハード的なリミッタは付けない事としました。
 今後、ハード部分が出来上がれば、下のスケッチを必要に応じて修正してゆくことにします。


参考としたHP;
Arduinoで小型ステッピングモータを動かす。半田付け不要 
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (4) 
ステッピングモーター SPG20-1332 を DRV8835 で回してみる
SPG-27 Spec sheet
SGP-20 Spec sheet 
Arduinoでステッピングモータを制御してみる 
ステッピングモータを動かす(ステッピングモータ、モータドライバ使用)
TynyStepper_28BYJ_48(GitHub)


=================================================
//  For use of DRV8835+SPG27-1101
//  Author  Ken Yamada, JA2IYJ
//  Date:  2019 July 3rd.
//    2019 July 4th.
//      interruptをup/downに使えるようにpin アサインメントを変更(interruptはボタンのセンスが不安定でうまくゆかなかった)
//        ZERO_SENSOR ->12, MAX_SENSOR ->13, UP_BUTTON->2, DOWN_BUTTON->3 
//
#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 12
#define MAX_SENSOR 13
#define UP_BUTTON 2
#define DOWN_BUTTON 3
#define PITCH 0.5 // mm/revolve
#define LENGHT_2_MOVE 10  // cm 必要な移動距離


long currentPosition = 0;  // 絶対値 ... 動作開始時にsetupで起点0にされる
long maxPosition = 120*200;   // 後で手動入力? M3並目ネジは0.5mm pitchなので10cm 動かすには200回廻す
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

Stepper myStepper(stepsPerRotate, MOTOR_1, MOTOR_2, MOTOR_3, MOTOR_4);

void setup(){
  Serial.begin(9600);
  pinMode(ZERO_SENSOR, INPUT_PULLUP); //内部pullup抵抗でHighになっている
  pinMode(MAX_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 = move2MaxPos(); // そこからCWしてmaxPosをいったん獲得  Maxが既知であればこの2行は手入力で置き換え
  // resetCurrentPos2Zero(); // enable this if move2MaPos() actually make a move.
}

void loop(){
  long start_t;
  long end_t;
 
  myStepper.setSpeed(1800); // 2500位まではOKの様です。
  Serial.println("Start ... ");

  if( digitalRead(UP_BUTTON) == LOW || toggle1 == TRUE){
    toggle1 = TRUE;
    while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && currentPosition < maxPosition ){
      myStepper.step(1);
      currentPosition++;
    }
  }
  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 ){
      myStepper.step(-1);
    }
  }
  if ( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE ){
    toggle2 = FALSE;
    while ( digitalRead(DOWN_BUTTON) == LOW && currentPosition > 0 ){
      myStepper.step(-1);
    }
  }
  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);
  }
}
long move2MaxPos(){
  if( 0 ) { // 計算でmax postionを出した方が早い
    while (digitalRead(MAX_SENSOR) == HIGH){
      myStepper.step(1);
      currentPosition++;
    }
    return currentPosition;
  } else {
    return LENGHT_2_MOVE/PITCH;
  }
}
int moveAbsPos2(long pos){
  if (pos < maxPosition) {
    myStepper.step(currentPosition - pos);
    currentPosition = pos;
  } else {
    return -1;
  }
 
}
int forwardPosBy(long pos){
  if (currentPosition + pos < maxPosition) {
    myStepper.step(pos);
    currentPosition = currentPosition+pos;
  } else {
    return -1;
  }
}
int backwardPosby(long pos){
  if (currentPosition - pos > 0 ){
    myStepper.step(-pos);
    currentPosition = currentPosition - pos;
  } else {
    return -1;
  }
}

==================================================



php のインストールの確認

phpって最初のfacebook書くときに使われたみたいで、それなりに歴史のある言語で、私も2006年位から使っていますが、CLIで使う事はあまり無いので、apacheとの連携のトラブル(mod_phpのバージョンの齟齬)などは気になりますが、拡張モジュールのインストールの問題に...