Introduction: Boltinator 2000

Anyone that has ever done a project is usually left with some unused bolts, which are ordinarly not sorted by their nominal size. You have two options; you can either grab some calipers and sort them manually in the matter of minutes, or you can spend hours on another project and make an automatic bolt sorter, leaving your mixed bolt problems in the past.

This machine sorts bolts with the help of their standardized head properties. For the demonstration purposes, we focused on pan head (DIN 7985) type, ranging from M3 to M6 with the maximum length of 60 mm. You can easily modify this assembly to sort bolts with other round head types (such as allen head - DIN 912). Please note that only one head type can reliably be sorted at a time, since the dimensions of different heads differ considerably.

Step 1: Concept Solution

We looked at different already existing sorting mechanisms, bearing in mind our manufacturing technology options (3D printing and laser cutting) and decided on a gravity slope mechanism with different barrier gap sizes.

The idea is the following: bolt is pushed down the slope by gravity. It slides down freely, until it encounters a barrier, which is placed low enough so that it can not clear it. It is then moved to the side of the slope, where it falls down the designated hole in the bottom plate. The barrier gaps were roughly estimated by looking at the bolt's head standards, but were finally fixed experimentally.

Since bolts sometimes need a little push when orienting or sliding by the barriers, we added a motor with eccentric mass to vibrate the entire bottom plate.

Bolts can be fed to the top of the slope manually, or by adding a separate feeding system. In this project, we added a conveyor belt, on which bolts are placed one by one by the operator. Our initial plan was to make an automatic feeding system, where you throw a bunch of mixed bolts in a input container, but since we encountered so many setbacks with our main sorting system, we decided do simplify the first part, which simulates our original plan.

Step 2: The Material

1 Stepper motor NEMA 17

1 Driver DRV8825

1 L298N Stepper Motor Driver Board Red

1 Capacitor 100 microFarad

1 sliding potentiometer

Electronic wires

1 wooden plate 2mm thickness

1 photo-interrupter TCST2103

1 switch

1 vibration motor

1 Arduino UNO R3

1 breadboard

1 conveyor belt kit

sorting slope:

Bolt :

10 M6 x 60

19 M4 x 25

24 M4 x 20

2 M3 x16


43 m4

30 M6

2 M8

washer: 8 M4

1 threaded rod M8 x 300

feeder system:


10 M4 x 20

4 M3 x 20


18 M4

8 M6

Washer: 8 M4

2 threaded rod M6 x 100

1 rod phi4 x 80

Step 3: Electronic Component

Stepper motor

To move the conveyor belt, a motor is needed. For this task, a stepper motor has been chosen. Because, a stepper motor is more easy to use and accurate than a DC motor and its rotation angle is not limited compared than a servomotor.

Driver DRV8825

A driver will be implemented to increase the accuracy of the stepper motors speed and it allow to reduce the number of pin used of the arduino. The driver DRV8825 will be used for the conveyor belt.

L298N Stepper Motor Driver Board Red

The L298N will be used to supply indirectly the vibration motor and it allows to provide a voltage supply of 5V.

vibration motor

A vibration motor will be used for the sorting part. It is a guarantee that the bolt fall to their right container in the case where they get stuck at the barrier.

photo-interrupter TCST2103

A photo-interrupter is a device used in an optical encoder to determine the displacement and the speed of an apparatus.In this project, the photo-interrupter will be used to determine if the conveyor belt gets stuck. This device is composed of an infrared led and a photo-transistor with a gap between them. In this way, when the infrared light is not detected or keep detected in a certain amount of time, the system deduce that the conveyor belt do not move.

Step 4: Electronic Circuit

Every component must be connected to the power supply and ground. Even that, the voltage value is different for each component.

The 12V are supplied by a generator.

  • 12V Power:
    • DC motor driver (which supplies the DC motor)
    • Stepper motor driver (which supplies the stepper motor)

The 5V are supplied by a voltage converter inside the DC motor driver. The switch is the gate to this power supply. WARNING: Don't connect the arduino to the power supply while to the computer, it might produce a shortcircuit!

  • 5V Power:
    • Arduino
    • Potentiometer

The 3.3V is an output from the arduino which convert the 5V Vin.

  • Photo-interrupter sensor

All the pins connections are defined in the arduino code:

  • Stepper motor:
    • Direction: 3
    • Step: 4
  • DC motor:
    • Pwm pulses: 9
    • In1: 5
    • In2:7
  • Potentiometer input: A0
  • Photo-interrupter sensor: 6

Step 5: Image

Step 6: Laser Cutting

This prototype is mostly created from laser cut parts. Most notable advantages of this manufacturing technology over 3D printing is the material cost, production speed and maximum component size.

Everything is cut out of 6 mm thick wooden plates, except:

  • Bottom plates - there are two. One is 6 mm wood and the other is 3 mm plexiglass
  • wheel2 - cut it out of 2 mm thick wooden plate

Anything not mentioned in the following list is cut only once:

  • horizontale - 2x
  • side - 2x
  • Bottom plates - 2x (see materials list above)
  • rib - 3x
  • barrier - 5x

When selecting laser cutting parameters, adjust them so that the laser slices all the way through the board (lower the cutting speed or increase the laser power). It is recommended to try small cuts beforehand, as to not waste material and time.

Step 7: 3D Printing

Parts that need more complex shapes are 3D printed. This mostly includes components, that need holes in more than 1 dimension.

We used Prusa minis, but they can be printed using virtually any 3D printer. Everything is made from PLA filament.

The exact printing parameters depend on your printer and filament, but here are some guidelines:

  • Layer height does not need to be thin. Use 0,25 or 0,3 mm to make your print times shorter
  • There is no need for too much infill. Anything above 25% is excessive
  • Pars are not complex, you can print them with high speeds. (We used 70 mm/s)
  • There is no need for supports
  • Should the surface edges lift off the bed, use brim feature in your slicer

Parts not mentioned on this list are printed only once:

  • barrier height adjuster 1 - 8x
  • barrier height adjuster 2 - 4x
  • barrier height adjuster 3 - 3x
  • 4.2 - 2x

Step 8: Code

#include <AccelStepper.h>

// Include the AccelStepper library:
// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
// Define also the sensor, L298N driver and potentiometer connections.

#define dirPin 3
#define stepPin 4
#define motorInterfaceType 1
#define pwmPin 9
#define m1Pin 5
#define m2Pin 7
#define potPin A0
#define sensor 6<br>
//Initializing variables to store data

int mincont = 3000;
int maxcont = 4000;
int count = 0; //use for the sensor to detect when the motor is stuck
int Motorspeed = 400; // initial speed of the stepper motor
int val; // it's equal to 1 or 0, depend when the sensor detect an obstacle
int potv; // potential to apply to the vibration motor
int speedmotor; //speed of the vibration motor
int timenow;
int period = 2000;

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // setup code here, to run once:

  timenow = 0;

  Serial.begin(9600); //Starting the serial communication at 9600 baud rate
  //Initializing the motor pins as output
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(pwmPin, OUTPUT);
  pinMode(m1Pin, OUTPUT);
  pinMode(m2Pin, OUTPUT);

  //Initializing the sensor pin as input
  pinMode(sensor, INPUT);

  // maximum speed in steps per second

  // Set initial rotation direction
  digitalWrite(m1Pin, HIGH);
  digitalWrite(m2Pin, LOW);
void loop() {
  // main code here, to run repeatedly:

  stepper.setSpeed(Motorspeed); // Set the speed in steps per second:

  potv = analogRead(potPin);  // Read potentiometer value
  speedmotor = map(potv, 0, 1023, 0, 255); // Map the potentiometer value from 0 to 255
  analogWrite(pwmPin, speedmotor); // Send PWM signal to L298N Enable pin

  val = digitalRead(sensor); // Read the signal of the sensor
  if (val == 1) {
    count++; // count when the sensor detect an obstacle 
  // every 2 seconds we enter this loop
  if (millis() > (period + timenow)) {
    timenow = millis();
    if (count < mincont || count > maxcont) { // if count is not between 3000 and 4000, it means that the motor doesn't run normally and stop it
      Motorspeed = 0;
      speedmotor = 0;
    count = 0; // count is reset to 0

Step 9: Experimental Results

Entire machine is held together with removable connections. This means that when we had to replace only one part of the assembly, this was easily accomplished.

Our project based heavily on experimental testing. We made most of the parts adjustable for that exact reason. Here are a few examples:

  • Feeders system speed
  • Feeder system gap between wall and belt is adjustable at four locations
  • Slope inclination angle
  • Vibration motor speed
  • Vibration motor eccentric mass
  • Vibration motor mounting location (can be mounted to either of the three ribs)
  • Barrier height is adjustable at both mounting points individually
  • Clearance of M4 pivot point bolt (located behind M6 barrier) is adjustable

We experienced most difficulties with making the bolts fall down the designated holes. Problems mostly occurred when bolts were coming to the holes at angles that we did not predict. They either got stuck or deflected into the wrong container below. We fixed this issue with a lot of experimental testing and 4 iterations of bottom plate.

The 3rd iteration of the base plate was almost perfect, we only had problems with the longest M6 x 60 bolts getting stuck on the M5 barrier because of its length. We soled the issue by adding a pivot point for longer bolts and the machine was working as expected.

One of the issued was with the feeding system throwing the bolts at wide variety of angles, making some of them continue their path to the higher located hole without the interference with the barrier. We fixed this issue by slight modification to the front plate and thus making the hole part of the bottom plate slightly raised in comparison to the conveyor belt side. By making this change, we also had to slightly increase the lean angle and vibration motor speed, but this was not an issue, as we made our machine plenty adjustable for this kind of events.

When we first tried the feeding system, we experienced a problem, where it was moving too fast and the bolts were consequently thrown into the first (M6) barrier and deflected into wrong holes, because they did not have a chance to hit the bottom plate before that. We solved this issue by slightly lowering the entire feeding system and by reducing its speed.

We made the distance between the belt guiding wheels fixed, since we were able to add or remove building blocks of the conveyor belt and thus adjust the belt tension.

Smaller M3 bolts were often jamming our feeding system, but after adjusting the tolerances between the walls and the belt (with aforementioned 4 location adjuster system), this problem was resolved.

Another time-consuming part was figuring out the container location and their wall height below the designated holes. This was a finicky and long-lasting experiment, since longer bolts (of the same nominal size) tend to deflect slightly different than shorter ones. Should we redo the machine, we would make it 100 or so millimetres longer, and avoid this altogether. We took some of the boxes from the workshop and caught the bolts, but should we have made designated boxes for this exact machine, we would have to make them heavy, because when big heavy bolts (M6 x 60) fall into the empty container with a non negligible speed, they tend to move it.

One of the last experimental parts was fixing the angle of inclination and making the corresponding base plate at the bottom. We attached some rubber pads to the aforementioned plate, because we found out that our entire system moves with vibrations. This causes it to move away from the feeding system (as it is not physically connected), and it poses a danger of falling of a table, should machine be placed there.

Step 10: Problem Encountered

During the test, different problems appeared. The first problem encountered is the M8 bolts sorting, the space between the gaps for the M8 and M6 is short that leads the M8 bolts fall in the M6 bolt container. The solution had to be to increase the space but for that, all the design of the sorting part should be changed. We didn't have the time and resources to recreate the sorting part, so we have decided to remove the M8 barrier and not use the M8 bolt.

The second problem is the vibration motor. The vibration motor has a problem of internal connection to lead to short-circuit. The solution is to buy a new vibration motor with the same model but we have not enough of time to order one.

The third problem is the fixation of the photo-interrupter. The photo-interrupter can be easily move around his screw. The solution is to create a 3D printed component to mount the photo-interrupter but that also, we had not the time to create.

While programming the Arduino it was burned one of the USB ports of the laptop. It was a mistake of powering the Arduino with an external power supply and with the USB port at the same time. The excess current went directly to the laptop, so be really careful when programing and wiring because electricity is not a game.

Build your machine with as much non-permanent/removable connections as possible. You never know what you will have to replace.

If possible, add as much adjustability to your project. It really helps you out at the very end, when all of the parts have to work together, and you have to finetune your project.

Try to test as much beforehand as possible. You are often surprised with things not working as imagined. By testing on every step, you avoid wasting material and time.

Do conceptual and embodiment design as soon as possible. Identify and order parts early. Should they not arrive on time, you can not test/assemble/finish your project.

Step 11: Video