3#include "TinyRobotics/motors/Motors.h"
6namespace tinyrobotics {
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
30 MotorBoat() =
default;
33
34
35
36
37
38
39 void setPins(
int in1,
int in2,
int rudderPin) {
40 motor_.setPins(in1, in2);
41 rudder_.attach(rudderPin);
45
46
47
48
54
55
57 motor_.setSpeedPercent(percent);
59 Message<
float> msg(MessageContent::MotorSpeed, percent, Unit::Percent);
60 msg.origin = MessageOrigin::Vehicle;
61 Vehicle<T>::sendMessage(msg);
65
66
68 rudder_.setAngle(angle);
70 Message<
float> msg(MessageContent::SteeringAngle, angle, Unit::AngleDegree);
71 msg.origin = MessageOrigin::Vehicle;
72 Vehicle<T>::sendMessage(msg);
75 void setRudder(
Angle angle){
76 setRudder(
static_cast<
int>(angle.getValue(
AngleUnit::DEG)));
80 motor_.setSpeedPercent(0);
83 for (
auto& motor : getMotors()) {
89 bool isPinsSet()
const {
return motor_.isPinsSet() && rudder_.isPinsSet(); }
93 switch (msg.content) {
94 case MessageContent::Throttle:
95 if (msg.unit != Unit::Percent)
return false;
96 setThrottle(
static_cast<
int>(msg.value));
98 case MessageContent::SteeringAngle:
100 if (!toAngleDegree(angle, msg.unit, angle))
102 setRudder(
static_cast<
int>(msg.value));
104 case MessageContent::Obstacle:
105 Vehicle<T>::setSpeedFactor(0);
112 std::vector<MessageContent> getControls()
const override {
113 return {MessageContent::Throttle, MessageContent::SteeringAngle};
116 MotorMT& getMotor() {
return motor_; }
118 ServoMT& getServo() {
return rudder_; }
120 std::vector<IMotor<T>*> getMotors()
override {
121 std::vector<IMotor<T>*> motors;
122 motors.push_back(&motor_);
123 motors.push_back(&rudder_);
Represents an angle with unit conversion and wrap-around support.
Definition: Angle.h:42
High-level H-Bridge motor driver class for bidirectional DC motor control.
Definition: BrushedMotor.h:36
Motor boat with 1 drive motor and 1 rudder servo.
Definition: MotorBoat.h:28
void setSpeed(float percent)
Set the speed as a percentage (-100 to 100). Positive = forward. This applies the speed scaling facto...
Definition: MotorBoat.h:49
void setThrottle(float percent)
Set throttle (percent, -100 to 100). Positive = forward.
Definition: MotorBoat.h:56
void setRudder(float angle)
Set rudder angle (degrees, left positive, right negative).
Definition: MotorBoat.h:67
void setPins(int in1, int in2, int rudderPin)
Set the pins for the drive motor and rudder servo.
Definition: MotorBoat.h:39
bool isPinsSet() const
Check if the necessary pins for the vehicle's actuators have been set (pure virtual).
Definition: MotorBoat.h:89
void end()
Reset the vehicle to a safe or neutral state (pure virtual).
Definition: MotorBoat.h:79
bool onMessage(const Message< float > &msg) override
Handle an incoming message (pure virtual).
Definition: MotorBoat.h:91
High-level wrapper for Arduino Servo control (RC servo motors).
Definition: ServoMotor.h:40
Abstract base class for all vehicle types.
Definition: Vehicle.h:26
AngleUnit
Supported angle units for conversion and representation.
Definition: Angle.h:11
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72