Thumbnail Zigarettenstopfmaschine

3D Printed Cigarette Stuffing Machine with Arduino

WHY???

Admittedly, the idea of constructing a cigarette stuffing machine may sound rather special. The inspiration for it came to me during my wanderings through the internet. I’m always on the lookout for challenging projects, and this one undoubtedly represents one of my most challenging yet. Building a machine like this requires a considerable amount of expertise. Over hundreds of hours I have devoted to design, 3D printing, building, testing, programming, creating schematics, and many other aspects.

In the end, we now have a fully automatic cigarette stuffing machine that was realized using 3D printing. However, it is important to mention that this is a prototype. The machine is not yet perfect in its functionality. It still needs some customization work to make it fully work. However, with enough effort and the right approach, it is entirely possible to develop a fully functional machine.

You can download all the necessary files here: Printables, Cults

There was a HACKADAY article published about it.

My first experiments

My first attempts at stuffing tobacco into pre-made tubes were quite simple in design. I made a brass sleeve on which I could place a cigarette tube. I operated the pusher manually.

The learning curve during these experiments was quite steep. It became apparent that considerable force was required to press the tobacco into a uniform shape. In addition, it became clear that the tobacco must be pressed so that its diameter is slightly smaller than that of the cigarette tube. This makes it much easier to insert into the tube. If the pressed tobacco has the same thickness as the cigarette tube, insertion becomes extremely difficult.

 
 

 

 

First tests with stuffing tobacco
First attempt to plug tobacco in a sleeve

Based on the aforementioned findings, the following design, known as the „toggle lever design,“ was developed. This design makes it possible to exert a significantly higher pressing force on the tobacco with comparatively little effort. The point at which the two levers are in a straight line to each other generates the maximum pressing force. Here, only a minimum force is needed to push the levers through. If this design is calculated mechanically, an infinitely large force is produced at this point.

As already mentioned, the tobacco is compressed in diameter slightly smaller than the diameter of the cigarette tube. When the knee lever is pushed through, the tobacco press is moved back again slightly, loosening the compressed tobacco somewhat. This allows for easier insertion with the pusher into the tube.

There are many different systems for plugging tobacco, but the solution with the toggle lever design seems to be technically the most effective.

Zigarettenstopfmaschine Presse Mechanik
Pressing by means of toggle lever principle
Zigarettenstopfmaschine Presse Mechanik eingefahren
Knee lever pressed through

It is important to deburr the brass sleeves cleanly and preferably polish the interior. Any resistance that could prevent the tobacco from smoothly sliding into the cigarette tube must be avoided.

 
 

 

 

Zigarettenstopfmaschine Presse Fixer Teil
Polished brass sleeve

The press

In all my tests I used a 12V gear motor with 166 RPM. The performance of this motor is very marginal. Here you should go to a more powerful model in any case. Either you reduce the speed -> thereby you achieve a higher torque, or you increase the electrical voltage of the motor.
Basically, I would advise to 24V motors. But you have to be careful not to exceed the maximum currents of the L293D Motor Driver Shield.

Motor from the stuffing machine
12V gear motor

To drive the toggle, my first approach was to use a conventional M6 threaded rod. Unfortunately, this solution proved to be less efficient. The occurring friction losses were considerable and due to the low pitch of the threaded rod, the speed was very slow. In view of these shortcomings, I looked for alternatives.

In my research, I came across the company Igus, which offers trapezoidal threaded spindles with steep threads. In combination with the matching nut made of iglidur J material, an extremely effective solution resulted. This comparison and the clear improvements can also be seen very well in my video. By using the Igus trapezoidal lead screw in combination with the matching nut, the friction losses were reduced considerably, and the system now functions with low friction and efficiently.

 
 

 

 

Zigarettenstopfmaschine Presse Spindel Igus
Igus steep thread spindle
Zigarettenstopfmaschine Presse Spindel Gewindestange
Normal M6 threaded rod

The tamper pusher

The tamper pusher from the cigarette stuffing machine has the task of conveying the pressed tobacco into the tobacco tube. Due to this function, this operation requires considerable force. The tamper pusher is made of half-shell-shaped brass and is equipped with driving teeth to move the tobacco safely through the sleeve.
The same motor is used to drive the tamper pusher as for the press. Again, I would advise a 24V motor. Brass bearings were used as plain bearings for low friction movement.

 
 

 

 

Motor for the tamper in the cigarette stuffing machine
Motor for the tamper pusher
Zigarettenstopfmaschine Stopfer
Sliding guides for the tamper slide

The sleeve magazine

Zigarettenstopfmaschine Acrylteile
Acrylic plates for the magazine
Zigarettenstopfmaschine Elektronik Referenzsensor
Reference sensor for the drum magazine

The tube magazine from the cigarette stuffing machine performs the task of storing empty cigarette tubes. It was constructed from acrylic sheets. The bottom of the magazine is mounted on pivoting bearings, which allows it to be shaken by means of a small DC motor. This shaking is essential to ensure that the tubes can align themselves neatly. Once aligned, the cigarette tubes slide down a chute. At this point, they are picked up by a rotating drum magazine.

The drum magazine takes over the task of conveying the tubes to the position for insertion. Here they are pinned onto the tobacco press by a pin driven by a model building servo. After the tamping process, the magazine rotates to the next position and the finished cigarette is ejected.

Before the machine starts, the drum is referenced by means of a slot sensor and brought into an initial position.

 
 

 

 

Cigarette Stuffing Machine Drum Magazine
Drum magazine
Vibrator for the cigarette stuffing machine case magazine
Vibration motor

The tobacco magazine

The tobacco magazine from the cigarette stuffing machine performs the important task of storing the tobacco. Due to the inherent difficulties in dosing tobacco precisely – as the tobacco threads tend to stick to each other – a pivoting vertical wall was installed

The vertical wall of the magazine is mounted on pivoting bearings. Movement by means of a servo motor causes the wall to move back and forth. This action causes the tobacco to slide evenly down the chute. The initial position of the servo, that is, the position of the vertical wall, can be adjusted by means of a thread. This allows relatively good feeding to the press.

 
 

 

 

Zigarettenstopfmaschine Tabakmagazin
Movable vertical wall in tobacco magazine
Zigarettenstopfmaschine Servo Tabakmagazin
Servo to shake the tobacco

An additional step was required to allow the tobacco to now slide into the recess of the press. This was achieved by using a magnetic linear cylinder I use an acrylic wall from above to stuff the tobacco into the press.

Zigarettenstopfmaschine Magnetzylinder

The electronics

The circuit diagrams and electronic information presented on this website are for illustrative purposes only and are based on my own experience and procedures. I assume no responsibility for the accuracy, completeness or timeliness of the content provided. Any use or implementation of the information presented here is at the user’s own risk. I expressly exclude any liability for damages that may arise from the use of this information. It is recommended that you consult a specialist before implementing any electronic projects and take appropriate safety precautions.

Electronics may seem complex at first glance. But if you connect everything step by step, it is actually quite simple to understand.

 
 

 

 

Electronics general view of cigarette stuffing machine
Electronic components

The whole cigarette stuffing machine is controlled by an Arduino Uno and a L293D Motor Driver Shield. In the attached photo („Circuit diagram of the motorshield“), the Motorshield can be seen from above. On the right side you can see the two DC motors for the tobacco press and the tamper pusher. In addition, the servo for attaching the empty cigarette tubes and the servo for the tobacco magazine are shown here. On the left side you can see the stepper motor for the drum magazine. Optionally a button can be connected to the D2 connector of the Arduino. With this you can have a cigarette plugged by pressing a button.

 
 

 

 

Arduino of cigarette stuffing machine
Top view: L293D Motor Driver Shield
Cigarette Stuffing Machine Wiring Diagram
Circuit diagram of the motorshield

In the picture „Initiators circuit diagram“ you can see on the left side the connections to the Arduino. A0-A2 are connected to the analog inputs of the Arduino. These inputs are then configured as digital inputs in the program.
At the top you can see the power supply of the initiators. Unfortunately they do not work with the 5V of the Arduino. Therefore a 12V power supply must be provided. On the right side the initiators are connected.

Zigarettenstopfmaschine Platine Initiatoren
Top view of initiators PCB
Zigarettenstopfmaschine Schaltplan Initiatoren
Initiators circuit diagram

The two relays are connected via A3 and A4 of the Arduino.
On the right side of the photo „Relay and 12V distributor“ you can see a simple 12V and GND distributor.

Zigarettenstopfmaschine Elektronik Relays
Relay and 12V distributor
Zigarettenstopfmaschine Schaltplan Relay
Relay - magnetic cylinder / motor sleeve magazine

Arduino code

To breathe life into the machine, of course, you still need the code for the Arduino. To describe a code in words is usually not very easy. I tried to comment everything as good as possible. However, if there are any questions or ambiguities, I’m happy to answer them.

 
 

 

 

#include AFMotor.h
#include Servo.h

int INI_press = A0;
int INI_push_front = A1;
int INI_push_rear = A2;
int magazin_sensor = A5;
int Ecylinder = A3;
int vibro = A4;
int button = 2;

//Settings
int press_back_time = 1000;//how long should press slide retract
int eject_drive_time = 1000;//Time how long is ejected
int knocking = 8; //How often to knock
int plug_on_rear = 85;//Plug-on servo rear position
int plug_on_front = 5;//Plug-on servo front position
int tobacco_servo_rear = 140;//Tobacco magazine servo rear position
int tobacco_servo_front = 80;//Tobacco magazine front rear position

long eject_start_time;
long press_start_time;

int pusher_home = 0;
int press_home = 0;

String progress = "knocking"; //Initial state
String mode = ""; //Button mode

AF_DCMotor motor_press(1); // Motor pressing
AF_DCMotor motor_push(2); // Motor pushing
AF_Stepper motor_magazin(200, 2);
Servo Servo_tobacco_magazine;
Servo Servo_plug_on;

void setup() {
  Serial.begin(9600);
  pinMode(INI_press, INPUT);
  pinMode(INI_push_front, INPUT);
  pinMode(INI_push_rear, INPUT);
  
  pinMode(Ecylinder, OUTPUT);
  digitalWrite(Ecylinder,LOW);

  pinMode(vibro, OUTPUT);

  motor_press.setSpeed(255);
  motor_press.run(RELEASE);
  motor_push.setSpeed(255);
  motor_push.run(RELEASE);
  
  Servo_tobacco_magazine.attach(9); 
  Servo_plug_on.attach(plug_on_rear); 

  pinMode(button, INPUT);
  
  reference_drive();
}

void loop() { 
//---------------------------------------------------------------------------------- 
  if (digitalRead(button) == HIGH){                               //Request button
    buttonread();
  }
 
  if (mode == "one_piece"){
  
    if (progress == "knocking"){                                  //Start knocking
      for (int i = 0; i <= knocking; i++) {
      Servo_tobacco_magazine.write(tobacco_servo_front);
      digitalWrite(vibro,HIGH);
      digitalWrite(Ecylinder,HIGH);
      delay(100);
      Servo_tobacco_magazine.write(tobacco_servo_rear);
      digitalWrite(Ecylinder,LOW);
      delay(100);
      }                                 
      motor_magazin.setSpeed(30);                                 //Plug on tubes
      motor_magazin.step(25, FORWARD, SINGLE);
      delay(200);
      Servo_plug_on.write(plug_on_front);
      delay(200);
      Servo_plug_on.write(plug_on_rear);
      delay(100);
      
      motor_press.run(FORWARD);                                   //Start press motor
      progress = "pressing";
    }
  //----------------------------------------------------------------------------------  
    if (progress == "pressing"){                                  //Press cigarette
      if (digitalRead(INI_press) == LOW){
        motor_press.run(RELEASE);
        motor_push.run(FORWARD);                                  //Motor push start forward
        progress = "stuffing"; 
      }
    }
   //----------------------------------------------------------------------------------  
    if (progress == "stuffing"){                                   //Stuff cigarette
      if (digitalRead(INI_push_front) == LOW){
        
        motor_push.run(BACKWARD);                                  //Start retract
        delay(700);
        press_start_time = millis();
        motor_press.run(BACKWARD);                                 //Press retract
        progress = "retract";
      }
    }
   //----------------------------------------------------------------------------------  
    if (progress == "retract"){                                    //Retract slider+press
      if (digitalRead(INI_push_rear) == LOW){
        motor_push.run(RELEASE);
        pusher_home = 1;
      }
      if (millis() >= press_start_time + press_back_time){         //Stop press
        motor_press.run(RELEASE);
        press_home = 1;
      }
      if ((pusher_home == 1) && (press_home == 1)){
        eject_start_time = millis();
        motor_push.run(FORWARD);                                    //Start ejection
        delay(200);
        progress = "eject";
        pusher_home = 0;
        press_home = 0;
      }
    }
  //----------------------------------------------------------------------------------  
    if (progress == "eject"){                                       //Eject
      if (millis() >= eject_start_time + eject_drive_time){
        motor_push.run(BACKWARD);
      }
      if (digitalRead(INI_push_rear) == LOW){
        motor_push.run(RELEASE);
        progress = "knocking";
        mode = "";
        digitalWrite(vibro,LOW);                                    //Cycle starts from the beginning           
      }
    }
  }
}


//_____________________________________________________________________________________________
void buttonread(){                                                 //Here you can code different
  long press_start = millis();                                     //operating modes (one cigarette, automatic)
  while(digitalRead(button) == HIGH){
    //do nothing
  }
  if (millis() >= press_start + 500){                              //How long is button pressed
    mode = "one_piece";
  }
}
//_____________________________________________________________________________________________
void reference_drive(){
//Tobacco Servo Reference
  Servo_tobacco_magazine.write(tobacco_servo_rear);
  
//Reference magazine
  Servo_plug_on.write(plug_on_rear);
  delay(1000);
  motor_magazin.setSpeed(10);
  while (analogRead(magazin_sensor) < 100){
    motor_magazin.step(1, FORWARD, SINGLE);
  }
  delay(6000);
  
//Stuff slider reference
if (digitalRead(INI_push_front) == LOW){
  while (digitalRead(INI_push_rear) == HIGH) {
    motor_push.run(BACKWARD);
  }
  motor_push.run(RELEASE);
}
else if (digitalRead(INI_push_rear) == LOW){
  motor_push.run(FORWARD);
  delay(800);
  while (digitalRead(INI_push_rear) == HIGH) {
    motor_push.run(BACKWARD);
  }
  motor_push.run(RELEASE);
}
else{
  while (digitalRead(INI_push_rear) == HIGH) {
    motor_push.run(BACKWARD);
  }
}

//Press slider reference  
  if (digitalRead(INI_press) == LOW){
    motor_press.run(RELEASE);
  }
else{
  while (digitalRead(INI_press) == HIGH) {
    motor_press.run(FORWARD);
  }
  motor_press.run(RELEASE);
}

//Empty the bale chamber
  while (digitalRead(INI_push_front) == HIGH) {
    motor_push.run(FORWARD);
  }
  while (digitalRead(INI_push_rear) == HIGH) {
    motor_push.run(BACKWARD);
  }
  motor_push.run(RELEASE);

  motor_press.run(BACKWARD);//Presse zurückfahren
  delay(press_back_time);
  motor_press.run(RELEASE);
//delay(10000);

}

You can download the building plan here:

You will get the following digital files:
  • All .stl files you need to print the machine.
  • Assembly drawing in .dxf, .jpg, .pdf -format.
  • The complete 3D model of the machine in .step – format.
  • The cut-out drawing of the base plate and acrylic plates in .jpg, .pdf, .dxf – format.
  • A drawing of all metal parts to be manufactured in .dxf, .jpg, .pdf – format.
  • A detailed parts list of all installed parts including internet links to the supplier.
  • The circuit diagram
  • The Ardino Code
  • An instruction video with all building steps.
  • I will do my best to help you with any problems or questions.

You can find more information here:

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen