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
26
27
28
29
30
31
32
50 motor_.setPins(in1, in2);
57 servos_[Rudder].setPin(pin);
58 servos_[Rudder].setID(
static_cast<uint8_t>(Rudder));
63 pins_[Elevator] = pin;
64 servos_[Elevator].setPin(pin);
65 servos_[Elevator].setID(
static_cast<uint8_t>(Elevator));
70 pins_[AileronLeft] = leftPin;
71 pins_[AileronRight] = rightPin;
72 servos_[AileronLeft].setPin(leftPin);
73 servos_[AileronRight].setPin(rightPin);
74 servos_[AileronLeft].setID(
static_cast<uint8_t>(AileronLeft));
75 servos_[AileronRight].setID(
static_cast<uint8_t>(AileronRight));
78 void setPinServo(ControlSurface surface,
int pin) {
79 if (surface >= 0 && surface < NumSurfaces) {
81 servos_[surface].setPin(pin);
82 servos_[surface].setID(
static_cast<uint8_t>(surface));
88 percent = constrain(percent, 0, 100);
89 motor_.setSpeedPercent(percent);
92 Message<
float> msg(MessageContent::MotorSpeed, percent, Unit::Percent);
93 msg.origin = MessageOrigin::Motor;
94 Vehicle<T>::sendMessage(msg);
99 servos_[Rudder].setAngle(angle);
101 Message<
float> msg(MessageContent::Yaw, angle, Unit::AngleDegree);
102 msg.origin = MessageOrigin::Rudder;
103 Vehicle<T>::sendMessage(msg);
108 servos_[Elevator].setAngle(angle);
110 Message<
float> msg(MessageContent::Pitch, angle, Unit::AngleDegree);
111 msg.origin = MessageOrigin::Elevator;
112 Vehicle<T>::sendMessage(msg);
117 servos_[AileronLeft].setAngle(leftAngle);
118 servos_[AileronRight].setAngle(rightAngle);
120 Message<
float> msgLeft(MessageContent::Roll, leftAngle, Unit::AngleDegree);
121 msgLeft.origin = MessageOrigin::Aileron;
122 msgLeft.origin_id = 0;
123 Vehicle<T>::sendMessage(msgLeft);
124 Message<
float> msgRight(MessageContent::Roll, rightAngle,
126 msgRight.origin = MessageOrigin::Aileron;
127 msgRight.origin_id = 1;
128 Vehicle<T>::sendMessage(msgRight);
138 for (
auto& motor : getMotors()) {
144 if (!motor_.isPinsSet())
return false;
145 for (
const auto& s : servos_) {
146 if (!s.isPinsSet())
return false;
162 switch (msg.content) {
163 case MessageContent::Throttle:
164 if (msg.unit != Unit::Percent)
return false;
165 setThrottle(
static_cast<
int>(msg.value));
167 case MessageContent::Pitch:
169 if (!toAngleDegree(angle, msg.unit, angle))
173 case MessageContent::Roll:
175 if (!toAngleDegree(angle, msg.unit, angle))
179 case MessageContent::Yaw:
181 if (!toAngleDegree(angle, msg.unit, angle))
190 std::vector<MessageContent> getControls()
const override {
191 return {MessageContent::Throttle, MessageContent::Pitch,
192 MessageContent::Roll, MessageContent::Yaw};
195 MotorMT& getMotor() {
return motor_; }
196 ServoMT& getServo(ControlSurface surface) {
return servos_[surface]; }
198 std::vector<IMotor<T>*> getMotors()
override {
199 std::vector<IMotor<T>*> motors;
200 motors.push_back(&motor_);
201 for (
auto& s : servos_) {
202 motors.push_back(&s);
Simple fixed-wing airplane model with motor, rudder, elevator, and aileron control.
Definition: AirPlane.h:35
void setPinsAilerons(int leftPin, int rightPin)
Definition: AirPlane.h:69
void setYaw(int angle)
Definition: AirPlane.h:158
void setPinElevator(int pin)
Definition: AirPlane.h:62
void setPitch(int angle)
Definition: AirPlane.h:152
void setPinsMotor(int in1, int in2)
Definition: AirPlane.h:49
void setAilerons(int leftAngle, int rightAngle)
Definition: AirPlane.h:116
void setElevator(int angle)
Definition: AirPlane.h:107
bool isPinsSet() const
Check if the necessary pins for the vehicle's actuators have been set (pure virtual).
Definition: AirPlane.h:143
void end()
Definition: AirPlane.h:132
bool onMessage(const Message< float > &msg) override
Handle an incoming message (pure virtual).
Definition: AirPlane.h:160
void setRudder(int angle)
Definition: AirPlane.h:98
void setPinRudder(int pin)
Definition: AirPlane.h:55
void setThrottle(int percent)
Definition: AirPlane.h:87
void setRoll(int angle)
Definition: AirPlane.h:155
High-level H-Bridge motor driver class for bidirectional DC motor control.
Definition: BrushedMotor.h:36
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
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72