My new cheap hot air soldering station arrived, along with some solder paste that turned out to be leaded (I forgot to check). Tried it out and holy shit it's like magic! This is a game changer for micro USB connectors.
I tried it out on a pointing stick PCB and it's a big improvement over my dodgy hand soldering. It also saved a board I had written off because it was too much of a pain to fix the USB connector.
Accidentally made a new thread for the pointing stick, so here's the old one: https://mastodon.technology/@gbrnt/105906955241870768
Major progress on the pointing stick project today! I actually managed to build it into a keyboard!
Started by redesigning the strain gauge mount to clear the keycaps, then printed and assembled it. That went smoothly but took a while.
It turned out the keys I bought are plate mount so they lack the little pegs that go into the PCB! But they'll do - this is just a prototype, the keys aren't the important thing here.
Initial testing feels good but it's late so I'll try it tomorrow!
Unfortunately I found out that there's something wrong with the pointing stick board I soldered with the hot air station. I can't burn the Arduino bootloader on it with a setup that works for the first one I put together. Can't see anything wrong with it, so it might just be that I killed the chip while soldering it :(
Programmed some keys on my keyboard to be mouse buttons and the pointing stick is now usable!
It's a little bit too high - I keep hitting it while typing H and I just found out that I type B with my right hand instead of my left. It would be easier not to hit it if the keyboard had a slight split.
With this longer stem on the pointing stick I am noticing drift starting to happen. That gives me a reason to look at correcting it.
Today I'll design a little nub for the top of the stick!
I'm still working on the code for the pointing stick, but it looks like I've managed to (physically) break the Y-axis. That was the one with a dodgy strain gauge that I just put some hot glue over.
Hopefully if I lift off the pads I can just glue another gauge on top and not lose too much sensitivity.
Turns out the strain gauge I replaced probably wasn't the one that had an intermittent connection - replacing the top gauge in the photo didn't fix the problem of the pointer jumping around.
If you look closely you can see the bottom one's left contact has broken off after I poked it.
Basically these strain gauges are not something that'll work for a device in production. The gauges themselves are fine, but the heat of soldering messes with the pads and it's a fiddly manual process.
So after replacing the pointing stick's Y-axis strain gauges, it's a bit stiffer than the X axis but more usable than a broken axis.
The pointing stick is already pretty usable on my linux desktop. Weirdly, when I transfer my USB hub to my work Windows laptop, the cursor starts drifting. Really not sure why that happens. Maybe it's something to do with grounding, or maybe it's something to do with Windows.
In terms of simplifying assembly, it looks like IBM eventually moved to capacitive sensing instead of resistive. I'm not entirely clear on how it would work but I have an idea.
It's probably worth trying it out! Should be able to do some rudimentary capacitive sensing with one of the Arduinos I have lying around.
I've been trying and failing to correct the drift in the pointing stick. It seemed like it might be a good idea to visualise the jitter in the measurement.
This is a heatmap of the X and Y changes from a baseline over a ~15 minute period of not using the pointing stick.
It looks like a deadzone with a radius of 15 should ignore most of the noise. I forgot to include a footprint to add a low-pass filter, but that definitely seems like a good idea.
I guess I haven't really been using it long enough to notice any problem with drift - it's just the random noise that's occasionally outside the deadzone.
I don't think there's that much I can do about it algorithmically (maybe software low-pass filter?) - it seems like a good idea to just filter it in hardware.
Despite that setback, you can see that the low-pass filter did its job on the one still-working axis. Here's a heatmap of just the X axis from before, compared to with the low-pass added.
There's a much narrower range in the noise on the sample with the low-pass filter. It's hard to tell with only one axis working, but it doesn't seem to have an effect on how the pointing stick feels. So that's definitely something to include in the next design!
I finally finished writing a blog post about my pointing stick project! This is basically a summary of the progress I was sharing on the fediverse as I went.
As usual I'm posting this just before heading to bed, so if my Pi goes down that's a tomorrow problem.
@yngmar Probably, yeah! I think the extra height that would add might be a bit annoying, and it seems odd for something that should be permanent. I'd rather find something I can surface mount on a PCB that acts as a strain gauge when it's stretched
@gbrnt I mean something like this (random pic off images search that illustrates what I mean):
I expect there is some flexing going on so these might last better than soldered contacts?
@yngmar Hmmm, this might be a good step in between what I have now and integrating the strain gauges onto the PCB. I'm still not a fan of manually gluing the strain gauges in place, but spring fingers would at least take the pain out of connecting to them!
@piggo Haha that actually wasn't a conscious choice (must have been matplotlib's default?) but I'll take the points ;)
@gbrnt If you want to be really precise, you could double the strain gauge like this. It's more for thermal drift and increased sensitivity, but could help.
Dunno if it's really worth it if you're going to compensate it in firmware anyway.
@clexy I'm sort of doing that, but rather than the opposing gauges being on opposite sides of the beam, they're on opposite sides of the "cross" of beams. It definitely helped with temperature drift though - my problem now is probably mostly noise due to dodgy PCB design and wiring
@gbrnt do you have any idea where the grid pattern comes from? is tha a side-effect of the individual 3d-printing-strands on the surface?
@grindhold I think it miiiight be aliasing. The arduino's Serial.print() rounds floats to 1 decimal place by default. That probably doesn't line up with the number of "buckets" I chose for the histogram, so some get less values included and some get more.
It looks pretty cool though!
@gbrnt i doubt that it's possible to create an unfair bucketsystem as long as the buckets are equally sized and the data that it depicts can be described by a continuous function. that one looks inverse-square-ish.
@grindhold Here's an animation of me changing the number of bins from 1 up to 500. The way the pattern changes as it goes tells us it's in the presentation and not the data itself, right?
@gbrnt oh wow thx! that looks awesome :D yes you're right indeed. i think i know now what i overlooked when i wrote that yesterday: cutting off float values already is a kind of pseudo bucket system and if you put another bucket system on top, moiré patterns emerge. my bad.
@grindhold Yeah that sounds about right! I think these visualisations are going to be a useful tool for figuring out how well my drift-correcting algorithms are working
@gbrnt Very nice. I am interested in making a keyboard with integrated pointing, so please keep posting progress!
@jamesvasile Will do! I don't think the current design is appropriate for anything larger scale than 5 keyboards - soldering the magnet wire to the strain gauges is too much of a pain. I need to figure out some surface mount strain gauges, which would make assembly trivial.
This Mastodon instance is for people interested in technology. Discussions aren't limited to technology, because tech folks shouldn't be limited to technology either!