Project Feasibility Question - Rotary Engine Compression Tester - Please Comment

I know quite a bit about computers, but nothing about the Arduino and its capabilities and need some sage advise.

MY PROJECT - Rotary engine compression tester

Mazda RX-7 and RX-8 rotary engines have two rotors, each with three lobes, and no pistons. A very good way to determine the 'health' of a rotary engine with a lot of mileage is to do a compression test using a specialized compression tester that tests the compression of each of the three lobe chambers separately.
A Mazda OEM Compression Tester costs about $1,800. Generic testers cost $325 (See the video at for how it operates.)

A pressure transducer (connected to the compression tester) is screwed into a spark plug hole in the 1st rotor (the process is repeated for 2nd rotor) and the engine is rotated using the starter for a short period of time. The compression tester measures and stores the maximum readings of each of the three lobes and/or averages the readings (for each of the lobes) over some three to five revolutions.

If one of the lobes shows a significantly higher compression than the other two, this indicates a damaged apex seal between two of the lobes.

If the lobes show relatively equal but low overall compression, this indicates worn apex and side seals

A pressure transducer would be connected through an ADC to an Arduino with a 4-line display.

The pressure transducer outputs 0.5V at 0-psi and 4.5V at 200 psi. Response time is about 1ms.

Engine cranking speed varies from 120 rpm to 300 rpm (2 to 5 revolutions per second) depending on engine temperature and battery condition.

The engine has a compression 'stroke' every revolution, so each compression stroke duration will be at least 200 milliseconds long in duration. The shape of the pressure curve would be approximately sinusoidal. Pressure transducer sampling could be done every 5-10 mSec.

'Good' or 'bad' results are dependent on both rotor pressures AND the cranking rpm.
(See chart at )

At a minimum, the tester needs to calculate either highest pressure and/or average pressure for each of the three rotor lobes, and the average rpm. +/- 5% accuracy is probably good enough for both pressure and rpm. A 4-line 20-character display would be adequate.

Is this project feasible?
Thanks for your comments.

I think the feasibility depends on two factors. {A} whether the transducer you have in mind is suitable for detecting the pressure (and you will need to go elsewhere if you need advice about that) and {B} whether the Arduino can collect samples fast enough to be useful.

The analog to digital converter in the Atmega 328 can do a max of about 15,000 samples per second at max resolution.

You mention samples at 5 to 10 msecs sample intervals but I suspect that would not be fast enough. The critical period, IMHO, is the few degrees either side of maximum pressure. A 30 degree range would only take 200/6 msecs - say 33msecs and you probably want to get a reading every msec in that period in order to be sure that you do not miss the peak. And it would probably be wise to experiment to see if that is sufficient by comparing the results with the commercial compression tester.

That should certainly be within the scope of the Atmega 328 but I'm not sure if it could be achieved using the standard Arduino analogRead() function. You would need to do some tests. If the standard function is too slow you would need to write code to control the ADC register directly - not rocket science, but a little more complex.


Robin2, thanks for your response. The pressure transducer I’m looking at is probably suitable for the environment it would be subjected to.

It’s a three wire unit with a ground, +5VDC supply, and transducer output that varies linearly from 0.5V to 4.5V. Response time (settling time? refresh rate?) is listed as <= 1mSec so meaningful sampling could be done every 1mSec if the Arduino can capture at that rate.

(see )

The 5-10 mSec sample interval I mentioned was what I thought would be the longest interval that could be used that might still give useable results.
As you noted, 1mSec sampling would be more optimal.

Would you know offhand what the clock rate of the Atmega328 is and where I might find a document listing the number of clock cycles required of each the different functions like analogRead()?

I’m hoping not to have to write any machine or assembly language routines. The last time I did that was as a contract coder in 1973.

(see )

See if you can get the manufacturer's datasheet to confirm the ebay data. I don't see any information about how quickly it can respond to a large change in pressure. By the way I am NOT trying to suggest that it is unsuitable.

Would you know offhand what the clock rate of the Atmega328 is and where I might find a document listing the number of clock cycles required of each the different functions like analogRead()?

The standard Arduino Uno clock speed is 16MHz.

While it would be possible to figure out the number of cycles for analogRead() I doubt if anyone has bothered. And, of course, there is more to it than just analogRead() because you don't want to throw away the value immediately after it is obtained. Write a short test program and time it over maybe 1000 iterations using millis().

The Atmel (now Microchip) datasheet for the Atmega 328 has all the gory details including the number of clock cycles for an ADC conversion - but note that analogRead() also selects the pin to be used so it does more than just convert.

It is quite straightforward to manipulate the Atmega 328 registers using C++ as they are all defined in the Arduino code.

The only way to prove your project will be by comparison with a commercial compression tester.


This process is basically the same for any internal combustion engine. What is NOT mentioned (that I could see) is the check valve between the pressure transducer and the combustion chamber. Several rotations of the engine are needed to achieve max pressures, which is definitely within the realm of processing speeds, and even the ramp up pressures from a single event could have a few data points if you were looking to plot the curve and had a simple efficient code.

What is NOT mentioned (that I could see) is the check valve between the pressure transducer and the combustion chamber.

It probably does not matter if I don't follow that as long as the OP does.

Do you mean a one-way valve that allows the pressure to be "collected" over several cycles?

If so that would not work for a rotary engine because all 3 "cylinders" on one lobe will feed the same transducer which would make it impossible to compare the compression for individual lobes.