AYUDA!!! hacer cambio secuencial en una caja de cambios automatica de un coche

Buenas tardes,

mi nombre es David y necesito hacer un sistema electronico relativamente simple y por lo visto con arduino se puede hacer, pero he estado buscando en la red y quiza se me presente complejo ante la falta total de conocimiento acerca de arduino y mi bajo conocimiento en electronica pura porque en electronica del automovil si que me defiendo ademas hay esquemas electricos de casi todo pero para esto no encuentro ningun esquema y por eso despues de intentar buscar en la red como podria hacer el esquema de la arduino y no obtener resultados estoy intentando en foros a ver si alguien puede ayudarme.

Tengo que hacer un circuito electrico para que la caja de cambios automatica de mi coche pueda convertirla a modo secuencial, externo a la arduino llevaria un interruptor de tres posiciones ON-OFF-ON en el que en una posicion ON pasaria 12v positivos al modulo que maneja el cambio en modo automatico y en la otra posicion ON en lugar de pasar corriente al modulo del cambio pasaria a traves del nuevo sistema electrico que iria conectado directamente a los solenoides de la caja de cambio y asi se usaria en modo secuencial. Para el funcionamiento en modo secuencial solo son necesarios dos cables a la caja de cambios automatica, el funcionamiento de la caja automatica es sencillo, lleva dos solenoides y segun tengan corriente positiva a 12v funciona en una marcha u otra, el funcionamiento es este, os lo indico en forma de tabla:

SOLENOIDE1 SOLENOIDE 2
1º MARCHA ON OFF
2º MARCHA ON ON
3º MARCHA OFF ON
4º MARCHA OFF OFF

En el link que os pongo mas abajo tambien bloquea el convertidor de par a traves de la arduino pero esto se puede hacer directo a traves de un interruptor asi que esa parte no me preocupa, solo la parte que atañe al modo secuencial.

Mi idea es que ante la dificultad de poner unas levas detras del volante como se utiliza en los coches que llevan cambio secuencial habia pensado usar un interruptor del tipo pulsador de los elevalunas electricos para poder subir o bajar marchas, por lo tanto lo que necesito es que al meter corriente a positiva a 12v al circuito en el modo secuencial a traves de la arduino pase corriente al solenoide 1 directamente, al pulsar una vez el boton del "elevalunas" hacia arriba pase a la posicion de segunda marcha y pase corriente a ambos solenoides, con una pulsacion mas hacia arriba pase a la posicion de tercera marcha y solo envie positivo al solenoide 2 y con una pulsacion mas pase a posicion de cuarta marcha y no envie ningun positivo. Y que pueda hacer lo mismo pero en sentido contrario al pulsar el boton del "elevalunas" hacia abajo y asi poder reducir marchas.

He encontrado en algun foro americano que este sistema lo han hecho con arduino UNO o con la arduino pro mini ademas pueden insertar un display que indica en que numero de marcha vas pero no he encontrado ningun esquema en el que se indique en que punto se debe soldar a la placa y si necesita añadirse alguna resistencia o alguna cosa de estas para que todo funcione perfectamente y esto es justamente lo que necesito un esquema de donde tengo que soldar el interruptor tipo elevalunas o el display por ejemplo porque la programacion si que la tengo y la añado al final. Ademas he visto que la arduino pro mini funciona a 5v pero no se si se puede hacer funcionar el sistema a 12v y encima no estables ya que los coches no estan estables a 12v o al menos hacer que saque corriente a 12v.

Este es uno de los links en los que aparece como han hecho el sistema electrico e incluso aparece la programacion necesaria para la arduino, la unica diferencia es que aqui han usado un mando tipo joystick y yo preferiria usar un interruptor tipo elevalunas o dos pulsadores directamente. Le he mandado varios privados a ver si pudiese pasarme el esquema electrico para la arduino pero no me responde.

Si pudieseis ayudarme para saber al menos donde tengo que conectar en la arduino los pulsadores, el display, la alimentacion de la arduino y si puede ser a 12v y saber cuales son las salidas que irian a los solenoides os estaria tremendamente agradecido, de verdad que siento las molestias pero ya no se a quien recurrir porque no conozco a nadie que pueda ayudarme con esto y esto esta empezando a convertirse en un reto para mi pero se me esta haciendo muy dificil entender el funcionamiento de la arduino sin tener ningun conocimiento sobre ella.

Muchas gracias a todos y aqui debajo os dejo la programacion y asi quiza entendais mejor lo que necesito y ademas quiza hasta os pueda interesar para otros proyectos vuestros. Saludos

Written by Fish, Logic by Big-G
*

  • Tiptronic gearbox controllor for Jeep AW4.
  • Changes up and down gears, provides torque conveter lockup and
  • a 7 segment led display readout of which gear you are in.

************************************************** *****************************/

// function prototypes
void power_up();
void power_down();
void chng_to( int );
void abend();
void flash_disp();
int get_gear();
void handle_event( int );
void tcu_ctrl( int );
void tcl_ctrl( int );

// Define our pins - modify to ease hardware layout

const int p_in_sol1 = A0;
const int p_in_sol2 = A1;
const int p_in_onoff = 2;
const int p_out_tcu = 3;
const int p_in_up = 4;
const int p_in_down = 5;
const int p_in_tcl = 6;
const int p_out_sol1 = 7;
const int p_out_sol2 = 8;
const int p_out_sol_tcl = 9;
const int p_out_leddp = 10;
const int p_out_led1 = 11;
const int p_out_led2 = 12;
const int p_out_led3 = 13;

// Events
const int ev_power_change = 1;
const int ev_changeup = 2;
const int ev_changedown = 3;
const int ev_tcl_change = 4;

// Other constants
const int boot_delay = 1000;
const int pwr_up_delay = 1000;
const long debounce_delay = 10;
const int tcl_delay = 250;
const int tcl_long_press = 2000;

// State variables
int running = 0;
int tcl_running = 0;
int current_gear = 0;
int current_up_state = 0;
int current_down_state = 0;
int current_on_state = 0;
int current_tcl_state = 0;
int last_up_state = 0;
int last_down_state = 0;
int last_on_state = 0;
int last_tcl_state = 0;
int last_tcl_on_time = 0;
int auto_tcl_mode = 0;

// switch debounce tracking
long last_debounce_time = 0;

void setup() {
// define pins as inputs or outputs
pinMode( p_in_sol1, INPUT );
pinMode( p_in_sol2, INPUT );
pinMode( p_in_onoff, INPUT );
pinMode( p_out_tcu, OUTPUT );
pinMode( p_in_up, INPUT );
pinMode( p_in_down, INPUT );
pinMode( p_in_tcl, INPUT );
pinMode( p_out_sol1, OUTPUT );
pinMode( p_out_sol2, OUTPUT );
pinMode( p_out_sol_tcl, OUTPUT );
pinMode( p_out_leddp, OUTPUT );
pinMode( p_out_led1, OUTPUT );
pinMode( p_out_led2, OUTPUT );
pinMode( p_out_led3, OUTPUT );

Serial.begin(9600);
Serial.print("Starting...\n");

// power-up steps
tcu_ctrl( 1 ); // turn on power to the TCU
delay( boot_delay ); // hang on a god-damned second
current_gear = get_gear();
}

void loop() {

int up_state = digitalRead( p_in_up );
int down_state = digitalRead( p_in_down );
int on_state = digitalRead( p_in_onoff );
int tcl_state = digitalRead( p_in_tcl );

if (
up_state != last_up_state
|| down_state != last_down_state
|| on_state != last_on_state
|| tcl_state != last_tcl_state
) {
last_debounce_time = millis();
}

if ( (millis() - last_debounce_time) > debounce_delay ) {
if ( up_state != current_up_state ) {
current_up_state = up_state;
if ( current_up_state ) {
handle_event( ev_changeup );
}
}
if ( down_state != current_down_state ) {
current_down_state = down_state;
if ( current_down_state ) {
handle_event( ev_changedown );
}
}
if ( on_state != current_on_state ) {
current_on_state = on_state;
if ( current_on_state != running ) {
handle_event( ev_power_change );
}
}
if ( tcl_state != current_tcl_state ) {
current_tcl_state = tcl_state;
auto_tcl_mode = 0;
if ( current_tcl_state ) { // momentary switch
last_tcl_on_time = millis();
handle_event( ev_tcl_change );
} else {
if ( ( millis() - last_tcl_on_time ) > tcl_long_press ) { // long press
// auto_tcl_mode = 1;
}
}
}
}
last_up_state = up_state;
last_down_state = down_state;
last_on_state = on_state;
last_tcl_state = tcl_state;

if ( (get_gear() != current_gear ) && running ) {
abend();
}
}

void handle_event( int ev ) {

switch(ev) {
case ev_changeup :
if ( ! running ) break;
switch( current_gear ) {
case 4 :
//flash_disp();
break;
default :
chng_to( ++current_gear );
break;
}
break;
case ev_changedown :
if ( ! running ) break;
switch( current_gear ) {
case 1 :
//flash_disp();
break;
default :
chng_to( --current_gear );
break;
}
break;
case ev_power_change :
if ( running ) {
power_down();
} else {
power_up();
}
break;
case ev_tcl_change :
if ( running ) {
tcl_running = ! tcl_running;
tcl_ctrl( tcl_running );
}
break;
}
}

void power_up() {
current_gear = get_gear();
chng_to( current_gear ); // set solenoids and LEDs
tcu_ctrl( 0 ); // kill the TCU
delay( pwr_up_delay ); // hang on a god-damned second
if ( get_gear() == current_gear ) {
running = 1;
} else {
abend();
}
}

void power_down() {
// kill power to the gear solenoids
digitalWrite( p_out_sol1, 0 );
digitalWrite( p_out_sol2, 0 );
tcl_ctrl( 0 ); // turn off the tcl
tcu_ctrl( 1 ); // turn on power to the TCU
// blank the display
digitalWrite( p_out_led1, 0 );
digitalWrite( p_out_led2, 0 );
digitalWrite( p_out_led3, 0 );
running = 0;
}

void chng_to( int new_gear ) {

tcl_ctrl( 0 );
delay( tcl_delay );

switch( new_gear ) {
case 1 :
// gear solenoids

digitalWrite( p_out_sol1, 1 );
digitalWrite( p_out_sol2, 0 );

// LED display
digitalWrite( p_out_led1, 1 );
digitalWrite( p_out_led2, 0 );
digitalWrite( p_out_led3, 0 );
break;

case 2 :
// gear solenoids

digitalWrite( p_out_sol1, 1 );
digitalWrite( p_out_sol2, 1 );

// LED display
digitalWrite( p_out_led1, 0 );
digitalWrite( p_out_led2, 1 );
digitalWrite( p_out_led3, 0 );
break;

case 3 :
// gear solenoids

digitalWrite( p_out_sol1, 0 );
digitalWrite( p_out_sol2, 1 );

// LED display
digitalWrite( p_out_led1, 1 );
digitalWrite( p_out_led2, 1 );
digitalWrite( p_out_led3, 0 );
break;

case 4 :
// gear solenoids

digitalWrite( p_out_sol1, 0 );
digitalWrite( p_out_sol2, 0 );

// LED display
digitalWrite( p_out_led1, 0 );
digitalWrite( p_out_led2, 0 );
digitalWrite( p_out_led3, 1 );
break;
}

if ( auto_tcl_mode ) {
delay( tcl_delay );
tcl_ctrl( 1 );
}
}

void abend() {
// kill power to the gear solenoids
digitalWrite( p_out_sol1, 0 );
digitalWrite( p_out_sol2, 0 );
tcl_ctrl( 0 ); // turn off the tcl
tcu_ctrl( 1 ); // turn on power to the TCU
flash_disp(); // warn the driver
delay( 1000 );
// blank the display
digitalWrite( p_out_led1, 0 );
digitalWrite( p_out_led2, 0 );
digitalWrite( p_out_led3, 0 );
running = 0;
}

int get_gear() {
//return 3;
Serial.print( analogRead( A0 ), DEC );
Serial.print( " - " );
Serial.print( analogRead( A1 ), DEC );
Serial.print( "n" );
int val_sol1 = analogRead( A0 ) > 500 ? 1 : 0;
int val_sol2 = analogRead( A1 ) > 500 ? 2 : 0;
switch ( val_sol1 + val_sol2 ) {
case 0 : return 4;
case 1 : return 1;
case 2 : return 3;
case 3 : return 2;
}
}

void flash_disp() {
// show '0' and flash dp
//digitalWrite( p_out_led1, 0 );
//digitalWrite( p_out_led2, 0 );
//digitalWrite( p_out_led3, 0 );
//running = 0;

digitalWrite( p_out_leddp, 1 );
delay(250);
digitalWrite( p_out_leddp, 0 );
delay(250);
digitalWrite( p_out_leddp, 1 );
delay(250);
digitalWrite( p_out_leddp, 0 );
delay(250);
digitalWrite( p_out_leddp, 1 );
delay(250);
digitalWrite( p_out_leddp, 0 );
delay(250);
digitalWrite( p_out_leddp, 1 );
delay(250);
digitalWrite( p_out_leddp, 0 );
delay(250);
}

void tcu_ctrl(int on_or_off) {
digitalWrite( p_out_tcu, on_or_off ? 0 : 1 );
}

void tcl_ctrl(int on_or_off) {
digitalWrite( p_out_sol_tcl, on_or_off );
digitalWrite( p_out_leddp, on_or_off );
tcl_running = on_or_off;
}