Suzuki SV650 Riders Forum banner

SV650 ECM Serial Data Stream Hack

50K views 126 replies 19 participants last post by  Dragon_Dude  
#1 ·
Here is a video of the prototype:

This hack will come in handy if you want to mount, say, an SV650 gen2 gauge on a gen1 bike. Without the data stream from the ECM, the gen2 gauge will be stuck displaying "CHEC", and no way to show engine coolant temperate. Documented here is a way to fix that.

Other potential use for the circuit is to make dual use of the temp readout. Bike voltage could be displayed, or Distance Till Empty (only down to 68 miles as that is the lowest display value) if connected to a fuel gauge (in the works :naughty:).

This mod works on the SV650, and may work on other Suzuki gauges, like the GSXR, but I have not tested those.

Step 1 to make this work was deciphering the data stream from the ECM. Using a logic analyzer it was determined that the ECM transmits an 8 byte message once every 100mS (ten times a second). The 8 byte message consist of 7 data bytes, followed by 1 check byte. Bytes are transmitted 10mS apart, with a 30mS gap between message repeat.

See the PIC source code below for the data format.

The challenging part of making this work was figuring out the code for the check byte at the end of the data stream. It's typical to use a CRC (Cyclical Redundant Check; there is a good description on Wikipedia if you're interested). I tested all the common 8 bit CRCs but none matched. Am I doing it right? Are the bytes reversed? Is the bit order correct...?

Without the proper code byte at the end of the data stream it's impossible to make "CHEC" go way. Having the proper data is not enough. The code byte at the end must match too.

I was about to give up, defeated, when it dawned on me that the check byte might not be a CRC at all. A simpler method is to use CheckSum (check the easy things first, right?!). CRC performs division, CheckSum is simple addition. After a few checks, turns out it was CheckSum not CRC! Haha, I was thrilled!

In hindsight it makes sense that the check byte was not CRC. CRC is quick calculation in hardware, but without a dedicated circuit (SV's ECM probably doesn't have one) it takes many cycles in software. A software checksum is a faster to perform than a CRC and would leave precious processing time for the ECM to perform other functions. Checksum it is.

Here is the prototype I'm sending to brle7817 to test with his GSXR gauge. The potentiometer (variable resistor) sticking out the top is for testing and gets removed when the real ECT thermistor is hooked up.
Image



Schematic
Image



MikroElektronika BASIC Source Code
Code:
program SV650_ECM_Serial_Hack
'Date: March 14, 2012
'Part: PIC16F1847
'Design: TeeRiver, at SVRider.com
'Ver:1.0
'Use: SV650 Gen2 ECM Serial Stream Emulator

dim ecm_serial_byte as byte[8] '8 bytes, 0 thru 7
dim check_sum as byte
dim index as byte
dim adc_value as word

const dealer_mode = 0
const temp = 0  '0 thru 1023
const C11 = 0 'Undefined for SV650
const C12_CKP = 0
const C13_IAP = 0
const C14_TPS = 0
const C15_ECTS = 0
const C21_IATS = 0
const C22_CAM = 0 'Not used on SV650
const C23_TOS = 0
const C24_IG_Coil_1 = 0
const C25_IG_Coil_2 = 0
const C28_STVA = 0
const C29_STPS = 0
const C31_GPS = 0
const C32_FI_1 = 0
const C33_FI_2 = 0
const C41_FP_Relay = 0
const C42_IG_Switch = 0
const C43 = 0 'Undefined for SV650
const C44 = 0 'Undefined for SV650
const C49_PAIR = 0
const Adj_TPS_0 = 0
const Adj_TPS_1 = 0

'##############################################################################
sub procedure Boot_up()
  'Set internal oscillator
  OSCCON = %01110000 '8MHz
 
  'Set all PIC I/O to DIGITAL, except for ADC1
  ANSELA = %11100010' Configure all 5 PortA AN pins (A4:A0) as DIGITAL I/O
  ANSELB = %00000001' Configure all 7 PortB AN pins (B7:B1) as DIGITAL I/O

  'Set I/O port direction
  TRISB = %11101011 'B4 is test strobe, B2 is UART TX
  TRISA = %11111111

  'Initialize the UART
  UART1_Init(7800)
end sub 'Boot_up

'###############################################################################
main:
  Boot_up()
  'Initialize ECM Data Stream
  for index = 0 to 7
    ecm_serial_byte[index] = $00
  next index
  
  'Assign Error Code bits to data stream
  ecm_serial_byte[1].4 = dealer_mode
  ecm_serial_byte[3].0 = C11 'Undefined for SV650
  ecm_serial_byte[3].1 = C12_CKP
  ecm_serial_byte[3].2 = C13_IAP
  ecm_serial_byte[3].3 = C14_TPS
  ecm_serial_byte[3].4 = C15_ECTS
  ecm_serial_byte[3].5 = C21_IATS
  ecm_serial_byte[3].6 = C22_CAM 'Not used on SV650
  ecm_serial_byte[3].7 = C23_TOS
  ecm_serial_byte[2].0 = C24_IG_Coil_1
  ecm_serial_byte[2].1 = C25_IG_Coil_2
  ecm_serial_byte[4].5 = C28_STVA
  ecm_serial_byte[4].6 = C29_STPS
  ecm_serial_byte[2].2 = C31_GPS
  ecm_serial_byte[2].3 = C32_FI_1
  ecm_serial_byte[2].4 = C33_FI_2
  ecm_serial_byte[2].7 = C41_FP_Relay
  ecm_serial_byte[1].0 = C42_IG_Switch
  ecm_serial_byte[1].5 = C43 'Undefined for SV650
  ecm_serial_byte[4].3 = C44 'Undefined for SV650
  ecm_serial_byte[4].7 = C49_PAIR
  ecm_serial_byte[1].1 = Adj_TPS_0
  ecm_serial_byte[1].2 = Adj_TPS_1
  ecm_serial_byte[0] = temp >> 2
  ecm_serial_byte[1].7 = temp.1
  ecm_serial_byte[1].6 = temp.0
 
  while true
    portb.4 = 1 'Test strobe

   'Read the ECT thermistor
    adc_value = ADC_Read(1)
   
    'Assign thermisor adc voltage to serial data stream
    ecm_serial_byte[0] = adc_value >> 2
    ecm_serial_byte[1].7 = adc_value.1
    ecm_serial_byte[1].6 = adc_value.0

   'Calculate the checksum.
    check_sum = 0
    for index = 0 to 6
      check_sum = check_sum + ecm_serial_byte[index]
    next index
    'Calculate two's compliment
    check_sum = 256 - check_sum

   'Send the datastream
    for index = 0 to 6
      UART1_Write(ecm_serial_byte[index])
      delay_ms(10)
    next index
    UART1_Write(check_sum)
    'Inter-message gap
    delay_ms(30)
    portb.4 = 0
  wend
End.

Intel Hex File, Programming data for PIC 16F1847, if you'd like to burn a copy of the chip for yourself.
Code:
:02000000E028F6
:0C0006000E30FD00FD0B05280000080076
:1000120048302000B7000030B8004530B900003049
:0E002200BA00F03021009E009D011D14080060
:10003000D6302000A1000030A2004230A3000030E2
:10004000A400FF30B300FF30B4000030B500003032
:10005000B600FF30AF00FF30B0000030B10000301C
:10006000B200FF30BB00FF30BC000030BD000030EC
:10007000BE0023009E1690309D0021008D140D11AE
:100080002000911E472823001908F000402808008E
:10009000833021009D0520004508F000F035F03543
:1000A000700821009D0403209D149D1C5928000008
:1000B00055281C08F100F0011B0870042000C60040
:1000C0007108C7000030C7044608F0004708F10077
:0200D000080026
:1000D2002000F801F9011030FC00710DF80DF90D46
:1000E2007408F8027508031C750FF90203188028BA
:1000F2007408F80775080318750FF9070310F00D57
:08010200F10DFC0B6E28080052
:10010A00092020004208C50048207008C300710871
:10011A00C40021001D1020004308F0004408F1002B
:02012A000800CB
:10012C00703021009900E23023008C0001308D00EA
:10013C00FB3021008D00FF308C0023009F159C01AB
:0C014C00FF309B009C011E1518200800CD
:100158002000FB01FA01F9018030F800F10CF00CE5
:10016800031CBF287408F90775080318750FFA07E8
:100178000318FB0A0310F01FC7287408FA0775084C
:100188000318750FFB07FB0CFA0CF90CF80C031C91
:10019800B2287B08F3007A08F2007908F1007808A1
:0401A800F00008005B
:1001AC0023009E18DB280000D628200042082300DC
:0401BC009A0008009D
:1001C00096202000BF0125308600003087003F08C0
:1001D00086070318870A81013F08073A0319F228A6
:1001E000BF0AE32826122810A8102811A8112812E7
:1001F000A8122813A8132710A710A9122913271132
:10020000A7112712A7132610A612A911A913A61029
:100210002611A501A61326130D160130C200852054
:100220007008AD007108AE006430F400F501AC2038
:100230007008C0007108C1002D08F0002E08F10000
:100240005E30F400F501AC2070084002F000710847
:10025000413BF1006430F400F501692070082D077E
:10026000F30071082E3DF4007308AD007408AE0071
:100270007308F0007408F100F136F00CF136F00C60
:100280007008A500AD184629A6134729A6172D18F2
:100290004B2926134C292617A001BF0125308400C5
:1002A000003085003F0884070318850A0008A0076E
:1002B0003F08063A03195E29BF0A4E292008003C70
:1002C000A000BF0125308400003085003F0884076E
:1002D0000318850A0008C200D6201A30FC00F83046
:1002E000FD00FD0B7129FC0B7129000020003F0867
:1002F000063A03197D29BF0A62292008C200D620C8
:100300004E30FC00EB30FD00FD0B8429FC0B8429F2
:0803100020000D120C298B29BD
:020000040001F9
:04000E00A43F1316E2
:00000001FF
 

Attachments

#7 ·
Thanks, I appreciate the kind feedback! :)

... A gear position indicator ... (Hint, hint.....)
Rock, one of these days I will post a thread on how to build this GPI. It's based on the same PIC chip and Radio Shack proto-board as the ECM build above, only different software and has a 7 segment LED attached. :D


Here is a close up photo. I tried to make the unit as small as possible so it can be mounted inside the SV gauge via a cutout through the tach face. This photo shows the entire unit, no separate power box, connects with just the three wires: Red (12v), Black(gnd), and Green(tap the SV's gear position sensor wire). At the moment, I'm searching for a 7seg LCD display instead of the power hungry LED to get the heat down. With no air circulation it gets a bit hot inside the gauge housing.
Image


Image
 

Attachments

#8 ·
Hey TeeRiver, I watched the video; yours works better than mine. :sbmfacepalm:

Mine shows false neutrals and the wrong gear, for a up to second or so, from time to time. I'm not sure what causes it. It's got an big LED display, probably too big, but it's very easy to read. An LCD would need a back light; no problem I'm sure.

About putting it in the speedo housing; that takes the mod from plug and play to a much higher level of difficulty. I would go for an outside mount, myself. Edited to add: combining this with a tre would be a good thing, IMO.

You sure seem to keep busy doing some great stuff!
 
#10 ·
Hey TeeRiver, I watched the video; yours works better than mine. :sbmfacepalm:

Mine shows false neutrals and the wrong gear, for a up to second or so, from time to time. I'm not sure what causes it. It's got an big LED display, probably too big, but it's very easy to read.
I had the same problems, Rock. There is a lot of noise on the signal from the gear position sensor. This makes it a challenge to accurately recognizing gear changes (and by challenge, I mean a major pain in the ass!). It took some tweaking and software tricks to get quick gear changes and make the false neutrals go away.

Do you remember the Cheap GPI Thread that never came to fruition? I believe they hit the same problems. A design can work beautifully on the bench, but once mounted on the bike, all hell may break loose. The devil is in the details!

Bighammer actually took the SV gear position sensor apart and exposed the individual gear contacts. It would use a few more wires, but a design based on that would be rock solid and fast. I think he should build it.
 
#11 ·
OK, with all of you ultra smart people on here it begs the question...

Why do I still need piggyback fuel management. Somebody needs to come up with a way to change the fuel tables in the stock ECU. Sounds like it would be an afternoon project for some of you.
 
#13 ·
... Why do I still need piggyback fuel management. Somebody needs to come up with a way to change the fuel tables in the stock ECU. Sounds like it would be an afternoon project for some of you.
Check this out ineedanap!
http://www.svrider.com/forum/showthread.php?t=140234

Can be purchased here. Probably pricy.
http://www.svrider.com/forum/showthread.php?t=125552



I think that you should build it ...
It's better to share; I shouldn't be the one having all the fun. :)
 
#17 ·
Regarding the GPI noise... Here's a thought:

The noise generated is most probably from the ignition coils. Have you tried enclosing your PIC within a EMC shielded casing and running the GPI switch through a Low Pass Filter (Simple LC-Filter maybe)?

I still need to test this, but it's just speculation. :)
 
#18 ·
Thanks for the input Wurmsous. The GPI is working well, no noise issues now, but it took some effort to make it function reliably. :)

You are right, the ignition is a major source of electrical noise and an LC filter helps knock that down to manageable level. A shielded enclosure was not necessary, but before getting things under control I was seriously thinking about it!

The biggest headache was noise from the gear position sensor itself. With the GPS mounted directly on the engine, there is a lot of physical vibration on the contacts. At high RPM the contacts spontaneously make and break causing voltage spikes. The spikes are worse in the low gears, and to compound the problem, the GPS resistor values make 1st and 2nd gear voltage thresholds very close.

It turns out there is enough nose at 1st gear position to exceed the 2nd gear threshold. The good thing though is this can be fixed in software.
 
#19 ·
UPDATE!

"CHEC" Eliminator now works with the GSXR gauge! :D

brle7817 and I were trying to get this to work with his GSXR gauge over in this thread, but ran into trouble. He was very generous and sent me a GSXR gauge to experiment with; after investigation, it turns out the data format between the SV650 and GSXR are the same, but there is a slight difference in data transmission time between the two bikes. SV650 has a message gap of 30mS, the GSXR needs the gap to be at least 60ms. Adjusting the message gap from 30mS to 60mS fixed the problem!

So with this little circuit (PIC micro-controller), anyone who want to mount a GSXR or gen2 SV650 gauge on a bike without an ECM can do so, complete with functional Temp display.
 
#20 ·
I was interested in this because I would like to run a GSXR gauge on my 07 SV650 to match the 08-09 GSXR 750 forks I just picked up.

Well, I was able to code up my own version of this for Arduino.

I will post the code and the info I found this weekend sometime.

Here is the temp being displayed:
Image


I also tried out the tach:
Image


I did have a little trouble with how to drive the tach. I wasn't exactly sure how to set up the code to drive it. So I just guessed and verified I could drive it.
 
#25 ·
Here is my code in case anyone wants to try it.

If anyone can suggest how to drive the Tach as far as the code portion that would help me. I am not sure if is a hardware issue or not, but I used a 200 ohm resistor between the output of the Arduino and the Tach line. I figured if I pulsed the output for 5ms on and then 5ms off it would run the Tach to 6,000 rpm, but it goes to like 6,625 and the error seems to follow RPM. So the lower the RPM the lower the error and the higher the rpm the higher the error.

Code:
int ecm_serial_byte[8];     // 8 bytes for serial data
byte check_sum;             // Check sum of bytes 0 to 6
int temp = 0;               // Temp number between 0 and 1023
int cycle_time = 5;         // Vary number to change RPM for Tach output

void setup() {
  Serial.begin(7800);       // Serial output to gauge Tech line
  pinMode(2, OUTPUT);       // For Tach output
}

void loop() {
  
  // Input various numbers to see temp output of gauge
  temp = 90;
  
  // Put temp reading into correct bytes
  ecm_serial_byte[0] = temp >> 2;
  ecm_serial_byte[1] = temp << 6;
  
  // Dealer Mode (Uncomment to turn on)
  // bitSet(ecm_serial_byte[1],4);
  
  // FI Code (Replace x with byte and y with bit interested in)
  // bitSet(ecm_serial_byte[x],y);
  
  // Calculate check sum byte  
  for(int x = 0; x < 7; x++){
    check_sum = check_sum + ecm_serial_byte[x];
  }
  
  check_sum = 256 - check_sum;
  
  // Write data bytes to serial
  for(int y = 0; y < 7; y++){
    Serial.write(ecm_serial_byte[y]);
    delay(10);
  }
  
  // Write check sum byte to serial
  Serial.write(check_sum);
  
  // Intermessage delay
  delay(30);
   
  // Tach Output Signal 50% DC
  digitalWrite(2,HIGH);
  delay(cycle_time);
  digitalWrite(2,LOW);
  delay(cycle_time);
    
}
 
#26 ·
That is excellent Bubba!

If anyone can suggest how to drive the Tach as far as the code portion that would help me.
The 200 ohm between Arduino output and Tach in is fine. The isolation resistor is not necessary when driving the tach on the bench, but is essential when connected to the motorcycle to keep the uC from resetting due to system noise; especially the huge spike generated when the starter solenoid is released.

The SV tach displays about 11% high, which explains why the 5mS high/5mS low code shows 6,625 rpm, so what you have is good. For fun, you might try connect a couple pots to the Arduino ADC inputs and use them to vary the tach and temp real time!

Nice job! :thumbsup:
 
#27 ·
I can't seem to figure out how to get the tach to vary smoothly.

I am able to get it to vary with a pot, but it jumps to values like there isn't enough resolution. And the resolution issue is worst at high rpm's.

So I scaled the whole pot movement to just try and get the upper rpms to be smooth, but it still jumps to values like my output numbers are coarse.

Tee, do you have any code I could look at for how you got the tach output to work smoothly?
 
#28 ·
I can't seem to figure out how to get the tach to vary smoothly.

I am able to get it to vary with a pot, but it jumps to values like there isn't enough resolution. And the resolution issue is worst at high rpm's.

So I scaled the whole pot movement to just try and get the upper rpms to be smooth, but it still jumps to values like my output numbers are coarse.
If you haven't already, try driving the tach from a dedicated Tach_drive program; don't combine with the ECM serial stream routine. Actually, I don't see how the posted code can properly drive the tach since the delay(10) and delay(30) statements will throw off the timing for the delay(cycle_time). If you can, post up just the tach drive routine and we'll take a look, whatever is wrong should be straight forward to figure out.


Tee, do you have any code I could look at for how you got the tach output to work smoothly?
My tach_drive code runs off an internal PIC hardware timer that triggers an interrupt (necessary since the FuelBot is doing several things simultaneously) so is not straight forward. I will post it if you like, but will likely confuse more than it helps...
 
#29 ·
Here is some updated code after playing around with it more.

I found that the "delay()" function would round whatever number it was given to an integer, which is why it was getting more coarse as the rpms went up. Because the smaller the cycle_time then the higher the rpm.

So I discovered the "delaymicroseconds()" function which allowed me get higher resolution. The only problem is that the highest number that function will work with is 16,383 so I can't get the full range of rpms.

Not sure how else to do it.

Code:
int cycle_time = 0;
const int analogPin = 0;

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
}

void loop() {
  
  // Analog input
  cycle_time = map(analogRead(analogPin), 0, 1023, 2580, 15000);
   
  //Serial.println(cycle_time); 
   
  // Tach Output Signal 50% DC
  digitalWrite(2,HIGH);
  delayMicroseconds(cycle_time);
  digitalWrite(2,LOW);
  delayMicroseconds(cycle_time);
    
}
 
#30 ·
You're almost there bubba. Easy way is to break the delay into two parts, Coarse and Fine. Use delayMiliseconds() for Coarse, delayMicroseconds() for Fine. The key is to use the Modulo operator "%" to get the remainder for uS resolution.

I have not compiled this, so please check the syntax, but something like this should work.
Code:
long_int cycle_time_uS = 0; //Must be long integer to fit max 500,000 size.
int cycle_time_fine_uS = 0;
int cycle_time_coarse_mS = 0;
const int analogPin = 0;

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
}
void loop() {
  //Map Analog input (0 through 1023) to (4,000uS through 500,000uS)
  //4000uS = 250Hz = 15,000 RPM, MAX
  //500,000uS = 2Hz = 120RPM, MIN
  cycle_time_uS = map(analogRead(analogPin), 0, 1023, 4000, 500000);
   
  //COARSE
  //divide by 1000; integer arithmetic converts uS to mS, remainder is discarded.
  cycle_time_coarse_mS = cycle_time_uS/1000
  
  //FINE
  //"%" is the Modulus operator, result is the uS remainder.
  cycle_time_fine_uS = cycletime_uS % 1000
   
  // Tach Output Signal 50% DC
  digitalWrite(2,HIGH);
  delay(cycle_time_mS); //COARSE delay
  delayMicroseconds(cycle_time_uS);  //FINE delay
  digitalWrite(2,LOW);
  delay(cycle_time_mS);
  delayMicroseconds(cycle_time_uS);
}
 
#34 ·
Thanks TeeRiver. I will be sure to try that and let you know the results and perhaps make a video if I can get it working good.


You're almost there bubba. Easy way is to break the delay into two parts, Coarse and Fine. Use delayMiliseconds() for Coarse, delayMicroseconds() for Fine. The key is to use the Modulo operator "%" to get the remainder for uS resolution.

I have not compiled this, so please check the syntax, but something like this should work.
Code:
...
 
#35 ·
Just want to say thanks to everyone sharing their results! I'm working on a project to read the ECU datastream so I don't need to run the OEM dash (I have a GPX Pro I want to use), but I still wanted a way to know that the FI idiot light turned on. Based on this information, it should be pretty easy to use an Arduino to do that.

Can someone confirm that the ECU signal to the dash is 5V? I don't own a scope and just ordered a cheap logic analyzer and wasn't sure if I needed to take any precautions since the LA only supports up to 5V.

Thanks!
 
#36 ·
Just wanted to say thanks to everyone contributing to this thread. I'm actually interested in working on the problem from the other way- I want to remove my SV650 dash and just use a GPX Pro for my race bike. The goal is to use an Arduino board to read the ECU data stream and illuminate a light when the Check FI signal is sent... maybe I'll even hook up a couple of 7-seg displays to show the code, or just plug in the dash on an as needed basis.

Later on, I want to use the Arduino to fake the ECU into thinking the STP actuator/sensor are there so I can remove them.

One thing I was curious about was how you determined the 7800 baud rate for reading the data stream? I'm waiting for my logic analyzer to show up, so right now the only information I have about the protocol is the source code earlier in this threat.

For those interested, here's my code so far:

https://dl.dropbox.com/u/10783986/ecu-reader.ino

Thanks!
 
#37 ·
Just wanted to say thanks to TeeRiver and everyone else who contributed to this thread. I'm building a race bike with a 2nd gen SV motor/ECU (the frame is actually a Ducati 1098 though) and didn't want to run the stock gauges since I already have a GPX Pro dash/data logger. Problem is of course how do I know when something is wrong with the EFI system?

Anyways, I've been able to write code for a Teensy board and hook it up to the ECU signal wire and decode the data stream to know when to light a warning light. I'll then be able to plug in my computer via USB and get all the error codes as well.

Anyways, I tested this all on my work bench and it works great and just ordered a prototype PCB that I can mount on the bike. If all goes well (might be asking a lot- this is the very first PCB I've ever designed!), I'll have it ready just in time for the first AFM race this year! :)

https://dl.dropbox.com/u/10783986/ecu-indicator.png
 
#38 ·
...Anyways, I've been able to write code for a Teensy board and hook it up to the ECU signal wire and decode the data stream to know when to light a warning light.

...I tested this all on my work bench and it works great
Very cool synfinatic. :thumbsup:

How about add an LED to the PCB to have it blink out the error code(s), then no need to hookup to your computer?

Good luck on your first PCB! If by change there are any errors, you can cut bad traces with an exacto knife then add jumps with 30awg wire wrap wire, works great; not that I have much experience fixing screw-ups... :icon_biggrin:
 
#39 ·
Well I found some cheap (10 for $13 on ebay) 4 digit 7 segment displays with a built in SPI chip that *just* will fit in my enclosure. So that's going to be version 2.0 :) I don't need to decode the water temp since I have the GPX Pro, but I could easily do that too from the looks of it.

The only thing right now that's driving me nuts is I haven't been able to find the connector that Suzuki is using for the wiring harness to the dash. I know Eastern Beaver sells a lot of these Japanese connectors, but I couldn't find anything there that matches.

Anyways, boards show up in about two weeks (maybe one of these days I'll learn how to etch my own boards... the wait is killing me) so I'll keep in mind the exacto knife trick.
 
#40 ·
Well I found some cheap (10 for $13 on ebay) 4 digit 7 segment displays with a built in SPI chip that *just* will fit in my enclosure. So that's going to be version 2.0 :) I don't need to decode the water temp since I have the GPX Pro, but I could easily do that too from the looks of it.
Please post some photos!

The only thing right now that's driving me nuts is I haven't been able to find the connector that Suzuki is using for the wiring harness to the dash. I know Eastern Beaver sells a lot of these Japanese connectors, but I couldn't find anything there that matches.
Gauge/harness connector info is in this thread.
 
#41 ·
Oh sweet! And I don't need to buy 680 of them either like on DigiKey! Guess I need to find some other things to buy there since they have a $20 minimum though.

Here's a quick little video I did showing the decodes via the Arudino serial/USB console:



Once I get the PCB in, I'll do another showing the semi-final product.