Home > Mindstorms, Misc. > Reach Stacker

Reach Stacker

Model of a generic reach stacker. Features drive, steering, elevated and extended boom, elevated cabin, rotated head and motorized jaws.  


Completion date: 01/04/2012
Power: electric (Power Functions)
Dimensions: length 38 studs (not including the arm) / width 22 studs (not including the arm) / height 22 studs
Weight: 1.565 kg
Suspension: none
Propulsion: 1 x PF XL motor geared 1.4:1
Motors: 2 x PF XL motor, 3 x PF Medium, 2 x micromotor

Reach stackers are highly specialized industrial machines that can be considered a distant variant of a telehandler. They are being used primarily in cargo terminals in ports around the world, where their task is to transport and arrange containers. I have been planning to build such a machine for a very long time, and I finally succeeded.

The model showed a generic, typical reach stacker rather than some particular model. The interesting thing about reach stackers is that they are absent from the offer of most of the European machinery manufacturers, except for the Liebherr company which produces reach stackers with arched booms, which would be extremely difficult to model with LEGO pieces.

The model was intended to be as simple, small and functional as possible. I have used no suspension system in it; I was unable to determine whether real reach stackers have any suspension systems, but it seems unlikely for machines that are designed to carry heavy loads around perfectly flat asphalt areas. For example, most front loaders have no suspension on their front axles to make them more stable with loads, and they are supposed to work in rough terrain.

Most of the model was built entirely studless, with exception for the sides of the hull, consisting of studfull bricks connected to the bearing frame. Thus, they were used to strengthen the chassis in its crucial section between the mounting points of the boom and of the linear actuators.

The model’s front axle was driven by PF XL motor through a single differential, and its four wheels were mounted on two small Technic turntables which acted as bearings, taking load off the axle. It seemed to work, as the model proved to be very agile, with and without the load. The rear axle was steered by a PF Medium motor with a very simple steering mechanism lacking a clutch or a return-to-center function. It had an extreme steering lock, merely thanks to removal of any parts of the body that could collide with wheels.

The boom, made of studless panels and self-container, was elevated by two large linear actuators driven by a single PF XL motor. A PF Medium motor installed at the back of the boom was used to extend it, through a system of a worm gear meshed with racks on the boom’s extendable section. The head at the tip of the boom included two micromotors, one for rotating it and another one for closing and opening its jaws. Since the head was intended to balance itself under own weight, just like in real machines, a weighted brick was attached to its side opposite the latter micromotor to counter-balance it. The head’s rotation range was full 360 degrees, and its jaws had a gripping range from 9 to 31 studs. Finally, a PF Medium motor and a small linear actuator were used to elevate the cabin and move it forward, but due to lack of space in the hull, the range of movement was minimal and the function was quite unimpressive.

One function that I toyed with and eventually abandoned was tilting the head forward and backward. Real reach stackers have such function, although it appears to be very rarely used. I did not expect to really need it, and it added plenty of technical difficulties, requiring another motor near the boom’s tip, or a pneumatic system routed to its tip, or perhaps an extending driveshaft inside the boom.

There were few interesting technical solutions that I’ve tried – other than using turntables as bearings, they included the construction of the boom which can be made much longer, and the jaws extension mechanism which was very simple, compact and yet reliable. In general, the model had a sturdy chassis and boom, but rather delicate head and jaws. Despite that, the jaws worked flawlessly with any kind of load, and the maximum load capacity of the model proved to be almost 0.5 kg, limited only by the torque of the PF XL motor elevating the boom and by the clutches in the linear actuators.

I have also used this opportunity to test my IR Link sensor which allows the NXT brick to control Power Functions devices. I have built a simple NXT controller with one joystick, using three motors and two touch sensors and working in two modes: drive mode and boom control mode. The controller worked rather well using my program written in ROBOTC which is included below, but the IR Link sensor was a disappointment: its range was shorter than that of PF remotes, and it caused delays in the reaction of PF motors. Still, controlling the model in such way, definitely more realistic than with regular Power Functions remotes, was an interesting experience.

Control program:

#pragma config(Sensor, S1, HTIRL, sensorI2CCustom)
#pragma config(Sensor,S3,touch1,sensorTouch)
#pragma config(Sensor,S4,touch2,sensorTouch)
#include "drivers/HTIRL-driver.h"
bool sending = false;
bool drivemode = true;
tPFmotor DriveMotor = pfmotor_S1_C1_A;
tPFmotor SteeringMotor = pfmotor_S1_C1_B;
tPFmotor BoomElevationMotor = pfmotor_S1_C2_A;
tPFmotor BoomExtensionMotor = pfmotor_S1_C2_B;
tPFmotor CabinMotor = pfmotor_S1_C3_A;
tPFmotor HeadCatchMotor = pfmotor_S1_C4_A;
tPFmotor HeadRotationMotor = pfmotor_S1_C4_B;

task Buttons()
  nNxtButtonTask  = -2;
  nNxtExitClicks = 2;
  nxtDisplayCenteredTextLine(0, "Not sending...");
    if(nNxtButtonPressed == 3)
      if(sending == false){
        sending = true;
        nxtDisplayCenteredTextLine(0, "Sending...");
        sending = false;
        nxtDisplayCenteredTextLine(0, "Not sending...");

    if(nNxtButtonPressed == 1)
        drivemode = false;
        nxtDisplayCenteredTextLine(2, " DRIVE [BOOM]");

    if(nNxtButtonPressed == 2)
        drivemode = true;
        nxtDisplayCenteredTextLine(2, "[DRIVE] BOOM ");

    if(nNxtButtonPressed == 0)
      sending = false;
      PFMotor(DriveMotor, 0);
      PFMotor(SteeringMotor, 0);
      PFMotor(BoomElevationMotor, 0);
      PFMotor(BoomExtensionMotor, 0);
      PFMotor(HeadCatchMotor, 0);
      PFMotor(HeadRotationMotor, 0);
      PFMotor(CabinMotor, 0);


task main()
  nxtDisplayCenteredTextLine(2, "[DRIVE] BOOM ");
  int LeftMotor = 0;
  int RightMotor = 0;
  int UpperMotor = 0;
  int RightButtons = 0;

  while (true) {
    if(drivemode == true)
      LeftMotor = (nMotorEncoder[motorA] / 7) * -1;
      if (LeftMotor > 7) LeftMotor = 7;
      else if (LeftMotor < -7) LeftMotor = -7;

      RightMotor = (nMotorEncoder[motorC] / 10) * -1;
      if (RightMotor > 2) RightMotor = 2;
      else if (RightMotor < -2) RightMotor = -2;

      if (SensorValue(touch1) == 1) RightButtons = 7;
      else if (SensorValue(touch2) == 1) RightButtons = -7;
      else RightButtons = 0;

      nxtDisplayTextLine(4, "Left motor: %d", LeftMotor);
      nxtDisplayTextLine(5, "Right motor: %d", RightMotor);
      nxtDisplayTextLine(6, "Buttons: %d", RightButtons);

      if (sending == true)
        PFMotor(DriveMotor, LeftMotor);
        PFMotor(SteeringMotor, RightMotor);
        PFMotor(CabinMotor, RightButtons);
      LeftMotor = nMotorEncoder[motorA] / 20;
      if (LeftMotor > 0) LeftMotor = 7;
      else if (LeftMotor < 0) LeftMotor = -7;

      UpperMotor = nMotorEncoder[motorB] / 20;
      if (UpperMotor > 0) UpperMotor = 7;
      else if (UpperMotor < 0) UpperMotor = -7;

      RightMotor = (nMotorEncoder[motorC] / 20) * -1;
      if (RightMotor > 0) RightMotor = 7;
      else if (RightMotor < 0) RightMotor = -7;

      if (SensorValue(touch1) == 1) RightButtons = 7;
      else if (SensorValue(touch2) == 1) RightButtons = -7;
      else RightButtons = 0;

      nxtDisplayTextLine(4, "Left motor: %d", LeftMotor);
      nxtDisplayTextLine(5, "Right motor: %d", RightMotor);
      nxtDisplayTextLine(6, "Upper motor: %d", UpperMotor);
      nxtDisplayTextLine(7, "Buttons: %d", RightButtons);

      if (sending == true)
        PFMotor(BoomExtensionMotor, LeftMotor);
        PFMotor(BoomElevationMotor, UpperMotor);
        PFMotor(HeadRotationMotor, RightMotor);
        PFMotor(HeadCatchMotor, RightButtons);

Work in progress photos:

1.jpg 2.jpg 3.jpg


1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg dsc08488.jpg dsc08496.jpg dsc08506.jpg dsc08514.jpg dsc08527.jpg e_boom.png e_head.png nxtcontroller1.jpg nxtcontroller2.jpg nxtcontroller3.jpg nxtcontroller4.jpg original1.jpg original2.jpg original3.jpg original4.jpg


Media reference:

8studs (Polish only)

Categories: Mindstorms, Misc. Tags: ,
  1. LegoStax
    April 16th, 2013 at 03:17 | #1

    Oops, I meant to use a smiley face.

  2. LegoStax
    April 16th, 2013 at 03:16 | #2

    I installed the Driver Suite and got it to work. Thanks! http://sariel.pl/wp-includes/images/smilies/icon_biggrin.gif

  3. Sariel
    April 15th, 2013 at 22:58 | #3

    Documentation as in the whole Help file available when you press F1.

  4. LegoStax
    April 15th, 2013 at 22:41 | #4

    P.S. It also said in the compile error window that it couldn’t open the IRLink driver (Drivers\HTIRL-driver.h).

  5. LegoStax
    April 15th, 2013 at 22:33 | #5

    I am running 3.54. What do you mean by documentation? The files or…what? By the way I copied over your code to see if it would work but ROBOTC says that it can’t compile it because it doesn’t recognize the PFMotor command. So I know that mine didn’t come with the driver installed. Should I install 3.60?

  6. Sariel
    April 15th, 2013 at 20:18 | #6

    I think the driver came together with my RobotC install. Did you check the documentation in your version? Which version are you running?

  7. LegoStax
    April 15th, 2013 at 18:44 | #7

    P.S. How would I install it? I know I sound really dumb, but I know it’s in “C:\Program Files (x86)\Robomatter Inc\ROBOTC Development Environment\Drivers\NXTDriver”. Do I put it under NXTDriver or just in the Drivers folder?

  8. LegoStax
    April 15th, 2013 at 18:31 | #8

    I looked at your ROBOTC code and I can’t get my IR Link to work and I can’t. I do know that I need the HiTechnic driver for it, but I went to their site and I can’t find one for ROBOTC. Do you know where I might be able to get one?

  9. Sariel
    July 27th, 2012 at 08:22 | #9

    Because I don’t work for LEGO.

  10. Jimmy
    July 27th, 2012 at 06:05 | #10

    I mean Why can’t your creations become a lego set@Jimmy

  11. Sariel
    July 9th, 2012 at 21:57 | #11

    Yes, I did.

  12. Nate
    July 9th, 2012 at 21:25 | #12

    I agree. Your creations are better then some of the official Lego Technic sets.

  13. Nate
    July 9th, 2012 at 21:22 | #13

    Great job Sariel. Did you use worm gears to move the arm and claw?

  14. unknown
    June 18th, 2012 at 22:00 | #14

    Sorry i meant to say case.

  15. Sariel
    June 5th, 2012 at 16:33 | #15


  16. unknown
    June 5th, 2012 at 16:22 | #16

    Why did you not just use k select.

  17. Alex
    April 18th, 2012 at 14:44 | #17

    Don’t be pessimistic! I think you could make it indeed. @Sariel

  18. Sariel
    April 14th, 2012 at 21:10 | #18


  19. Arjan
    April 14th, 2012 at 21:06 | #19

    what plug-in do you use to post your photos?

  20. Sariel
    April 13th, 2012 at 23:03 | #20

    Because none of the things I’ve built has any chance of being turned into a LEGO set.

  21. Alex
    April 13th, 2012 at 23:02 | #21

    Why don’t you send something to Lego.CUUSOO ?

  22. Cody
    April 6th, 2012 at 23:36 | #22

    Great job on your newest creation. I find it genius to Use both Power functions and NXT In This creation. I look foward to more!

  23. Sariel
    April 6th, 2012 at 09:29 | #23

    You know, the description says that. The video shows that. What’s stopping you from reading and watching?

  24. MAN
    April 6th, 2012 at 09:11 | #24

    how much it can lift?

  25. Sariel
    April 5th, 2012 at 21:06 | #25

    It’s secured with liftarms on both sides. It doesn’t get much stronger than this.

  26. TLT803
    April 5th, 2012 at 20:49 | #26

    I don’t want to be critical but the connection of the LAs with the boom doesn’t look that strong… did nothing else work?

  27. April 5th, 2012 at 15:58 | #27

    Ingenious creation Paul! And also high quality video in every respect.

  28. destructor
    April 5th, 2012 at 10:21 | #28

    They seem to be quite specialized in moving cargo.
    Mainly (big) forklifts, reachstackers and so on…

  29. Sariel
    April 5th, 2012 at 09:47 | #29

    Thanks for the info, I must admit I’ve never heard about Kalmar Industries.

  30. Marco Ryu
    April 5th, 2012 at 09:17 | #30

    Awesome! great quality of the video

  31. destructor
    April 5th, 2012 at 09:01 | #31

    > The model showed a generic, typical reach stacker rather than some particular model. The
    > interesting thing about reach stackers is that they are absent from the offer of most of the
    > European machinery manufacturers, except for the Liebherr company which produces reach
    > stackers with arched booms, which would be extremely difficult to model with LEGO pieces.

    Not totally true. “Kalmar Industries” produce them in Sweden. (I already drove by that factory myself)
    see http://www.cargotec.com/en-global/ps/reachstackers/Pages/default.aspx

  32. Sariel
    April 5th, 2012 at 08:08 | #32

    Yes, Furball is a new hamster and this is her first video with LEGO. I think she did very well. Soon we’ll see how her younger sister does 🙂

  33. Tony
    April 5th, 2012 at 02:05 | #33

    Awesome creation! i love your cute hamster ^^ Looking forward to more!

  34. Minotaur
    April 5th, 2012 at 01:30 | #34

    Awesome construction Sariel!!! You improve every single time you post a new creation. Also, is Furball a new hamster? 😀

  1. No trackbacks yet.