Automatic Baby Bouncer
March 7, 2012 5 Comments
This is the story of my (failed
) attempt to automate my son’s bouncer…
It all started with my son that was born in November last year… we soon realised that a bouncer was a very useful noise reduction tool, but that it needed continuous work as the baby was too small to rock the whole thing by himself …
Given that I hadn’t done any electronics / hacking for several months, it was the perfect excuse to start a new project !
Besides, as my wife put it, “it would be the first time you actually hack something useful !”… if only it worked…
But as you’ll see in a few moments, it’s harder than one might imagine.
1st attempt - Monstrous RC servo
The obvious choice: put together some wood, cut some Delrin pieces, have a wheel and a plastic chain to transfer the motion from a big RC servo…
In order to avoid the whole weight of the bouncer (and the baby !) being on the motor axle, I needed some sort of shaft. Ball bearings and similar stuff would be nice, but too difficult to work without the appropriate tools, so I decided to use Delrin (which is a very dense and heavy plastic that smells like urine when cut
).
While working on this, I realised that the whole chain idea was bad as it was introducing extra moving parts, so went back to simply connecting the motor to the other end of the axle. Easier, even though the whole contraption would be much longer…
By now, I had finally received the super Vigor VSD 11 AYMB humongous servo (up to 19 kg/cm stall torque) which I though would be powerful enough to lift the whole bouncher (weighting between 5 and 10kg )
I will never know if this setup was fit for purpose, but the servo was definitely powerful enough to literally cut the 2mm metal screw perpendicular to the main shaft !
Rather than try to fix this, probably frustrated by all the manual cutting and drilling and by the fact that the servo was really noisy, I decided to re-design the whole device…
2nd attempt – Stepper motor
Here comes a stepper motor (my first foray into such a technology), thanks to the guys from Farnell that were kind enough to provide this sample for me to test ! They’ve also provided this great 250:1 gearbox, but due to my inexperience when choosing it, it would prove too difficult to marry with the motor and hence I couldn’t use it.
It’s a bi or uni polar Nanotec motor, with up to 0.1 Newton meter holding torque.
And given that it was the first time I was using a stepper motor, I couldn’t resist the temptation to inspect its internals…
Now another first for me: as mentioned previously, by this point I was fed up with manual work and couldn’t be bothered with sawing a new enclosure for this motor, so it was a great opportunity to start some 3D modelling (something that I had been wanting to do for a while, but never found the time or the motivation…).
There are many CAD softwares out there, some free some very expensive, but being a hard core programmer I chose to go with OpenSCAD (which I highly recommend and which is also free !).
If you’re curious, here’s the code used to generate this shape (first the motor module and then the main program):
module stepperNanotecST2818M1006B() {
fixHoleOffset = 11.5;
fixHoleOffset2 = 9.5;
difference(){
// main body
cube([28, 28, 44.5], true);
// front face
translate([fixHoleOffset, fixHoleOffset, 20])
fixHole();
translate([-fixHoleOffset, fixHoleOffset, 20])
fixHole();
translate([fixHoleOffset, -fixHoleOffset, 20])
fixHole();
translate([-fixHoleOffset, -fixHoleOffset, 20])
fixHole();
// rear face
translate([fixHoleOffset2, 0, -20])
fixHole();
translate([-fixHoleOffset2, 0, -20])
fixHole();
}
// disc on one side
translate([0, 0, 23.25])
cylinder(h=2, r=11, center=true);
// shaft
translate([0, 0, 3.25])
cylinder(h=78, r=2.5, center=true);
}
module fixHole() {
cylinder(h=4.5, r=1.25, center=true, $fn=20);
}
module stepperNanotecFixation(){
wallThickness = 3;
motorL = 44.5;
motorH = 28.5;
motorD = 28.5;
shaftHoleR = 5;
fixHoleOffset = 11.5;
fixHoleOffsetZ = (motorL + wallThickness)/2;
// main body
difference(){
// overall enveloppe
cube([motorH + 4, motorD + 2*wallThickness, motorL + 2*wallThickness], true);
// the motor body
cube([motorH, motorD, motorL], true);
// shaft holes
cylinder(h=motorL + 2*wallThickness + 0.1, r=shaftHoleR, center=true);
// disk on one side hole
translate([0, 0, motorL/2 + 1])
cylinder(h=2.1, r=11, center=true);
// fix holes front face
translate([fixHoleOffset, fixHoleOffset, fixHoleOffsetZ])
fixHole();
translate([-fixHoleOffset, fixHoleOffset, fixHoleOffsetZ])
fixHole();
translate([fixHoleOffset, -fixHoleOffset, fixHoleOffsetZ])
fixHole();
translate([-fixHoleOffset, -fixHoleOffset, fixHoleOffsetZ])
fixHole();
// remove the back half
translate([0, 0, -fixHoleOffsetZ])
cube([motorH + 2*wallThickness + 0.1, motorD + 2*wallThickness + 0.1, motorL], true);
// weight loss / ventilation holes
rotate(90, [1, 0, 0]){
weightLossHoles([0, 6, 12], [4, 9, 14, 19]);
}
rotate(90, [0, 1, 0]){
weightLossHoles([4, 9, 14, 19], [0, 6, 12]);
}
}
}
module weightLossHoles(offsetsX, offsetsY) {
for ( ox = offsetsX ){
for(oy = offsetsY){
translate([ox, oy, 0])
cylinder(r=2, h=100, center=true, $fn=10);
translate([-ox, oy, 0])
cylinder(r=2, h=100, center=true, $fn=10);
translate([ox, -oy, 0])
cylinder(r=2, h=100, center=true, $fn=10);
translate([-ox, -oy, 0])
cylinder(r=2, h=100, center=true, $fn=10);
}
}
}
stepperNanotecFixation();
use <stepperMotorNanotec.scad>;
module stepperThreadMain(){
// number of fragments
//$fa = 1; $fs = 0.4;
translate([0, 0, 38.25])
sliderSupports();
translate([0, 0, -58])
stepperNanotecFixation();
translate([0, 0, -20]) rotate(90,[0,0,1])
shaftsJoint();
translate([0, 5, 40])
rotate(90,[1,0,0])
threadSlider();
translate([0, -5, 40])
rotate(90,[1,0,0])
threadSlider();
// add the links
translate([14.5, 0, -20])
link();
translate([-14.5, 0, -20])
link();
}
module link(){
difference(){
cube([3, 16, 30], true);
rotate(90,[0,1,0]){
translate([10, 5, 0])
cylinder(h=3.1, r=1.5, center=true, $fn=20);
translate([-10, 5, 0])
cylinder(h=3.1, r=1.5, center=true, $fn=20);
translate([10, -5, 0])
cylinder(h=3.1, r=1.5, center=true, $fn=20);
translate([-10, -5, 0])
cylinder(h=3.1, r=1.5, center=true, $fn=20);
translate([5, 3, 0])
cylinder(h=3.1, r=2, center=true, $fn=20);
translate([-5, 3, 0])
cylinder(h=3.1, r=2, center=true, $fn=20);
translate([5, -3, 0])
cylinder(h=3.1, r=2, center=true, $fn=20);
translate([-5, -3, 0])
cylinder(h=3.1, r=2, center=true, $fn=20);
}
}
}
module sliderSupports(){
difference(){
// main body
union(){
cube([32, 34, 90], true);
// lever axis support
rotate(90, [1, 0, 0]){
difference(){
union(){
translate([16, 0, 14.5])
cube([20, 20, 5], center=true);
translate([23, 0, 14.5])
cylinder(r=10, h=5, center=true);
translate([16, 0, -14.5])
cube([20, 20, 5], center=true);
translate([23, 0, -14.5])
cylinder(r=10, h=5, center=true);
}
translate([19, 0, 0])
cylinder(r=2, h=34.1, center=true, $fn=20);
translate([27, 0, 0])
cylinder(r=2, h=34.1, center=true, $fn=20);
}
}
}
// hollow interior
cube([12.5, 34.1, 70], true);
cube([32.1, 24, 70], true);
// thread holes
cylinder(r=2, h=90.1, center=true, $fn=20);
// reduce weight holes (not functionally necessary)
rotate(90, [1, 0, 0])
weightLossHoles([4.05, 11], [0, 8, 16, 24, 32, 40]);
rotate(90, [0, 1, 0])
weightLossHoles([40], [10]);
}
}
module threadSlider(){
difference(){
// main body
cube([12, 34, 7], true);
// hole for the main nuts (a nut has 6 faces)
cylinder(r=4,h=8.1, center=true, $fn = 6);
// cut
translate([0, 8.1, 0])
cube([2, 17.1, 8], true);
// screw hole
translate([0, 6.5, 0])
rotate(90, [0, 1, 0])
cylinder(r=1.5, h=12.1, center=true, $fn=20);
}
}
module shaftsJoint(){
difference(){
// main body
cube([9, 17, 20], true);
// motor shaft
translate([0, 0, 6])
cylinder(h=12, r=2.5, center=true, $fn=20);
// thread shaft
translate([0, 0, -6])
cylinder(h=12, r=1.90, center=true, $fn=20);
// cut
translate([0, 4.25, 0])
cube([2, 9, 21], true);
// screw holes
rotate(90, [0, 1, 0]){
translate([5, 5, 0])
cylinder(h=10, r=1.5, center=true, $fn=20);
translate([-5, 5, 0])
cylinder(h=10, r=1.5, center=true, $fn=20);
}
}
}
stepperThreadMain();
The great thing with these 3D designs is that you can order them to be printed online, and you nicely receive the finished product at home. I used Shapeways and the not so great thing was the price (almost 50£ !!!) and the solidity of the material. While the resolution was impressive, you can see that the material / process they are using is more suitable for decorative objects.
I was also dissatisfied with my tests using a L293D motor controller that I had lying around, so I ordered a couple of (very cheap) L298 based motor controllers (thanks suntekstore.co.uk, great price and quick delivery directly from HK):
So, after all these modifications and re-designs, here’s the final result:
And how it was supposed to be mounted on the wooden frame of the bouncer:
If you’ve had the patience to read up to this point, then here’s finally the reason why all this doesn’t work:
Again, my “amateurish” approach to dimensioning the parts, meant that in this case the stepper motor itself was faaaar from being powerful enough to move the whole bouncer ! I naively though that by using a thread to transform the circular motion into a linear one, I would gain enough torque…
One could suggest using some extra gears which will definitely increase the torque, but at the price of speed, which is already not great. Keep in mind that for this whole thing to be useful it has to be able to move the baby bouncer at some reasonable speed, something like one rocking movement every 1-2 seconds.
In any case, THANK YOU for reading my ramblings, and as usual any feedback or idea on how to fix it, would be more than welcome !
Dan















I have worked with the VSD 11AYMB and it is noisy…plus it seems to oscillate with a virring sound at every position! I would recommend you by one of the Hobbyking (www.hobbyking.com) made servos with something like 13 Kg output and mod the servo for continuous rotation (open it up and cut out the stopper, etc. with/without removing the electronics). if you remove the electronics you can use the L298 to control it.
I also had a small question…I am trying to build one of the solar tracking devices mentioned on instructables…they basically use servos to move sensors that track sunlight…I have used it on a large scale to move a huge array of parabolic mirrors for heating water…problem is that the Vigor 11AYMB is too fast in moving the array. If I introduce a delay in the code, it slows it but also reduces the torque…plus I have a feeling the servo (which is rated at 40 Kg on the Vigor datasheet) doesn’t give more than 15 Kg ?
I have one more Vigor VSD 11AYMB without the electronics removed and hooked to an L298N…that one I can hook up to higher voltages, etc. and get more torque/lower speed…but I can’t seem to ‘brake’…ie make the motor freeze at angular positions or hold the dish tight when it tries to flip under its own weight.
Thank you,
Nooman
Thank you Nooman, the 11AYMB seems indeed to be of quite dubious quality, I found the same noisy behaviour with a lot of jitter, but was wondering if it was me doing something wrong…
I’m not sure I understand what exactly your question is though ?
Dan
A vibrator could have been a simple an effective solution. Just spin an unbalanced weight of some sort. You can put the entire thing in an enclosure if you don’t want any external moving parts.
You’d probably need to play around with its inertia and rotation speeds to get the smooth harmonic motion you’re after.
Oh, and a pendulum is a similar approach, that won’t require much power to keep running if you go with its natural frequency.
Indeed, I thought of a pendulum as you suggest, but was afraid it was too complicated from a mechanical point of view.
Also, the weight would have to be big enough and I’d run into a similar motor dimensioning problem.
The advantage of a pendulum would however be a more “natural” movement due to inertia, whereas my actual solution, even if it worked, it would have probably produced a really “sudden” and un-natural movement, that the baby would most probably not like anyhow… lol…:)
dan