custom tank controls

id like to use an arduino uno to rc a prevously wire controlled tank
using a 3ch pistol rc controller (futaba 3pl)
ch1 = steering
ch2 = throttle
ch3 (high/low pwm control) = to betwen track control and turret move (ch1) with cannon/machine gun shoot sounds (ch2)

is it possible?

i know it takes 2 pwm out to run each dc motor
will take 3 dc motors and a speaker output

basic program layout

callout the motor and speaker pinouts, and rc radio pwm receiver inputs
and track steer rate and throttle rate and turret steer rate

loop

when ch3 > 128 (drive mode)

track motor right pos = (thr+steer-128)/2
track motor right neg = -(thr+steer-128)/2

track motor right pos = (thr-steer-128)/2
track motor right neg = -(thr-steer-128)/2

turret motor pos = 0
turret motor neg = 0

speaker out = 0

when ch3 < 128 (turret control mode)

track motor right pos = 0
track motor right neg = 0

track motor right pos = 0
track motor right neg = 0

turret motor pos = steerturret steer rate
turret motor neg = -steer
turret steer rate

when thr > 192 = cannon shoot sound
when thr < 64 = machine gun shoot sound

other ideas welcome

thanks in advance

If you look at the schematic of the Arduino motorshield, you can see that that only needs one PWM output and one 'normal' output to control one motor (both forward and backward).

ok, so using one of these i could control all 3 dc motors and a speaker

Motor Drive Expansion Shield Board L293D For Arduino

First decide how much power you need the 'drivers' to deliver (see specification of your motors).

Further I will not buy stuff that does not has a schematics accompanying the product; but that is just me.

motors are 2x 260 size for tracks
and 1x 280 for turret

shouldnt need much

speaker is 8ohm

what i have so far that works in serial monitor

5v leds hooked up to digital 5-12

3ch reciever connected to power/ground and analog pins 2 (steering), 3 (throttle), 4 (2pos switch)

i found output values are 1000-2000 with 1500 on center for steering and throttle
and ch3 (2pos switch) is 1000 and 2000 for low/high and 0 when the controller is off

// volatile int temp_pwm_value0 = 0;
// volatile int temp_pwm_value1 = 0;
// volatile int prev_time0 = 0;
// volatile int prev_time1 = 0;
byte PWM_PIN2 = A2; // ch1 radio steer
byte PWM_PIN3 = A3; // ch2 radio throttle
byte PWM_PIN4 = A4; // ch3 radio switch
byte led5 = 5; // power on
byte led6 = 6; // turret right
byte led7 = 7; // turret neutral
byte led8 = 8; // turret left
byte led9 = 9; // machinegun sound
byte led10 = 10; // no sound
byte led11 = 11; // cannon sound
byte led12 = 12; // ch3 high_low
int left_speed = 100;
int right_speed = 100;
int turret_speed = 100;
int right_dir = 0;
int left_dir = 0;
int turret_dir = 0;
int steer_rate = 50; // in %
int throttle_rate = 100; // in %
int turret_rate = 100; // in %
int pwm_value0 = 0;
int pwm_value1 = 0;
int pwm_value2 = 0;



void setup() {
Serial.begin(250000);
//attachInterrupt(0, rising0, RISING);
//attachInterrupt(1, rising1, RISING);
pinMode(PWM_PIN2, INPUT); // ch1 radio
pinMode(PWM_PIN3, INPUT); // ch2 radio
pinMode(PWM_PIN4, INPUT); // ch3 radio
pinMode(led5, OUTPUT); // power on
pinMode(led6, OUTPUT); // turret right
pinMode(led7, OUTPUT); // turret neutral
pinMode(led8, OUTPUT); // turret left
pinMode(led9, OUTPUT); // machinegun sound
pinMode(led10, OUTPUT); // no sound
pinMode(led11, OUTPUT); // cannon sound
pinMode(led12, OUTPUT); // ch3 high_low
// pinMode(led13, OUTPUT);

}

void loop() {

//pwm_value0 = temp_pwm_value0;
//pwm_value1 = temp_pwm_value1;
pwm_value0 = pulseIn(PWM_PIN2, HIGH) ;
pwm_value1 = pulseIn(PWM_PIN3, HIGH) ;
pwm_value2 = pulseIn(PWM_PIN4, HIGH) ;

// Serial.print("value0 ");
// Serial.print(pwm_value0);
// Serial.print(", value1 ");
// Serial.print(pwm_value1);
// Serial.print(", value2 ");
// Serial.println(pwm_value2);


if (pwm_value2 < 50 || pwm_value1 < 50 || pwm_value0 < 50) // check for low radio values
{
digitalWrite(led5, LOW); // power off
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
digitalWrite(led9, LOW);
digitalWrite(led10, LOW);
digitalWrite(led11, LOW);
digitalWrite(led12, LOW); // ch3 high_low

Serial.println("controller off");

}
else if (pwm_value2 > 1550) //              begin steer and throttle control
{

digitalWrite(led5, HIGH); // power on
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
digitalWrite(led9, LOW);
digitalWrite(led10, LOW);
digitalWrite(led11, LOW);
digitalWrite(led12, HIGH); // ch3 high

left_speed = ((pwm_value1 - 1500) / 2 * ((float)throttle_rate / 100)) - ((pwm_value0 - 1500) / 2 * ((float)steer_rate / 100)); 
right_speed = ((pwm_value1 - 1500) / 2 * ((float)throttle_rate / 100)) + ((pwm_value0 - 1500) / 2 * ((float)steer_rate / 100));

if (left_speed > 255) left_speed = 255;
if (left_speed < -255) left_speed = -255;
if (right_speed > 255) right_speed = 255;
if (right_speed < -255) right_speed = -255;


// Serial.print("left track ");
// Serial.print(left_speed);
// Serial.print(", right track ");
// Serial.print(right_speed);
// Serial.println();

if (left_speed < -25) // Left move check
{
digitalWrite(led6, LOW); // left track reverse
digitalWrite(led7, LOW); // left track neutral
digitalWrite(led8, HIGH); // left track forward
Serial.print("left track forward ");
Serial.print(left_speed);
}
else if (left_speed > 25)
{
digitalWrite(led6, HIGH); // left track reverse
digitalWrite(led7, LOW); // left track neutral
digitalWrite(led8, LOW); // left track forward
Serial.print("left track reverse ");
Serial.print(left_speed);
}
else
{
digitalWrite(led6, LOW); // left track reverse
digitalWrite(led7, HIGH); // left track neutral
digitalWrite(led8, LOW); // left track forward
Serial.print("left track stop ");
Serial.print(left_speed);
}

if (right_speed < -25) // right move check
{
digitalWrite(led9, LOW); // right track reverse
digitalWrite(led10, LOW); // right track neutral
digitalWrite(led11, HIGH); // right track forward
Serial.print(", right track forward ");
Serial.println(right_speed);
}
else if (right_speed > 25)
{
digitalWrite(led9, HIGH); // right track reverse
digitalWrite(led10, LOW); // right track neutral
digitalWrite(led11, LOW); // right track forward
Serial.print(", right track reverse ");
Serial.println(right_speed);
}
else
{
digitalWrite(led9, LOW); // right track reverse
digitalWrite(led10, HIGH); // right track neutral
digitalWrite(led11, LOW); // right track forward
Serial.print(", right track stop ");
Serial.println(right_speed);
}



} //                                        end steer and throttle control
else //                                     begin shoot and turret commands
{
digitalWrite(led5, HIGH); // power on
digitalWrite(led12, LOW); // ch3 low

turret_speed = (pwm_value0 - 1500) / 2 * ((float)turret_rate / 100);
if (turret_speed > 255) turret_speed = 255;
if (turret_speed < -255) turret_speed = -255;


if (turret_speed < -25) // turret move check
{
digitalWrite(led6, LOW); // turret right
digitalWrite(led7, LOW); // turret neutral
digitalWrite(led8, HIGH); // turret left
Serial.print("turret turn left ");
Serial.println(turret_speed);
}
else if (turret_speed > 25)
{
digitalWrite(led6, HIGH); // turret right
digitalWrite(led7, LOW); // turret neutral
digitalWrite(led8, LOW); // turret left
Serial.print("turret turn right ");
Serial.println(turret_speed);
}
else
{
digitalWrite(led6, LOW); // turret right
digitalWrite(led7, HIGH); // turret neutral
digitalWrite(led8, LOW); // turret left
Serial.print("turret stop ");
Serial.println(turret_speed);
}



if (pwm_value1 < 1450) // sound check
{
digitalWrite(led9, HIGH); // throttle forward
digitalWrite(led10, LOW); // throttle neutral
digitalWrite(led11, LOW); // throttle reverse
Serial.println ("Machinegun Sound");
}
else if (pwm_value1 > 1550)
{
digitalWrite(led9, LOW); // throttle forward
digitalWrite(led10, LOW); // throttle neutral
digitalWrite(led11, HIGH); // throttle reverse
Serial.println ("Cannon Sound");
}
else
{
digitalWrite(led9, LOW); // throttle forward
digitalWrite(led10, HIGH); // throttle neutral
digitalWrite(led11, LOW); // throttle reverse
}


} //                                                        end shoot and turret commands

} // end void loop

just waiting on the motor shield and how to connect it to the pins and controls

update

after lots of playing around i got it working
using 2x L298N driver boards, 1 for tracks, 1 for turret and speaker

track kit
http://www.ebay.com/itm/272134426526?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

turret was from an old wird tank and 8ohm speaker

just need to hardwire it and stuff all the components into the tank chassis and get the battery for the tank

and added low voltage alarm for 2cell lipo
using 2x 100k resistors
+battery == 100k resistor == pin a0 == 100k resistor == gnd

#include <PCM.h>

const unsigned char gun[] PROGMEM = {
// gun
130, 126, 136, 135 // snip
};
const unsigned char cannon[] PROGMEM = {
// cannon
117, 126, 140, 151, // snip
};
const unsigned char dead[] PROGMEM = {
// dead
119, 105, 88, 88, // snip
};



byte PWM_PIN2 = A2; // ch1 radio steer
byte PWM_PIN3 = A3; // ch2 radio throttle
byte PWM_PIN4 = A4; // ch3 radio switch

int left_speed = 0;
int right_speed = 0;
int turret_speed = 0;
int right_dir = 0;
int left_dir = 0;
int turret_dir = 0;
int steer_rate = 60; // in %
int throttle_rate = 117; // in %
int turret_rate = 125; // in %
int pwm_value0 = 0;
int pwm_value1 = 0;
int pwm_value2 = 0;

int trackmla = 3; // forward
int trackmlb = 4; // back
int trackmls = 5; // pwm 5,6

int trackmra = 8; // forward
int trackmrb = 7; // back
int trackmrs = 6; // pwm

int turretma = 9; // left
int turretmb = 10; // right
int turretms = 6; // pwm

int bvoltain = 0; // reading
int bvolt0d = 0;  // value for 0v
int bvolt5d = 1023;  // value for 5v
float bvolt5v = 4.98;  // measured voltage from arduino regulator
float bvoltmin = 3.20; // volts
int bvoltinmin = ((bvolt5d-bvolt0d) * (float) bvoltmin/bvolt5v)+bvolt0d;

void setup() {

Serial.begin(250000);
pinMode(PWM_PIN2, INPUT); // ch1 radio
pinMode(PWM_PIN3, INPUT); // ch2 radio
pinMode(PWM_PIN4, INPUT); // ch3 radio

pinMode (trackmla, OUTPUT); // forward
pinMode (trackmlb, OUTPUT); // back
pinMode (trackmls, OUTPUT); // pwm

pinMode (trackmra, OUTPUT); // forward
pinMode (trackmrb, OUTPUT); // back
pinMode (trackmrs, OUTPUT); // pwm

pinMode (turretma, OUTPUT); // left
pinMode (turretmb, OUTPUT); // right
pinMode (turretms, OUTPUT); // pwm


}

void loop() {

pwm_value0 = pulseIn(PWM_PIN2, HIGH) ;
pwm_value1 = pulseIn(PWM_PIN3, HIGH) ;
pwm_value2 = pulseIn(PWM_PIN4, HIGH) ;
bvoltain = analogRead(A0);

Serial.print("min voltage value ");
Serial.print(bvoltinmin);
Serial.print(", voltage reading ");
Serial.println(bvoltain);



if (pwm_value2 < 50 || pwm_value1 < 50 || pwm_value0 < 50 || bvoltain <= bvoltinmin )  // check for low radio values and voltage
{
digitalWrite (trackmla, HIGH); // forward
digitalWrite (trackmlb, HIGH); // back
digitalWrite (trackmls, LOW); // pwm

digitalWrite (trackmra, HIGH); // forward
digitalWrite (trackmrb, HIGH); // back
digitalWrite (trackmrs, LOW); // pwm

digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (turretms, LOW); // pwm


if (bvoltain <= bvoltinmin )  // check for low radio values and voltage
{
Serial.println("low voltage");
    startPlayback(dead, sizeof(dead));
   delay(1000); // 500

}
else
{
Serial.println("controller off");
}
}

else if (pwm_value2 > 1550) //              begin steer and throttle control
{

// controller on

left_speed = ((pwm_value1 - 1500) / 2 * ((float)throttle_rate / 100)) - ((pwm_value0 - 1500) / 2 * ((float)steer_rate / 100)); 
right_speed = ((pwm_value1 - 1500) / 2 * ((float)throttle_rate / 100)) + ((pwm_value0 - 1500) / 2 * ((float)steer_rate / 100));

if (left_speed > 255) left_speed = 255;
if (left_speed < -255) left_speed = -255;
if (right_speed > 255) right_speed = 255;
if (right_speed < -255) right_speed = -255;


// Serial.print("left track ");
// Serial.print(left_speed);
// Serial.print(", right track ");
// Serial.print(right_speed);
// Serial.println();

if (left_speed < -25) // Left move check
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right  
digitalWrite (trackmla, LOW); // forward
digitalWrite (trackmlb, HIGH); // back
analogWrite (trackmls, -left_speed); // pwm
Serial.print("left track forward ");
Serial.print(left_speed);
}
else if (left_speed > 25)
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (trackmla, HIGH); // forward
digitalWrite (trackmlb, LOW); // back
analogWrite (trackmls, left_speed); // pwm
Serial.print("left track reverse ");
Serial.print(left_speed);
}
else
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (trackmla, HIGH); // forward
digitalWrite (trackmlb, HIGH); // back
digitalWrite (trackmls, LOW); // pwm
Serial.print("left track stop ");
Serial.print(left_speed);
}

if (right_speed < -25) // right move check
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (trackmra, LOW); // forward
digitalWrite (trackmrb, HIGH); // back
analogWrite (trackmrs, -right_speed); // pwm
Serial.print(", right track forward ");
Serial.println(right_speed);
}
else if (right_speed > 25)
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (trackmra, HIGH); // forward
digitalWrite (trackmrb, LOW); // back
analogWrite (trackmrs, right_speed); // pwm
Serial.print(", right track reverse ");
Serial.println(right_speed);
}
else
{
digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (trackmra, HIGH); // forward
digitalWrite (trackmrb, HIGH); // back
digitalWrite (trackmrs, LOW); // pwm
Serial.print(", right track stop ");
Serial.println(right_speed);
}



} //                                        end steer and throttle control
else //                                     begin shoot and turret commands
{
// digitalWrite(led5, HIGH); // power on
// digitalWrite(led12, LOW); // ch3 low  stop tracks

digitalWrite (trackmra, HIGH); // forward
digitalWrite (trackmrb, HIGH); // back
//digitalWrite (trackmrs, LOW); // pwm

digitalWrite (trackmla, HIGH); // forward
digitalWrite (trackmlb, HIGH); // back
digitalWrite (trackmls, LOW); // pwm



turret_speed = (pwm_value0 - 1500) / 2 * ((float)turret_rate / 100);
if (turret_speed > 255) turret_speed = 255;
if (turret_speed < -255) turret_speed = -255;


if (pwm_value1 < 1400) // sound check
{

digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (turretms, LOW); // pwm
Serial.print ("Machinegun Sound ");
Serial.println (pwm_value1);
    startPlayback(gun, sizeof(gun));
   delay(490); //236

}
else if (pwm_value1 > 1600)
{

digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (turretms, LOW); // pwm
Serial.print ("Cannon Sound ");
Serial.println (pwm_value1);
    startPlayback(cannon, sizeof(cannon));
   delay(1950); // 1925-1935

}
else
{
// no sounds check for turret move

if (turret_speed < -25) // turret move check
{

digitalWrite (turretma, LOW); // left
digitalWrite (turretmb, HIGH); // right
analogWrite (turretms, -turret_speed); // pwm
Serial.print("turret turn left ");
Serial.println(turret_speed);
}
else if (turret_speed > 25)
{

digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, LOW); // right
analogWrite (turretms, turret_speed); // pwm
Serial.print("turret turn right ");
Serial.println(turret_speed);
}
else
{

digitalWrite (turretma, HIGH); // left
digitalWrite (turretmb, HIGH); // right
digitalWrite (turretms, LOW); // pwm
Serial.print("turret stop ");
Serial.println(turret_speed);
}

}


} //                                                        end shoot and turret commands

} // end void loop