Turret control - SergeGit/rc-tank-platform GitHub Wiki

Turret rotation setup

  • Turret rotation motor

Code

Turret_control.ino

/*******************************************************************************
   THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTY AND SUPPORT
   IS APPLICABLE TO THIS SOFTWARE IN ANY FORM. CYTRON TECHNOLOGIES SHALL NOT,
   IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR CONSEQUENTIAL
   DAMAGES, FOR ANY REASON WHATSOEVER.
 ********************************************************************************
   DESCRIPTION:
   This code shows how to drive 2 motors using 2 PWM pins (2 for each motor) and
   4 digital inputs with the L293D motor driver.
   The turret rotation/elevation output is fed by varying size battery. 
   Output max voltage = (battery voltage - 1.5V|2.0V).

   CONNECTIONS (Arduino nano v3 - Atmega328P, old bootloader):

   Arduino D5   - L293D (enA) - rotation
   Arduino D2   - L293D (in1) - rotation
   Arduino D4   - L293D (in2) - rotation
   Arduino D6   - L293D (enB) - elevation
   Arduino D7   - L293D (in3) - elevation
   Arduino D8   - L293D (in4) - elevation
 *******************************************************************************/

// Configure the motor drive for driving the Turret DC motors
// Motor A - Turret rotation connections
const int enA = 5;
const int in1 = 2;
const int in2 = 4;
// Motor B - Turret elevation connections
const int enB = 6;
const int in3 = 7;
const int in4 = 8;

// Parameters
const int turret_deadzone = 20;       // Deadzone for control input of -20 and 20 is stop
//int turretRot_SpeedThreshold = 255;    // PWM range 0-255 to full battery voltage. Turret motor has max voltage = 4V

// Function to set up motor control pins
void setup_Turret_ctrl() {

  // Set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}


// Function to calculate the turret PWM speed based on input via joystick/i2c
void turretSpd_ctrl(int joystickX, int joystickY) {

  // Convert i2c pulse input to turret PWM value (-255 to 255)
  joystickY = turret_pulseToPWM(-joystickY);  //motorspeed is inverse
  joystickX = turret_pulseToPWM(joystickX);   //left right :: -100 - 100

  // Turret motor (Rotation / elevation)
  turretDrive(joystickX, joystickY);
}


// Function to drive the turret motors with speed input as PWM signal
void turretDrive(int speed_x, int speed_y) {

  // Limit PWM speed to MIN/MAX motor voltage
  speed_x = constrain(speed_x, -(turret_SpeedThreshold), turret_SpeedThreshold);
  speed_y = constrain(speed_y, -(turret_SpeedThreshold), turret_SpeedThreshold);

  // Set direction for Turret rotation
  if ( speed_x == 0 ) {
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	Serial.println("Rotate turret - stop ");
  } else if ( speed_x > 0 ) {
	digitalWrite(in1, HIGH);
	digitalWrite(in2, LOW);
	Serial.println("Rotate turret - right");
  } else {
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	Serial.println("Rotate turret - left");
  }

  // Set direction for Turret elevation
  if ( speed_y == 0 ) {
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
	// Serial.println("Elevate turret - stop ");
  } else if ( speed_y > 0 ) {
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	// Serial.println("Elevate turret - up ");
  } else {
	digitalWrite(in3, HIGH);
	digitalWrite(in4, LOW);
	// Serial.println("Elevate turret - down ");
  }

  // Set speed Turret rotate & elevate
  analogWrite(enA, abs(speed_x));
  analogWrite(enB, abs(speed_y));

  // Print output speeds of turret
  // Serial.print("Turret rotation: ");
  // Serial.println(speed_y);

  // Serial.print("Turret elevation: ");
  // Serial.println(speed_y);
}


// Convert controller input pulse value [-100,100] to motor PWM value [-255,255]
int turret_pulseToPWM(int pulse) {

  // Map value from controller input range to Motor speed range
  // pulse = map(pulse, -100, 100, turret_SpeedThreshold * -1, turret_SpeedThreshold);
  pulse = map(pulse, -100, 100, -255, 255);

  // Low speeds in deadzone should be seen as stop for the motor
  if ( abs(pulse) <= turret_deadzone ) {
    pulse = 0;
  }

  return pulse;
}

Test code

Test_main.ino

/*******************************************************************************
   THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTY AND SUPPORT
   IS APPLICABLE TO THIS SOFTWARE IN ANY FORM. CYTRON TECHNOLOGIES SHALL NOT,
   IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR CONSEQUENTIAL
   DAMAGES, FOR ANY REASON WHATSOEVER.
 ********************************************************************************
   DESCRIPTION:
   This is the test code for testing the Turret control function.
   The function shows how to set up turret control and use the functions for movement.
   **Please note that the battery voltage is assumed 11.1V**

   CONNECTIONS (Arduino nano v3 - Atmega328P, old bootloader):
 *******************************************************************************/

// Keyboard 456-258 for turret control
#define TURRET_LEFT '4'
#define TURRET_STOP '5'
#define TURRET_RIGHT '6'
#define TURRET_UP '8'
#define TURRET_DOWN '2'

// parameters
int turret_SpeedThreshold = 115;      // PMW_max = 255 * (Vmotor_max/(Vbat-1.5V|2.0V)) = 255*(4V/(11.1V-1.5V))

// Initialisation
void setup() {
  Serial.begin(9600);
  
  turret_SpeedThreshold = 115;      // Set calculated value speed threshold if battery voltage is known!
  setup_Turret_ctrl();              // Setting up motor control L253D for Turret rotate and elevate 
}

void loop() {
  char byte = 0;
  // press q to cancel and exit
  while (byte != 'z') {
    Serial.readBytes(&byte, 1);

    // TURRET MOVEMENT VIA KEYBOARD CONTROL  
    // -----------------------------------
    // press 5 to stop turret
    if (byte == TURRET_STOP) {

      //Set Turret speed
      Serial.print("Turret stop \n");
      turretSpd_ctrl(0, 0);
      byte = 0;
    }

    // press 4 to move turret left
    if (byte == TURRET_LEFT) {

      //Set Turret speed
      Serial.print("Turret move left \n");
      turretSpd_ctrl(-100, 0);
      byte = 0;
    }

    // press 6 to move turret right
    if (byte == TURRET_RIGHT) {

      //Set Turret speed
      Serial.print("Turret move right \n");
      turretSpd_ctrl(100, 0);
      byte = 0;
    }

    // press 8 to move turret up
    if (byte == TURRET_DOWN) {

      //Set Turret speed
      Serial.print("Turret move DOWN \n");
      turretSpd_ctrl(0, -100);
      byte = 0;
    }

    // press 2 to move turret up
    if (byte == TURRET_UP) {

      //Set Turret speed
      Serial.print("Turret move UP \n");
      turretSpd_ctrl(0, 100);
      byte = 0;
    }

  }
  Serial.print("Done \n");
  Serial.end();
}