From f3a5b90d090fda687adad44e37200fa446fcf7e0 Mon Sep 17 00:00:00 2001 From: EnricoGuccii Date: Sun, 11 May 2025 19:11:37 +0200 Subject: add motors --- lib/motors/motors.cpp | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 lib/motors/motors.cpp (limited to 'lib/motors/motors.cpp') diff --git a/lib/motors/motors.cpp b/lib/motors/motors.cpp new file mode 100644 index 0000000..d0e71b4 --- /dev/null +++ b/lib/motors/motors.cpp @@ -0,0 +1,146 @@ +#include +#include "settings.h" +#include "motors.h" + +#define LEFT_CHANNEL 4 +#define RIGHT_CHANNEL 5 + +#define MOTOR_FREQ 5000 +#define MOTOR_RES 10 + +int MOTORS::scaleSpeed(int speed) +{ + return map(speed, 0, 100, 0, (1 << MOTOR_RES) - 1); +} + +MOTORS::MOTORS() +{ +} + +void MOTORS::stop() +{ + ledcWrite(LEFT_CHANNEL, 0); + ledcWrite(RIGHT_CHANNEL, 0); +} + +void MOTORS::leftStop() +{ + ledcWrite(LEFT_CHANNEL, 0); +} + +void MOTORS::rightStop() +{ + ledcWrite(RIGHT_CHANNEL, 0); +} + +void MOTORS::init() +{ + ledcSetup(RIGHT_CHANNEL, MOTOR_FREQ, MOTOR_RES); + ledcAttachPin(EN34, RIGHT_CHANNEL); + + ledcSetup(LEFT_CHANNEL, MOTOR_FREQ, MOTOR_RES); + ledcAttachPin(EN12, LEFT_CHANNEL); + + pinMode(IN1, OUTPUT); + pinMode(IN2, OUTPUT); + pinMode(IN3, OUTPUT); + pinMode(IN4, OUTPUT); +} + +void MOTORS::leftForward(int speed, int duration) +{ + digitalWrite(IN1, HIGH); + digitalWrite(IN2, LOW); + ledcWrite(LEFT_CHANNEL, scaleSpeed(speed)); + + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::leftBackward(int speed, int duration) +{ + digitalWrite(IN1, LOW); + digitalWrite(IN2, HIGH); + ledcWrite(LEFT_CHANNEL, scaleSpeed(speed)); + + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::rightForward(int speed, int duration) +{ + digitalWrite(IN3, HIGH); + digitalWrite(IN4, LOW); + ledcWrite(RIGHT_CHANNEL, scaleSpeed(speed)); + ledcWrite(LEFT_CHANNEL, 0); + + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::rightBackward(int speed, int duration) +{ + digitalWrite(IN3, LOW); + digitalWrite(IN4, HIGH); + ledcWrite(RIGHT_CHANNEL, scaleSpeed(speed)); + ledcWrite(LEFT_CHANNEL, 0); + + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::forward(int speed, int duration) +{ + rightForward(speed); + leftForward(speed); + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::backward(int speed, int duration) +{ + rightBackward(speed); + leftBackward(speed); + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::leftTurn(int speed, int duration) +{ + rightForward(speed); + leftBackward(speed); + if (duration > 0) + { + delay(duration); + stop(); + } +} + +void MOTORS::rightTurn(int speed, int duration) +{ + rightBackward(speed); + leftForward(speed); + if (duration > 0) + { + delay(duration); + stop(); + } +} \ No newline at end of file -- cgit v1.2.3