Skip to main content

Easy tuning a Honda or Acura with Crome and Freelog

his is a tutorial on how to easily tune using all free software and without using a moates ostrich. I can't believe anyone has never tried this before.

1. First you need to setup your ecm with a basemap and datalogging. There's other articles on this.. I will not be covering how. Make sure you have all your rpms and map sensors correctly set in freelog. (They should match crome). Make sure you have a safe basemap, this means retarded ignition, boost cut off, and lots of fuel under boost (it's better to blow out spark with too much fuel, than melt your pistons by not having enough)

2. When ready, go collect some data with freelog. You want a map of o2 values looking something like this...


3. Do a file -> save fuel map captures as in freelog


4. Open the saved csv file in your spreadsheet program, google doc's works great if you dont have one. I use It should look like this...


5. I have a B18b, so i'm only doing low cam tuning, scroll down until you find "Low Cam" Complete and copy the whole table of values into your spreadsheet program
Should like similar to this...


6. Add a new sheet to your spreadsheet, In it copy all of your target o2 values. Mine looks like this...


7. Next we want to compute the percent error between the values and make a table of fuel multipliers. Percent error is (observed - expected)/expected. In this case, our observed is our datalogged o2 values, and our expected is our target o2 values. Create a new sheet, and copy either sheet1 or sheet2 into so all the rows and columns are aligned. If we use the formula above, =(Sheet1.B5-Sheet2.B5)/Sheet2.B5 (note your spreadsheet syntax may be different) you will get values something like this...


-1's and 0.001's are going to ruin our fuel map, so we have to adjust the forumla to this

What this does is says, if you didn't get a o2 value in the datalogger sheet, it will be 0 so just set the multiplier to 1 (keep the fuel value the same).. If you do have a value there, add the margin of error to 1, creating a good fuel value multipliers. I got something like this....


Your values should make sense, If you have a higher o2 value on the datalogger than what you want, (aka running lean) the multiplier should be < 1, meaning it will add fuel. And the same for running rich. Check a few values to make sure you didn't make any mistakes. Mine were good so I continued on...

8. Now you want to make another sheet and copy sheet1 into it again. Then go into crome and open your chip. Copy all of the fuel values for whatever cam your tuning, I'm doing low cam so mine looks like this...


Copy this into your new sheet4... It should look like this...


9. Add one last sheet to your spreadsheet, copy sheet1 again into it, make sure that all of your tables correspond, aka all rpm and map scalars should match up for each and every sheet (Sheet1.B1 should be the same rpm/map as Sheet3.B1 and Sheet4.B1 etc...) , If they don't go back and restart or find which ones do not line up. Failure for these to not match up will completely ruin your chip and possibly damage your car if you don't do this right.

With that said, plug in this formula into the last sheet
, all this does it multiplies your fuel values by the multiplier we made earlier. Mine looks like this...


10. Finally copy your values back into crome and save it as a new chip. (I strongly recommend not rewriting your old chips as you have something to fall back on if you mess up).

Then your done. This is an absolute must do procedure, if you don't have an ostrich (I'm to cheap to buy one so why not just use my brain?). Adjusting values one by one without knowing how much to change them will take forever and is not nearly as effective as this method (believe me I know). You may have to do repeat this a few times, as you progress your datalog values should be quickly be getting closer and closer to your target o2 values. With one try I got within a margin of error of about 5% on all of my values.

Good luck!


  1. Great write up for those with limited funds. I had an Ostrich in the past but now I just have a chip burner. So what if it takes longer! Save some cash and spend more time with your ride!




Post a Comment

Popular posts from this blog

Kivy vs React-Native for building cross platform mobile apps

I've built three apps now using Kivy and one with React-Native, just wanted to share my thoughts on both.

Just a warning, I am strongly biased towards python and this is all based on opinion and experience and is thus worth what you pay for it. I don't claim to be an expert in either of these, just have worked with each for several months.  If something is incorrect I'd love to hear advice.

Demo of one of the apps

Nice to be able to run natively on the desktop WITHOUT a simulatorPython is easy to work withUse (almost) any python libraryVery easy to create custom widgetsKivy properties and data binding just work. Way nicer than React's "state" / flux / redux whatever you want to call it (stupid?). Native interfaces (pyjnius) and (pyobjc)Runs and feels pretty smooth Cons:Default widget toolkit looks like Android 4.4. Requiring you use your own widgets or a theming kit like KivyMD if styling bothers youCreating dynamic widgets declaratively is not yet s…

Control Systems in Python - Part 1 - Bode and Step Response

I hate matlab with passion, yet sadly, nearly everyone uses it.  I'm a fan of Python and open source stuff so here's a simple article on how to do some common control systems stuff in Python.

First we need to make sure the environment is setup.
Install IPython (or you can use any other python shell, but a unicode supported shell is preferred)Install python-control (numpy, scipy)Install sympy
These should do if your on Ubuntu/debian:

sudo apt-get install python-sympy python-numpy python-scipy python-matplotlib ipython
Then you need to install python control, see How to download and install python-control
Intro to using SympyOpen ipython and run the following:

import sympy from sympy import * sympy.init_printing() s = Symbol('s')

Now we can do things like define transfer functions using the symbolic variable s.

We can expand the bottom using the .simplify() method

and we can do something more complex like...
which is really nice because it does all the multiplication for us... and it’…