design work
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…
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)
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:
The PCB designed in KiCAD uses a Pico, an I2S sound dac, an analog amplifier/conditioning stage, control of RC servos, bus power, etc.
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.
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:
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:
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);
}
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.
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.
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:
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.
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.
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.
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!