In this post, you are going to learn about how to create a web application on Raspberry Pi to control servo motors using the Flask Web Framework to create the web application. We will create two sliders on the web app that will send a corresponding value, causing the servo motors to move upon pressing the button.
Flask is a web application framework written in Python and developed by Armin Ronacher, who leads an international group of Python enthusiasts named Pocco. Flask is based on Werkzeug WSGI toolkit and Jinja2 template engine. Both are Pocco projects.
- Make sure your Raspberry Pi is up to date. To update the Raspberry Pi, type the following command: sudo apt-get update
- To install Flask, we need to have pip, so type the following command to install pip: sudo apt-get install python-pip
- Then type the following command to install Flask: sudo pip install flask
- Raspberry Pi
- SG90 Servo motors
- Jumper cables
Circuit Diagram and Explanation
The circuit diagram for this project is very simple — you just need to connect your two servo motors. Make the following connections:
Servo Motor 1
Servo Motor 2
Yellow or Orange Wire
Black Or Brown Wire
Yellow or Orange Wire
Black or Brown Wire
Let’s breakdown the code used in this project. The full code can be found at the end of the article.
First, we imported the flask modules required for this project. The render_template_string module allows us to use HTML in our projects. The request module allows us to get data from HTML. The RPi.GPIO library allows us to control the GPIO pins of the Raspberry Pi.
from flask import Flask, render_template_string, request import RPi.GPIO as GPIO from time import sleep
Now, we enable the debug mode in our project. The advantage of enabling the debug mode is it automatically reloads the server upon changing the code. It also provides a useful debugger to track errors in the application.
app.config['DEBUG'] = True
The servo motor shakes a bit while it is not moving. In order to stop it, we use the following line:
How to Run the Program
Create a Python file and upload the code. Next, run this file with sudo command to start the server at localhost on port 5000.
Now, pressing the submit button will send the values of the sliders according to which servo motors we are controlling.
from flask import Flask, render_template_string, request # Importing the Flask modules required for this project import RPi.GPIO as GPIO # Importing the GPIO library to control GPIO pins of Raspberry Pi from time import sleep # Import sleep module from time library to add delays # Pins where we have connected servos servo_pin = 26 servo_pin1 = 19 GPIO.setmode(GPIO.BCM) # We are using the BCM pin numbering # Declaring Servo Pins as output pins GPIO.setup(servo_pin, GPIO.OUT) GPIO.setup(servo_pin1, GPIO.OUT) # Created PWM channels at 50Hz frequency p = GPIO.PWM(servo_pin, 50) p1 = GPIO.PWM(servo_pin1, 50) # Initial duty cycle p.start(0) p1.start(0) # Flask constructor takes the name of current module (__name__) as argument. app = Flask(__name__) # Enable debug mode app.config['DEBUG'] = True # Store HTML code TPL = ''' <html> <head><title>Web Application to control Servos </title></head> <body> <h2> Web Application to Control Servos</h2> <form method="POST" action="test"> <p>Slider 1 <input type="range" min="1" max="12.5" name="slider1" /> </p> <p>Slider 2 <input type="range" min="1" max="12.5" name="slider2" /> </p> <input type="submit" value="submit" /> </form> </body> </html> ''' # which URL should call the associated function. @app.route("/") def home(): return render_template_string(TPL) @app.route("/test", methods=["POST"]) def test(): # Get slider Values slider1 = request.form["slider1"] slider2 = request.form["slider2"] # Change duty cycle p.ChangeDutyCycle(float(slider1)) p1.ChangeDutyCycle(float(slider2)) # Give servo some time to move sleep(1) # Pause the servo p.ChangeDutyCycle(0) p1.ChangeDutyCycle(0) return render_template_string(TPL) # Run the app on the local development server if __name__ == "__main__": app.run()
Related Stepper Motor Projects
Check out these other projects that utilize stepper motors in a variety of ways:
- Machine Learning for Makers: How to Control Servos With Wekinator and Raspberry Pi
- How to Control Servo Motors from a Mobile Device with an Arduino UNO and an Android App
- How to Control Servo Motors With an Arduino and Joystick
- How to Control a Servo With an Arduino and MPU6050