Name: Michael Shimniok
Member since: 2007-12-23 16:33:37
Last Login: 2013-08-22 04:57:14
Author of Bot Thoughts blog, interested in robotics since '89. Since 2007, dove in full force, built Pokey the firefighter (failure = learning), and then Data Bus, 3rd place in 2012 AVC, my Rapsberry Pi tele-rover, a beam robot, and have tinkered with lots of other electronic thingies.
Recent blog entries by shimniok
My Western Electric 302
I've finally fixed my only vintage phone, an old Western Electric 302, and thought I'd share the old telephones' electro-mechanical guts.
PulsesThese old phones are how dialing a number became a thing. Instead of push buttons and DTMF, rotary telephones send pulses. And not with a 555 timer, either...
Stick a finger in the number you want to dial next, rotate the dial clockwise until your finger hits the silver finger stopper thingy.
Then, remove the finger, and the dial rotates at a precise speed, sending up to 10 pulses within one second by way of contacts and cams.
The pulses are timed to within 10% of 66ms with the magic of physics.
How, you may ask?
GovernorThe dial uses a speed governor with hinged weights attached to a spinning shaft, similar to automotive distributors' mechanical advance mechanisms that are used to advance timing as engine rpm increases.
In the 302, the spinning shaft is driven by the dial return spring. As rotational speed increases, the law of inertia for the mass of the weights (1) and the centripetal force at the hinge point cause the weights to rotate outward, overcoming an adjustment spring (3).
Rubber stoppers (2) mounted on the outside of the weights then contact a containing drum (4), where friction prevents further speed increase.
ContactsThe electrical pulses are made by a cam that makes and breaks a set of contacts.
The cam (1), driven by the dial's geartrain and return spring, raises and lowers the flexible contact arm (2) to make contact with the second flexible contact (3). When one initially rotates the dial clockwise, no pulses are sent.
The cam (1) rotates counterclockwise along with a raised nub (3). When the nub is out of the way, the top contact is allowed to move down, remaining in constant contact with the lower contact (2).
When the dial is released, the cam immediately rotates clockwise, raising the contacts (2,3), while the nub rotates into place, holding the top contact up, so that the cam can now break the connection once per rotation.
By the way, many modern phone companies have equipment that still support pulse dialing. Including those at my central office.
I don't know what test equipment the Bell companies or Western Electric used to calibrate these dials. But I used a thoroughly modern (and indispensable) Saleae Logic 8 Analyzer.
I connected one contact to ground, the other to 5V through a pullup resistor, and measured that contact. When the connection is made, the voltage drops to 0V. When it is broken it rises to 5V.
Following lubrication and cleaning of the horribly gummed up dial mechanism, it was spinning a bit too fast, with 10 pulses being sent in only 0.9s.
Tediously tweaking the governor spring, I got within 1% of the target (506ms for 5 pulses as shown below).
Adjusting the duty cycle (pulse length) is a matter of bending the contacts slightly. With a little tweaking, and verifying that pulses are only sent when the dial is returning home, the dial's pulses are now within a few ms of the 66ms target across the entire rotation and range of numbers.
And, more to the point, the phone company correctly recognizes the numbers I dial.
Of course, none of this was possible until I first fixed the phone's internal wiring. More on that in a future post.
Making Slot Car Tires
As Christmas approached when I was a kid and Rudolph the Red Nosed Reindeer aired on the TV, Dad would return from the garage with an enormous box emblazoned with "Thunderbolt III" and a picture of two race cars battling to victory.
We set up the Strombecker slot car tracks and, grasping the blue speed controllers, we brought to life the epic struggle of white Chaparral 2D and yellow Ford GT 40 Mk II, father versus son.
I still have that old slot car set. And now a child of my own. And though Dad left this life in 2010 and mom passed away in September, they'd be happy to see my 7 year old daughter and I reliving those moments from my own childhood.
Except... when I finally unwrapped the cars, stored carefully 35 years ago, the tires fell apart in my hands. Rats.
After some online research, I discovered one can create custom slot car tires using a 2-part RTV silicone rubber. So that's what I did.
I found an Alumilite Super Casting Kit for $40 with coupon from the local craft store. The kit contains 2-part silicone rubber, 2-part resin, mold release, measuring cups, and stir sticks.
The instructions describe using the silicone rubber to make the mold. Instead, I made a plastic mold with my Monoprice Architect 3D printer and used the rubber, instead of the 2-part resin, as the casting material.
I designed the mold in FreeCAD. It is designed to mold the tires right around the original tires. The mold is basically just a bowl with a raised cylinder that the original tires snap onto. Then you pour the RTV Silicone goo around the outside of the wheels.
|Transparent 3d view of the mold|
In the first attempt, I thought it'd be fun to add black coloring. Since the silicone is white, the tire came out dark grey. I'll have to look for some clear silicone in the future.
The first two test tires came out fine, and I put them on the GT40. I replaced the rear axle and tires with a set from eBay.
I had a working slot car, although the silicone tires were slightly too large in diameter and inhibited contact of the pickup brushes with the track.
For the Chaparral, I printed smaller front tire molds, and then printed the rear tire molds. I was able to get measurements from the crusty original tires before they fell apart.
The next day I had a set of white tires for the Chaparral. However, they have a tendency to come off the wheels really easily. But, they do have more traction than the original rubber.
For the next attempt I'll 3D print a wheel and mold to create undersized tires that have to stretch a little to fit onto the original wheels.
I ended up going a little nuts over the last month, buying two more cars (both need rear tires), a New Old Stock chassis, new brushes, and a ton of track. I repaired a lot of soldering issues on the cars and track.
We've had some good fun racing with family and friends. But I have more up my sleeve. I'm working on a track timer...
At night, the smallest of the inflatable Hello Kitties were really dim! And the lights inside them were --gasp-- not user replaceable!
|Before: Small kitties are dim!|
|All but three kitties have been upgraded|
These inflatables have zippers at the bottom to access the internals. There's no need to unclip the LED.
|Epoxy-encapsulated single SMT LED|
Make sure you use a resistor rated for the power through it. Power is given by current times voltage: P=IV. So for example, 10mA x 12V = 0.12 watts. That's nearly 1/8W so I used 1/4W and 1/2W resistors I had laying around.
I selected wide-angle, 20mA, high brightness LEDs from Digikey, (Part No: C535A-WJN-CU0W0231-ND)
ConstructionI found some great protoboards on ebay. Long and narrow, it was easy to install the LEDs and resistors.
Since my wife has mastered soldering while teaching the 5th graders, assembly was a team effort.
InstallationInstalling the LED array was a matter of unzipping the un-inflated Kitty, reaching up in and grabbing the LED module, pulling out to access it.
Then, clipping the wires, I soldered them onto the protoboard.
I placed a dollop of Goop to glue the new board onto the old module.
Then added a zip tie (pink of course), belt-and-suspenders style, and we have bright kitties again!
Merry Christmas and/or Happy Holidays!
Oh, Here's an LED Refresher
It also means that connecting four LEDs in parallel draws four times the current as four in series. That's why I put the LEDs in series.
In this case, if I want I=15mA, and each LED drops 2.8V, then using Kirchoff's Voltage law, I can solve for the voltage across the resistor:
Then using Ohm's Law I can solve for the resistance, R, that results in a 0.8V drop and 10mA of current.
Closest E24 (5% tolerance) resistor is 56 ohms, but it's a good idea to see what happens in the worst case.
Most voltage regulators are within 5% (12.6V). Now if the resistor is at the low end of the 5% tolerance range (53 ohm), you'd end up with 26mA which is too high for the LED.
If you recalculated R for the worst case voltage and worst case current (20mA), you'd compute R=70. With the next E24 resistor of 75 ohms, you'd have a reasonably safe margin.
You could also check the LED datasheet and see if there is a worst-case (lowest) voltage drop on the LEDs. If you really wanted to get fancy, you could design a current source circuit instead that would be a lot less sensitive to power supply voltage error. But that's another story for another day.
DIY Vehicle Speed Sensor Buffer
Here's the riveting tale of how I created a Vehicle Speed Sensor (VSS) interface circuit for my Jeep Grand Wagoneer (yeah, that Jeep).
I wanted the sensor for the GM throttle body injection (TBI) system I retrofitted onto the Jeep's old AMC 360 c.i. V8.
Back when my Jeep was built, vehicle speedometers were driven by a flexible steel cable, the speedometer cable, connected by a tiny gear to the output shaft of the transmission.
Jeep, as with other vehicles of the era, split the speedo cable in half and stuck the VSS in between.
So, with insufficient hobby funds to buy an expensive, off-the-shelf Vehicle Speed Sensor/Buffer, but wanting to reap the benefits of a VSS, I created my own interface. Here's how it went down...
The VSS SignalMade of a rotating coil and fixed magnet (or maybe vice versa), the voltage across the two output wires of the VSS is a sine wave. It puts out 8000 pulses per mile.
As one would hope, the VSS signal's frequency increases with speed. But testing revealed that the amplitude increases too: from less than 1Vpp below 10mph, to a peak of around 4Vpp above 50mph.
The data points were all I could reliably obtain using a cordless drill to run the thing. But it provided sufficient understanding to devise an interface circuit.
|Speed (mph)||Amplitude (Vpp)|
What the ECM WantsUnfortunately for me, the GM ECM expects to see 2000 pulses per mile. And it expects a nice square wave, compatible with 5V logic.
The former can be managed by a counter/divider or MCU. The latter is easily accomplished with a comparator. But that's only if the original signal amplitude is large enough. It wasn't.
My interface circuit would have to amplify the VSS signal first, then convert it to square wave, and finally divide the frequency by 4. But that wasn't all...
AC/DCBefore I can amplify or really do anything at all, the VSS signal's DC offset needs to be kicked to the curb.
That way, when using a single-supply op amp, I can use a 1/2 VCC virtual ground (2.5V) and the amplified output will have a 2.5V DC offset that will work nicely with a comparator.
A series capacitor does this dirty deed dirt cheap. Um. Yeah. Anyway...
AmplificationBelow 10 mph, the VSS signal amplitude was too low to work with. A single-supply operational amplifier with a high gain ensures the output reaches the 0-5V rails at all but vehicle speeds below 2mph, which the ECM doesn't care about anyway.
|Example of a sine wave clipping|
That's called clipping. For music amplification, clipping sucks. For this signal it doesn't matter since we want a square wave in the end anyway.
One problem. After building the amplifier circuit and testing a little, the oscilloscope revealed unpredictable voltage spikes when the VSS spun at extremely low speeds.
FilteringThose spikes, amplified into pulses, would trick downstream logic circuits into reporting a faster-than-actual speed.
Filtering seemed like a perfectly sensible thing to do, assuming the noise was above the maximum frequency of the VSS signal. I suspected it was.
So, what was this magical maximum frequency I designed to?
Figuring on a speed of under, say, 100mph (the Jeep can achieve this only when driving downhill with a subtantial tailwind), one computes the maximum frequency as a unit conversion from pulses per mile to pulses per second (Hz):
The target was a low pass filter with a corner frequency around 200Hz. The low pass filter is the same as the amplifier, but with a capacitor in parallel with the feedback resistor. Use the formula below to find C given the feedback resistor R:
That's all well and good, but why not be a little trickier than that?
Using a smaller capacitor than calculated, the amplifier frequency response have gain at lower frequencies where the input was low amplitude, and would roll off to attenuate the signal at higher frequencies when the signal reached its maximum, while further attenuating higher frequency noise.
If you wanted to get fancy, you could carefully measure more input signal data points of frequency vs. amplitude, determine the best low frequency gain and roll off to maintain signal amplitude to tighter tolerances. Or a filter with sharper roll off could be used if noise is a really big problem.
Sometimes, it doesn't pay to engineer the snot out of stuff. As far as I can tell from testing, as long as the output signal amplitude is over about 2Vp-p across its range of 2-100mph and the noise is somewhat attenuated, then it is good enough for me to get this done so I can work on related projects and get the Jeep through emissions.
I used a trial and error approach to set the corner frequency until I got a reasonable amplitude at the lower speeds without any noise. I ended up using a 0.1uF capacitor.
The frequency response of the circuit starts with a gain of around 30dB rolling off gradually to -40dB by 200Hz, according to LTSpice:
I also found that a 22-33uF series capacitor on the input worked better than lower values that I tried.
Notice in the schematic below that the + input is connected to a virtual ground of 2.5V, half VCC, in turn providing a 2.5V DC offset to the output signal.
Converting to Square WaveWhile a comparator can convert a sine wave to a square wave, in the real world a noisy signal may bounce back and forth across the threshold, causing the comparator to trip when it shouldn't. To prevent this, you need hysteresis.
A normal comparator has one voltage threshold. By contrast, a Schmitt Trigger has two thresholds. The high threshold is for rising waveforms, and the low threshold is for falling waveforms. That way, once the signal rises above the high threshold, it has to fall all the way below the low threshold before the output signal changes. And vice versa.
Fun fact, you can use an operational amplifier to implement a Schmitt Trigger. So I was able to use one dual op amp IC to implement the filter/amplifier and the Schmitt Trigger.
By selecting 100k for all three resistors in the Schmitt Trigger circuit below, you wind up with a high threshold of 2/3 VCC and a low threshold of 1/3 VCC.
Dividing the SignalRather than using a logic divider or flip-flop, since I didn't have any on hand, I just used a cheap ATtiny25. It probably draws less current anyway. It's definitely more flexible.
A simple C program sets up the INT0 pin interrupt to trigger on the rising edge of the conditioned VSS square wave. By toggling the PB3 output pin within the INT0 pin interrupt service routine, and also toggling PB4 every other time the ISR is called, we get a divide-by-2 on PB3 and divide-by-4 on PB4.
Skipping every other interrupt for toggling PB4 is achieved by checking bit 0 of a simple count variable. If it's 1, toggle PB4. If I needed to conserve flash and/or execution time I guess this would be a good way, though probably not the most readable method.
How would you code this? Is there a better way?
The ResultI prototyped the design on a breadboard throughout the development of the circuit, testing it with the VSS I'd pulled from my Jeep.
Once the output signal seemed reasonable, I reinstalled the VSS and hooked up the breadboard in the Jeep and tested it out driving around. I didn't see any anomalous behavior. Then I hooked up TunerPro to my ECM to display the speed as seen by the ECM.
My initial revision was a divide-by-2 circuit, so I quickly refactored the code to look as it does above, and voila, correct speed reading.
The next step was fabricating a prototype circuit board... but more on that in a future post...
Teaching Programming to Kids (Cont'd)
After much struggle to select a microcontroller and programming system for teaching programming to my 5th grade club, everything suddenly came together.
In a flash I remembered PICAXE, which are low cost BASIC-programmable microcontrollers.
Even better, since all the kids have Chromebooks, PICAXE can be programmed with a Chrome App using the Google Blockly graphical programming framework.
For example, an LED blinky program looks like this:
As pointed out by my SHARC pals during a lunch discussion, 5th graders aren't expert typers so this kind of graphical block system sidesteps a lot of frustration. And I feel this system is better suited for robotics than native Scratch is.
The PICAXE Blockly IDE has some neat features.
First, the IDE includes a simulator so kids can run their code safely before trying it on the robots.
My sample PICAXE-14M2 is now successfully blinking an LED on pin B.5. Soon I'll be prototyping motor control using the Pololu DRV8835 driver breakout boards I bought during the Black Friday sale.
And, I'm almost done designing a baseboard, similar to my PIPduino, that uses a Pololu step-up/step-down regulator (S10V4F5) for power, also a Black Friday purchase.
Since the PICAXE programmer cables are too costly for our budget I'm going to find or make cheap FTDI breakout boards or else put an FTDI and USB connector onboard.
It feels good to have finalized the MCU and programming system for the kids' robots. I'll order the baseboards soon and hopefully I won't have screwed up anything so we can get started programming in 2-3 weeks.
Others have certified shimniok as follows:
[ Certification disabled because you're not logged in. ]