Introduction: Nitduino

Running Nitrous or NOS or what every you want to call it can seem intimidating especially after watching movies that portray that it takes you into warp drive and can blow engines. Nitrous can be ran very safe if installed correctly.

First off nitrous should never be used unless under WOT (Wide open throttle) which is when you have the gas fully pressed/engaged. Not doing so can lead to backfire and as you might think flames shooting out of your car is cool, its not so much when they come out of you intake.

Next another safety feature is a RPM window switch. This only allows the nitrous to be sprayed between a certain RPM. For bottom I have heard 3000 RPM is minimum. As for top end you want it below you rev limiter bounce back. This is the RPM you car picks back up when you bounce off the rev limiter. This is important because when the rev limiter is hit the car cuts the fuel and if nitrous is still spraying the car will go lean and can blow the engine.

I looked into various systems that control these functions but they seem to all be around $150 - $200.

After looking into how nitrous controller work by reading ecu readings and doing simple if statements, I decided to give it a try my self.

I was able to put this together for under $20 due to having some of the parts and it has been working great and is a ton of fun.

WARNING: I am not responsible for your action or anything that might happen to you or your car.

Step 1: The Parts and Tools

Parts used:

1x - Arduino Mini Pro - $2.42 (You could use nano or uno as well)

1x - 5v Relay - $4

1x - Buck Converter - $1 (I bought this as a 10 pack)

2x - 2 Pin Screw Terminal Block Connector

1x - 10K Resistor

1X - PCB Prototype Board

Tools used:

Soldering Iron/Solder

FTDI USB to Serial (For programming arduino not needed for nano or uno)


Step 2: Piece It Together

First step was to put the pieces together. Using the schematic provided I soldered the arduino, connectors, and resistors to the pcb board. Next I soldered the buck converter and the relay.

For the switch in the car I wired up a push button and a toggle switch. This allowed me to be able to turn it fully on with the switch and the computer does the work or with the button I can spray when I want and easily stop when I want.

Step 3: Finding the ECU Outputs

Now you need to find a pin out of your ecu. The two wires I needed is the Engine Speed Sensor (to find RPMs) and the throttle position sensor. In my case I have a electronic throttle system. If you have a mechanical wire throttle you could use a physical switch and change the arduino code a bit.

WARNING: If you are not comfortable with this please do not try. Find a professional. I am not responsible for any damage to you ECU or vehicle.

I unplugged the cables from my ECU. Once I found the 2 wires, I spliced into them and ran wire to later connect to the arduino.

Step 4: Dialing in the Numbers

The first code I loaded to the arduino was to determine a few numbers in terms of the throttle reading and the RPM reading.

When I found my ecu pin out it as gave indication of how wire output signals. The throttle output a steady voltage that varied at different levels of throttle openings. The RPM was a pulse.

I connected a multimeter to each output to verify the voltages and amps. I wanted to make sure they didn't exceed the limit of 5v and 20mA which they did not. If they would have I could have set up a voltage divider to limit the voltage and adjusted the code or a inline resistor to limit the current.

After I had signals from the ecu and tested their output, it was time to connect them into the correct terminals as previously marked.

The first piece of code I ran was the determine the voltage of the throttle at WOT (Wide Open Throttle) and have the RPMs where output.

Load up the following code:

void setup() {<br>  Serial.begin(9600);
void loop() {
  float voltage = (analogRead(A1) * 5.0) / 1024.0;
  unsigned long h = pulseIn(A2,HIGH);
  unsigned long l = pulseIn(A2,LOW);

After you upload this code start open the Serial Monitor in Arduino IDE by the keyboard shortcut Ctrl+Shift+m

Now you will see the input voltage of the throttle and the pulse width of the high and low cycle of the RPM.

With the car off (I didn't want to bug the neighbors) I looked at the voltage of the throttle. The voltage at idle (0% throttle) was about 1v and at WOT it increased to slightly over 4v. So I determined that a safe activation voltage was about 3.75 or roughly 91% throttle.

I then started the car closed out of the Serial monitor and opened it back up for a clean window.

Next for the RPM pulse I was reading around 19800 (in microseconds) for both high and low pulse widths. (The reading was inconsistent but not by a huge factor since a car doesn't idle perfectly smooth this was expected) This told me the the duty cycle was 50% or 0.5 also the pulse width of 0.02 seconds (19800 rounded to 20000 and converted to seconds from microseconds)

I used the following equation to find the frequency:

Duty Cycle(as decimal not percent) / pulse width (in seconds) = frequency

So 0.5/0.02 = 25

I learned that this can be put in the following equation to get a true RPM number:

RPM = Frequency * (3000 / (Number of Cylinders * 25)

So for my car 25 * (3000 / (4 * 25)) = 750 which is what my car was idling at.

Step 5: Editing the Final Code

You will need to change the following variable in the code to fit you numbers calculated previously.


Num_Cyl (4.0 for 4 cylinder 8.0 for 8 cylinder and so on)


Max_RPM and Min_RPM

int n = 3; //Nitrous Solenoid relay output
int s = 9; //Switch/Button Input //User configurable settings float Duty_Cycle = 0.5; //Calculated Duty cycle of RPM output. float Num_Cyl = 4.0; //Number of cylinders in engine float Min_Throttle_Volt = 3.75 //Minimum throttle open voltage float Max_RPM = 8000; //Max RPM to activate nitrous should be under rev limiter bounce back float Min_RPM = 5000; //Min RPM to activate nitrous void setup() { Serial.begin(9600); pinMode(n,OUTPUT); pinMode(s,INPUT); } void loop() { //Read throttle voltage float voltage = (analogRead(A1) * 5.0) / 1024.0; //Read the pulse width of the RPM signal unsigned long pusle = pulseIn(A2,HIGH); //Read the main activation switch int Activation_SW = digitalRead(s); //If throttle open enough and RPMs are within range and activation switch is engaged fire nitrous if (Activation_SW == HIGH && inRPMRange(pusle) && inWOT(voltage)){ digitalWrite(n,HIGH); } else{ digitalWrite(n,LOW); } delay(10); } bool inRPMRange(unsigned long r){ float rpm = (Duty_Cycle / (r/1000000.0;)) * (3000.0/(cyl*25.0)); if (rpm > Min_RPM && rpm < Max_RPM){ return true; } return false; } bool inWOT(float tv){ if(tv > Min_Throttle_Volt){ return true; } return false; }

After changing the code upload it and test it out. I use a led with a resistor and some leads. I ran this out of the hood so the led was right in my view. I did this so I could verify that the system was coming on at the right time and no other time with out having the nitrous actually spraying. I would rather have the led pop on than nitrous spraying at the wrong time.

I have had this working for about a week now with no issues. I 3D printed a case and it has been working great.

This project made me nervous at first but has taught me a lot about how the electronics on cars work. In the future I hope implement a gear input so I can configure staging by gear.