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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||