design work

design work

FABuslously Furry Synthesiser Module

FABuslously Furry Synthesiser Module

Most of the design work has been done in week02, leading to the following animation:

next steps in planning:

  • try out software examples for RP2040 for SD card interfacing, OLED display and WAV play (at variable rate, seemless looping)
  • develop a tendon driven RC servo module for animating the face
  • mold and cast nice acrylic versions of the eyes
  • develop the full PCB in KiCAD

In week 5 I tried the design of the face bit as ‘print in place’. Looks stunning in copper by the way, I might have to use that to turn the module into a cool ‘steampunk look tortured furby’ instead of a furry one…

Furby face printed in copper-PLA

Furby face printed in copper-PLA

During week06 I developed a start of the software using the XIAO RP2040, VScode and the Seeed expansion board, resulting in the following video

planning

At this point (Midterm) the FabAcademy program is mid-way and the planning for the final project needs to be finalised. The functional breakdown of the project has been described already partially in previous weeks, but is repeated here:

mechanical side

  • standard modular synth compatible form factor - laser cut
  • model small 3D printed animatronic furby face. U
  • design a tendon drive system with flexible (servo actuated) tendons so the motor unit placement is flexible
  • eye-ball casting using clear acrylic, iris painting… realistic veins?
  • bare versions and furry versions -> use fabric

electronics

  • custom PCB using capable microcontroller
  • load wav from file sd card, menu, file selection SSD1306 OLED
  • loop (seamless), set begin and end point marker (visualise)
  • control playback frequency, high quality audio playback
  • analog modulation inputs for trigger, gate, frequency, modulation
  • standalone midi input

functional breakdown prioritised

Prioritising these using MoSCoW

function priority motivation
modular synth compatible must have put in my modular!
furby face must have whole point of the design
animation must have should be ‘alive’
tendon drive system should have might be a direct-drive
custom eyeball should have could be store bought
hairy, furry version could have is a nice to have
custom PCB should have standard expansion board works
loading files should have play back from flash instead
seamless loop must have audio essential
frequency control must have audio essential
high quality audio should have low-fi furby sound is ok-ish
analogue inputs must have audio-control essential
MIDI input could have nice for config, playback, etc

So far the initial planning posted in week 2 has been largely followed. As summary of the things done for the final project (and still on the to-do for the weeks to come)

System overview

System overview

planning

  • week 1: sketch of the tortured furby synth module
  • week 2: 3D model of furby face.
  • week 3: –
  • week 4: RP2040 + VScode
  • week 5: 3D print of furby face (needs more work)
  • week 6: RP2040 + VScode + PWM audio + SSD1306 OLED
  • week 7: –
  • week 8: RP2040 Pico board design + PWM audio + SSD1306 OLED
  • week 9: I2S audio DAC and PCA9685 Servo driver
  • week 10: – (more Pico work)
  • week 11: SD card, encoder, potentiometer and analogue control input
  • week 12: molding and casting eyeballs
  • week 13: interfacing MIDI input, USB host (pio code?)
  • week 14: application in rocessing.org configuration tool? or something else
  • week 15: wildcard tendon drive mechanism. Perhaps twisted-wire actuators. High voltage generator?
  • week 16: parts list, bill of materials, first version of final project
  • week 17: integrate module with modular synth, plan video
  • week 18: dissemination plan: ‘creaturesynth.org’. Develop a product line :)

electronics

The electronics design has been completed in week15, combining the boards from week 08, week 09 and week 11. Below the hero-shot of week 15:

laser-cut faceplate of recycled PLA and furry vacuum molded cover (and the PCB design on paper)

laser-cut faceplate of recycled PLA and furry vacuum molded cover (and the PCB design on paper)

The PCB designed in KiCAD uses a Pico, an I2S sound dac, an analog amplifier/conditioning stage, control of RC servos, bus power, etc.

PCB design for the full module

PCB design for the full module

The kicad project (final PCB) can be found here:

(26-05-2024)

The PCB has been assembled using the designated parts. First I’ve put all SMD’s in place, then the thruholes. In terms of values I rounded (for now) all values to their closes E12 range values. This means that:

  • 120k -> 100k
  • 200k -> 220k
  • 50k -> 47k
  • 25k -> 22k

This probably will have some effects on the linearity of the input, especially of the CV. This can be changed in software by linearisation or a lookup-table. Also it -might- not be such a problem since the (Furby) is not meant to be pitch perfect.

SMD components soldered, thruholes next up...

SMD components soldered, thruholes next up...

mechanics

Next up is the integration work of the enclosure: a faceplate (designed in week 02, together with the face mechanism and finalised in week 15. For the coming weeks I will have to complete the software and finalise the furby face mechanism, preferbly using the week 15 fur addition and the week 12 eyes.

part list

In the following picture you see the PCB (board house ordered version) and a selection of components to check fitting/footprint sizes:

Components on board for checking sizes

Components on board for checking sizes

group part order number n price files
electronics
Pico 1 5.95
PCM5102 board 1 10.95
PCB AISLER 1 furbysynth-kicad.zip
mechanics module plate - 1 furby-final.svg
eyes - 2

The BOM for electronics from KiCAD: (using this converter I can make a markdown-compatible version). The full *.csv file can be found here.

tendon drive (bowden cable)

A special mechanism is needed to animate the furby’s face. For this I experimented with very thin PTFE tube with a flexible stainless-steel core (to allow push-pull motion). The mechanism consists of the following parts:

group part order number n price files / description
box - 1
RC servo - 1
PTFE tube - 1 20 cm, 2 mm OD, 1 mm ID
mounting tab - 1
steel cable - 1 25 cm. 1 mm Stainless Steel, 19 strands
screws m2 - 6 M2 x 6mm, 2 nuts
rod mount - 2 1.6 mm shaft, 2 mm set screw

The design consists of a box for mounting / protecting the RC servo, two tendon mounts to clamp the steel cable, flexible PTFE tube and an end-piece. The mechanism is based on a design which I have used more often for powering eye-mechanisms in animatronics.

For both the steel cable and PTFE tube external suppliers have been used:

Steel cable: 1mm, 19 strands, Stainless steel (Staalkabelstunter.nl)

Steel cable: 1mm, 19 strands, Stainless steel (Staalkabelstunter.nl)

2mm OD, 1mm ID PTFE tube (Amazon)

2mm OD, 1mm ID PTFE tube (Amazon)

In order to transfer the motion of the servo at the other end of the bowden cable a small connection piece has been designed using the following OpenSCAD script:

$fn=50;
difference(){
    union(){
        hull(){
            cube([15,10,2]);
            translate([2,10,0])cylinder(d=4,h=2);
             translate([13,10,0])cylinder(d=4,h=2);
        }
        translate([7.5-2,0,2])cube([4,12,1]);
        translate([7.5,0,3])rotate([-90,0,0])cylinder(d=4,h=12);
    }
    translate([2,10,0])cylinder(d=2,h=2.2);
    translate([13,10,0])cylinder(d=2,h=2.2);
    translate([2,2.5,0])cylinder(d=2,h=2.2);
    translate([13,2.5,0])cylinder(d=2,h=2.2);
    
    translate([7.5,1,3])rotate([-90,0,0])cylinder(d=2,h=12);
    translate([7.5,-1,3])rotate([-90,0,0])cylinder(d=1,h=12);
}
print job with box, lid and tendon-end piece

print job with box, lid and tendon-end piece

Below a picture of the assembled system. By chaning the length of the cable I can determine where the servos are being placed, without their noise (mechanical/electrical) interfering with the sound.

Assembled bowden cable system

Assembled bowden cable system

face mechanism

The mechanism and parts which have been tried as print-in-place in week06 have been subtly re-designed to allow for a bit more wall-thickness, clearance between parts and connecting rods for attaching the steel bowden-cables.

Especially the interplay (gap) between eye-lids and the surrounding frame (base) is important. Eventually using a different printer (bambulab instead of ultimaker) made the critical improvement in precision.

Base parts and eyelid in cura

Base parts and eyelid in cura

Base part and eyelid printed using Bambulab

Base part and eyelid printed using Bambulab

The (final) design file can be found here as OpenSCAD script:

With this file the following *.stl files are generated which have to be printed:

original and synth face in the making

original and synth face in the making

post-processing the parts

Eventually the eyes made in molding and casting week are not very suitable, the layer thickness of the casted epoxy varies a lot, on one of the eyes sanding down has a disasterous effect as it reveals cracks, air bubbles and unevennesses that cannot be sanded away.

I tried sanding and polishing using a hand-drill, waterproof sanding paper and polishing paste (toothpaste). Eventually adding a small layer of clear nail-varnish solves many unevennesses.

Sanding using drill, a rubber eyeball mount, sanding paper and toothpaste

Sanding using drill, a rubber eyeball mount, sanding paper and toothpaste

Hence a seond attempt, I used the inner-eye shape as has been used during the molding and casting week, hand-painted a pupil and iris and ‘drip-cast’ a cornea using clear nail-varnish.

eyes: (left to right, top to bottom) thingiverse, molding/casting week, store-bought, old epoxy resin, blank, blank + paint + nail varnish

eyes: (left to right, top to bottom) thingiverse, molding/casting week, store-bought, old epoxy resin, blank, blank + paint + nail varnish

For the other 3D printed parts I use a M2 reamer, various drill bits, a small hobby knife and a deburring tool to remove any print support left, clear the holes, etc.

tools for reworking 3D prints

tools for reworking 3D prints

software

In week 06 I made a start with the software, getting a basic (PWM) sound output and waveform display. In week 08 I switched to Pico (instead of XIAO, still using RP2040). I added software for output (I2S audio and servo control) in week 09 and added analogue modular synth-style inputs in week 11. In week 13 I added MIDI and USB Midi connectivity. In week 14 I added javascript/webserial control, and might use it for demo functionality when the main software (and MIDI control allows). It would be interesting to develop a web-tutorial that actually controls your synth module while explaining it.

During a session @Waag I started a fresh project to make the re-designed electronics work. I started from scratch, first -just- in Arduino to make sure all modules were behaving nicely. As it turned out there are a few errors in the design:

  • the connector to the OLED display is still reversed, so I need to add wires to the OLED to have it in place
  • apparently in the final version just before sending to AISLER I forgot to re-fill the ground planes. This might result in a bit more noise in output and input

I started the Arduino sketch by building up in software the following steps:

  • blinky (with the LED_BUILTIN)
  • Serial output (using debug probe on Serial1), outputting “hello world”
  • Serial output of the three analogue input signals (CV, modulation, gate) to be viewed with a serial plotter
  • Test-tone output for I2S on the I2S DAC
  • PIO encoder test example outputting values to serial plotter
  • “hello world” lines / sprites on the SSD1306 OLED display

When all of that is working I re-implemented the code of my first wav2c playing example. Besides I2S DAC output it is also (still) outputting PWM on one of the output pins

added the main control of they synth, being inputs for setting an A and B markers in between which the sample section is looped. This is already FUN! In the following video you see an unexperienced user (Joe) having a first go:

Joe testing the UI with two markers/inputs

In the version showed during the demo, the servos are added. The eyelids move open (wakeup) as soon as there is activity on the gate input. Eyelids will close slowly after activity has ceased. Upon every gate impulse the beak will open (so the furby ‘sings’). The final firmware can be found here in the directory project/furbyfirmware

The following two files are necessary:

Current functions not working or tested yet:

  • reading audio from SD card
  • menu control with encoder
  • multicore use for audio
  • controlling frequency

~Fin~

Reflection

June 13th, somewhere on the train to Amsterdam to the celebration

After explaining what FabAcademy is I usually got the question: “but you know all this stuff, why are you taking the course?”. Apparently because I felt there is still much to learn and following FabAcademy confirmed this state of affairs. I am very happy to have been part of this programme and I think I learned a lot.

The most valuable lessons for me were:

  • Triage. I of course -know about- this, but getting a 5-layered triage experience (and surviving) means that you internalise it.
  • getting to the bottom. I -did- use 3D printing and lasercutting and foil cutting, but did not internalise the habit of rigorous testing (for kerf, overhang, resolution, cutting depth, etc)
  • fresh controllers, fresh software, using RP2040, pico, VScode, Git, markdown. Growing more confident in OpenSCAD (and still knowing how avoiding Fusion, Rhino and Blender)
  • getting into a good documentation routine (now keeping it up is the thing..)
  • finally getting to use all these machines and supplies that you collected for another time, such as getting to work with milling machines such as the smaller one for PCB and the big shopbot. Also I tended to avoid molding and casting - hence the materials that I had were way past their shelf life. After the experience I might still will keep avoiding them. But now from a more knowledgable and experienced perspective.

The final project I chose was by far not the most complicated or elaborate project I did (not even during Academy) but it was nice, something fun I wanted to build for a long time - and I guess well chosen for the lessons and topics addressed because I managed to integrate many of the weekly assignments into it.

I also very much appreciated the way the courses were organised, a good mix from top-down “everything I know about the topic in one hour” lectures by Neil to the practical dissemination during class at Waag. The weekly workload, portfolio, random generator - It worked well for me to experience this from a students perspective, I guess it will also make me a better teacher / lecturer (although the flip-side is that since I managed to pull this one off, why would I expect any less from my students?)

So. FabAcademy worked for me. I would like to thank all instructors and organisers involved, especially the fantastic people at Waag: Michelle and Henk for being great tutors, Saco, Erwin and Bas for their lessons - and fellow students Vera, Joany, Leo and Joe, for all the fun and support during this shared experience!