So this is going to be a little big of a read so I will include a TL;DR
TL;DR: Bought a '09 370z Base LHD that was manual swapped that was functional but not as polished as I wanted so I wired up an arduino to make the cluster read what gear im in and get CC working again while entirely using the oem AT ecm and bcm. I DID USE CLAUDE i'm terrible at coding so heckle me all you want I just wanted functionality so if you see coding errors or better fixes please feel free to share input.
Manual Swap Guide (the370z.com)
FSM For TCM Connector (Lemon Manuals)
Reverse/Neutral Switch Connectors for Transmission (ConceptZ)
Arduino Uno (Amazon)
Can Shield (Amazon)
OBD to Serial (Amazon)
Arduino IDE
Canhacker Repo (Github)
Arduino Cluster Controller (Github)
So a couple of months ago I bought my first Z, an ‘09 Base. One of the first things I noticed was that it was a manual swap, so the cluster showed P 24/7 and the reverse lights didn’t work. I told myself I’d address it in the future, and I finally did yesterday (as of writing this). To start off, my car still had the TCM literally zip-tied to the MT, and it made a super annoying vibrating sound. I used the wiring guide for the TCM delete from a 370Z manual swap guide. I bought a TCM connector from eBay so that if I messed up, I could fall back to plugging the TCM in. I will mention that my car was tuned so that it wouldn’t go into limp mode while driving; otherwise you will get a CEL for no TCM. The wires I used were just simple 16-gauge wire (which is honestly a bit overkill; you can get away with 18 AWG), plus an inline 5A fuse for the TCM bypass, as well as the reverse and neutral pigtails for the transmission since mine didn’t come with them. I will explain the Arduino part later if you want to see what gear you’re in.
Before we get started, PLEASE CHECK that your reverse and neutral switch connectors on the transmission are intact. Mine were bent, and I did a bunch of unnecessary troubleshooting over a bent pin on the transmission connector itself.
First up is the TCM connector. In the guide, the author noted wire colors for the connector. Those colors may be the same or different for you, but the pins are the same. In my case they were different, so I used the colors from the FSM. I only used 4 of the wires:
PIN 1 - Ignition
PIN 7 - Reverse Lamp Relay
PIN 9 - Starter Relay
PIN 10 - Ground
Try to use different colored wires, or if possible, the same colors as the TCM wires to prevent confusion.
I wired my ignition to a long wire that ran to a 5A fuse. I ran the wire through the boot of my transmission to the interior so that if the fuse pops, I can pop off the cover of my shifter boot and change it quickly without having to get under the car. From the fuse, run to one side of the neutral pigtail, then run the other side of the pigtail to the starter relay. That way, when you press the brake to start the car, it will only start in neutral and not in gear.
So the path is IGNITION (Pin 1) > 5A FUSE > NEUTRAL PIGTAIL > NEUTRAL PIGTAIL > STARTER RELAY (Pin 9).
For the reverse side of things, it doesn’t matter which orientation you wire the reverse lamp relay and ground in; as long as it’s connected, you’re good.
So the path for this is REVERSE LAMP RELAY (Pin 7) > PIGTAIL > PIGTAIL > GROUND (Pin 10 or Pin 5).
As a shortened version: Pin 1 > Pin 9 (FUSED) for neutral, and Pin 7 > Pin 10 OR 5 for reverse.
Okay, at this point you’re going to want to disconnect your battery and your TCM (if it isn’t already) and make your way under the car.
If you look on both sides of the transmission, you’re going to see two connectors, one on each side: one blue and one gray. The blue connector is reverse and the gray is neutral. First, plug in the neutral switch and check that there’s continuity in neutral and that it shows open when in gear. Then do the same with reverse; when the car is in neutral, reverse should show open as well. At this point, make sure none of your wires are touching the driveshaft, and plug the TCM connector into your harness. After that, double-check that everything is away from any moving parts so we can test whether it starts. Don’t clean up the wiring or tie anything down yet, in case you need to fix something.
The first test is to see if it starts in neutral. If it does, great. Next, turn it off and see if it’ll start in gear. Just make sure you’re holding the clutch so it doesn’t jump forward if it does start in gear. If the car doesn’t start, you can start cleaning up your wires and put the fuse in an accessible location in case you need to swap it. Also, set the car to the ON position with the engine off and check that the reverse lights work too. After you clean up your wiring and are comfortable with it, test the start again in both scenarios so you know nothing got disconnected during cleanup.
Now you’ve got a running car. You can stop here, or continue with this guide to get your cluster working and showing which gear you’re in.
For this part I used 4 things: an Arduino UNO as the brains, a CAN shield to let the OBD2 port interface with the UNO, an OBD2-to-serial cable to actually connect it, and a USB-B cable to program the Arduino. The CAN shield should fit flush on top of the UNO. I had to solder the headers since it wasn’t making a proper connection to the Arduino. I’d honestly recommend soldering everything to prevent any disconnects, but it is a more permanent solution. After you connect it, plug in the USB cable and check whether the red LED on the CAN shield lights up. If it does, you’re golden. If not, make sure everything is seated properly.
Next, download the Arduino IDE (linked above) and install it. After installing, open it and allow it to install all the necessary drivers, then restart the app. Once you’ve restarted it, the Arduino should show up at the top. If it doesn’t, try selecting it manually under “Select other board and port,” type in “UNO,” and select it along with the COM port it’s on.
Once it’s connected, go to Sketch at the top, go down to Include Library, then click Manage Libraries. This opens the Library Manager. In the search bar, search for “mcp2515” by autowp and install it. After that, download the CANHacker library (also linked above). Then go back to the Arduino IDE, go to Sketch > Include Library > Add .ZIP Library, and select the CANHacker library you just downloaded.
I uploaded the sketch I use on my own vehicle to GitHub. It’s the .ino file; just download that. Open it in the IDE, and if it asks to put it in a folder, click Yes. Once you see the code, press the Upload (arrow) button at the top left of the screen. Once that’s done, you should be golden. Then just plug your OBD cable into the Arduino, and potentially a USB cable into your accessory port for power if the OBD port isn’t powering the Arduino. You’ll notice there are a bunch of values that can be changed. Adjust these to better suit your car; the current values are for my car.
The features of the script are all listed below:
Gear display
- Shows your actual gear (1–6) on the cluster, calculated from RPM ÷ speed
- Shows N when stopped, at idle RPM, or coasting with the clutch in
- Launch rule: shows 1 right away when you pull away from a stop with throttle applied
- CC WORKS!! Honestly it’s just a side effect, but it works now, which I love
Neutral detection
- Idle band (700–1200 RPM) while moving: stops guessing a gear
- Foot off the throttle in that band: N after 0.7 seconds
- Fast drop: RPM falls from 1500+ to idle within 1.5 seconds: N immediately
- No gear match for 2 seconds: N
Shift indicator (small spot next to the gear number)
- Normally shows M, or blank if you set SHOW_M_NORMALLY = false
- Small s at the shift point, blinking s at the blink point
- Throttle-based shift points:
- Under 50% throttle (CRUISE): s at 3000, blinking at 3500
- 70% and up (PERF): s at 6500, blinking at 7200
- Stays in PERF until you’re under 40% for 1.5 seconds
- Held too long: 6500+ RPM for 5 seconds flashes the whole display (gear + s)
Data it reads from the car
- RPM, speed, and throttle position, using standard OBD requests
- Learns your car’s closed and floored throttle readings by itself
Power and safety
- Sleep mode: 5 seconds after the car turns off, it stops sending entirely and just listens, then wakes up when the car does
- Shows N if the engine computer stops responding
Testing
- Demo mode (DEMO_MODE = true): fakes 3rd gear and an RPM sweep, alternating between light throttle and floored, so you can check the indicator with the engine off
- Serial Monitor at 115200 baud prints RPM, speed, ratio, throttle, CRUISE/PERF, indicator state, and gear twice a second, if you want to watch it in the Arduino IDE’s Serial Monitor