Introduction: Hardware Hacking 101: Silencing the SpotBot
The quest is simple. Make the SpotBot shut up.
I intended to document what was to be a simple hardware hack. I ultimately used a microcontroller to do this, but it could also be done by snipping a wire. I demonstrate 2 oblique ways to solving this problem which circumvent the need to completely disassemble the device in order to find the buzzer. The journey provides a glimpse into practical digital electronics and hardware hacking. And it could inspire you to break - err, fix - your own stuff one day.
Step 1: What Is a SpotBot?
What is a SpotBot?
The SpotBot is a carpet cleaning thingy. I don't receive any money for endorsing the SpotBot, but I endorse it, anyway. It's like a wet vac with rotating brushes for cleaning up stuff from your carpet. You just set it down over [motor oil, cat vomit, etc] and push a button.
There's something very satisfying about setting this thing on a stain, pressing the button, then simply going on with your life. But every SpotBot owner knows there's a dark side. When SpotBot is done doing your dirty work, it starts to beep. Loudly. Incessantly.
What's the big deal? Well, imagine you have a maid. You tell your maid to clean a spot on the carpet. Then you go about your business. You're relaxing in your recliner, sipping a marguerita, when your maid cries out, "All done! Come look and see what a great job I did."
You say, "Great! You're the best! Why don't you go home early, today?"
"No, come look! I did an amazing job!"
"Shut up, already."
"No, really! Come and see!"
"No, really! Come and see! I have my nose in the carpet and I can't smell any cat pee, at all!!"
"You're so mean. You're a lousy client. I don't need you. I'll be going, now.... as soon as you come and see this!!!"
So you basically have to get up and tell the SpotBot "good job, now shut up" by pressing the stop button. I don't know who decided that a loud wet vac machine needed an even louder beep to tell you when it was done (you'd think the sound of silence would be good enough), but I'd like to give him my 2 cents on the matter.
Step 2: Point of Entry
So the first thing is to determine where to open the thing. This is 90% of the battle. The SpotBot has a digital control panel on top with a bunch of buttons and LEDs. But there's seemingly no way to get to it. The closest screw is miles away.
Experience tells me that the whole panel must pop out. So I set to it. By inserting 2 screwdrivers into the corner of the panel, I'm able to pop it out.
Step 3: Now What?
So I got the panel out. As expected, there are a couple connectors on the back. There's a big connector and a 2-wire connector.
Ignore that little chip dead-bugged to the back. That was my ultimate solution. I took the picture when putting the thing back together.
Step 4: Panel
Again, ignore the chip.
This is what the panel looks like. Removing the four screws allows the pcb to come away.
Step 5: Reading a PCB
Ok, now for some detective work.
First things, first. Where's the annoying beep coming from? Unfortunately, I don't see a piezo element on the control pcb. And the SpotBot is a tortoise-like shell of armored plastic. So where to start?
Hardware Hacking Step 1: find the power and ground.
At first, I thought the 2-wire connector must be the power cable. But using a continuity tester, I quickly ruled this out. One of the wires is ground. But the other one isn't the power connection.
There's a big electrolytic capacitor on the pcb. These are usually a giveaway when looking for power and ground. So I followed the cap.
The positive end of the capacitor goes straight to a 3-pin TO-92 package device. Aha. It must be a voltage regulator. The middle pin connects to ground. The third pin connects to a power plane. Yep, it must be an LM78L05 voltage regulator.
So hmm.. could the 2-wire connector lead to the annoying noise maker? I connect the big connector back up, and leave the 2-wire connector unplugged. I press the start button, and I wait for 3 minutes. "Beep! Beep! Beep!" Darn it, no. I have no clue what that connector does, because the thing seems to work just fine with it unplugged.
Step 6: Plan B
So, perhaps one of the wires from the big connector does nothing else but control the Beep-of-Nagging-Hell? Well, it's possible. But I tried something else.
The "Finish" LED only comes on when the SpotBot is done. So it lights up at the same time Spot starts nagging.
So I figure, all I have to do is connect the active lo output of this LED to the button that's marked "Stop."
Step 7: Failure 1
So here goes. I added a jumper wire as shown in the picture.
Powered it on, and...
One of the LEDs starts blinking. The SpotBot isn't responding. It's an error message.
So for some reason the microcontroller must be doing some kind of diagnostic at startup, and it's detecting an error.
Step 8: Failure 2
So I swap out the jumper wire with a diode. This way, the LED connection can pull the button low, but not high.
I plug it in, and SpotBot's working. I run a cycle. At the end, it still beeps. The button is held low, yet the darn thing doesn't stop. What gives?
Well, there's a thing called debouncing. When you press a switch, the actual state may change several times before it settles. This is due to the physical properties of the switch. Digital circuitry often requires debouncing to prevent a single switch input from being read as several presses. One common method of software debouncing is to add a small delay after a change of state is detected, then to wait for the button to be released before acting. In a way, this is similar to the way a mouse button works. After you press it, you have to release it before it registers as a click.
The LED remains lit, so the button is held down and never releases. Ahh, back to the drawing board.
Step 9: Failure 3
To produce a momentary button press, there is a method called an "edge trigger." I first learned about this method some years ago from this exact site. If you scroll down a good ways, you'll find it under the heading "Edge-triggering."
Incidentally, this is also an excellent way to achieve hardware debouncing.
So why didn't this work!?
At the very moment that the LED goes low, the durn thing beeps. A microcontroller can only do one thing at a time! It is apparently telling the buzzer to beep at the very same time the edge trigger is doing its thing!
An embedded programmer can do 3 things to get around this. A microcontroller might have a hardware interrupt. If used, a button input can override whatever else the micro is doing, thus registering a button press even when it's not actively looking for one. Or an internal timer can be used. This timer will count down the delay while the buzzer is beeping, and when it gets to zero the micro is alerted to turn off the buzzer. In the meantime, it can go back to looking for button presses. The third way of dealing with the problem is to use polling. This means that inbetween every loop of delay, the program goes back and checks the state of the button(s). These kind of steps are somewhat cumbersome, and not at all necessary for a simple user interface such as this. So I'm not surprised that these methods don't appear to be utilized.
Step 10: Failure 4
So to get around this problem, I tried increasing the time that the button is held low. I did this by increasing the size of the capacitor in the edge trigger. This time I used a 100uF cap.
Doh. Now the thing is failing it's startup diagnostic again. So I put the diode back in the equation. The capacitor now gets a slight reverse bias at rest, which is technically not good. But I don't think a 0.6V reverse bias will kill it anytime soon..
But still no luck.... Why?
Well, either the cap is too small, still, or the microcontroller is using edge-detection in its debounce routine. If it's the latter, then this isn't going to work no matter how big a cap I use. Since the button is being pressed at the moment that the micro "has its back turned" (telling the buzzer to beep and the LED to light up), by the time it comes back the button is already low. If it's only looking for a falling edge, the button won't do anything when the edge trigger releases. Pity.
Step 11: A Hollow Victory
At this point I'd had enough. I took 5 minutes to program a microcontroller to do the job. It detects the finish LED turning on, then it waits 1 second before hitting the stop button.
...But that isn't necessarily the end of the journey! If your place isn't crawling with piles of blank microcontrollers like mine is, you might still find a way to beat the beep.
Step 12: Alternative
The beep is coming from inside the machine, somewhere. It's highly likely that it is receiving a signal from this control board. So it must be coming from one of the wires on the large connector. It's possible that the wire also does something else beside controlling the beep, but I find that an unlikely possibility.
If one were to probe the connector with a multimeter while it was beeping, the signal wire might be discovered... and snipped.
Hmm... this looks like a perfect application for an 8 channel logic probe.
Step 13: Logic Probe
Step 14: Results
Take a look at the pic to see the detailed results.
All lines are low when inactive, and high when active.
You can disable the beeping by cutting a wire.
I suppose you could also program a microcontroller to perform a custom cleaning algorithm if you cared to.
I also had another idea to make SpotBot actually help prevent stains rather than just clean them up. An IR motion triggered vacuum cleaner alarm might keep my cats away from a particularly problematic corner of the living room. Everyone knows cats don't like vacuum cleaners!