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.
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.
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.
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.
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.
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.
The sleeve 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.
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.
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.
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.
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.
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.
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.
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.








