Wie versorge ich einen 12V DCMotor mit einer externer Stromquelle?

Hey,

ich bin gerade dabei mir einen Motor zu bauen, der mir den Vorhang aufzieht. Dafür habe ich einen 12V DC Wurm-Motor geholt.
Bei meinem "Board Setup" muss ich das Arduino UNO board über den verfügbaren Stromanschluss mit einer 9V E-Block Batterie versorgen und den Motor auch.

Da ich aber keine Batterien verschwenden will, suche ich nach einer Alternative, wie ich das ganze powern kann. Leider kenne ich mich damit nicht wirklich gut aus.

Ich habe schon versucht die 9V Batterie für das Arduino Board, durch einen AC/AC Adapter zu ersetzen, ging leider so schief, dass das Board jetzt nicht mehr funktioniert :confused:

Der Adapter hat als Output angegeben: 18VAC und 500mA.
In anderen Foren habe ich gelesen, dass das Arduino Board nur so viel Strom zieht wie es braucht, also 5V und es deshalb egal ist wie hoch der Output ist.
Oder war damit was anderes gemeint :sweat_smile:?
(falls es eine Rolle spielt: der Input von dem Adapter war: 230-240VAC und 50Hz)

Worauf sollte ich achten wenn ich keine Batterien verwenden will? Wie gesagt, bin ich noch ein echter Noob und hab so gut wie keine Ahnung :confused:

Hier ist ein Bild von meinem Board Setup, falls es was nützt:

Und hier mein Code, wenn das auch eine Rolle spielt: (ich weiß dass das RTC überflüssig ist, wenn ich einen Lichtsensor habe und der Code so ist wie er ist. Ich war aber zu faul das zu ändern :drooling_face: :P)

#include <DS1307RTC.h>
#include <TimeLib.h>
#include <Wire.h>


int lightValue; // light sensor
int lightValueCheck;

const int sunrise = 6;
const int sunset = 21;

const int lightTolerance = 640;

const unsigned long SECOND = 1000;
const unsigned long MINUTE = 60 * SECOND;

const int motorA = 5; // motor
const int motorB = 6;
const int motorSpeed = 3;

const int buttonPin = 2;

int buttonState = 0;

unsigned long timeNow;
unsigned long waitTimeCount;

bool blinds_up = false;

void setup() {
    pinMode(motorA, OUTPUT);
    pinMode(motorB, OUTPUT);
    pinMode(buttonPin, INPUT_PULLUP);
    Serial.begin(9600);
    setSyncProvider(RTC.get);
    adjustTime(5);
}

void printDigits(int digits) {
    Serial.print(":");
    if(digits < 10)
        Serial.print('0');
    Serial.print(digits);
}

void digitalClockDisplay() {
    Serial.print(" - Time: ");
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.println(" ");
}

void roll_up() {
    Serial.print("--roll up--");
    digitalWrite(motorA, HIGH);
    digitalWrite(motorB, LOW);
    analogWrite(motorSpeed, 150);
    delay(1000);
    analogWrite(motorSpeed, 200);
    delay(1000);
    analogWrite(motorSpeed, 250);
    delay(25000);
    analogWrite(motorSpeed, 0);
    blinds_up = true;
    Serial.println(" | set to: true");
}

void roll_down() {
    Serial.print("--roll down--");
    digitalWrite(motorA, LOW);
    digitalWrite(motorB, HIGH);
    analogWrite(motorSpeed, 150);
    delay(1000);
    analogWrite(motorSpeed, 200);
    delay(1000);
    analogWrite(motorSpeed, 250);
    delay(10000);
    analogWrite(motorSpeed, 0);
    blinds_up = false;
    Serial.println(" | set to: false");
}

void roll_on_button_trigger() {
    buttonState = digitalRead(buttonPin);
    //Serial.println(buttonState);

    if (buttonState == 0) {
        if (blinds_up == false) {
            Serial.println("Button GATE 1");
            Serial.println("--Button: roll up--");
            roll_up();
        }
        else if (blinds_up == true) {
            Serial.println("Button GATE 2");
            Serial.println("--Button: roll down--");
            roll_down();
        }
    }
}

void delay2() {
    timeNow = millis();
    // delay
    while (millis() < (timeNow + 3 * MINUTE)) {
        waitTimeCount = millis();
        Serial.print("wait: ");
        Serial.print((waitTimeCount - timeNow) / 1000);
        Serial.print(" seconds/3 minutes");
        lightValueCheck = analogRead(A0);
        Serial.print(" - Light Value: ");
        Serial.println(lightValueCheck);
        roll_on_button_trigger();
        delay(1000);
    }
}

void delay1() {
    timeNow = millis();
    // delay
    while (millis() < (timeNow + 2 * MINUTE)) {
        waitTimeCount = millis();
        Serial.print("wait: ");
        Serial.print((waitTimeCount - timeNow) / 1000);
        Serial.print(" seconds/2 minutes");
        lightValueCheck = analogRead(A0);
        Serial.print(" - Light Value: ");
        Serial.println(lightValueCheck);
        roll_on_button_trigger();
        delay(1000);
    }
}

void roll_on_light_trigger() {
    timeNow = millis();
    waitTimeCount = millis();
    analogWrite(motorSpeed, 0);
    lightValue = analogRead(A0);
    Serial.print(" - Light Value 2: ");
    Serial.println(lightValue);
    if (lightValue < lightTolerance) { // bright
        if (blinds_up == false) {
            Serial.println("Check: false");
            roll_up(); // blinds_up set: true
        }
        else {
            Serial.println("Check passed");
        }
        while (lightValue < lightTolerance) { 
            digitalClockDisplay();
            analogWrite(motorSpeed, 0);
            delay1();
            lightValueCheck = analogRead(A0);
            Serial.print(" - Light Value Check: ");
            Serial.println(lightValueCheck);
            if (lightValueCheck >= lightTolerance) {
                Serial.println("Light Value changed");
                delay2();
            }
            lightValue = analogRead(A0);
            Serial.print(" - Light Value 4: ");
            Serial.println(lightValue);
        }
    }
    if (lightValue >= lightTolerance) { // dark
        if (blinds_up == true) {
            Serial.println("Check: true");
            roll_down(); // blinds_up set: false
        }
        else {
            Serial.println("Check passed");
        }
        while (lightValue >= lightTolerance) {
            digitalClockDisplay();
            analogWrite(motorSpeed, 0);
            delay1();
            lightValueCheck = analogRead(A0);
            Serial.print(" - Light Value Check: ");
            Serial.println(lightValueCheck);
            if (lightValueCheck < lightTolerance) {
                Serial.println("Light Value changed");
                delay2();
            }
            lightValue = analogRead(A0);
            Serial.print(" - Light Value 4: ");
            Serial.println(lightValue);
        }
    }
}


void loop() {
    lightValue = analogRead(A0);
    Serial.print(" - Light Value 1: ");
    Serial.println(lightValue);
    digitalClockDisplay();

    // day
    if ((hour() >= sunrise) && (hour() <= sunset)) {
        Serial.println("D-Gate 1");
        if (blinds_up == false) {
            Serial.println("D-Gate 2");
            roll_up(); // blinds_up = true
        }
        digitalClockDisplay();
        while ((hour() >= sunrise) && (hour() <= sunset)) {
            Serial.println("D-Gate 3");
            digitalClockDisplay();
            roll_on_light_trigger();
        }
    }

    // night
    if ((hour() <= sunrise) || (hour() >= sunset)) {
        Serial.println("N-Gate 1");
        if (blinds_up == true) {
            Serial.println("N-Gate 2");
            roll_down(); // blinds_up = false
        }
        digitalClockDisplay();
        while ((hour() <= sunrise) || (hour() >= sunset)) {
            Serial.println("N-Gate 3");
            digitalClockDisplay();
            roll_on_light_trigger();
        }
    }
}

Wenn beim Arduino oder beim Motor DC (Gleichstrom) angegeben ist, dann darf man dort keinen Wechselstrom (AC) einspeisen. Du brauchst also ein 12V DC Netzteil für den Motor.

9V Batterien sind ungeeignet zum Betrieb von Motoren, die sind in ein paar Minuten leergelutscht.

Für die Ansteuerung des Motors brauchst Du ein Motortreiber Modul, für 12V und mindestens so viel Strom wie der Motor braucht. Ein Transistor mit etwas Zubehör geht auch, ist für Dich aber jetzt noch etwas zu kompliziert.

y_u_y:
.....
Ich habe schon versucht die 9V Batterie für das Arduino Board, durch einen AC/AC Adapter zu ersetzen, ging leider so schief, dass das Board jetzt nicht mehr funktioniert :confused:

Das der Arduino kein AC (Wechselspannung) abkann, wurde dir ja schon geschrieben.
Das wird den gekillt haben.

Der Adapter hat als Output angegeben: 18VAC und 500mA.
In anderen Foren habe ich gelesen, dass das Arduino Board nur so viel Strom zieht wie es braucht, also 5V und es deshalb egal ist wie hoch der Output ist.
Oder war damit was anderes gemeint :sweat_smile:?

Das der Arduino den Strom nimmt, den er braucht, stimmt fast. Er muss den auch von der Quelle (Akku, Batterie oder Netzteil) geliefert bekommen. Strom ist A (Ampere).
Wenn die Quelle nicht mehr liefert, bekommt er auch nicht mehr.

Aber 5V ist Spannung und da musst du den max. Wert einhalten.
Der 5V Pin darf nur 5 Volt haben, mehr nicht.
Andere Spannungspins ähnlich.

Ausgenommen da ist ein Regler zwischen, da geht dann mehr. Hier das Datenblatt lesen.

(ich weiß dass das RTC überflüssig ist, wenn ich einen Lichtsensor habe

Nein, überflüssig ist eine RTC nicht. Da kann man dann noch schön Schaltzeiten mit einstellen.

Okay, vielen Dank für die Erklärungen! :grinning:
Ich glaube ich sollte mich da wirklich mehr reinlesen :sweat_smile:

Hallo Y_U_Y,

ich finde es klasse das du einfach mal probiert hast auch mit eher wenig Wissen. Die wichtigste Erkenntnis ist ja inzwischen rübergekommen. Erst sich die Grundlagen aneignen und dann erst ausprobieren.

Zu Elektronikgrundlagen gibt es natürlich eine Menge Internetseiten die das erklären wollen. 90% machen das aber eher schlecht und/oder schwer vertsändlich.

Ich habe dazu gegoogelt und folgende Seite gefunden
https://www.hobbyelektroniker.ch/grundlagen/stromkreis/

Die hat eine gute Mischung aus leicht verständlich erklären was für den Praktiker wichtig ist und nicht zu tief in die Theorie eintauchen.
Ich habe mir nicht alle aber einige Seiten angeschaut. Wie es der Zufall will erklärt sie auch noch am Arduino.
Also das passt richtig gut. Mit Hilfe von der Seite kriegst du das auch mit einem Transistor gebacken.
Je nachdem wie dick dein Geldbeutel ist, kannst du weitere Dinge gleich selbst ausprobieren oder wenn alles heile bleiben soll lieber noch einmal hier im Forum nachfragen.

viele Grüße Stefan