Arduino - Motion Sensor - Servo Motor
We will learn:
- If the motion is detected, rotate servo motor to 90 degree
- If the motion is not detected, rotate servo motor back to 0 degree.
Hardware Required
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Disclosure: Some links in this section are Amazon affiliate links. If you make a purchase through these links, we may earn a commission at no extra cost to you.
Additionally, some links direct to products from our own brand, DIYables .
Additionally, some links direct to products from our own brand, DIYables .
Buy Note: When using multiple servo motors, we recommend the PCA9685 16 Channel PWM Servo Driver Module to save MCU pins and make wiring easier.
About Servo Motor and Motion Sensor
If you do not know about servo motor and motion sensor (pinout, how it works, how to program ...), learn about them in the following tutorials:
Wiring Diagram

This image is created using Fritzing. Click to enlarge image
Initial Setting
| Time Delay Adjuster | Screw it in anti-clockwise direction fully. |
| Detection Range Adjuster | Screw it in clockwise direction fully. |
| Repeat Trigger Selector | Put jumper as shown on the image. |

Arduino Code - Motion Sensor Controls Servo Motor
/*
* Created by ArduinoGetStarted.com
*
* This example code is in the public domain
*
* Tutorial page: https://arduinogetstarted.com/tutorials/arduino-motion-sensor-servo-motor
*/
#include <Servo.h>
// constants won't change
const int MOTION_SENSOR_PIN = 7; // Arduino pin connected to motion sensor's pin
const int SERVO_PIN = 9; // Arduino pin connected to servo motor's pin
Servo servo; // create servo object to control a servo
// variables will change:
int angle = 0; // the current angle of servo motor
int lastMotionState; // the previous state of motion sensor
int currentMotionState; // the current state of motion sensor
void setup() {
Serial.begin(9600); // initialize serial
pinMode(MOTION_SENSOR_PIN, INPUT); // set arduino pin to input mode
servo.attach(SERVO_PIN); // attaches the servo on pin 9 to the servo object
servo.write(angle);
currentMotionState = digitalRead(MOTION_SENSOR_PIN);
}
void loop() {
lastMotionState = currentMotionState; // save the last state
currentMotionState = digitalRead(MOTION_SENSOR_PIN); // read new state
if (currentMotionState == LOW && lastMotionState == HIGH) { // pin state change: LOW -> HIGH
Serial.println("Motion detected!");
servo.write(90);
}
else
if (currentMotionState == HIGH && lastMotionState == LOW) { // pin state change: HIGH -> LOW
Serial.println("Motion stopped!");
servo.write(0);
}
}
Quick Steps
- Connect Arduino to PC via USB cable
- Open Arduino IDE, select the right board and port
- Copy the above code and open with Arduino IDE
- Click Upload button on Arduino IDE to upload code to Arduino
- Move your hand in front of sensor
- See the change of servo motor
Arduino UNO R4 with HC-SR501 Motion Sensor - Video Tutorial
The below is a step-by-step video tutorial demonstrating how to use the HC-SR501 motion sensor with the Arduino UNO R4. At the end of the video, you will see how to make an automated open door system with a servo and buzzer using the code below:
#include <Servo.h>
#define SENSOR_PIN 2 // The Arduino UNO R4 connected to the output pin of the motion sensor
#define SERVO_PIN 5
#define BUZZER_PIN 6
Servo servo;
int motion_state = LOW; // Initialize current pin state to LOW
int prev_motion_state = LOW; // Initialize previous pin state to LOW
void setup() {
Serial.begin(9600); // Start serial communication at 9600 baud rate
pinMode(SENSOR_PIN, INPUT); // Configure pin 2 as an input for the sensor
pinMode(BUZZER_PIN, OUTPUT); // Configure the buzzer pin as output
servo.attach(SERVO_PIN);
servo.write(0);
noTone(BUZZER_PIN);
}
void beep() {
for (int i = 0; i < 2; i++) {
tone(BUZZER_PIN, 5000); delay(100);
noTone(BUZZER_PIN); delay(100);
}
}
void loop() {
prev_motion_state = motion_state; // Assign the current pin state to the previous pin state for comparison
motion_state = digitalRead(SENSOR_PIN); // Read the current state from the sensor output
// Check for transition from LOW to HIGH which indicates motion detected
if (prev_motion_state == LOW && motion_state == HIGH) {
Serial.println("Motion detected!"); // Print message when motion is detected
servo.write(180);
beep();
// Optional: Additional actions when motion is detected
}
// Check for transition from HIGH to LOW which indicates motion has stopped
else if (prev_motion_state == HIGH && motion_state == LOW) {
Serial.println("Motion stopped!"); // Print message when motion has stopped
servo.write(0);
beep();
// Optional: Additional actions when motion stops
}
}