Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Servo mbed-rtos Motor
Diff: main.cpp
- Revision:
- 4:22910b683dea
- Parent:
- 2:3d1a5025c32a
- Child:
- 6:0597a4ac4696
diff -r 3d1a5025c32a -r 22910b683dea main.cpp
--- a/main.cpp Mon Apr 27 01:25:01 2020 +0000
+++ b/main.cpp Mon Apr 27 02:44:10 2020 +0000
@@ -11,24 +11,20 @@
Servo topServo(p25);
Servo bottomServo(p26);
-
-volatile float topServoPos = 0.0;
-volatile float bottomServoPos = 0.0;
-volatile float leftMotorSpeed = 0.0;
-volatile float rightMotorSpeed = 0.0;
volatile int xpadState = 0; //left-right Dpad
volatile int ypadState = 0; //up-down Dpad
volatile int leftJoystickState = 0;
volatile int rightJoystickState = 0;
-volatile int leftEncoderCount = 0;
+volatile int leftEncoderCount = 0; //keep track of encoder ticks
volatile int rightEncoderCount = 0;
-volatile bool interruptAttached = false;
+//increment left encoder counts
void LeftCount()
{
leftEncoderCount = leftEncoderCount + 1;
}
+//increment right encoder counts
void RightCount()
{
rightEncoderCount = rightEncoderCount + 1;
@@ -37,23 +33,27 @@
//rotate the pan/tilt servos
void RotateServos()
{
- if(xpadState == 1)
+ float topServoPos = 0.0;
+ float bottomServoPos = 0.0;
+
+ while(1){
+ if(xpadState == 1) //pan right
{
bottomServoPos = bottomServoPos + 0.05;
if(bottomServoPos > 1.0) bottomServoPos = 1.0;
}
- else if(xpadState == -1)
+ else if(xpadState == -1) //pan left
{
bottomServoPos = bottomServoPos - 0.05;
if(bottomServoPos < 0.0) bottomServoPos = 0.0;
}
- if(ypadState == 1)
+ if(ypadState == 1) //tilt up
{
topServoPos = topServoPos + 0.05;
if(topServoPos > 1.0) topServoPos = 1.0;
}
- else if(xpadState == -1)
+ else if(ypadState == -1) //tilt down
{
topServoPos = topServoPos - 0.05;
if(topServoPos < 0.0) topServoPos = 0.0;
@@ -62,16 +62,38 @@
topServo = topServoPos;
bottomServo = bottomServoPos;
Thread::wait(150);
+ }
}
//Sets and keeps motor speed matched using encoder output
void SpeedBalance()
{
+ bool interruptAttached = false; //flag indicating whether encoders are being counted
+ bool speedSet = false; //flag indicating if the inial motor speed has been set
+
+ //used when speed adjusting using encoders
+ float leftMotorSpeed = 0.0;
+ float rightMotorSpeed = 0.0;
+
+ int encoderCountDifference = 0;
+ int countDifferenceTolerance = 2; //How many counts difference between encoders is allowed
+
+ while(1){
if(leftJoystickState != 0 && rightJoystickState != 0 && leftJoystickState == rightJoystickState) //only need to match speeds if they're moving in same direction
{
+ if(speedSet == false) //set motor speed initally
+ {
+ leftMotorSpeed = leftJoystickState;
+ rightMotorSpeed = rightJoystickState;
+ speedSet = true;
+ }
+
+ //set motor speed using variable rather than joystick state, because joystick is read-only
leftMotor.speed(leftMotorSpeed);
rightMotor.speed(rightMotorSpeed);
+
+ //start counting encoders if not already
if(interruptAttached == false)
{
leftEncoder.fall(&LeftCount);
@@ -79,24 +101,45 @@
interruptAttached = true;
}
- if(leftEncoderCount > rightEncoderCount)
+ encoderCountDifference = leftEncoderCount - rightEncoderCount;
+ if(encoderCountDifference > countDifferenceTolerance) //if left encoder counted more, left motor is faster
{
- leftMotor.speed(leftMotor.ReadSpeed() - 0.01);
- leftEncoderCount = 0;
+ //add or subtract motor speed, depending on if its positive or negative
+ if(leftMotorSpeed < 0){
+ leftMotorSpeed = leftMotorSpeed + 0.01;
+ leftMotor.speed(leftMotorSpeed);
+ }
+ else if(leftMotorSpeed > 0){
+ leftMotorSpeed = leftMotorSpeed - 0.01;
+ leftMotor.speed(leftMotorSpeed);
+ }
+ leftEncoderCount = 0; //reset encoder counts
rightEncoderCount = 0;
}
- else if(leftEncoderCount < rightEncoderCount)
+ else if(encoderCountDifference < (-1 * countDifferenceTolerance)) //if left encoder counted less, right motor is faster
{
- rightMotor.speed(rightMotor.ReadSpeed() - 0.01);
- leftEncoderCount = 0;
+ //add or subtract motor speed, depending on if its positive or negative
+ if(leftMotorSpeed < 0){
+ rightMotorSpeed = rightMotorSpeed + 0.01;
+ rightMotor.speed(leftMotorSpeed);
+ }
+ else if(leftMotorSpeed > 0){
+ rightMotorSpeed = rightMotorSpeed - 0.01;
+ rightMotor.speed(leftMotorSpeed);
+ }
+ leftEncoderCount = 0; //reset encoder counts
rightEncoderCount = 0;
}
else Thread::yield(); //if counts are same, nothing left to do
}
- else //stop counting encoders when motor speeds unequal
+ else //The case where joysticks arent in the same direction
{
+ //set motors using joystick states, since motor speed wont need to be dynamically changed in this case
leftMotor.speed(leftJoystickState);
rightMotor.speed(rightJoystickState);
+ speedSet = false;
+
+ //Stop counting encoders because they aren't being used
if(interruptAttached == true)
{
leftEncoder.fall(NULL);
@@ -106,6 +149,7 @@
rightEncoderCount = 0;
}
}
+ }
}
int main()
@@ -121,46 +165,46 @@
{
if(pi.readable()) //check if new command from pi available
{
- if (pi.getc() == '!' ) {
+ if (pi.getc() == '!' ) { //look for dpad update
servoNum = pi.getc();
- if (servoNum == '0') {
+ if (servoNum == '0') { //dpad released
xpadState = 0;
ypadState = 0;
}
- else if (servoNum == '1') {
+ else if (servoNum == '1') { //dpad left
xpadState = -1;
}
- else if (servoNum == '2') {
+ else if (servoNum == '2') { //dpad right
xpadState = 1;
}
- else if (servoNum == '3') {
+ else if (servoNum == '3') { //dpad up
ypadState = 1;
}
- else if (servoNum == '4') {
+ else if (servoNum == '4') { //dpad down
ypadState = -1;
}
}
- else if (pi.getc() == '(') {
+ else if (pi.getc() == '(') { //look for left joystick update
leftMotNum = pi.getc();
- if (leftMotNum == '0') {
+ if (leftMotNum == '0') { //joystick center
leftJoystickState = 0;
}
- else if (leftMotNum == '1') {
+ else if (leftMotNum == '1') { //joystick up
leftJoystickState = 1;
}
- else if (leftMotNum == '2') {
+ else if (leftMotNum == '2') { //joystick down
leftJoystickState = -1;
}
}
- else if (pi.getc() == ')' ) {
+ else if (pi.getc() == ')' ) { //look for right joystick update
rightMotNum = pi.getc();
- if (rightMotNum == '0') {
+ if (rightMotNum == '0') { //joystick center
rightJoystickState = 0;
}
- else if (rightMotNum == '1') {
+ else if (rightMotNum == '1') { //joystick up
rightJoystickState = 1;
}
- else if (rightMotNum == '2') {
+ else if (rightMotNum == '2') { //joystick down
rightJoystickState = -1;
}
}