====== MagLoop mit DC-Fernsteuerung ====== **Bauvorschlag von Daniel DL2AB mit Schrittmotoransteuerung und Steuerung über DC-Speiseweiche** Eines vorweg: MagLoops sind Kompromiss-, keine Wunderantennen ;) \\ 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, denen immer häufiger nur der Balkon o.ä. für den Sendebetrieb bleibt. Leider ist das auch mit einem erheblich geringerem Wirkungsgrad verbunden, aber dennoch ist es oft erstaunlich, was man unter schwierigen Bedingungen mit diesen Antennen erreichen kann - selbst bei SSB-Sprechfunk. \\ Zur Berechnung von Strahler und Drehkondensatoren gibt es einige Rechner im Netz. Ein hilfreiches Tool ist diese Webseite von VK3CPU: https://miguelvaca.github.io/vk3cpu/magloop.html \\ \\ 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, diversen Widerständen und Kondensatoren sowie einer Fernspeiseweiche mit ein paar Windungen auf einem FT114-43. \\ * 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 "2BBYJ-4B" mit ULN2003-Treiberplatine. Diese sind überall günstig als Set zu bekommen. \\ Für die Untersetzung werden "GT2-Zahnriemenscheiben" mit 60, 40 und 20 Zähnen verwendet, die es ebenfall überall als Set gibt. Da die Zahnriemen einen Draht enthalten könnten, eignet sich ein 5mm-Acrylstab für die Verbindung zweier Zahnräder (siehe Bild). Je größer das Verhältnis zwischen den Räder ist, desto feiner ist die Abstimmung. Wie fein man diese auswählen möchte, ist einem selbst überlassen. \\ \\ Hier sind ein paar Bilder von meinem ersten Aufbau (links Fernsteuerung, mitte Steuereinheut mit Dreko-Motor, rechts Gesamtaufbau mit beklebtem Kunststoffring) :\\ {{:projekte:magloop2-dl2ab.jpg?200 |}}{{:projekte:magloop1-dl2ab.jpg?400|}} {{:projekte:magloop3-dl2ab.jpg?200|}}\\ \\ **[[https://wiki.funkfreun.de/_media/projekte/magloop-stepper.zip|Download Schaltplan und Arduino-Sketch]]** \\ 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): \\ {{ :projekte:mag-loop-dl2ab_circuit.png?direct&600 |}} \\ 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, bin ich für jeden Tipp per Mail an dl2ab@darc.de dankbar - man lernt ja schließlich nie aus ;) \\ //Benutzung auf eigene Gefahr, ich übernehme keine Haftung bei Schäden durch Benutzung oben stehender Schaltung und untenstehendem Code!// // .----------------------------------------------------------------------------------------------------------------------------------------------------------------. // | MagLoop-Stepper with DC-feeder | // '----------------------------------------------------------------------------------------------------------------------------------------------------------------' // by Daniel Wendt-Fröhlich, DL2AB (BugReports/Changes to danielwf@hackerspace-bremen.de, dl2ab@darc.de) for https://funkfreun.de // License CC-by-SA 3.0 - 02/2023-06/2023 - Bremen(GER) -- http://creativecommons.org/licenses/by-sa/3.0/de/ // Circuit and further informations: https://wiki.funkfreun.de/projekte/magloop-dl2ab // Source Motorcontrol: https://github.com/NikodemBartnik/ArduinoTutorials/tree/master/28BYJ-48 and https://www.roboter-bausatz.de/projekte/schrittmotor-mit-arduino-ansteuern // 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, OUTPUT); pinMode(STEPPER_PIN_2, OUTPUT); pinMode(STEPPER_PIN_3, OUTPUT); pinMode(STEPPER_PIN_4, OUTPUT); analogReadResolution(10); Serial.begin(9600); } void loop() { buttonRead(); if (old_button != button) { button_time = millis() + WAIT_TIME; if (button == 0) { digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); if (old_button != 0) { digitalWrite(VOLT_PIN, HIGH); delay(20); digitalWrite(VOLT_PIN, LOW); } } if (button == 1) { for (int i=0; i < FINESTEPS_LEFT; i++){ OneStep(false); delay(30); } } if (button == 2) { for (int i=0; i < FINESTEPS_RIGHT; i++){ OneStep(true); delay(30); } } } if ( (millis() > button_time) && (old_button == button) ) { if (button == 0) { digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); if (old_button != 0) { digitalWrite(VOLT_PIN, HIGH); delay(20); digitalWrite(VOLT_PIN, LOW); } } 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; //short for: 5V / 1024steps * 3,2KOhm(R1+R2) / 1KOhm(R2) * 100 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(" /100 V - Button pressed: "); Serial.println(button); serial_time = millis() + 500; } } void OneStep(bool dir){ if(dir){ switch(step_number){ case 0: digitalWrite(STEPPER_PIN_1, HIGH); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); break; case 1: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, HIGH); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); break; case 2: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, HIGH); digitalWrite(STEPPER_PIN_4, LOW); break; case 3: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, HIGH); break; } }else{ switch(step_number){ case 0: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, HIGH); break; case 1: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, HIGH); digitalWrite(STEPPER_PIN_4, LOW); break; case 2: digitalWrite(STEPPER_PIN_1, LOW); digitalWrite(STEPPER_PIN_2, HIGH); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); break; case 3: digitalWrite(STEPPER_PIN_1, HIGH); digitalWrite(STEPPER_PIN_2, LOW); digitalWrite(STEPPER_PIN_3, LOW); digitalWrite(STEPPER_PIN_4, LOW); } } step_number++; if(step_number > 3){ step_number = 0; } }