2021年9月10日金曜日

CL6DXを追加

 6~7月にEスポで6mのDXが騒がしく、30-40-80mのダイポールでもEUが聞こえていたので、「おー、6mも出れるようにしなきゃ!」と以前よりお願いしても中々来て貰えない整備点検も兼ねてFTIに注文しました。 当然、シーズンに間に合うわけは無く、9月に入ってやっと雨の合間をぬって実施して貰いました。

市販のアンテナは、無調整でもほとんど問題なく希望の周波数に同調しており、ほんとに簡単ですね。 他のアンテナに対しても、特に影響も無く、全て正常に稼働し、また、タワーの昇降時の音が大分静かになったのはありがたい。 

全部のアンテナの同調点をシャックからnanoVNAで確認してみましたが、案の定80mダイポールは、温度かテンションか少し伸びて同調点が下がってましたので、20cm(15cm+5cm)程切り詰めて、3.53Mhzに中心周波数が来るように微調整。

備忘録として、本日のnanovna-saverの測定データ(80,40,30,6m)を添付。




 



2021年9月9日木曜日

Stepper Motor Driver の問題解決

2~3年前秋月にコパルのSPG27-1101が安価で出ていたので、使い道も考えずに纏め買いして、ジャンクボックスの肥しになっていました。 で、バタフライバリコンでこれを使ってリモートで、と当然考え、これのドライバをESP8266とDRV8835で作ってみました。

SPG27のスペックシートを見ると12Vでの動作が出ていたので、つい「12Vで動かす必要がある」と思い込んでいましたが、DRV8835のVMmaxが12Vです。 気にしないで、12V加えていましたが、 突然動かなくなって、ESP8266もUSB入力を受け付けなくなってしまうものが幾つか出てきました(壊れている!)。

回路はいたって簡単で、外部からDC電源を供給して、内部で3.3VのVccをICに供給、モーターには外部からのDCを供給するようになっています。

壊れそうなところは無いので、最初原因が分からず色々考えていましたが、DRV8835のVM maxが一番怪しい!という事で、電圧を5V位まで落としてみましたが、StepperMotorはちゃんと動いてくれます(トルクが少し落ちているかもしれませんが)。 また、動かなくなることも今のところないようなので、結論として、12Vが拙かった!  

ちょっとした勘違いで、可愛そうなESP8288とDRV8835を幾つかお見送りしてしまいました。Amen...

SPG27-1101は基本ステップ角度3°で、これに5:1のギアでMLAのバタフライバリコンを動かしています(0.6°/step)が、100pF程度のバタフライバリコンだと、まだ粗い感じがあります。 

マルチバンドのMLAの場合は、多分、固定コンデンサと小容量のバタフライバリコンの組み合わせ、等を考える必要があるのでしょうね。 この時、固定コンデンサの切り替えをリレーで行うとすると数十Aの高周波電流を許容するリレーをどうするか?が問題になりそう。

備忘録としてfritzingのBreadboardとPCBのコピー、それにsketchを添付しておきます。

 

 

 

 

 

 

 

  1.  

     

     

     

     

     //  For use of DRV8835+SPG27-1101

  2. //  Author  Ken Yamada, JA2IYJ

  3. //  WeMos D1 mini

  4. //  Date:  2019 July 3rd. V0.5 Initial version.

  5. //              July 11th V1.0 Zero_sensor added and bandled to the workable protype hardware.

  6. //         2020 Nov. 11 v2.0  MAX_sensor added.  

  7. //         2021 Apr. 23 Modified for Butterfly Capacitor ... No need of Max/Min Stopper.

  8. //         2021 May. 19  EEPROM.write/read/commit added to set initial and current Position.

  9. //         2021 Sept. 3  Changed Up/Dwn/Init pin to reflect PCB alignment.  Motor runs at 5V.

  10. //                       Above 11V, DRV8835 might die and kills ESP8266 too.

  11. //

  12. #include <Stepper.h>

  13. #include <EEPROM.h>

  14. #include <ESP8266WiFi.h>

  15. #define EEPROM_SIZE 2  // sizeof(int)=2 byte.

  16. #define TRUE 1

  17. #define FALSE 0

  18. #define MOTOR_1 16 //15  DRV8825のピン配置に合わせて変更 5/22

  19. #define MOTOR_2 14 //12

  20. #define MOTOR_3 12 //13

  21. #define MOTOR_4 13 //14

  22. // digital address それぞれをボタンにアサイン

  23. #define UP_BUTTON 0 // 黄色

  24. #define DOWN_BUTTON 4 // 白

  25. #define INIT_BUTTON 2 // Position 0 setting (GPIO16 has a built-in pull-down resistor.)

  26. #define STEPS_PER_REV 120  // SPG27-1101 specification

  27. #define MAX_POS 155 // 90deg/3deg step, 5:1 gear = 30 x 5 + α

  28. // stepPerRotate は素のモーターの一回転当たりのstep数の様です(ギアの事汎用では顧慮できないもんね)

  29. //const int stepsPerRotate = 20;// SPG20-1332ス テップ数 = 480 ギア比1:24 hence 20

  30. const int stepsPerRotate = 12;// SPG27-1101 ステップ数 = 120 ギア比1:5 hence 24 でも12でないと動かない! 何故?

  31. int curPosition;

  32. int initPosition;

  33. boolean toggle1 = FALSE;

  34. boolean toggle2 = FALSE;

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

  36. void setup(){

  37.   Serial.begin(115200);

  38.   Serial.println("\n Setup ...");

  39.   // WiFiを使用しないので、省電力化の為に下の3行

  40.   WiFi.mode(WIFI_OFF);

  41.   WiFi.forceSleepBegin();

  42.   delay(1);

  43.  

  44.  //EPROM.begin(EEPROM_SIZE);

  45. //initPosition = EEPROM.read(0);

  46. //curPosition = initPosition;

  47.   Serial.print("\n curPosition = ");

  48.   Serial.println( curPosition );

  49.   pinMode(UP_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High

  50.   pinMode(DOWN_BUTTON, INPUT_PULLUP); // 手動制御用のUp/Down ボタン High

  51.   pinMode(INIT_BUTTON, INPUT_PULLUP);  // One time.

  52.   myStepper.setSpeed(2000); // 2500位まではOKの様です。

  53.   //myStepper.setSpeed(50); // make it slow

  54.   Serial.println("\n  End of Setup ...");

  55. }

  56. void loop(){

  57.   Serial.println(" Start Loop ---");

  58.   //  初期設定の時に容量最大値の位置を0に設定する。

  59.   #if 0

  60.   if( digitalRead(INIT_BUTTON) == LOW) {

  61.     EEPROM.begin(EEPROM_SIZE);

  62.     EEPROM.write(0, 0);

  63.     EEPROM.commit();

  64.     Serial.println( " Wrote EEPROM -> 0 ");

  65.     delay(500);

  66.   }

  67.   #endif

  68.   // Up button

  69.   if( digitalRead(UP_BUTTON) == LOW ){

  70.     Serial.println("Up button 1");

  71. //  while( digitalRead(UP_BUTTON) == LOW && toggle1 == TRUE && curPosition < MAX_POS){

  72.     while( digitalRead(UP_BUTTON) == LOW ){

  73.       myStepper.step(1);

  74.       curPosition++;

  75.       yield();    // Soft WDT reset が出ない様にするため。

  76.       delay(50);

  77.     }

  78.   }

  79.   // Down button

  80.   if ( digitalRead(DOWN_BUTTON) == LOW ){

  81.     Serial.println("Down button 1");

  82. //  while( digitalRead(DOWN_BUTTON) == LOW && toggle2 == TRUE && curPosition > 0 ){

  83.     while( digitalRead(DOWN_BUTTON) == LOW ){

  84.       myStepper.step(-1);

  85.       curPosition--;

  86.       yield();    // Soft WDT reset が出ない様にするため。

  87.       delay(50);

  88.     }

  89.   }

  90.   stopMotor();

  91.   #if 0

  92.   if (curPosition != initPosition ){

  93.      EEPROM.write(0, curPosition);

  94.      EEPROM.commit();

  95.      initPosition = curPosition;

  96.      Serial.print( "Save curPosition = ");

  97.      Serial.println( curPosition );

  98.   }

  99.   delay(10);

  100.   #endif

  101.   Serial.println("  End of Main loop ...");  

  102.   delay(10);

  103. }

  104. void stopMotor() {

  105.   digitalWrite(MOTOR_1, LOW);

  106.   digitalWrite(MOTOR_2, LOW);

  107.   digitalWrite(MOTOR_3, LOW);

  108.   digitalWrite(MOTOR_4, LOW);

  109. }  

  110. #if 0

  111. int moveAbsPos2(long pos){

  112.   if (pos < maxPosition) {

  113.     myStepper.step(currentPosition - pos);

  114.     currentPosition = pos;

  115.   } else {

  116.     return -1;

  117.   }

  118.  

  119. }

  120. int incrementPosBy(long pos){

  121.   if (currentPosition + pos < maxPosition) {

  122.     myStepper.step(pos);

  123.     currentPosition = currentPosition+pos;

  124.   } else {

  125.     return -1;

  126.   }

  127. }

  128. int decrementPosby(long pos){

  129.   if (currentPosition - pos > 0 ){

  130.     myStepper.step(-pos);

  131.     currentPosition = currentPosition - pos;

  132.   } else {

  133.     return -1;

  134.   }

  135. }

  136. #endif

  137.  

 

 

RM Noise

最近Galaxyの携帯のCMで風のノイズ除去をしているシーンが気になっていて、「AIで処理すれば、ノイズ除去性能は上がるのでは?」なんて思いながら、 AIのopen source?の Hagging face をブラブラしていましたら、何故かFacebookで RM noize ...