Sometimes you have to proceed to time-measurements which must be more precise than the RCX is able to. In such cases you require digital counters. Of course the information needs to be transmitted to the RCX. This is not an evident task, since the RCX has only analog inputs. The LEGO Mindstorms community (have a look at the web-sites of Andreas Peter or the one of Philo ) has developped several serial interfaces.

We worked on the idea of converting the digital information to an analog signal. The first appearance of this device may be found at the Phase sound sensor's page. A real hybrid between serial and D/A-converting systems can be seen at the Infrared-ultrasonic beacon's pages.

The following device is an extended version of those
prototypes. The main idea is to create a resistor-net which is a mathematical
base to convert a binary 8-digit-number to a single resistor-value. This may be
done by placing the resistors either in a serial or a parallel net. It is
important that the different values of the net are multiples of **2 ^{i}**
, otherwise you will not get an unambiguous result.

**1. SERIAL NET**

Note that open switch = 1; closed switch = 0;

r4 | r3 | r2 | r1 | R |

8000 | 4000 | 2000 | 1000 |
Ohm |

S4 = 0 | S3 = 0 | S2 = 0 | S1 = 0 | 0 |

0 | 0 | 0 | 1 | 1000 |

0 | 0 | 1 | 0 | 2000 |

0 | 0 | 1 | 1 | 3000 |

0 | 1 | 0 | 0 | 4000 |

0 | 1 | 0 | 1 | 5000 |

0 | 1 | 1 | 0 | 6000 |

0 | 1 | 1 | 1 | 7000 |

1 | 0 | 0 | 0 | 8000 |

1 | 0 | 0 | 1 | 9000 |

1 | 0 | 1 | 0 | 10000 |

1 | 0 | 1 | 1 | 11000 |

1 | 1 | 0 | 0 | 12000 |

1 | 1 | 0 | 1 | 13000 |

1 | 1 | 1 | 0 | 14000 |

1 | 1 | 1 | 1 | 15000 |

**2. PARALLEL NET**

Note that this time closed switch = 1; open switch = 0;

Attention: because the inverse of r_{i} is
considered, the order of r_{i} and S_{i} must be changed. Note
the decreasing R-values.

r1 | r2 | r3 | r4 | 1/R | R |

1000 | 2000 | 4000 | 8000 | Mho | Ohm |

S1 = 0 | S2 = 0 | S3 = 0 | S4 = 0 | 0 | #DIV/0! |

0 | 0 | 0 | 1 | 0,000125 | 8000 |

0 | 0 | 1 | 0 | 0,00025 | 4000 |

0 | 0 | 1 | 1 | 0,000375 | 2666,66667 |

0 | 1 | 0 | 0 | 0,0005 | 2000 |

0 | 1 | 0 | 1 | 0,000625 | 1600 |

0 | 1 | 1 | 0 | 0,00075 | 1333,33333 |

0 | 1 | 1 | 1 | 0,000875 | 1142,85714 |

1 | 0 | 0 | 0 | 0,001 | 1000 |

1 | 0 | 0 | 1 | 0,001125 | 888,888889 |

1 | 0 | 1 | 0 | 0,00125 | 800 |

1 | 0 | 1 | 1 | 0,001375 | 727,272727 |

1 | 1 | 0 | 0 | 0,0015 | 666,666667 |

1 | 1 | 0 | 1 | 0,001625 | 615,384615 |

1 | 1 | 1 | 0 | 0,00175 | 571,428571 |

1 | 1 | 1 | 1 | 0,001875 | 533,333333 |

**3. T****HE
INTERFACE WITH A PARALLEL NET**

Beside the low-cost-target we want to provide a galvanic separation, in order not to injure the RCX in any way. The easiest way is to use opto-couplers.

**Note that the polarity has to be respected! +V to x1-1.**

Because of the RCX-internal 10k pull-up resistor, the conversion to the raw-values follows the formula:

**RAW = 1023 * R / (10000 + R)
have a look at the book ****Extreme
Mindstorms****, Mike Gasperi, USA, 2000**

By transforming the formula you get the R-value back:

**R = 10000 * RAW / ( 1023 - RAW)**

We have R = **f**(X) = A / X, where X is the initial digital value

So we get back **f** ^{-1}(R)= A / R = X

In our case :

**f**(255) = 1000/(1/10+1/22+1/47+1/100+1/200+1/500+1/1000+1/2000) = 5398.7- A = 255 * 5398.7 = 1376658.4
**X = 1376658.4 / R = 137.67 * (1023 - RAW) / RAW**

Note that there is a non-neglectable error due to part
tolerance! The net has been chosen among standard resistor-values in order to
provide as much as possible unambiguous RAW-values. Note that the 10-bit
A/D-converter within the RCX gives 1024 different integer values. But the curve
being hyperbolic, the function decreases at the rate of -1/x^{2}. So the
real function may be surjective for the higher x-values. Of course the result
can be improved by changing the net as close as possible to multiples of 2^{i}.