Thursday, October 2, 2025

A Wiim Amp Pro for the bedroom system

I like to listen to music or recordings of tree frogs and crickets when I'm going to sleep so I've had a stereo system set up in the bedroom for years. The system consisted of an old (1983) Luxman RX-103 receiver, a SqueezeBox Touch to stream music from my server, and a pair of 20 YO Canton Ergo 22 DC speakers. The receiver was too big for the nightstands, so it sat on the dresser near the wall opposite the bed. Running speaker wires all over the bedroom wasn't an option, so the speakers were on the dresser, too. Unfortunately, that required turning the volume relatively high which might disturb my neighbors late at night because the walls/floors/ceilings are a little thin in this building.

An ideal system would fit on the nightstands near the bed so the volume could be kept to a reasonable, late-night level, but there was already too much junk on the nightstands, including table lamps. I started by getting rid of the lamps and replaced them with a couple PS 2014 hanging lamps from Ikea. It turns out that besides not taking up any space on the nightstands, they throw very nice patterns on the walls! They don't provide a whole lot of light, even when open, but that's OK for me.


The new system in place. You can just see the new amp in the left corner beside the speaker.


This is what it looks like with the lamps open.


A lot of the other stuff was disposed of or put in drawers and the result is that one nightstand has a speaker and my phone charger, and an alarm clock, and the other has a speaker, the new amplifier, and a CPAP machine. It looks a lot nicer, and is easier to keep dusted.


WAP!

When I was looking for amplifiers, I initially thought I'd continue using the SB Touch streamer. So I looked at the small class D amps by Fosi, Wiim, Marantz, Eversolo, and a few others. It occurred to me that the Wiim Pro Plus streamer in my living room system plays music from my Lyrion Music Server just fine, so maybe I could buy an amp with a built in streamer that would replace both the Luxman receiver and the SB Touch. Some of the amps I looked at had built in streaming with touchscreens on the front panel, but I decided I didn't need that as I'd be using my phone to control it anyway. I almost never used the touchscreen on the SB Touch.

After much digging through reviews and specs, I settled on the Wiim Amp Pro (WAP). It's small, has more than enough power for my purpose, and has a built in streamer that works with my server and Tidal Connect, just like the WPP in the living room. Both players can be synchronized so they play the same music at the same time (nice when I'm cleaning the condo). 

The WAP has toslink, USB, HDMI, and line inputs. It also has BlueTooth in and out but doesn't support high quality codecs (yet). There is no phono preamp. It has built-in graphic and parametric EQ with room correction(!) called RoomFit, and real bass management that can apply high pass to the audio in the WAP, and low pass to the subwoofer output. The Wi-Fi antenna is built into the case so there's no ugly antenna sticking up from it.


Front panel- just a few LEDs and the volume knob with play/pause button.


Back side of the WAP. Yes, power supply is built in!







Speaker connections are solid! The speaker binding posts grip banana plugs securely.



The side holes easily allow 12 gauge wire, if you feel you must.


Bottom of the WAP. The holes along the sides and bottom are all they need to ventilate this thing thanks to the efficient class D amplifiers.

When I got the amp, I connected it to my Wi-Fi network via the Wiim Home app on my phone (already there for the WPP in the living room system), and it immediately started updating its firmware. After a few minutes it was ready to go. Lyrion Music Server saw it as a player without any messing around. Everything just worked exactly as it should, unlike so many other things these days. It's been in the system for about two weeks and I haven't had even the slightest trouble with it.

The amp can be controlled via Wi-Fi (phone or tablet) or its own Bluetooth remote control, so I don't need to access the front panel of the amp at all, and it may end up under the bed, out of sight, if it can get a decent Wi-Fi signal down there.


Technical stuff

The WAP uses TI TPA3255 class D amplifiers to drive the speakers. They are very efficient compared to class A or AB amplifiers. That efficiency is achieved by switching the output transistors on (very low resistance) and off (very high resistance) at hundreds of kHz, so they spend very little time between those states generating heat. That efficiency means they don't need large heatsinks which minimizes the size and cost of the amplifier. The PWM output from the transistors is run through a low pass filter to create a smooth analog output waveform that drives the speaker. 

Unlike class A and AB amplifiers, class D amps don't normally provide a lot of dynamic headroom. This amp is rated for 60W at 8 Ohms (and 100W into 4), and that's all you'll get from it. That means if you're driving inefficient speakers and/or your room is large, it may not play as loudly as you'd like before it distorts audibly. Neither of these are problems in my situation.

I was curious about the switching frequency used so I connected the amp to an 8 Ohm dummy load and my Siglent digital oscilloscope to see what the output looked like when there was no music playing. Here's what I found:



This is the output of the amp with no music playing- about 600 mVpp at about 595 kHz. It's far beyond audible frequency range, even if you have golden ears, but could pose a problem if you're trying to listen to MW or SW radio anywhere near this amp. This signal could be the output switching clock leaking through, or it could be from the power supply that is also a switching circuit.



I used the scopes FFT to look at the spectrum of the output and found plenty of harmonics of the 595 kHz output. 

That output looks ugly, but there's no audible component of it coming from my speakers, even with my ear close to the tweeter.


Here's noise in the audio band from 10 Hz to 20 kHz. It looks very quiet except for a little 60 Hz from the power line.

My scope's FFT is OK, but it's not an audio analyzer. I suggest that if you want to see a real detailed technical review, you check out Audio Science Review.

I have read online that some people complain of a whining sound coming from the amplifier. If I press my ear against the top cover of the amp I can hear a very faint whine, but there's nothing audible (to my 67 YO ears) otherwise.


Using it

It seems to pick up 5 GHz Wi-Fi very well (plays 24 bit, 48 ksps music via Tidal without buffering), so I haven't had to use the ethernet port to connect to my network like I did with the SB Touch. The front panel has only a status LED that changes colors to indicate different things, a few more LEDs to indicate the relative volume level, and a single encoder knob with a built in push button to control volume and play/pause music.

The volume control has an odd feel to it, almost like turning the knob in a soft piece of rubber. There are no detents. I have noticed that changing volume by any of the available means seems to react a little slowly- it takes a fraction of a second for the volume to change when I start turning the knob, so I tend to turn it a little further than needed for the change I want to make.

The unit has a BT remote control with a mic built in for doing  the "hey Google" or "Alexa" thing. I don't use either, so I can't comment on the performance. You can put the amp out of sight - under the bed, in my case- or in a cabinet or drawer because it doesn't use IR for the remote control. The remote control's mic can't be used for RoomFit equalization tests.

The RoomFit function is a nice extra that you may or may not want to use depending on how picky you are about the sound. What it does is send a swept tone through the speakers, measuring the response in your listening position with a mic (usually in your phone or tablet running the Wiim Home app), and then it generates an equalization curve that alters the frequency response of the amp to achieve optimal sound quality. An uncalibrated mic's frequency response or directivity patterns are unknown so results of RoomFit using the mic in your phone or tablet will be questionable at best. For better results, you can get a calibrated mic (like my UMIK-1 that I used to check resonance when I was rebuilding the Quads) that plugs into a phone or tablet, and RoomFit can use the mic's calibration file when it does its magic. 

The amp sounds great with the Cantons, as expected. I haven't tried driving the Quads with it yet to see if it sounds any different from the A12 amp that's in the living room system, but soon. I expect it will sound the same/fine until it starts to distort (if I can run it that loud without freaking out the neighbors).

The Quads can't play very loudly compared to "normal" speakers, mostly because the narrow spacing between the stators in the drivers limits the diaphragm excursion when playing low frequencies. The WAP's bass management could be used to set up a biamped system in which the low frequencies are sent to a subwoofer (keeping them out of the Quads) which would allow the Quads to play much louder than they could otherwise. More experiments to follow.

Sunday, September 14, 2025

DIY Wireless Charging for the Pixel Tablet

I bought a Pixel tablet for my stereo system, mostly to select music to play from Tidal and Lyrion Music Server. When I bought it I decided not to buy the charging dock because I didn't need the speaker and I figured the battery would last a while for my light use. Big mistake. The battery in the tablet only lasts a couple days on a charge, even with power saving turned on, even just sitting unused on the coffee table. It seems like every time I pick it up to use it, it needs to be charged. No one, including the Pixel store, seems to have the charging docks in stock (trade war anyone?), and used ones go for far too much money on ebay. I'm waiting for Google to email me when the charging docks are available again, but in the meantime, I had to do something about keeping it charged. Plugging and unplugging a cable is a PITA and the tiny connector on the tablet may not last long doing that.

Here's a review of the charging dock that doesn't make it sound like a great investment.

I have a 10W Qi wireless charging pad that is sitting unused. I thought that if the tablet has wireless charging built-in, I could just use that charging pad. Nope- no wireless charging, and no NFC support (Really! Was it designed in 2005?). Apparently this is a common problem with tablets. So then I looked for a wireless charging receiver that I could stick to the back of the tablet. Yes, readily available and cheap!

The wireless charging receiver I used plugs into the USB C port on the tablet with a flex ribbon cable so the pad can be stuck to the back of the tablet using one small piece of industrial double stick tape.


Here's the back of the tablet with the wireless charging receiver attached. I know it isn't pretty, but it beats having to plug in a cable every time I need to charge it.


Wireless charging transmitter top side. It's about 96mm in diameter and about 6.2mm thick. The green light indicates that it's powered but not charging anything. The light turns blue when it's charging.



Wireless charging transmitter bottom side.

The design process started with measuring and creating a CAD model of the tablet. Then I added a model of the charging pad, and finally, a model of the wireless charging receiver. From there the design was pretty easy- position the charging transmitter and receiver on the back of the tablet model, then make a tilted cradle to hold it all in place. I also made a hole for the cable that powers the wireless charging pad. 


CAD render of the tablet sitting on the charging stand.


CAD render of the charging stand with the wireless charging transmitter in place. The Transmitter is positioned so that when the tablet is placed on the stand, the wireless charging receiver will be in perfect alignment with the transmitter. The chamfered notch to the left of the transmitter makes room for the cable that connects the receiver to the USB C port on the edge of the tablet.

I printed on UMMD using PETG filament in 0.25 mm layers with 15% triangular infill using a 1 mm line width (1mm nozzle). It used about 450g of filament. I added some rubber feet to keep it from sliding around on the furniture.




Note: When the wireless receiver arrived I tested it on the tablet and it worked fine for 10-20 minutes that it sat on the charging pad. As soon as I finished printing this stand I tried using it with the tablet. The transmitter LED lit up blue, indicating it was talking to the receiver, but it would not charge the tablet. The wireless receiver failed (the charger still charged my phone OK), so I returned it to Amazon for replacement. The replacement arrived in a few days and it worked fine.


Tablet charging on wireless charging stand. Oops! Sorry about the photo of the disgusting pedophile and his equally disgusting best friend.



Bonus!  It charges my Pixel 7 Pro phone, too. Oops! Sorry again for the disgusting photo of the pedophile's best friend imitating a blow-up doll while wearing his garbage man cosplay outfit.




End view of the tablet on the charging stand. Oops again! This time it's a picture of the convicted and suspected pedophiles, the "genius" immigrant fashion model, and the pedophile's BFF. I don't know how this stuff keeps showing up on my tablet and phone...

You can DL the CAD model of the charging stand here, but you may have to modify it to fit your wireless charging pad and receiver. 

When Google notifies me that the charging dock is available, I may buy one and move this one from the living room to the bedroom so I can use the tablet as an alarm clock. Or I may just save the money and print another one of these for the bedroom.

This method of adding wireless charging to the Pixel tablet should work for any tablet. All you need to do is copy what I did with dimensions specific for your tablet and wireless charger pad.

Friday, August 8, 2025

An improved diaphragm stretcher design for Quad ESL-63 speakers

I use a diaphragm tensioning jig to set the resonance of the drivers to match the factory value of about 86 Hz. Even though the drivers play below their resonance in the speakers, there's no hump in the frequency response at resonance. So why does the resonance matter? Setting the resonance to match the factory value does two things. First, it ensures that there is sufficient tension on the diaphragm so that when the HV bias is applied, the diaphragm won't pull to one side and stick to one of the stators. Second, it ensures the sensitivity of the drivers will be uniform if the resonance of the drivers is uniform.

There are companies that sell kits to replace diaphragms on ESL-63s. They recommend tensioning techniques that are far from ideal. Most recommend taping the film down on a flat surface, pulling it tight as you go around the film. Some even provide a spring scale and recommend pulling the film to a specific value on the scale before taping it down. That's the sort of thing hobbyists were doing in the 80s, and isn't likely to result in matching driver resonances.

I rebuilt my ESL-63s using a diaphragm stretcher made from MDF and wood, that allowed the resonance to be set to a specific value. It worked well, but after multiple uses, adhesive from the tape used to secure the film built up on the wood and the tape started letting go before I could glue the diaphragm to the stator grid. I found it very difficult to clean the adhesive off the wood. Also, the opening in the center didn't match the size of the driver, so the resonance measured on the stretcher was different from the resonance measured once the diaphragm was glued to the driver. I'm rebuilding more drivers (going to turn my 63s in 989s) so I decided to try to make a better stretcher, one that would, I hope, provide the same resonance on the stretcher and driver, and wouldn't have the same problem with tape adhesive.

I found some promising aluminum extrusion in my materials pile collection. I tried sticking some of the double sided tape used to hold the film on the stretcher to the aluminum and pulling it off, multiple times and found it didn't leave residue behind like it did on the wood stretcher. The next thing to do was model the aluminum in CAD.

The aluminum I used has this profile. It's 56.8 mm high x 42.5 mm wide. Those wide, flat areas on the top, bottom, and sides are very useful for this application. I have no idea who makes this particular stuff, and neither does Google Lens. Square or rectangular aluminum tubing would work as well and would be it would be easier to design and print corner pieces.

I measured the drivers and found the opening to be exactly 583 x 175 mm, so I cut the aluminum a few mm longer than needed with a saw, then milled it square to exact, matching lengths. The axial holes in the aluminum are sized for a 1/4" tap, so I tapped them with 1/4-20 threads.

The next step was to design and 3D print corner pieces to hold the aluminum rails. I split each corner piece into two identical parts so I could print the part that inserts into the aluminum without using any support material. The screw holes were printed 4mm in diameter and drilled out with a 1/4" drill after printing.


This is what the corner pieces look like. Support material is used inside the screw insertion slot. The slot is about 12mm high to accommodate the button head cap screws that mount the corner pieces on the aluminum rails.



One of the corners holding two of the rails together. It's a tight fit!


The whole frame. The 1/4" hole in the green rail is for the tire tube valve stem. I had to get a 20 x 1 3/8 tube with a 60mm long stem and Presta valve.



Here's a driver sitting on the frame. The opening in the frame matches the driver (583 x 175 mm) within a fraction of a mm. The plastic corners fit so tightly I had to tap them in with a rubber mallet. 


The next part of the design was to make a base that would allow the stretcher to be positioned vertically for resonance testing. In the previous design, when the stretcher tilted up, one edge hit the hinge support and stopped it from tilting further. That meant that during resonance testing, the tensioned diaphragm was in contact with the hinge support. I didn't like that. It doesn't take much to puncture and tear the tensioned film, so it's best to avoid physical contact with the film.

In the new design, I added "pins" to use for the hinge and an additional one for the support/tilt stop. It will allow the stretcher to tilt up to vertical, and I'll add a cord that will prevent it tilting so much that the edge hits the hinge support.

I installed three bolts for the hinge and support/stop.


The stretcher mounted on the stand. Yup, that's all there is to it. All that's left is to add a cord to the support/stop to prevent it from tilting too far, and some neoprene foam to the top surface of the stretcher frame.



First test with 6 um film. Worked well, but pointed out some minor issues. The pump hose has a pressure indicator that makes it hard to attach and detach the hose without accidentally closing or opening the valve. The film ultimately split, I think due to something sharp along the bottom edge of the frame.

After the film split during the first test I used a Scotchbrite pad and ran it over all the edges of the stretcher to smooth out anything sharp that might have caused the film to split. I had no further problems with film splitting.

The pump/hose I was using on the wood stretcher didn't work so well on this one. The pressure indicator on the hose took up too much space. I ordered another small tire pump that came with a hose and no pressure indicator. That solved the pump/valve problem.

There's one more problem I've been struggling with since I bought the roll of film back in the 80s. When the film is pulled from the roll, it generates a static charge that causes it to try to stick to anything and everything nearby (and pulls dust, cat hair, etc., from the air). When I put the film on the stretcher, it immediately curls under and tries to stick to the tape. Then I have to try to pull it free so I can position it where I want.

I decided to try to make a proper dispenser for the film that would kill the static charge generated when the film comes off the roll. I designed a couple conical end pieces with F608 skate wheel bearings and added two grounded steel tubes for the film to pass over as it comes off the roll. 8mm bolts go through the bearings and extend through the printed mounting brackets that are screwed to a piece of wood.


One end of the film dispenser. The other end is a mirror of this one. There are two conical plugs that fit the ends of the film roll, each of which has two F608 skate wheel bearings and an 8mm bolt. The ends of the bolts pass through the end supports that are screwed to a piece of wood. The film comes off the top of the roll, goes down under the bottom steel tube, wraps between the tubes, then pulls over the top of the upper steel tube so both sides of the film contact the steel. 


 
The bad news is this method doesn't actually take the charge off the film. It simply provides a new means of charging the film by sliding the plastic over the steel tubes. The good news is that it doesn't matter. I placed the film dispenser on the work table just behind the stretcher and I worked out a technique for attaching the film to the stretcher that works fine even with the charge on the film. Getting rid of the static charge on the film would require some sort of ion generator that would spray the film with ions and neutralize the charge as it comes off the roll.

Now I pull the film off the roll right over, and attach it to the two front corners of the stretcher. Then I cut the film free of the roll and attach it to the stretcher at the back corners, pulling wrinkles out of the film as much as possible as I do it. Then I attach the film to the short sides of the stretcher and finally to the long sides. The new stretcher allows me to see the film as it attaches to the tape.


Film coming off the roll and getting attached to the stretcher. I've added neoprene foam (black) around the edge of the opening in the top of the stretcher.


Once the film is attached, I put some air in the tube and tilt the stretcher up to check the resonance and adjust the air pressure as needed to get to the target value (about 80-85 Hz). 

Next I wipe the film and driver grid with IPA, then apply the 4693H contact cement to both, wait 15-20 minutes, check and adjust resonance again, and stick them together. I have found that with this stretcher, the final diaphragm resonance will be about 6 Hz higher on the driver grid than it is on the stretcher, so I set the resonance on the stretcher to about 80 Hz.


Resonance testing. I have added a couple marks on the stretcher frame (not visible here) indicating where the center of the diaphragm is to make positioning the microphone as accurate as possible. You can see the thin, black cord that is used to limit the tilt-up.

I pile some weight on top of the driver grid sitting on the stretcher and wait a few hours before letting the air out of the tube and cutting the driver free. Then I use a soldering iron set to about 260C to make the holes in the diaphragm around the center posts. When making the holes, I wear 5x loupes so I can see clearly, and keep the tip of the iron in contact with the post as I circle around it. Sometimes this creates fine plastic hairs that I remove using the soldering iron.

After letting the drivers sit for a couple days, I clean the excess glue off all the edges, tape off all the long edges, spray and wipe the diaphragms with IPA, then position the 3D printed masks in the center holes and on the ends, and spray with Licron Crystal. I make 4 passes, alternating L to R and R to L, then turn the driver around and do it again. I set the driver aside to dry while I spray the next one. I get reliable 10^8-10^9 Ohms/square resistivity using this technique.

Four drivers with newly recemented stators and new diaphragms, with long sides taped for spraying with conductive coating - Licron Crystal.


3D printed masks to block the conductive coating in selected areas of the driver.



I test the resonance after spraying on the Licron Crystal coating. I've been able to get pretty consistent results- here are resonance plots of 4 drivers I recently tested. Note- the lowest frequency peak is the one I use to set the resonance. The the drivers have multiple resonances and the mic picks up other sounds in the room (the AC running, garbage trucks outside, neighbors vacuuming, etc.), so it's safe to ignore the other stuff.











Final testing is done using electronics from an ESL-63 speaker- I have alligator clips on all the wires that go to the driver, and simply connect an amplifier and apply a signal. What I'm mostly looking for here is any hissing or whining noises coming from the driver when the 5.2 kV bias is applied, and any odd sound that a damaged driver might produce.


The two white boxes contain all the electronics from an ESL-63 speaker. I just connect the driver using the alligator clips, power it up and give it an audio signal from an amplifier.


Final testing is done with bias and audio signal applied:



The two halves of the early model drivers I have are held together by the three center screws and the four corner screws that hold the driver in the frame in the speaker. Newer ESL-63 drivers came with small metal clips to hold the two long sides of the drivers together. I think those clips are a good idea, so I ordered some 1/2" binder clips because they should fit in the 15 mm wide spaces in the driver grid. The 1/2" clips are actually 15mm wide (only in 'murica folks!) so I had to grind them all down to fit. 





When I am ready to add more bass panels to the ESL-63s I'll write another blog post.


Saturday, June 7, 2025

Arrakis 2.0 update

What's the simplest user interface of all?

Creating new patterns to run on on a sand table using Sandify is a complicated process that requires a lot of specialized knowledge and some experience with Sandify. First I generate the pattern in a size that will fit on the table. This takes me anywhere between a few minutes and a few hours, depending on my mood and what I'm seeing in the patterns in Sandify. After that, I run a post-processor (that I had to write myself) to assign two speeds to the drawing, then I upload it to the table, using the controller's 3D printer style web interface, and run the pattern to test it. If I like it, it stays in the memory on the table's controller board. Once I have a bunch of working patterns stored on the table, I often want to string them together in sequences so that I don't have to select and run them one by one. That requires some knowledge about the GCODE used by the controller. None of this process is what anyone would call "user-friendly".


A pattern preview from Sandify.




When I take Arrakis 2.0 to public venues like Maker Faires, I manually compose a macro file that runs a sequence of drawing and erase patterns. The patterns in the sequence are generated and/or chosen for the specific event/venue, and then I set up another macro that runs at power up and calls the pattern sequence macro. That way I don't need to do anything with the table but set it up and power it on and it will run unattended as it works through the pattern sequence macro, assuming there are no typos (and it's very easy for typos too creep into the file!). This is what that type of macro looks like:

M98 P/gcodes/maker_faire_milwaukee_2021.gcode
G04 S60
M98 P/gcodes/wipe01.gcode
M98 P/gcodes/ARRAKIS_90000_90000.gcode
G04 S60
M98 P/gcodes/wipe02.gcode
M98 P/gcodes/091821_04_18000_60000.gcode
G04 S60
M98 P/gcodes/wipe03_circle_center_out.gcode
M98 P/gcodes/090421_01_30000_60000.gcode
G04 S60
M98 P/gcodes/wipe01.gcode
M98 P/gcodes/091721_04_18000_60000.gcode
G04 S60
M98 P/gcodes/wipe02.gcode
M98 P/gcodes/091621_01_18000_60000.gcode
G04 S60
M98 P/gcodes/wipe01.gcode
M98 P/gcodes/090921_02_12000_60000.gcode
G04 S60
...

It's nice to operate the table this way, but it runs the same pattern sequence every time the table is powered up. That's OK at a Maker Faire, but not so good in my living room.

Composing the pattern sequence macro requires careful attention to detail. A single error in any of the file names will cause cause the table to stop dead. If I make a sequence that runs for 12 hours, the only way to be sure there are no typos is to run the file for the entire 12 hours. If it fails when I'm not watching it, I can't tell where it failed (maybe there's a log file somewhere that I don't know about), so I have to hunt through the file to try to find the error. It can be very tedious.

If I were better at writing software, I might try to write a dedicated user interface that would allow the selection of files to run from a phone or computer, providing previews of the patterns and allow composing sequences on-the-fly. Some day, if I am sufficiently motivated, I may try to do that. In the meantime, with the help of DC42 at the reprap forums, I was able to take advantage of one of the nicer features built into RepRap Firmware on the Duet2 controller board- specifically, the random function, to implement the simplest user interface possible- the power switch!

Now I store drawing files on the table's SD card in a folder called: 0:/gcodes/draw/ and erase files in a folder called 0:/gcodes/wipe/. I was able to put together a simple macro file that calls out a random erase pattern, followed by a random drawing pattern, followed by a 60 second delay, followed by much more of the same.

The new random sequence macro file looks like this:

; filename RS
M98 P{"/gcodes/wipe/"^random(22)^".gcode"} ; erase
M98 P{"/gcodes/draw/"^random(224)^".gcode"} ; draw a pattern
G04 S60 ; delay 60 seconds
M98 P{"/gcodes/wipe/"^random(22)^".gcode"} ; erase
M98 P{"/gcodes/draw/"^random(224)^".gcode"} ; draw a pattern
G04 S60 ; delay 60 seconds
M98 P{"/gcodes/wipe/"^random(22)^".gcode"} ; erase
M98 P{"/gcodes/draw/"^random(224)^".gcode"} ; draw a pattern
G04 S60 ; delay 60 seconds
etc.

The 'random' function returns an integer value between 0 and the number in parentheses minus 1. The first M98 command randomly selects one of 22 different erase patterns that are stored on the SD card in the wipe folder, with names like 0.gcode, 1.gcode, ... 21.gcode. The second M98 command selects one of 224 drawing patterns stored in the draw folder, also with names like 0.gcode, 1.gcode, ... 223.gcode. 

There are really only 3 lines in the file and all the others are just copies. If the first three lines work, the entire file will work, which makes testing super fast and easy. This doesn't make generating new patterns any easier, but it sure makes running the table simple and more enjoyable.

There's no provision to ensure that a pattern file doesn't get called multiple times during a sequence, but I can live with that. Also, if I delete one pattern or erase file, I need to rename all of them or replace the one I deleted with a file that has the same name. I think I can set up a test to see if the file exists before the table tries to draw it.

At some point I may try to use the looping capability in RepRap Firmware to make the random file smaller, but right now, it's very easy to copy and paste the statements as shown to make a very long sequence (even months long!), so my motivation is low. If I ever do mess with the looping, I'll update this post.

Friday, May 2, 2025

Stands for Quad ESL-63 Speakers

If you're of a certain age, you'll immediately recognize this image:


It's from an ad for Maxell cassette tapes that came out in the early 80s, when making mix tapes was the thing to do. There are a couple things to notice about this image. First, it looks like they took the seat cushion off the chair - that guy is sitting much too low. Second, the speaker is the famous and much- sought-after-by-collectors JBL L100. That speaker was designed to sit on the floor, though JBL and others sold stands that would raise them up a few inches and tilt them back to aim the tweeters and midrange sounds at your ears. A lot of speakers of that era (and even some current product) were similar size and designed to sit on the floor, and the first thing a lot of people did was put them on stands.

I recently restored a pair of Quad ESL-63 speakers that were made in the early 80s, and designed to sit on the floor, just like those JBLs. They sound great, but the high frequencies radiate from the center of the speakers, only about 21" off the floor. I made feet for them that tilt the speakers back 5 degrees to try to beam the highs toward my ears but when I'm sitting in a chair (upright, not extreme slouching like the guy in the picture), my ears are about 40" above the floor. I feel like I'm sitting in the balcony at a concert when I listen to the Quads, and I don't like it, especially when I compare them to the B&W 703 S3s that are at or even a little above ear level when I'm seated. My hot girlfriend, who wears hearing aids, pointed out that the Quads sound much better when she sits on the floor. I tried it- she's absolutely right! These speakers need stands!

Quad and another company called Arcici used to sell stands for these speakers, but they are a bit pricey when you can find them, and didn't really lift them very high. I tried setting the speakers on boxes that were about 275 mm (11") high and it was a big improvement, but they were still a little too low, so I decided to design some stands myself. I didn't want to spend too much as I consider them temporary and plan to rebuild the speakers into 989s with two more bass panels per speaker.


Quad ESL-63 in factory stands.



ESL-63 in Arcici stand.

Knowing how these speakers are built, I prefer the factory stands over the Arcici stands. The difference is that if the floor is uneven (like in my condo building) the Arcici stands can put twisting torque on the driver enclosure. The good thing about them is they center the weight of the speakers and make them less likely to get knocked over.

My stands are a kind of hybrid of the factory stands and the Arcici stands- I support the speakers from the bottom like the factory stands (but not nearly as prettily), but use long feet and center the weight to make them more stable, like the Arcici stands. 


CAD render of my t-slot aluminum stand design. I used 1" square t-slot for most of it, with 2 pieces of 1" x 2" t-slot for the verticals. The orange feet and the pieces at the bottom of the speakers are all identical 3D printed TPU parts.

I used some 1" t-slot material that I picked up at a scrap yard and had sitting in storage for a couple years. I wasn't really sure if it would be rigid enough, but after I bolted the first stand together, I breathed a sigh of relief. It's very sturdy and rigid. 

I was able to cut, mill everything square, and drill all the holes in a couple hours at the makerspace. Then I had to tap the holes- ugh! The ends of the verticals (8 holes) and the ends of the cross piece (2 holes) had to be tapped for each stand.

I used the following t-slot pieces:

1"x1" t-slot:

2x 190-200 mm (top of the stand, attach to the speaker bottom)
2x >=350 mm (the bottom feet of the stand)
1x 452 mm (the cross piece- must be exactly this length)

1" x 2" t-slot

2x >=250 mm (the vertical pieces- I used 292 mm)

The 3D printed parts at the speaker and on the floor are all the same:

3D printed TPU foot. These attach to the speakers by screwing them to the bottom in place of the feet that come on the speaker. They are also secured to the t-slot using a 1/4"-20 button head cap screw and t-nut.



I used 1/2" long 1/4-20 button head cap screws and these "economy" t-nuts to assemble the stands. The t-nuts are only used to secure the 3D printed parts to the t-slot.



The foot attaches to the t-slot using a cap screw and t-nut.



One of the stands, assembled (but the feet aren't secured yet). The yellow pieces on top will screw to the bottom of the speaker, then they will be secured to the stand using cap screws and t-nuts. Yes, I know, the color is less than ideal, but it's what I had on hand).


One of the speakers on its stand. It is quite sturdy, and stable despite being lifted about 350 mm (14") off the floor. One benefit of raising them is that my cat is less inclined to use the speakers as a scratching post. I'm sure she'll switch back to scratching the B&Ws! Now if I can keep her from chewing on the power cord...



Both speakers on stands. Project finished (until I reprint the feet in a nicer color). I'll use the t-slot to dress the cables a little neater. I'll be rearranging the furniture when a new chair arrives in the next week or so.


You can DL the CAD file for this stand, including the feet, here. The STL file for the feet is here.

Assembly- invert a speaker, take off the feet and screw down the new TPU feet.
Assemble the rest of the stand, then invert the stand and insert it into the TPU feet on the bottom of the speaker. Secure the stand to the speaker using cap screws and t-nuts. Done!

Update 5/9/25

Some people might prefer to use only 1"x1" t-slot to build the stands. I came up with a slightly modified version that uses two 1x1 pieces to replace each 1x2" vertical. It might even be more rigid than my original design:


This version replaces the 1x2 verticals with 1x1 verticals. You still have to tap the same number of holes, but this might be more rigid than the original design.

The speakers aren't very well designed from a mechanical perspective. The stands are attached to the speaker where the original feet were, screwed into steel speed-nuts that mount on the plastic electronics enclosure of the speaker. The length of the stand provides a lot of leverage against those speed-nuts and the plastic box, so you have to be a little careful when moving the speakers with the stands attached. If you set the speaker down too hard on one leg or the other it's entirely possible that some of the plastic will snap. Be careful!