Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige ÜberarbeitungLetzte ÜberarbeitungBeide Seiten, nächste Überarbeitung | ||
projekte:magloop-dl2ab [26/04/2023 22:05] – angelegt danielwf | projekte:magloop-dl2ab [05/06/2023 23:14] – danielwf | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== MagLoop ====== | + | ====== MagLoop |
- | Bauvorschlag von DL2AB | + | **Bauvorschlag von Daniel |
- | mit Schrittmotoransteuerung und Steuerung über DC-Speiseweiche | + | |
+ | Eines vorweg: MagLoops sind Kompromiss-, | ||
+ | Aber im gestörtem Umfeld können diese aufgrund ihrer Schmalbandigkeit verhindern, dass Empfänger mit Störungen zugstopft werden oder es zu unerwünschten Intermodulationen am Empfängereingang kommt. \\ Dazu lösen Sie auch ein Platzproblem bei vielen Funkamateuren, | ||
+ | Zur Berechnung von Strahler und Drehkondensatoren gibt es einige Rechner im Netz. Ein hilfreiches Tool ist diese Webseite von VK3CPU: https:// | ||
+ | \\ | ||
+ | Schnell wird man jedoch über die Fernabstimmung des Drehkondensators über einen Motor stolpern. In der Vergangenheit habe ich von einer Bluetooth-Steuerung über eine WLAN-Anbindung mit einem ESP32 bis zu langen Steuerleitungen einiges ausprobiert. Einige dieser Lösungen, die im Netz leicht zu finden sind, werden für viele Funkamateure auch gut funktionieren. Bei mir sind Bluetooth- und WLAN-Verbindungen jedoch eher wackelig und zudem auch etwas nervig, weshalb ich bei meiner letzten Loop den Motor am Drekondensator mit 20m-langen Telefonkabel angesteuert habe. Nur ist auch das alles andere praktisch, wenn man z.B. die Antenne woanders aufbauen möchte. \\ \\ | ||
+ | Der untenstehende Bauvorschlag verwendet zur Fernsteuerung eines Schrittmotors nur das bereits vorhandene Koaxkabel zur Antenne. \\ | ||
+ | Dazu wird je nach gewünschter Drehrichtung eine andere Spannung über eine DC-Weiche auf das HF-Signal gelegt. \\ | ||
+ | * Die Fernsteuerung besteht hier nur aus einem Spannungswandler, | ||
+ | * In der Steuereinheit wird hinter einer gleichen Fernspeiseweiche die gegebene DC-Spannung über einen Arduino in Schritte für einen Schrittmotor verwandelt, der wiederum zweimal im Verhältnis 60:20 untersetzt ist und im Vollschritt gefahren wird. Sollten durch den Arduino Störungen empfangen werden, lässt sich die Steuereinheit über die Fernbedienung abschalten, ohne den Drehkondensator zu verstimmen. \\ | ||
+ | * Als Antriebsmotor arbeitet hier ein Schrittmotor " | ||
+ | \\ Hier sind ein paar Bilder von meinem ersten Aufbau (links Fernsteuerung, | ||
+ | {{: | ||
+ | \\ | ||
+ | **[[https:// | ||
+ | Beide Schaltungen lassen sich leicht auf Lochrasterplatinen aufbauen. Beim Bau der Fernspeiseweiche sollte diese jedoch eine eigene Schirmung erhalten. \\ | ||
+ | Die Schaltungen sind auf diesem Schaltplan zusammengefasst (Klicken für größere Ansicht): \\ | ||
+ | {{ : | ||
+ | Arduino-Code: | ||
+ | Wie immer eine kurze Warnung vorab: ich bin kein Programmierer und es gibt die ein oder andere Stelle, die man noch verbessern könnte. Auch wenn der Code gut funktioniert, | ||
+ | //Benutzung auf eigene Gefahr, ich übernehme keine Haftung bei Schäden durch Benutzung oben stehender Schaltung und untenstehendem Code!// | ||
+ | |||
+ | <code c> | ||
+ | // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. | ||
+ | // | MagLoop-Stepper with DC-feeder | ||
+ | // ' | ||
+ | // by Daniel Wendt-Fröhlich, | ||
+ | // | ||
+ | // | ||
+ | |||
+ | // Source Motorcontrol: | ||
+ | |||
+ | // Configuration: | ||
+ | #define WAIT_TIME 500 // time between fine step and continous drive | ||
+ | #define FINESTEPS_LEFT 10 // motor steps for left fine step | ||
+ | #define FINESTEPS_RIGHT 20 // motor steps for right fine step | ||
+ | |||
+ | // Connections: | ||
+ | #define STEPPER_PIN_1 8 // Connections for stepper motor driver ULN2003 | ||
+ | #define STEPPER_PIN_2 9 | ||
+ | #define STEPPER_PIN_3 10 | ||
+ | #define STEPPER_PIN_4 11 | ||
+ | #define VOLT_PIN A2 // Connection for voltage sensing, for up to 15V: VCC--[Resistor 2.2k]--AnalogIn--[Resistor 1.0K]--GND | ||
+ | |||
+ | //Voltage Levels (max Voltage per Button x 100) | ||
+ | //Example: 12V(VCC) -- 10V(Level1) -- Button1 -- 9V(Level2) -- Button 2 -- 8V(Level3) -- Button 1+2 -- 7V(Level4) | ||
+ | // Use Serial Monitor at 9600 to read the ADC-Levels for different buttons | ||
+ | #define VOLTAGE_LEVEL_1 1000 | ||
+ | #define VOLTAGE_LEVEL_2 900 | ||
+ | #define VOLTAGE_LEVEL_3 800 | ||
+ | #define VOLTAGE_LEVEL_4 700 | ||
+ | |||
+ | |||
+ | byte step_number = 0; | ||
+ | byte button = 0; | ||
+ | byte old_button = 0; | ||
+ | unsigned long button_time = 0; | ||
+ | unsigned long debounce_time = 0; | ||
+ | unsigned long serial_time = 0; | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(STEPPER_PIN_1, | ||
+ | pinMode(STEPPER_PIN_2, | ||
+ | pinMode(STEPPER_PIN_3, | ||
+ | pinMode(STEPPER_PIN_4, | ||
+ | analogReadResolution(10); | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | |||
+ | buttonRead(); | ||
+ | |||
+ | if (old_button != button) { | ||
+ | button_time = millis() + WAIT_TIME; | ||
+ | if (button == 0) { | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | if (old_button != 0) { | ||
+ | digitalWrite(VOLT_PIN, | ||
+ | delay(20); | ||
+ | digitalWrite(VOLT_PIN, | ||
+ | } | ||
+ | } | ||
+ | if (button == 1) { | ||
+ | for (int i=0; i < FINESTEPS_LEFT; | ||
+ | OneStep(false); | ||
+ | delay(30); | ||
+ | } | ||
+ | } | ||
+ | if (button == 2) { | ||
+ | for (int i=0; i < FINESTEPS_RIGHT; | ||
+ | OneStep(true); | ||
+ | delay(30); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if ( (millis() > button_time) && (old_button == button) ) { | ||
+ | if (button == 0) { | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | if (old_button != 0) { | ||
+ | digitalWrite(VOLT_PIN, | ||
+ | delay(20); | ||
+ | digitalWrite(VOLT_PIN, | ||
+ | } | ||
+ | } | ||
+ | if (button == 1) { | ||
+ | OneStep(false); | ||
+ | delay(2); | ||
+ | } | ||
+ | if (button == 2) { | ||
+ | OneStep(true); | ||
+ | delay(2); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | void buttonRead() { | ||
+ | old_button = button; | ||
+ | int button_voltage = analogRead(VOLT_PIN) * 1.562; | ||
+ | byte button_temp = 0; | ||
+ | if ( ( button_voltage > VOLTAGE_LEVEL_1 ) || ( button_voltage < VOLTAGE_LEVEL_4 ) ) button_temp = 0; | ||
+ | if ( ( button_voltage <= VOLTAGE_LEVEL_1 ) && ( button_voltage > VOLTAGE_LEVEL_2 ) ) button_temp = 1; | ||
+ | if ( ( button_voltage <= VOLTAGE_LEVEL_2 ) && ( button_voltage > VOLTAGE_LEVEL_3 ) ) button_temp = 2; | ||
+ | if ( ( button_voltage <= VOLTAGE_LEVEL_3 ) && ( button_voltage > VOLTAGE_LEVEL_4 ) ) button_temp = 3; | ||
+ | if ( (button_temp != button) && (millis() < debounce_time) ) debounce_time = millis() + 2000; | ||
+ | if ( (millis() >= debounce_time) && (button_temp != button) ) button = button_temp; | ||
+ | |||
+ | if ( millis() >= serial_time ) { | ||
+ | Serial.print(button_voltage); | ||
+ | Serial.print(" | ||
+ | Serial.println(button); | ||
+ | serial_time = millis() + 500; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void OneStep(bool dir){ | ||
+ | if(dir){ | ||
+ | switch(step_number){ | ||
+ | case 0: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 1: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 2: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 3: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | } | ||
+ | }else{ | ||
+ | switch(step_number){ | ||
+ | case 0: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 1: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 2: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | break; | ||
+ | case 3: | ||
+ | digitalWrite(STEPPER_PIN_1, | ||
+ | digitalWrite(STEPPER_PIN_2, | ||
+ | digitalWrite(STEPPER_PIN_3, | ||
+ | digitalWrite(STEPPER_PIN_4, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | step_number++; | ||
+ | if(step_number > 3){ | ||
+ | step_number = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
- | (Beschreibung, | ||