小暮さんから、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>
<11v p="">M6(1mmピッチ)で100回転か、30度台形ネジ(すべりネジ)でないと、チューニングにやたら時間がかかってステッピングモーターの価値が半減しそうです。11v>
<11v p="">
4)Arduino Unoのスケッチの作成
2)のところで、色々なライブラリを試してみましたが、結局は標準のStepper.hをつかい、global変数にcurrentPositionを作り、setup()で必ずposition 0 に戻す事にしました。またmaxPositionは計算値、或いは実測値で求め、ソフト的に一定の範囲で動作するようにし、ハード的なリミッタは付けない事としました。
今後、ハード部分が出来上がれば、下のスケッチを必要に応じて修正してゆくことにします。
11v>
参考とした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;
}
}
==================================================
いずれにせよ、高耐圧の可変コンデンサが必要であることは確かなので、銅パイプのシリンダの出し入れで検討してみました。
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を超えると不安定になって、脱調を起こすようです。
<11v p="">M6(1mmピッチ)で100回転か、30度台形ネジ(すべりネジ)でないと、チューニングにやたら時間がかかってステッピングモーターの価値が半減しそうです。11v>
<11v p="">
4)Arduino Unoのスケッチの作成
2)のところで、色々なライブラリを試してみましたが、結局は標準のStepper.hをつかい、global変数にcurrentPositionを作り、setup()で必ずposition 0 に戻す事にしました。またmaxPositionは計算値、或いは実測値で求め、ソフト的に一定の範囲で動作するようにし、ハード的なリミッタは付けない事としました。
今後、ハード部分が出来上がれば、下のスケッチを必要に応じて修正してゆくことにします。
11v>
参考とした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;
}
}
==================================================
0 件のコメント:
コメントを投稿