wpi-32u4-library
Chassis.cpp
Go to the documentation of this file.
1#include <Chassis.h>
2
13void Chassis::init(void)
14{
16
17 // temporarily turn off interrupts while we set the time up
18 noInterrupts();
19
20 // sets up timer 4 for a 16 ms loop, which triggers the motor PID controller
21 // dt = 1024 (prescaler) * (249 + 1) / 16E6 (clock speed) = 16 ms
22 TCCR4A = 0x00; //disable some functionality
23 TCCR4B = 0x0B; //sets the prescaler to 1024
24 TCCR4C = 0x00; //disable outputs (overridden for the servo class)
25 TCCR4D = 0x00; //fast PWM mode (for servo)
26
27 OCR4C = 249; //TOP goes in OCR4C
28
29 TIMSK4 = 0x04; //enable overflow interrupt
30
31 // re-enable interrupts
32 interrupts();
33}
34
35void Chassis::setMotorPIDcoeffs(float kp, float ki)
36{
39}
40
41
46void Chassis::idle(void)
47{
48 setMotorEfforts(0, 0);
49}
50
54void Chassis::setMotorEfforts(int leftEffort, int rightEffort)
55{
56 leftMotor.setMotorEffort(leftEffort);
57 rightMotor.setMotorEffort(rightEffort);
58}
59
60void Chassis::setWheelSpeeds(float leftSpeed, float rightSpeed)
61{
62 int16_t leftTicksPerInterval = (leftSpeed * (ctrlIntervalMS / 1000.0)) / cmPerEncoderTick;
63 int16_t rightTicksPerInterval = (rightSpeed * (ctrlIntervalMS / 1000.0)) / cmPerEncoderTick;
64
65 leftMotor.setTargetSpeed(leftTicksPerInterval);
66 rightMotor.setTargetSpeed(rightTicksPerInterval);
67}
68
69
70void Chassis::setTwist(float forwardSpeed, float turningSpeed)
71{
72 int16_t ticksPerIntervalFwd = (forwardSpeed * (ctrlIntervalMS / 1000.0)) / cmPerEncoderTick;
73 int16_t ticksPerIntervalTurn = (robotRadius * 3.14 / 180.0) *
74 (turningSpeed * (ctrlIntervalMS / 1000.0)) / cmPerEncoderTick;
75
76 leftMotor.setTargetSpeed(ticksPerIntervalFwd - ticksPerIntervalTurn);
77 rightMotor.setTargetSpeed(ticksPerIntervalFwd + ticksPerIntervalTurn);
78}
79
80void Chassis::driveFor(float forwardDistance, float forwardSpeed, bool block)
81{
82 // ensure the speed and distance are in the same direction
83 forwardSpeed = forwardDistance > 0 ? fabs(forwardSpeed) : -fabs(forwardSpeed);
84 setTwist(forwardSpeed, 0); //sets the speeds
85
86 // calculate the total motion in encoder ticks
87 int16_t delta = forwardDistance / cmPerEncoderTick;
88
89 // set both wheels to move the same amount
90 leftMotor.moveFor(delta);
91 rightMotor.moveFor(delta);
92
93 if(block)
94 {
95 while(!checkMotionComplete()) {delay(1);}
96 }
97}
98
99void Chassis::turnFor(float turnAngle, float turningSpeed, bool block)
100{
101 // ensure angle and speed are in the same direction
102 turningSpeed = turnAngle > 0 ? fabs(turningSpeed) : -fabs(turningSpeed);
103 setTwist(0, turningSpeed);
104
105 // calculate the total motion in encoder ticks
106 int16_t delta = turnAngle * (robotRadius * 3.14 / 180.0) / cmPerEncoderTick;
107
108 // set wheels to drive in opposite directions
109 leftMotor.moveFor(-delta);
110 rightMotor.moveFor(delta);
111
112 if(block)
113 {
114 while(!checkMotionComplete()) {delay(1);}
115 }
116}
117
119{
120 bool complete = leftMotor.checkComplete() && rightMotor.checkComplete();
121 return complete;
122}
123
130ISR(TIMER4_OVF_vect)
131{
133}
134
136{
139
142}
143
145{
146 Serial.print(leftMotor.speed);
147 Serial.print('\t');
148 Serial.print(rightMotor.speed);
149 Serial.print('\n');
150}
151
153{
154 Serial.print(leftMotor.getCount());
155 Serial.print('\t');
156 Serial.print(rightMotor.getCount());
157 Serial.print('\n');
158}
ISR(TIMER4_OVF_vect)
Definition: Chassis.cpp:130
Chassis chassis
void idle(void)
Idles chassis. Motors will stop.
Definition: Chassis.cpp:46
const uint16_t ctrlIntervalMS
Definition: Chassis.h:27
const float cmPerEncoderTick
Definition: Chassis.h:25
void turnFor(float turnAngle, float turningSpeed, bool block=false)
Commands the chassis to turn a set angle.
Definition: Chassis.cpp:99
void updateEncoderDeltas()
Definition: Chassis.cpp:135
void init(void)
Initializes the chassis. Must be called in setup().
Definition: Chassis.cpp:13
void printSpeeds(void)
Definition: Chassis.cpp:144
LeftMotor leftMotor
Definition: Chassis.h:21
void driveFor(float forwardDistance, float forwardSpeed, bool block=false)
Commands the robot to drive at a distance and speed.
Definition: Chassis.cpp:80
bool checkMotionComplete(void)
Checks if the motion commanded by driveFor() or turnFor() is done.
Definition: Chassis.cpp:118
void setTwist(float forwardSpeed, float turningSpeed)
Sets target motion for the chassis.
Definition: Chassis.cpp:70
void setMotorEfforts(int leftEffort, int rightEffort)
Sets motor efforts. Max speed is 420.
Definition: Chassis.cpp:54
void printEncoderCounts(void)
Definition: Chassis.cpp:152
void setMotorPIDcoeffs(float kp, float ki)
Sets PID coefficients for the motors. Not independent.
Definition: Chassis.cpp:35
const float robotRadius
Definition: Chassis.h:26
void setWheelSpeeds(float leftSpeed, float rightSpeed)
Sets target wheel speeds in cm/sec.
Definition: Chassis.cpp:60
RightMotor rightMotor
Definition: Chassis.h:22
void setMotorEffort(int16_t effort)
void setMotorEffort(int16_t effort)
void setTargetSpeed(float targetSpeed)
int16_t getCount(void)
void calcEncoderDelta(void)
bool checkComplete(void)
volatile int16_t speed
void setPIDCoeffients(float kp, float ki)
static void init()
void update(void)
void moveFor(int16_t amount)