diff --git a/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp b/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f04749a69e19f1a3d0010f004c6b88d76cbf5aa1 --- /dev/null +++ b/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp @@ -0,0 +1,134 @@ +#include <Arduino.h> + +static int en1 = 9; // Enable Pin 1 des L293D +static int in1 = 7; // Input Pin 1 des L293D +static int in2 = 6; // Input pin 2 des L293D + +static int button = 4; +static int potentiometer = A0; + +// 0.0 = DC-Motor steht, 5.0 = DC-Motor dreht mit voller Drehzahl +float sollSpeed = 0.0; +//true = Uhrzeigersinn, false = Gegenuhrzeigersinn +bool sollDirection = true; + +// Diese Funktion sendet das Geschwindigkeitssignal an den L293D. +// TODO: **OPTIONAL** +// Passe die Funktion setSpeed so an, dass die Geschwindigkeit +// des DC-Motors schrittweise erhöht, resp. verringert wird. +void setSpeed(float speed) +{ + // Map the potentiometer(value between 0 and 5V) to speed from 0 to 255 + int pwmOutput = (int)(speed * 255.0/5.0); + // Send PWM signal to L298N Enable pin + analogWrite(en1, pwmOutput); +} + +// TODO: Erstelle die Funktion "setDirection". +// Die Aufgabe dieser Funktion soll es sein, die Drehrichtung des +// DC-Motors der Ist-Drehrichtung (istDirection) anzupassen. +// Dazu müssen mit digitalWrite() +// (https://www.arduino.cc/reference/de/language/functions/digital-io/digitalwrite/) +// die richtigen Werte auf die Pins in1 und in2 des H-Brücken-Chips L293D +// (https://www.ti.com/lit/ds/symlink/l293.pdf) geschrieben werden. +// Input der Funktion: Ist-Drehrichtung als Boolean +// Rückgabe der Funktion: nichts +void setDirection(bool istDirection) { + if (istDirection) { + digitalWrite(in1, HIGH); + digitalWrite(in2, LOW); + } else { + digitalWrite(in1, LOW); + digitalWrite(in2, HIGH); + } +} + + +// TODO: Erstelle die Funktion "getIstSpeed". +// Die Aufgabe dieser Funktion ist es, die am Potentiometer eingestellte +// Geschwindigkeit als Wert zwischen 0 und 5 zurückzugeben. +// Dazu muss das analoge Signal des Potentiometer mit analogRead() +// (https://www.arduino.cc/reference/de/language/functions/analog-io/analogread/) +// eingelesen werden. Das analoge Signal des Potentiometer liegt im Bereich +// zwischen 0 und 1023. Für die Weiterverarbeitung des Signals ist es notwendig, +// dass die Funktion aber nur einen Bereich von 0.0 bis 5.0 zurückgibt. +// Wird vom Potentiometer also das analoge Signal 1023 ausgelesen, muss die +// Funktion den Wert 5.00 zurückgeben, bei 341 den Wert 1.67, usw. +// Input der Funktion: nichts +// Rückgabe der Funktion: Ist-Geschwindigkeit im Bereich von 0.00 bis 5.00 als +// Float auf zwei Nachkommastellen genasu. + +// Diese Funktion gibt die Ist-Drehrichtung zurück. +// true = Uhrzeigersinn, false = Gegenuhrzeigersinn +float getIstSpeed() { + int analogValue = analogRead(potentiometerPin); + float voltage = analogValue * (5.0 / 1023.0); + float speed = voltage; + speed = speed < 0.0 ? 0.0 : speed; + speed = speed > 5.0 ? 5.0 : speed; + return speed; +} + +bool getIstDirection() +{ + return digitalRead(button); +} + +// Diese Funktion erstellt eine neue Soll-Geschwindigkeit und Soll-Drehrichtung +// und gibt diese über den Serial Monitor aus. +void setNewTask() +{ + sollSpeed = 5 / 12.0 * (random(0, 1200) / 100); + sollDirection = random(100) > 50; + + Serial.print("Soll-Geschwindigkeit: "); + Serial.println(sollSpeed); + Serial.print("Soll-Drehrichtung: "); + if (sollDirection) + { + Serial.println("Uhrzeigersinn"); + } + else + { + Serial.println("Gegenuhrzeigersinn"); + } +} + +// Diese Funktion rundet die mitgegebene Floating-Zahl auf eine Nachkommastelle +// und gibt diese ebenfalls als Float zurück. +float roundFloat(float floatingNumber) +{ + return (long)(floatingNumber * 10L) / 10.0; +} + +// Diese Funktion wird vom Arduino beim Start als erstes ausgeführt. +void setup() +{ + Serial.begin(9600); + pinMode(en1, OUTPUT); + pinMode(in1, OUTPUT); + pinMode(in2, OUTPUT); + pinMode(button, INPUT); + pinMode(potentiometer, INPUT); + setNewTask(); +} + +// Nach der setup()-Funktion ruft das Arduino die loop()-Funktion auf. +// Diese Funktion ist eine Endlosschleife, die nach jedem Durchlauf +// erneut aufgerufen wird. +void loop() +{ + + // TODO: Auslesen der Ist-Geschwindigkeit und Ist-Richtung. + // Die erhaltene Werte sollen dann an setSpeed und setDirection weitergegeben werden. + + // TODO: Überprüfen ob die Soll-Bedingungen mit den Ist-Bedingungen übereinstimmen. + // Bei jedem Durchlauf der Loop-Funktion soll überprüft werden ob die aktuellen + // Ist-Werten den geforderten Soll-Werten entsprechen. Um bei der Geschwindigkeit + // kleine Abweichungen zu erlauben, können die Geschwindigkeits-Werte vor dem + // Vergleich mit der Funktion roundFloat() einzel gerundet werden. + // Stimmen die Drehrichtungen sowie die Geschwindigkeiten überein, soll dies mittels + // mySerial.println() + // (https://www.arduino.cc/reference/de/language/functions/communication/serial/println/) + // über den Serial Monitor ausgegeben werden und einen neuen Task erstellt werden. +}