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();
}