The other day one of those pegs cracked, and I was able to rescue all the bits before they ended up in the heating element:
There’s an obvious layer of scurf and hard-water and soap deposits, and it’s also pretty clear that the pin cracked along the layer lines — probably some combination of lousy layer-to-layer adhesion and stress concentration (if a crack is going to form in a 3D printed piece, what better place than where the surface already has a V-shaped divot).
I printed a new peg-and-wheel combo out of whatever is on the machine at the moment, and we’ll see how long it lasts. The current stuff seems a little more flexy, but it hasn’t been through a thousand or hot wash-and-dry cycles, so who knows.
Pretty much ever since I upgraded to Ubuntu 22.04 (yeah, long term support), the software updater has been crashing. At first I worried, then a search mentioned that it was a known problem and in line for fixing, so I just ran the updates by hand. Then I went down a rabbit hole because there are several other programs that update software (and snaps, and flatpaks for those so inclined) and apparently all of them have problems on 22.04.
I assumed that the problem was something arcane and well beyond my abilities, so I just messed along waiting for someone else to fix things.
Then last week, in a moment of boredom I checked the Details tab of the error window. It’s a python import error: can’t import Sequence from the collections package, on some random line of the python wrapper for talking to the Linux dbus. A couple more searches, and yeah, in Python 3.10, for reasons no doubt clear and sufficient to the developers, Sequence got moved from the collections module to the collections.abc submodule. The folks working on the python dbus wrapper are apparently aware of this and have fixed it in a new release.
Which won’t install on my machine using PIP because I haven’t downloaded all of the necessary development tools to compile and build the dbus code that the python wrapper wraps itself around.
The heck with it. I fired up jmacs (the vaguely emacs-keybinding version of Joe, which I prefer to nano) and opened /usr/local/lib/python3.10/distpackages/dbus/service.py. On line 35 I changed “from collections import Sequence” to “from collections.abc import Sequence.”
This is no doubt extremely ill-advised and will eventually brick my entire desktop. But for the moment I don’t care.
So the kid decided to teach a soldering workshop at geek camp. Of course that means a custom PCB (and custom firmware, but that’s not my department). Which meant that I finally got to test all those tutorials about etching your own PCB with vinegar, peroxide and salt.
You know what, it’s an effing pain. The kid’s CAD program exports SVG, so I thought at least that part would be easy: export, hand the file to the Glowforge, zap away the resist, done. But no, the SVG is one of those cobbled-together things with black traces and and little white areas covering the parts where there shouldn’t be any copper. But the Glowforge doesn’t care what color an area is: if it’s filled, it zaps it. Oh, and layers so that the white areas are hiding a bunch of lines the CAD developers didn’t want to bother drawing to the right length. So it turns out the least brain-melting way to get an image for zapping is to export the design as a bitmap, import to inkscape, trace it, and then subtract the traced version from a big colored rectangle.
Then: you coat your PCBs with nail polish or spray paint and zap the spray paint back off. (I had this idea I could zap a layer of masking tape and use it to pattern the paint/polish, but not, the dried stuff sticks to the edges of the tape much better than to copper.) Then use some alcohol to wipe off the zapping residue and you’re good to etch. But wait! Hardware store spray paint dissolves in isopropyl alcohol, so nail polish it is.
Then the etching, which takes a whole lot longer if there’s a few days of cold weather. And more vinegar, peroxide and salt than you think, even for a handful of 2×3-inch boards. Oh, yeah, and then the drilling. I knew that dremel drill press would come in handy one of these decades. And the surplus-store sets of teeny-tiny refurb bits. And the magnifying clip-on for my glasses. And a slightly steadier hand…
Was it worth it? Good question. I certainly learned a lot. If you don’t count the dremel, or the dremel drill press, or the high-power magnifier, it was probably cheaper than getting boards from one of the usual suspects (except when one of the usual-suspect PCB houses has a getting-to-know you sale). And if you don’t count having to redo a couple of the steps, it might have been faster.
I’m glad I learned how to do this, and I might want to do it again some time, but I’m not in any hurry. On the other hand, I can see a bunch of ways we might have done things better if only we had known beforehand what he know now. So if I just gin up a little project to test out some different ways of doing the resist and the etching, and maybe build just a little numerically-controlled X-Y stage for the drill press…
Don’t get me wrong, I love Circuit Python. Sure, I could get stuff done in the ugly stepchild language that is Arduino, but the niggling details, the mediocre IDE, none of it was my friend. And truth to tell, it’s not often I need the full speed of even an ATTiny.
CircuitPython, in its quest for ease of use, sometimes does drive me completely around the bend. Particularly about the lengths its developers go to in avoiding interrupts. They’re right: interrupts are inelegant, interrupt code breaks way too easily, writing it just leaves you with a different set of problems, etcetera. I know that. And in theory I admire the tools they’ve developed to make interrupt routines unnecessary: countio, which right now just counts falling edges on a pin but soon will do all the things regular digital inputs do; pulseio, which gives you a Wow! bleeping list of the on and off times of the pins you’re watching. And the keyboard functions that tell you what switches you’ve got pressed. That’s almost all of what you might sensibly want interrupts for when you’re programming in an interpreted language.
Except. The gotchas. For example, pulseio counts in microseconds and only handles unsigned two-bye integers. So if whatever you’re watching go on and off does it slower than 16 times a second, that’s too darn bad.
Or the RP2040 and its PWM channels. For reasons that are no doubt obvious to the developers, you can only make countio objects on pins assigned to PWM port B. There are 8 of them, so that really shouldn’t be a problem, but wait. Ports A and B (as far as I’ve been able to figure out) share timer channels 0-7. So if you have a counter object on a pin that talks to timer channel 3 (on port B, natch), then woe unto you if you try to make some other PWM object (motor driver, servo control, tone out, dimmable LED, whatever) attached to the pin that talks to timer channel 3 on port A.
You can either make a matrix and cross out the pins you can’t use as you start assigning counter objects and PWM outputs, or you can just pick a number, see if an error message comes back and pick again. Or (if I were building new widgets on a slightly more frequent basis) it might even be worthwhile to create a tool where you tell it what inputs and outputs you need, and it hands back a list of plausible pin assignments. (Did I mention that my eyes are getting old and I really don’t like changing wires from one pin to another once I’ve got them set…)
It’s not a big deal, really, and mostly the problem is expectations. Python is supposed to be a language about orthogonality and abundance, not this-operation-only-uses-that-resource. If it were Arduino coding, I wouldn’t be surprised by arcane restrictions, but now I’m spoiled, and it’s hard to go backward.
(Ok, one latest debacle finally got me to post this). And then there’s my other favorite board, the Cytron Maker Pi 2040, which has a motor driver and servo drivers and a bunch of cute connectors. And no complete listing of what all the pins do. There’s a fuzzy silkscreen on the back for some of the pins, and a better silkscreen on the front that at least tells you what GPIO each special-purpose pin is connected to. Then you can either check table 1.4.3 in the Raspberry Pi datasheet, or consult the pictures of Raspberry Pi Pico board that tell you which functions go with which GPIO. Not sure which is more cumbersome.
The 16-year-old, who wants a career somewhere in IT, introduced me a while back to the distinction between pets and cattle. When something goes wrong with your pet, you nurse it back to health. When something goes wrong with one of your herd, you segregate it from the rest, hand the problem off to someone else (maybe future you) and get back to your work.
In the past few years, the tiny school I work at has gotten a couple of substantial donations from offices that were ditching their old desktop PCs. When all those machines came in, I wondered briefly whether there were more than we really needed. Then came the pandemic, with assigned desks (no moving between classrooms) assigned computers for each student (sanitized between uses), and ethernet drops to every seat. Suddenly too many machines was just barely enough.
This year, things are a bit better (we even finally got fiber to replace our DSL), and I’ve been concentrating on rational management of all our computers using FOG to put identical images on every PC — with accounts for every student, since any kid or teach might use any machine at any given time. Having “too many” machines has saved me repeatedly.
One of the little lunchbox units told me all its settings were gone — a sign that its little coin cell had finally died — and I didn’t have to spend an hour disassembling the damn thing (the manual says to take off the processor fan ducting and heat sink to make room for access to the battery holder, but if you’re in a hurry, you can reach underneath with a flat-bladed screwdriver to pop the battery out and then turn the machine upsidedown and shake it. Then winkle the replacement battery in with insulated tweezers). I just put it aside with another couple units that need new batteries and swapped in a working machine.
Same thing when a couple other boxes developed finicky network controllers — they performed fine once booted, but wouldn’t download a new boot image because the controller insisted there was no ethernet cable plugged in. Not interested in diagnosing that one, just swapped them out for other boxes of exactly the same model and vintage that worked. (And maybe we can pass the prima donnas on to someone who doesn’t have a dozen-odd identical machines to manage.)
Meanwhile the weekend before I spent a couple hours disassembling my personal laptop and going after the fan and heat exchanger with Q tips and forced air. It’s a pet.
It’s been a few years since I started wanting an e-bike, but for a long time I was put off by physics. We live at the top of a steep hill, and I’m fat and out of shape. So all those sprightly 250-watt bikes and front-wheel kits simply weren’t going to cut it.
This spring, I saw someone in the neighborhood on a Radpower utility bike (750 watts) and asked them if it could go up our hill. They said it could. And what the heck, 14-day free return policy.
So I ordered, waited a few months for delivery (while enduring a constant stream of email trying to get me to buy one of their other bikes) and ended up with this:
750 watts, 5 levels of pedal assist plus throttle, 300 pounds of payload, front and rear hydraulic brakes.
The throttle part is easy: you turn it and the bike goes. I’ve started using it to get going, because 70 pounds of bike is hard to start moving, especially when the pedal assist doesn’t kick in for those crucial first few seconds.
Pedal assist isn’t what I thought it would be — which may be a good thing. I have a frightening annual bill from Adafruit, so of course I’d imagined some complicated system with strain gauges and accelerometers (and probably a 3-axis gyroscope for good measure) that would sense just how fast and how hard I was pedaling, and then dole out a precisely calibrated extra kick to deliver just the right enhanced riding experience.
Nuh-uh. That would be the automatic transmission version. What this bike has, as far as I can tell, is much simpler: When the pedals are moving (well, a couple seconds after they start until a couple seconds after they stop) the motor is on. It delivers whatever level of assist you’ve chosen with the arrow buttons on the handlebar, from about 35 watts at level 1 to about 740 watts at level 5. The engineering for that is much less baroque.
(The simple engineering also means that the amount of assist will depend on your battery level — expect about 100 watts less of assist at the top end when your battery is just about done. Oh, and the battery-level meter will report based on how much assist you’re using: level 1 typically shows a bar or two more than level 5.)
I’m getting used to it. The lowest level is like regular bicycling, only as if I were young and in shape.
The higher levels are sort of like a pushbutton alternative to regular gears, at least around where I live. On a conventional bike, for this rider, going up a slope means downshifting until the bike is moving at a fast walking pace while I pedal madly until I reach the top or run out of breath and have to walk the bike up. On the Radrunner, going up a slope means kicking the pedal assist up a notch, maybe two. If it’s a serious slope, I can downshift a gear or two and slow down while the electric motor continues to do its thing. I still have to work, but it’s not a losing battle. The top level of assist even gets me up the hill by our house — the one that neighbors without 4WD sometimes park at the bottom of in the winter
The pedaling part of pedal assist is still a bit new for me — if I’m zipping along on the flat and the bike seems to be freewheeling, it feels natural to stop pedaling, as you would on a conventional bike. But when I do, two seconds later the electrics kick out, and the whole thing sags down the behemoth it is. So I have to learn to keep my legs lazily moving.
And although I’d expected electrical assistance to make the physical job of riding a bike easier, the psychological effect may turn out almost as important. I can ride anywhere in my small town (or maybe even to the next village over) without worrying about whether I’ll have enough endurance to ride back. I can also ride on roads without worrying about being mowed down by even the slowest-moving cars. Now, if I can just figure out how to keep riding during the winter…
A few other things I’ve learned:
It’s also loud. Not so loud that people can hear you coming, but between the motor and the fat tires loud enough that the conventional cycling experience of being able to hear nothing but the wind in your hair is gone.
Unless you work at going slowly, you will go faster than you would on an unassisted bike. No real surprise there, but old intuitions about overtaking pedestrians and other bikes have to be adjusted. (Oh, and kudos for the built-in bell).
This bike doesn’t really like to turn sharply. Which mostly isn’t a problem.
There’s a lot of space between the frame and the interior of the front wheel (and rear wheel too. You will need a bigger bike lock.
Say goodbye to range anxiety. No, the battery has a limited capacity, but unless you’re way fitter than I am, that capacity is likely greater than yours. I always had to gauge rides on a conventional bike by whether I would be able to ride back after riding out, but pedal assist and throttle. (20km and 135 meters of climb are less than 40% of battery — a real cyclist on a serious ride would laugh at that, but a real cyclist on a serious ride is not who the Radpower utility models are aimed at.)
Check your tire pressure. Those armored exteriors are stiff, and will defeat your conventional-tire intuition about squeezing a tire to see if it needs air. The difference in rolling resistance between underinflated and properly is about one gear or one level of pedal assist.
Who knew? Our fancy toilet has been leaking for a while, and at long last I decided to do something about it. Which involved disassembling a bunch of toilet-body parts (remember, fancy), turning off the water and extracting the flush mechanism.
At the bottom of which was a silicone gasket covered in little blisters. After suitable searches and an order for a replacement part, I stumbled across a review by someone who had had a similarly disfigured gasket (and blamed it for their leaks).
Down to my spouse’s sewing supplies for a pin, which I used to puncture every blister and squeeze out the water. More gymnastics getting the flush valve back in and reassembling everything (pro tip: cats should not be allowed to help). Then back to the search engines: why should an ostensibly waterproof gasket develop pockets full of water, even after 15 years of submersion?
Turns out that if there are water-soluble compounds inside an insoluble material that is even infinitesimally permeable, osmotic pressure over the years will force in enough water to dilute the soluble material and open up tiny bubbles. Chemistry!
So why are there water-soluble compounds inside my silicone gasket? Some kind of weird manufacturing flaw? Only sort of. The page I landed on about osmotic bubbles called out soluble metal salts in particular. Anyone remember what silicone uses to catalyze curing? Got in in one. Tin, Platinum, Bismuth… So unless the manufacturer is really careful (and thrifty) there will always be a little bit of excess soluble stuff inside the finished product.
There is one alternative explanation that scares me a bit, though: apparently thermal gradients can also drive water into semi-permeable materials. So maybe every time we might have sorta kinda let the water freeze inside the outside-wall supply lines we were creating a gradient that has now done the terrible damage of costing me $8 every 15 years for a new flapper gasket.
I admit it, I have an addiction to things that call themselves bargains. Down in the basement are multiple cubic feet of random electronic and mechanical components that looked like a good idea or might be useful someday or just seemed like too good a deal to pass up. 25 Magnets with holes in them. 100 trim pots that almost fit breadboard spacing. 500 sets of 3 green LED in some kind of indicator mounting…
Some of these things I have found a use for, like the hall-effect sensors or the optical interrupters. Others I probably never will, like the 20-watt 10-ohm resistors. But last week my addiction did me proud.
After about 15 years of use, the good kitchen thermometer stopped working. You know, the kind where you poke the tiny tip into meat or bread or sugar syrup and get an instant, accurate reading. The kind that takes a weird battery size that no one used to stock. It just didn’t work any more. Didn’t turn on, even with a fresh battery.
So what the heck, I pulled off the stickers over the screws and opened it up, and found that it occasionally did work when you pushed on the body just right. There’s a sweet cam-and-microswitch arrangement that turns the thermometer on when you rotate the probe away from the body. Oh, and the microswitch had green corrosion coming out of its case. Hmm.
Yep, when I shorted the contacts, the thermometer turned on just fine. But how to repair or replace the switch?
Oh, wait. A tray of 100 of the smallest microswitches you ever saw for $5. So tempting that I forgot about the first tray I bought and got another one a year later. And be careful opening it up, or they go everywhere. Clipped the leads on the old, dead switch so they stood up from the circuit board. Butted the leads on a microswitch against those. Soldered, bent the switch actuator out a bit to meet the cam. Done.
Every now and then all that crap in the basement comes in handy. And if this switch corrodes, I’ve got another 190 where it came from…
Not such a big deal at home, but at a school with donated computers of interesting provenance and a couple dozen energetic kids this might turn out to be really useful. After I get enough different measurements for various keyboard models, I might even post a revision where you just tell the script which keyboard you have and it sets all the dimensions.
Zapped on my glowforge, slightly modified from a design by IconPai at the Noun Project.
Every year I take the bottom however many inches have to come off our tree to make it fit the living room ceiling and slice some disks on the miter saw. Then I zap them into ornaments. The wood is green as it gets, so the ornaments usually warp all to heck and get tossed with the tree, but it’s fun while it lasts.
This one might be a little too Masque of the Red Death tho.