A common Motorcycle maintenance task is to synchronize the throttle bodies on the engine to smooth out any rough idle. This is done by monitoring the vacuum on each throttle body and using the idle screw to make the adjustment.

While this sounds rather advanced, with a little knowledge, a few standard tools to access the engine, and a TBS tool (Throttle Body Synchronization); the maintenance item really isn’t that hard.

Now you can buy a tool or build a TBS tool using fluids and tubes (there are examples of this out there on the interwebs), but I wanted to use an Arduino and some electronics to build my own to do the job. This instructable describes my journey in making my own Arduino Throttle Body Synchronization shield.

Step 1: Research

A TBS tool is rather simple in what it does; it will measure the vacuum that each cylinder is actively producing when the engine is running.  To measure vacuum with an Arduino I needed to build a shield that would contain a vacuum sensor for each cylinder on my engine (4 in my case). 

There are many vacuum sensors available from your favorite electronics parts stores.  The interesting range that I need to measure is around -33 kPa (-4.78 psi).  This is the value that should be measured on my motorcycle on a single cylinder when the engine is warm and at idle.  You should consult a service manual for the specifics for your engine.  So I picked one that measured a range between 0 kPa to -50 kPa.

Then I needed to understand how to connect this to my engine.  The service manual helps here also, but I also found many great write ups on the web.  I just needed some standard engine vacuum hose with an inner diameter of 1/8th inch which will push onto a service nipple already present on the throttle body.  This same hose will directly push onto the vacuum sensor.  I found this in bulk at my local automotive store.  I needed four hoses each with at least 3 feet length so I could put the Arduino and sensors in a safe place.
Very nice! What was the part number for the sensors that you used? Also, any chance of sharing your code for either the Arduino or the PC? (Preferably both... :))
Thanks, <br> <br>Look for an update to the article in next day or so, I will include the part number for the sensor and few other requests. <br> <br>I am planning on having a follow-up Instructable that will include more of the software side of this project with explanations; where more of the code will be shared.
<p>Hi, Makuna,</p><p> Could you please share the PCB designs?</p>
<p>I have included a link to the PCB design, and all the source code. If you make it better, please contribute with GitHub.</p>
You could alternatively use an external Analog to Digital converter that has a higher resolution; there are cheap 16 bit i2c AD chips available; integrate that on the board and have the communications between the board and the Arduino just be digital could be very interesting.
<p>I'm planning on making this, but have a few questions. What changes would you recommend for the PCB? And does the vacuum ever exceed the tolerance of the sensor? Based on an analog gauge that typically goes down to -30 psi (-105kpa), maybe a MPXV6115V sensor might give a bit more range. </p>
I definitely would recommend some changes to PCB.<br><br>Start with a standard Arduino Shield Layout and make sure it fits on that. The current layout was just a linear line that made sure the pins would plug into a an Arduino directly. But at least for the smaller boards (non-Mega) it hangs out the end and also isn't secured with the other pins. With this I would also add a few pins to the other side just for mechanical structure when connected to the Arduino.<br><br>For my motorcycle, the vacuum did exceed the range but only when I increase the throttle to near 66% which happens only quickly (blip of the throttle) and isn't really needed when synchronizing. Vacuum at 50% throttle should be fine and most instructions don't even ask you do anything other than idle.<br><br>When ever you increase the range of the sensor, you decrease the resolution of the readings. The Arduino only has 10bits of resolution(0-1024), spread that across 0-50kpa versus 0-100kpa for example you would loose half your resolution. Ultimately its design decision also based on what level of vacuum you need to measure; for my application the one I picked was good.
<p>Thanks for the reply. I was thinking a sensor with a wider tolerance could theoretically be left on the bike while riding for tuning/troubleshooting/curiosity purposes. To achieve a more accurate resolution from a wider range sensor, I suppose one could impose a lower analog voltage reference maybe?</p>
<p>Hi, great instructable!</p><p>Is it possible to measure positive pressure with this? For example when you have an intake valve that's not closing completely and you get a backpressure from the cylinder?</p><p>Or would you have to use a differente sensor to achieve this? A -50kPa to +'anything' sensor basically?</p>
You would have to use a different sensor. They do have the &quot;same&quot; sensor with different ratings and several of them do positive pressures.
<p>I've spent a lot of time searching for a sensor that's capable of such a range, but they are hard to find or really expensive. Any thoughts about splitting the tube with a T-connector and using a positive sensor (e.g. MPXV5050GC6T1) in parallel with the one you suggested? Off course then I would have to read 8 analog inputs...</p>
<p>I'm getting the message &quot;Connect the TBS shield before starting this application&quot; I've changed the com port of the arduino to 11 and 12 with no luck. Is there something else I'm missing or have done improperly?</p>
Finding the port is a hard problem that is finiky based on how many comm port devices are attached.<br><br>This is where the code starts, <br>https://github.com/Makuna/Tbs4RpmWin/blob/master/Tbs4Rpm/MainWindow.xaml.cs#L291<br><br>and it calls this to enumerate ports<br>https://github.com/Makuna/Tbs4RpmWin/blob/master/Tbs4Rpm/MainWindow.xaml.cs#L228<br><br>and uses this to identify the port as being the TBS<br>https://github.com/Makuna/Tbs4RpmWin/blob/master/Tbs4Rpm/MainWindow.xaml.cs#L262<br><br>You would have to debug the code to see why its skipping the port you have it on.
<p>I've been trying to get it read all week. In the arduino program I see Idle 0 and idle 1 going back and forth. When the program runs the rx light on the arduino flashes once then I get the above error. could I have something soldered wrong and it's not reading any values from the sensors?</p>
<p>Hi !<br><br>Well i continue to have problems with this setup.<br> I will get the &quot;make sure TBS is connected before...&quot; message everytime.I can see that the PC software is trying to communicate with the Arduino but then nothing happens. I have tried COM ports with single and double digits without success.<br>Windows 7 32bit and Windows 10 64bit is also something i have tried.<br>The PC software is built without a problem, aswell as the compilation and uploading of the Arduino program. I have a Arduino Mega with the Atmega communication circuit, not the FTDI. So i have ordered a TTL to USB with the FTDI circuit to connect directly to the Arduino to see if that solves the issue. Any other suggestions is wellcome.</p><p>\Patrik L </p>
Did it resolve your issue?<br><br>Curious as I seem to have stumbled into the same issue. :-(
<p>Has anyone else run into issues when trying to get the Windows part (C# code) working?</p><p>I am running a Windows 7 (x86) with Visual Studio Community 2015, with an Arduino Uno R3 plugged in.</p><p>I am stuck with System.TimeoutException errors concerning the .ReadLine (when trying to read the version query result).</p><p>If I pop up the Serial Monitor or other utility to connect to the port, I see the &lt;idle0&gt; and &lt;idle1&gt; along with the version if I send the command/query for it.</p><p>What gives? :-(</p>
<p>Excellent work Makuna. I have one question regarding the Arduino model. Does your app work with the Arduino MEGA 2560 with ATmega16U2 USB-serial chip?</p>
There is nothing specific in the code about the connection to computer. It treats it as a serial device. But I have never tested this configuration.<br><br>The connection to the sensors also follows standard pin setup so it should work if plugged into any 5v Arduino.<br><br>
<p>Hi Makuna. I have sucessfully uploaded the SW to the Arduino, but I have problems with starting the Win app. It replies with the following popup &quot;TBS Sensor Unit not found. Make sure the TBS unit is plugged in before starting this application&quot;</p><p>The arduino is detected as COM7. Any idea what could be the issue.</p><p>Thanks.</p>
<p>In the method </p><p>private string FindPortName(List&lt;string&gt; portsSkip)</p><p>you will see this line</p><p>if (portName.Length &gt; 4) // skip COM5</p><p>this is the problem. I had to add that due to have other USB devices that exposed a serial port that would choke if probed by the code in another place. This is suppressing all com ports that are single digit.</p>
<p>Hi Makuna.</p><p>I can not solve this problem. Simply does not find the COM port even if I change the port to COM10 or above. Tried on different PCs and the problem is the same. Can you send me your already compiled app to try.</p>
<p>I've noticed that line during troubleshooting and I tried with different COM port settings, unfortunately with the same outcome. Can you suggest which lines to delete or add in the code so I can try again. I'm not so much in to writing codes. I've tried with some simple arduino codes for reading analog input and plotting to serial port just to check if my sensors work and that was successful.</p>
<p>Hi. Great work! Thank you. Could you please either post or email the pin connections between the shield to the arduino?</p><p>Thanks for sharing.</p>
<p>In this [picture](<a href="https://www.instructables.com/file/F9K6S5XH2G5ZUVS" rel="nofollow">https://www.instructables.com/file/F9K6S5XH2G5ZUVS</a>) it shows the board layout, with labels showing connecting to the Arduino A0 - A3 directly.</p><p>The board was designed as a shield, so it just plugs directly on the top of the Arduino.</p>
I could really use that ounce I'm down with my carbs
<p>Hi Makuna, I thought this would be a nice project to sync the three throttle bodies on my Triumph Sprint 955i. I have fitted the sensors onto an arduino shield and plugged that into an Arduino Mega2560 board. The Arduino shield program runs nicely and I can see the output on the serial monitor. I have not been able to build the Windows TBS4 program. On Visual Studio10 Error messages are &quot;cant find MainWindow.xaml.cs and TBS4win.exe file. Are these missing from the zip files that you posted? Thanks On-on</p>
<p>it was there and for some reason I deleted it. In the spirit of Halloween I reserected it.</p>
Hi !<br>Have anyone solved the issue with the missing Mainwindow.xaml.cs file ?<br>This is the last step for me before i can actually try this project on my bike.<br><br>\Patrik
Check github again, this just got fixed.
is this syncing a maintenance issue or engine management?
<p>This work was aimed at maintenance. The concepts could be extended to management but this was not the goal.</p>
Okay, thanks! I was thinking this could help with an ITB idea I had for my car.
<p>I'am doing the same thing with other vacuum sensors. I have done also android UI. </p><p>It's a simple UI with 4 progress bars indicating pressure on each channel..</p><p>Can you please modify your library to support 3V sensors? </p>
just use logic converters.
<p>In the article there is a section that describes the relationship of the readings in voltages and the calculation to turn this into Kpa. If you are using a 3.3v Arduino this needs to be adjusted as its ADC range is 0v-3.3v instead of 0v-5v. </p><p>You will need to know what voltage your sensor outputs at the highest and lowest reading values. You can rely on the sensor specs for this; or attach a vacuum pump to a sensor and watch the ranges it provides as you increase and decrease the vacuum. </p><p> adc Value For 0 kPa = 4.6v * 204.8 = 942.08</p><p> adc Value For 50 kPa = 0.1v * 204.8 = 20.48</p><p>Then you can calculate the scale constant (kPa1000PerAscUnit) </p><p> kPa Per Adc Unit = (sensor range) / (Adc voltage range)</p><p>Inserting the numbers above, and due to using integers rather than floating point, scale by 1000, you get...</p><p> kPa 1000 scale = (50 * 1000) / (942 - 20) = 54;</p><p>Find these lines below in the code and adjust per new calculations for 3.3v instead of 5v and what ever range your sensors has and it should work.</p><p><br> const static long kPa1000PerAdcUnit = 54; // 0.05425347 per ADC unit;<br> const static long adcValueFor0Kpa = 942; // 4.6v<br> long kPa1000Value = ((adcValueFor0Kpa - adcValue) * kPa1000PerAdcUnit);</p>
<p>Hi, the project it's a little old, but very interesting, have you ever thought to integrate a couple of steady fixed stepper motors and a bit of logic to do the syncing work for you?</p>
<p>A couple questions:</p><p>1. When ordering the PCBs from Silver Circuits, did you just accept the defaults on the ordering page? <a href="http://i.imgur.com/QxUAIpj.png" rel="nofollow"> http://i.imgur.com/QxUAIpj.png</a></p><p>2. Can you suggest appropriate pin headers from digi-key? I think I have some spare headers that can with my arduino but I'd like to order more.</p>
<p>That is very cool.</p>
Wow, very nice!! <br> <br>Just a suggestion for future, what about using 4 rows of ~20 Led's. It will take some multiplexing but judging by your workmanship, you should have no trouble making this into a very portable unit! <br> <br>Thanks for sharing.
<p>I don't like the layout either as it doesn't fit the Arduino well. </p><p>The problem with something that works is that its hard to justify fixing the design and the cost to do it again. I made the files public in the hopes someone will contribute and grow the project.</p>
<p>When you say that it doesn't fit well you mean that the spacing of connectors is a bit off? I was just about to send your eagle file to oshpark, but it seems like I will have to learn Eagle first. ;)</p>
<p>The connectors fit fine, but the board doesn't fit over the Leonardo or Duo well, sticking out on one side and not using the full area on another.</p><p>If I was to redesign the board, I would start with a Leonardo/Duo sized shield layout and have the sensors in a 2x2 layout rather than the 1x4 that I had done.</p>
<p>This is still on my to do list. I have been busy making a GPS speedo but I will be starting this project in May.</p>
<p>Thought I'd share my project which aims to create a standalone/handheld version of this. <a href="https://github.com/synfinatic/carbsync" rel="nofollow">https://github.com/synfinatic/carbsync</a></p><p>PCB design is basically done (waiting to confirm some footprints before I send it out to OshPark for mfg). It's powered by a Teensy2.0 and has a LCD display so no computer required.</p>
<p>Hi Makuna,</p><p>Thanks for posting everything up on GitHub. I was curious to know if you've picked a license for your code/eagle design? </p>
<p>This is a great project and thank you for sharing! It's incentivized me to create my own, but with a small LCD screen for easy tuning without a computer.</p>
<p>Hi Makuna, I would like to buy one of these.</p><p>Is it possible? Please email me at malcolm.ragan@gmail.com</p><p>Thank you</p>
Sorry, I don't produce them yet. There hasn't been enough demand and one offs are expensive to produce and support.
<p>Is there a part number for your PCBs from <a href="http://www.silvercircuits.com/" rel="nofollow">SilverCircuits.com</a>? I was wondering if I could just order one based on your previous order rather than redesign my own.</p><p>I have all my other parts on order. </p>

About This Instructable



More by Makuna:Maker Faire Canopy Footing Mini Card Deck Holder Electronics Tips: Surface Mount Soldering By Hand 
Add instructable to: