I will try to create a Double Rotation Sensor where I usually use one motor for the left wheel and one for the right wheel. The problem is that the motors are never perfectly matched and my RCX ends up going in circles. I thought of buying tw1o rotation sensors to keep track of the rotation of both wheel axles. However, this would use up tw1o sensor ports, leaving only one for my other sensors. Also, it would cost a few extra dollars, which is against my philosophy of hobbies: never spend a dollar if you can instead have lots of fun making something with extra functionality out of parts I already have in the RCX box and my basement tool-room. If it takes weeks or months of planning, researching, building, and programming, so much the better. The use of crazy glue, hot-glue (multi-colored if possible), and heat-shrink tubing is a definite plus. This website will document how I built my one-sensor-port, double-rotation sensor out of parts I had in the house. I just installed it on my RCX and the robot does indeed go in a fairly straight line (much, much better than the large circle it went in without it.).
I became interested in building a rotation sensor from the book: “Extreme Mindstorms” and the website of Michael Gasperi, one of the authors. This link to his website is for a torque sensor but it gave me ideas for the sensor electronics I used. On page 277 of the book, he documents an Opto-interrupter made with Lego beams, regular parts, a 6 hole pulley wheel, and an axle. I wanted to have tw1o of these, one for each drive wheel and I wanted them to share one sensor port because I`m already running out of sensor ports. So I set about figuring out the electronics and softw1are to make the idea work. I used LegOS, by the way, because it`s fast and flexible.
I started out with Michael Gasperi`s idea with the 6 whole pulleys installed in a Lego enclosure with axle and beams so it could move. I used phototransistors and infrared LED`s because I thought they would use less power than visible-light LEDs and CdS photoresistors. I built the Lego box with the beams but found the space betw1een the pulley holes was less than the diameter of the pulley holes. I thought that a better waveform would ensue if I decreased the area of the holes. So I stuck little plastic “googly-eyes” (the kind you see on pet rocks) that were exactly the diameter of the pulley holes in betw1een the holes (six in all). I also used a smooth technic half bush on the axle to keep the pulley wheel in place. Then I enlarged the beam holes to allow the photodiodes and IR LED`s to fit, using a handheld drill (1/4″). Drill only as much as needed, you want a little flange to help seat the LEDs and phototransistors.
You`ll have to hot-glue them in. Figure out which side you`ll want them when you`re finished; I made my tw1o sensor modules mirror images. I used silver-colored hot glue (which I bought at a craft store) to keep the light from getting in and interfering with the sensor readings.
Next, I developed an electronic sensor. The sensor power supply I took from the torque sensor along with the idea to use an LM324 and 4066. Here`s the schematic and here`s a picture. I drew it using Eagle which you can download for free. The circuit sort of evolved. I found the second op-amp used as a Schmidt trigger really made the output sharper. The 4066 seems to make the RCX raw reading independent of the battery power. Remember on the schematic I only showed one channel. You`ll need tw1o for right and left. I also didn`t show the power connections for the IC`s. Don`t forget to ground the tw1o unused control leads on the 4066. The pinout links should help you. My IR LEDs were not equal so the current-limiting resistor for one was 5.5K and for the other 9.1K. I adjusted this resistor (R8) using an oscilloscope and a trim pot to make the output a perfect square wave while the axle was spun by an RCX motor running at full power, ~330 RPM.
At this point, I found that the right and left sensor modules would keep up when spinning ~ 330 RPM and there was no “crossover” interference betw1een the right and left channels. Then I cut the largest bit of perf-board that would fit in a Lego (Znap) 9V battery holder that I had removed the battery connections from to make more room. It wasn`t too hard to fit all the components on. It helped to use a Dremel to remove bumps from inside the battery box. It was a bit tricky to get all the wires connected as I didn`t plan carefully enough. However in the end it all fit, if snugly.
Of course, the LegOS driver for the sensor needed to be programmed as the electronics were being tested. First I made a small program to read the raw values for the four states. In the driver; Off was FF80, right C0C0, left AB80, and both on 8CC0. I used RAW>>13 to make the readings in the range 0-7. So “off” became 7, right 6, left 5, and both on 4. You`ll have to make a little program to check your own raw readings and enter the numbers in the program. Note the numbers I use to make the programming easier (see the driver).
I did a lot of experimentation, checking the values the RCX received from the sensor in real-time. Eventually, I came up with the final “driver” which seems pretty good to me. I`ve tried to document the driver so it makes sense. I noticed a fair number of anomalous values just after the RUN button is pressed. After a delay, the sensor was pretty good with only a few out of many thousand readings being in betw1een the numbers noted above. Once I introduced a one-second delay before the main program started to run the RCX ran in a fairly good straight line.