CD ROM Stepper Motor Speed And Direction Control Using Arduino ...
Maybe your like
Last Updated on August 16, 2024 by Engr. Shahzada Fahad
Table of Contents
- CD ROM Stepper Motor with Arduino Description:
- Amazon Links:
- CD ROM Stepper Motor with Arduino Circuit Diagram:
- CD ROM Stepper Motor Arduino Programming:
- Other Stepper Motor Related Tutorial:
CD ROM Stepper Motor with Arduino Description:
In this tutorial, you will learn how to control the speed and direction of the CD ROM stepper motor using 2 axis joystick, L298N motor driver, and Arduino. The stepper motor control system can be activated and deactivated using the joystick push button. The same program and circuit connections can be used for the other types of stepper motors.
For the extreme basics, you can watch my getting started tutorials on the bipolar and unipolar stepper motors, 2 Axis Joystick and L298n motor driver. So I highly recommend first you should watch these tutorials and then you can resume from here.
2 axis joystick getting started Tutorial:
L298n getting started tutorial:
Stepper motors are used worldwide in industries, robots, toys, printers, CNC machines, 3D printers, etc. Recently I posted new articles on bipolar steppers motors. In these tutorials, I have explained how to control the Stepper motors using the CNC shield, and how to control Stepper Motors using the IoT “internet of things” technology.
Amazon Links:
Arduino Nano USB-C Type (Recommended)
12v Adaptor:
L298N motor driver:
2-Axis Analog Joystick
Arduino CNC Shield V3.0
A4988 Stepper Motor Driver
Hybrid Stepper Motor Nema17:
12v UniPolar stepper motor:
CD ROM bipolar stepper motor:
24BYJ48 5V DC unipolar stepper motor:
*Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.
CD ROM Stepper Motor with Arduino Circuit Diagram:

Regardless of the type and size of the stepper motor the basic working principle of all the stepper motors is exactly the same. The circuit diagram as you can see on the screen will remain the same for all types of the stepper motors. As the stepper motor, I am using has current requirement less than 4amps so that’s why I decided to use the L298N motor driver. The L298N motor driver is basically designed for controlling simple dc motors; in my previous tutorials, I used this motor driver for controlling the Robot.
As the L298N motor driver has the ability to control 2 dc motors at the same, and as you know a stepper motor has 4 wires, so it means we can use the L298N motor driver to control a Unipolar or bipolar stepper motor. You might be thinking what about the Unipolar motors as they have 6 wires. Well, the common wires are not connected. So the Unipolar stepper motor connection with the l298n motor driver is exactly the same as the bipolar stepper motor.
As you can see in the circuit diagram the four wires of the stepper motor are connected with the out1, out2, out3, and out4. While the input pins of the l298N motor driver are connected with Arduino’s Pin number 8, 9, 10 and 11.
The enables pins of the l298n motor driver by default comes with the jumper caps, so make sure you remove the jumper caps and connect the enable pins with the Arduino’s pin number 6 and pin number 7.
J1 is the DC female power jack, this is where we connect the external 12v or 5v power supply and finally connect the VCC of the L298N motor driver with the Arduino’s 5volts.
The VRx and VRy pins of the joystick are connected with the analog pins A0 and A1. The Switch is connected with the Arduino’s pin number 4. The VCC pin of the joystick is connected with the Arduino’s pin number 5, while the ground is connected with the Arduino’s Ground.
Let me tell you once again if you are using stepper motors with current ratings greater than 4amps then never use the l298N motor driver. Now let’s have a look at the pinout of the L298N Motor Driver.
CD ROM Stepper Motor Arduino Programming:
Before, you start the programming, first of all, make sure you download the Stepper library.
#include <Stepper.h> int ENA = 6; int ENB = 7; int joystick_power = 5; // connect the vcc pin of the joysick // with pin number 5 of the arduino. int vrx = A0; int vry = A1; int vrx_data = 0; int vry_data = 0; int joystick_switch = 4; boolean state = false; int switch_flag = 0; int stepper_motor_led = 13; int steps = 4; // you can set to different values, 4, 8, 12,16,20,24,28 and 32 Stepper myStepper(steps, 8, 9, 10, 11); void setup() { myStepper.setSpeed(100); Serial.begin(9600); digitalWrite(ENA , LOW); digitalWrite(ENB , LOW); pinMode(joystick_power , OUTPUT); digitalWrite(joystick_power, HIGH); pinMode(vrx , INPUT); pinMode(vry, INPUT); pinMode(joystick_switch , INPUT_PULLUP); pinMode(stepper_motor_led, OUTPUT); digitalWrite(stepper_motor_led, LOW); } void loop() { if ( digitalRead(joystick_switch) == LOW) { state = !state; Serial.println("button pressed"); delay(1000); } if( (state == false)&& (switch_flag == 0) ) { digitalWrite(ENA , LOW); digitalWrite(ENB , LOW); Serial.println("Stepper motor is not active"); digitalWrite(stepper_motor_led, LOW); switch_flag = 1; } if( (state == true) && (switch_flag == 1) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); Serial.println("Stepper motor is ActivE"); digitalWrite(stepper_motor_led, HIGH); switch_flag = 0; } if ( state == true) { joystick(); } } void joystick() { vrx_data = analogRead(vrx); Serial.print("Vrx:"); Serial.println(vrx_data); // to stop the stepper motor if ( (vrx_data > 490) && (vrx_data < 510) ) { digitalWrite(ENA , LOW); digitalWrite(ENB , LOW); Serial.println("Stepper Motor Stopped"); } if ( (vrx_data > 510) && (vrx_data < 1000) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(20); myStepper.step(+1); } if ( vrx_data > 1000 ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(700); myStepper.step(+1); } // for reverse movement if ( (vrx_data >= 0) && (vrx_data < 20) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(700); myStepper.step(-1); } if ( (vrx_data > 20) && (vrx_data < 490) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(50); myStepper.step(-1); } }| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | #include <Stepper.h> intENA=6;intENB=7; intjoystick_power=5;// connect the vcc pin of the joysick// with pin number 5 of the arduino. intvrx=A0;intvry=A1;intvrx_data=0;intvry_data=0;intjoystick_switch=4;booleanstate=false;intswitch_flag=0;intstepper_motor_led=13; intsteps=4;// you can set to different values, 4, 8, 12,16,20,24,28 and 32Stepper myStepper(steps,8,9,10,11);voidsetup(){myStepper.setSpeed(100);Serial.begin(9600);digitalWrite(ENA,LOW);digitalWrite(ENB,LOW); pinMode(joystick_power,OUTPUT);digitalWrite(joystick_power,HIGH);pinMode(vrx,INPUT);pinMode(vry,INPUT);pinMode(joystick_switch,INPUT_PULLUP);pinMode(stepper_motor_led,OUTPUT);digitalWrite(stepper_motor_led,LOW);}voidloop(){ if(digitalRead(joystick_switch)==LOW){state=!state;Serial.println("button pressed");delay(1000);} if((state==false)&&(switch_flag==0)){digitalWrite(ENA,LOW);digitalWrite(ENB,LOW);Serial.println("Stepper motor is not active");digitalWrite(stepper_motor_led,LOW);switch_flag=1;} if((state==true)&&(switch_flag==1)){digitalWrite(ENA,HIGH);digitalWrite(ENB,HIGH);Serial.println("Stepper motor is ActivE");digitalWrite(stepper_motor_led,HIGH);switch_flag=0;}if(state==true){joystick();}} voidjoystick(){vrx_data=analogRead(vrx);Serial.print("Vrx:");Serial.println(vrx_data); // to stop the stepper motorif((vrx_data>490)&&(vrx_data<510)){ digitalWrite(ENA,LOW);digitalWrite(ENB,LOW);Serial.println("Stepper Motor Stopped");} if((vrx_data>510)&&(vrx_data<1000)){digitalWrite(ENA,HIGH);digitalWrite(ENB,HIGH); myStepper.setSpeed(20);myStepper.step(+1);} if(vrx_data>1000){digitalWrite(ENA,HIGH);digitalWrite(ENB,HIGH);myStepper.setSpeed(700);myStepper.step(+1);} // for reverse movement if((vrx_data>=0)&&(vrx_data<20)){digitalWrite(ENA,HIGH);digitalWrite(ENB,HIGH);myStepper.setSpeed(700);myStepper.step(-1);} if((vrx_data>20)&&(vrx_data<490)){digitalWrite(ENA,HIGH);digitalWrite(ENB,HIGH);myStepper.setSpeed(50);myStepper.step(-1);} } |
CD ROM Stepper Motor Arduino Code Explanation:
As usual, i started off by adding the Stepper.h header file.
#include <Stepper.h>
Defined two pins 6 and 7 for the ENA and ENB pins of the motor controller shield.
int ENA = 6; int ENB = 7;
int joystick_power = 5; // connect the vcc pin of the joysick // with pin number 5 of the arduino.
The VRx and VRy pins of the 2-axis Joystick are connected with the Arduino’s analog pins A0 and A1 int vrx = A0; int vry = A1;
I defined, two variables vrx_data and vry_data of the type integer for storing the values coming from the Joystick. int vrx_data = 0; int vry_data = 0;
As you know the type of the Joystick I am using also comes with a Pushbutton, I connected the Joystick pushbutton with the Arduino’s pin number 4, defined some flags state, and switch_flage. int joystick_switch = 4; boolean state = false; int switch_flag = 0; int stepper_motor_led = 13;
int steps = 4; // you can set to different values, 4, 8, 12,16,20,24,28 and 32 Stepper myStepper(steps, 8, 9, 10, 11); Inside the setup() function, I set the speed to 100, activated the serial communication and selected 9600 as the baud rate. Initially I set the ENA and ENB to low. void setup() {
myStepper.setSpeed(100); Serial.begin(9600); digitalWrite(ENA , LOW); digitalWrite(ENB , LOW);
using the pinMode() function I set the pins as input and output as per the requirement.
pinMode(joystick_power , OUTPUT); digitalWrite(joystick_power, HIGH); pinMode(vrx , INPUT); pinMode(vry, INPUT); pinMode(joystick_switch , INPUT_PULLUP); pinMode(stepper_motor_led, OUTPUT); digitalWrite(stepper_motor_led, LOW); }
void loop() {
The following condition is used to check if the Joystick Pushbutton has been pressed. If the Joystick button is pressed then change the status of the state flag, write on the Serial monitor that the button is pressed, and then a delay of 1 second, as 1000 milliseconds are equal to 1 second.
if ( digitalRead(joystick_switch) == LOW) { state = !state; Serial.println(“button pressed”); delay(1000); }
The following checks, if the state is false and also if the switch_flag is qual to Zero then completely turn off the Stepper Motor and change the switch_flag from 0 to 1.
if( (state == false)&& (switch_flag == 0) ) { digitalWrite(ENA , LOW); digitalWrite(ENB , LOW); Serial.println(“Stepper motor is not active”); digitalWrite(stepper_motor_led, LOW); switch_flag = 1; }
Now, if the state is true and the switch_flag is equal 1 then High the ENA and ENB pins of the Motor board, On serial monitor write that the Stepper motor is Active, and finally, change the switch_flag status back to 0.
if( (state == true) && (switch_flag == 1) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); Serial.println(“Stepper motor is ActivE”); digitalWrite(stepper_motor_led, HIGH); switch_flag = 0; }
if the state flag is true then simply call the joystick() function. if ( state == true) { joystick(); }
}
The joystick() function is a user-defined function, it has no return type and does not take any arguments as the inputs. The purpose of this function is to ready the VRx and Vry pins of the Joystick and store the values in variables vrx_data and vry_data. For now, i am using only the VRx pins and the variable vrx_data.
The rest of the instructions inside the Joystick() function are pretty straightforward. We simply set the Stepper motor speed and the steps. You can try different steps to see the effect.
void joystick() { vrx_data = analogRead(vrx); Serial.print(“Vrx:”); Serial.println(vrx_data);
// to stop the stepper motor if ( (vrx_data > 490) && (vrx_data < 510) ) {
digitalWrite(ENA , LOW); digitalWrite(ENB , LOW); Serial.println(“Stepper Motor Stopped”);
}
if ( (vrx_data > 510) && (vrx_data < 1000) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH);
myStepper.setSpeed(20); myStepper.step(+1); }
if ( vrx_data > 1000 ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(700); myStepper.step(+1); }
// for reverse movement
if ( (vrx_data >= 0) && (vrx_data < 20) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(700); myStepper.step(-1); }
if ( (vrx_data > 20) && (vrx_data < 490) ) { digitalWrite(ENA , HIGH); digitalWrite(ENB , HIGH); myStepper.setSpeed(50); myStepper.step(-1); }
}
Watch Video Tutorial:
Other Stepper Motor Related Tutorial:
UniPolar and Bipolar Stepper Motors Speed and Position Control
Discover more from Electronic Clinic
Subscribe to get the latest posts sent to your email.
Type your email…
Subscribe
TagsArduino arduino joystick stepper motor control Arduino programming arduino project arduino projects arduino stepper motor arduino stepper motor joystick Arduino uno basic arduino projects cd rom stepper motor arduino diy electronic clinic electronics electronics projects joystick stepper motor joystick stepper motor arduino joystick stepper motor control stepper motor stepper motor arduino l298n stepper motor joystick stepper motor speed and direction controlTag » Arduino Cd Rom Controller
-
An Arduino And A CD-ROM Drive Makes A CD Player - Hackaday
-
DIY Arduino ATAPI CD-ROM Controller - FC2
-
CD Playback Control - Project Guidance - Arduino Forum
-
Cd Rom Stepper Motor Arduino L298n + Joystick Controlled Speed ...
-
CD-ROM Stepper Motor With Arduino Motor Shield L293d - YouTube
-
Arduino CD Player
-
CD-ROM Sensored BLDC Motor Control With Arduino - Simple Projects
-
CD-ROM Controller DVD-ROM IDE Optical Controller DIY ... - EBay
-
Run A CDROM Brushless Motor With Arduino : 3 Steps - Instructables
-
Sensored Brushless DC Motor Control With Arduino - Simple Projects
-
Run A CDROM Brushless Motor With Arduino - Pinterest
-
XY Axis CD-ROM Laser Printer