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

19 Responses to Automatic Baby Bouncer

  1. chas says:

    I found that my PWM frequency had a big effect on my stall torque while working on a similar project (linear actuator). Just curious what frequency you picked and if you manipulated it at all?

    • trandi says:

      Hi I was simply using the Arduino’s analogWrite(), which as per the documentation has a frequency around 490Hz. I wouldn’t have thought that the frequency would have such a great impact though… In any case I haven’t played with it at all.
      In this case, I think I found the answer to the problem, as commented by another guy, it’s the fact that I opened the stepper motor, it removed most of its torque by de-magnetising it…

      Dan

  2. Pingback: Fail of the Week: Automatic Baby Rocker | Maker of Meta

  3. David Randolph says:

    Two suggestions. One cheap and one expensive. You could just get a heavy duty linear servo like this http://www.servocity.com/html/heavy_duty_linear_servo__25__l.html they can move up to 180lbs so you would be good there. My cheap suggestion would be ditch servo and steppers all together and go with a geared motor like this http://www.robotmarketplace.com/products/AME-214-1001.html then mount a hub with an offset wheel that every time the wheel comes around it pushes down and rolls on the ground and then goes up on the other side and so on, no reversing direction and no microcontroller just a speed controller you set with a POT and your done.

    • trandi says:

      Your 2nd suggestion is EXACTLY what I’m using right now for my V.2 !
      Only that your link is a ripoff, given that it’s simply an electric car window motor, that you can get from eBay for 5£ in perfect shape !!!

      And yes, you’re totally right that a controller is not needed, but then what would be the challenge…
      On the CONTRARY, I’m making V.2 even more complex by adding an 6 axis IMU to keep track of the exact angle of the baby bouncer… ! 🙂

  4. John says:

    One of the biggest problems is that you disassembled the stepper motor, essentially ruining it. The torque it had after you put it back together was probably only about 10% – 25% of what it originally was due to loss of magnetism. Obviously not your only issue here, but steppers can give plenty of torque if specced correctly (and not taken apart!)

    • trandi says:

      This is VERY interesting !
      I had no idea that was the case, but now I’ve googled it and you’re totally right.
      I haven’t done any proper testing of before and after, but now that you mention it I remember that I kept wondering why the heck a stepper comparable in size to a Nema17 produces so little torque whereas the Nema ones can drive 3D printers and other stuff…
      WOW, that’s probably the most useful comment I received, thanks a ton !

      Dan

  5. James says:

    Hmm. Looking at this – I would almost go to a motor route that spins a small tire (rubber). Ontop of that is a cam shaft (through another wheel. that provides a rocking motion, Easy to do by constructing a wheel with an offset axel. The offset axel would provide the rocking motion. If you are intrigued, I could draw it out.

    • trandi says:

      That is indeed a much simpler solution, not even needing a micrcontroller at all… and that’s the problem, the challenge would be mostly mechanical, whereas I enjoy more electronics / programming stuff 🙂

  6. Joe says:

    Holy cow! That looks like an unprotected 20c LiPoly or LiIon battery! You should use that anywhere near your baby!!!!

    To learn more about c ratings, check out adafruit’s tutorial: http://learn.adafruit.com/all-about-batteries/power-capacity-and-power-capability

    More importantly, read what she says about unprotected hobby batteries. http://learn.adafruit.com/all-about-batteries/liion-lithium-ion-and-li-poly-lithium-polymer They don’t have protection circuitry on them because it is often safer for a hobby airplane to land and possibly catch fire than to fail mid-air because the protection circuit came on.

    Your application is a baby in a flammable rocker. Use a safer power source or add some protection to that battery.

    • trandi says:

      Thanks for reminding me of this, you are totally right, that was for testing purposes only.
      I normally keep all my LiPo batteries in a safety bag in the workshop, well away from the baby !

      Dan

  7. mb says:

    Use the weight of the baby as balast. If you add a fulcrum just forward the center of gravity of the rocker, the weight of the baby and rocker should reduce the mechanical force required to move it back and forth.

    One of these (http://goo.gl/XDCp43) might be a cheaper solution in the long run 🙂

    • trandi says:

      Yes, but the more reduce the force the more you increase the distance over which you have to push/pull (conservation of mechanical work) and hence the time to achieve the movement… so the danger is that it becomes too slow…

      I thought about buying one, but then what would be the challenge !? 🙂

      Thanks for your comment anyhow!
      Dan

  8. Pingback: Fail of the Week: Automatic Baby Rocker

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

  10. 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 comment