cobalt6700
09-15-2011, 11:55 AM
This has been pulled over from another forum, thought i would share my work :)
I found this topic on NAXJA forums, http://www.naxja.org/forum/showthread.php?t=103658&page=1, and it inspired me to build a tiptronic controller of the same design.
The only drawback is that on OBDII jeeps, the check engine light is on for 50 key turns after the tiptronic is used, this is an issue I would like to fix.
After a lot of mucking about on eagle with schematics and PCB layouts, i finally got to the stage of breadboring.
The board was going to cost around £15 to make, with £15 of components and a lot of my time, to solder the board up. This would mean it would either be an involved project for anyone that wanted to do it, or it would take up a lot of my time making the boards. Getting them fully made by a company in such small quantities is also very costly.
I have a friend helping me on this, and we have been discussing it and working though it to add a few more features. Whist working though it, we came up with the idea of using a PLC instead.
A PLC (Programmable Logic Controller) is a device that uses software to control stuff, very much like an ECU. The idea behind Kevin fletcher’s tiptronic controller was to keep it simple. I feel that a PLC makes it even simpler still.
The PLC costs around £25, and then you need switches and a box on top, but this is the same as the board anyway. All the PLC needs to do the same job as the board is a bit software. This means I can now write the software, and anyone can buy the board, solder a few wires and that’s it. It also means that if I ever want to add more features, all you would need to do is upload the new software via a usb cable.
I am now at the stage of buying one of the PLC’s (called an arduino UNO) and writing the software, to prove the concept. If it works, I will then release the software to the public, with a full write up on how to install it.
At the moment the system has the following features:
- Takes control from the factory TCU.
- Provides manual up/down shift from 1st to 4th
- Provides a torque converter lock, which dis-engages when changing gear
- Has an led readout that shows what gear you are in, 1-4, and if the TC is locked
You switch to the tiptronic whilst in neutral, it boots up into 3rd gear as standard. You then select 1st and move into drive. If you go down the gears with the gear stick, you will limit what the tiptronic controller can do, so leave it in D.
I am hoping to add the following features soon
- TC lock dis-engage when braking
- TC lock dis-engage on gear change then re-engage after, enabled and disabled by holding the TC button down for 5 secs, notified by TC lock led flashing twice.
- Stop check engine light coming on.
- Use of arduino PRO mini – which only costs £13, and is 20mm by 30mm, reducing package size massively.
- Sense what gear you are currently in, hold that gear, and then turn the TCU off.
- Make sure the TCU has full control before the tiptronic shuts down.
If anyone is interested in one, please let me know (I know some already have). Also please bear in mind that I have a full time job and life, and can’t spend all hours of the day on it, so don’t expect on up and running next week. I also accept no responsibility if you break your car or yourself. This is not intended for highway use and should only be used offroad.
Think thats its for now, hopefully some updates and pictures soon!
------
So, a bit of an update
I have the up/down switch made, this is my idea and of my design and im sorry to say i wont be supplying them.
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3667.jpg
This shows the action inside the switch
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3670.jpg
I also have made a faceplate which takes the TC button too
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3673.jpg
This is the on/off switch and the tc lock button
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3675.jpg
This is the arduino, the brains which the code is uploaded too. It is just smaller than a credit card.
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3665.jpg
I also received a LED display, a driver chip (4511) and some TIP120 transistors. I have been breadboaring it up today, and so far have the switches working with the arduino, and the driver driving the display.
http://img.photobucket.com/albums/v248/cobalt6700/1c6b7435.jpg
http://img.photobucket.com/albums/v248/cobalt6700/52a5e1f6.jpg
More to come soon :)
------
Spent the last two nights on programming, Have been learning ardunio code with my mate who's doing most of the programming.
So far we've got to the alpha stage, it's a bit of a skeleton program at the moment, but it's getting there :)
I took a quick vid, sorry for the rubbish quality, I was excited and only had my phone.
Top led on the right represents the TCU relay, followed by the TC lock solenoid, and gear solenoids. TC lock didn't work right now, but as you can see, it sees what gear it's in when it gets turned on, turns the TCU off and takes the gear.
http://img.photobucket.com/albums/v248/cobalt6700/th_302b3126.jpg (http://smg.photobucket.com/albums/v248/cobalt6700/?action=view¤t=302b3126.mp4)
More soon :D
------
Hi guys, at a major point in the project, I'm now at the testing phase.
We have finished the program to the beta stage, which means we are at the stage of putting it into the car and seeing what happens. So hopefully next week it will be going into the jeep .
If anyone is interested in the code, here it is.
Please bear in mind I haven't tested this in the jeep yet, but if anyone wants to have a go at the project, feel free. Any feedback I can get is good
/************************************************** *****************************
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;
}
------
:D
I found this topic on NAXJA forums, http://www.naxja.org/forum/showthread.php?t=103658&page=1, and it inspired me to build a tiptronic controller of the same design.
The only drawback is that on OBDII jeeps, the check engine light is on for 50 key turns after the tiptronic is used, this is an issue I would like to fix.
After a lot of mucking about on eagle with schematics and PCB layouts, i finally got to the stage of breadboring.
The board was going to cost around £15 to make, with £15 of components and a lot of my time, to solder the board up. This would mean it would either be an involved project for anyone that wanted to do it, or it would take up a lot of my time making the boards. Getting them fully made by a company in such small quantities is also very costly.
I have a friend helping me on this, and we have been discussing it and working though it to add a few more features. Whist working though it, we came up with the idea of using a PLC instead.
A PLC (Programmable Logic Controller) is a device that uses software to control stuff, very much like an ECU. The idea behind Kevin fletcher’s tiptronic controller was to keep it simple. I feel that a PLC makes it even simpler still.
The PLC costs around £25, and then you need switches and a box on top, but this is the same as the board anyway. All the PLC needs to do the same job as the board is a bit software. This means I can now write the software, and anyone can buy the board, solder a few wires and that’s it. It also means that if I ever want to add more features, all you would need to do is upload the new software via a usb cable.
I am now at the stage of buying one of the PLC’s (called an arduino UNO) and writing the software, to prove the concept. If it works, I will then release the software to the public, with a full write up on how to install it.
At the moment the system has the following features:
- Takes control from the factory TCU.
- Provides manual up/down shift from 1st to 4th
- Provides a torque converter lock, which dis-engages when changing gear
- Has an led readout that shows what gear you are in, 1-4, and if the TC is locked
You switch to the tiptronic whilst in neutral, it boots up into 3rd gear as standard. You then select 1st and move into drive. If you go down the gears with the gear stick, you will limit what the tiptronic controller can do, so leave it in D.
I am hoping to add the following features soon
- TC lock dis-engage when braking
- TC lock dis-engage on gear change then re-engage after, enabled and disabled by holding the TC button down for 5 secs, notified by TC lock led flashing twice.
- Stop check engine light coming on.
- Use of arduino PRO mini – which only costs £13, and is 20mm by 30mm, reducing package size massively.
- Sense what gear you are currently in, hold that gear, and then turn the TCU off.
- Make sure the TCU has full control before the tiptronic shuts down.
If anyone is interested in one, please let me know (I know some already have). Also please bear in mind that I have a full time job and life, and can’t spend all hours of the day on it, so don’t expect on up and running next week. I also accept no responsibility if you break your car or yourself. This is not intended for highway use and should only be used offroad.
Think thats its for now, hopefully some updates and pictures soon!
------
So, a bit of an update
I have the up/down switch made, this is my idea and of my design and im sorry to say i wont be supplying them.
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3667.jpg
This shows the action inside the switch
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3670.jpg
I also have made a faceplate which takes the TC button too
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3673.jpg
This is the on/off switch and the tc lock button
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3675.jpg
This is the arduino, the brains which the code is uploaded too. It is just smaller than a credit card.
http://img.photobucket.com/albums/v248/cobalt6700/DSCF3665.jpg
I also received a LED display, a driver chip (4511) and some TIP120 transistors. I have been breadboaring it up today, and so far have the switches working with the arduino, and the driver driving the display.
http://img.photobucket.com/albums/v248/cobalt6700/1c6b7435.jpg
http://img.photobucket.com/albums/v248/cobalt6700/52a5e1f6.jpg
More to come soon :)
------
Spent the last two nights on programming, Have been learning ardunio code with my mate who's doing most of the programming.
So far we've got to the alpha stage, it's a bit of a skeleton program at the moment, but it's getting there :)
I took a quick vid, sorry for the rubbish quality, I was excited and only had my phone.
Top led on the right represents the TCU relay, followed by the TC lock solenoid, and gear solenoids. TC lock didn't work right now, but as you can see, it sees what gear it's in when it gets turned on, turns the TCU off and takes the gear.
http://img.photobucket.com/albums/v248/cobalt6700/th_302b3126.jpg (http://smg.photobucket.com/albums/v248/cobalt6700/?action=view¤t=302b3126.mp4)
More soon :D
------
Hi guys, at a major point in the project, I'm now at the testing phase.
We have finished the program to the beta stage, which means we are at the stage of putting it into the car and seeing what happens. So hopefully next week it will be going into the jeep .
If anyone is interested in the code, here it is.
Please bear in mind I haven't tested this in the jeep yet, but if anyone wants to have a go at the project, feel free. Any feedback I can get is good
/************************************************** *****************************
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;
}
------
:D