Automatic Baby Bouncer


This is the story of my (failed :)  ) attempt to automate my son’s bouncer…

The plan was to mount the circuits and the motor directly on the wooden frame of the 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

BabyBouncer_1stAttempt_ServoAndChain

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…

BabyBouncer_1stAttempt_ServoAndChain2

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 :) ).

Delrin shaft bearing

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…

BabyBouncer 1stAttempt initial test with a normal RC servo

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 )

BabyBouncer_1stAttempt_WithBigServo

BabyBouncer_1stAttempt_WithBigServoMounted

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.

Nanotec Stepper testing

And given that it was the first time I was using a stepper motor, I couldn’t resist the temptation to inspect its internals…

Stepper dismounted

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 !).

BabyBouncer_2ndAttempt_3DShape Open SCAD shape

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.

BabyBouncer_2ndAttempt_3DShape_ShapewaysBox

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):

BabyBouncer_2ndAttempt_L298StepperControllers

So, after all these modifications and re-designs, here’s the final result:

BabyBouncer_2ndAttempt_WholeThing

And how it was supposed to be mounted on the wooden frame of the bouncer:

BabyBouncer_2ndAttempt_Mounted

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

About these ads

5 Responses to Automatic Baby Bouncer

  1. Nooman says:

    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

    • trandi says:

      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

  2. 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.

    • trandi says:

      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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 88 other followers

%d bloggers like this: