Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| projekte:magloop-dl2ab [05/06/2023 22:45] – danielwf | projekte:magloop-dl2ab [05/06/2023 23:19] (aktuell) – danielwf | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== MagLoop mit DC-Fernsteuerung ====== | ====== MagLoop mit DC-Fernsteuerung ====== | ||
| - | Bauvorschlag von DL2AB mit Schrittmotoransteuerung und Steuerung über DC-Speiseweiche | + | **Bauvorschlag von Daniel |
| Eines vorweg: MagLoops sind Kompromiss-, | Eines vorweg: MagLoops sind Kompromiss-, | ||
| Zeile 12: | Zeile 12: | ||
| * 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. \\ | * 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 " | * Als Antriebsmotor arbeitet hier ein Schrittmotor " | ||
| - | \\ Hier sind ein paar Bilder von meinem ersten Aufbau (links Fernsteuerung, | + | \\ 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; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||