Lesson 23 – Servo Control
Setup
- Before you start working with any of the tutorials in this series please make sure you have completed the following tasks –
- Downloaded and installed the Arduino IDE.
- Are able to connect to the Arduino IDE from your computer
- Have been successful in uploading a simple (e.g. Blink LED’s) example programs (that comes with the Arduino IDE) onto your Arduino UNO board
- If you haven’t installed the Arduino IDE please head back to the first tutorial and make sure you’ve gone through each of the steps involved.
- Once you’ve sorted all of the above you are ready to move onto the next tutorial.
Tutorial
Servo motor is a position control rotary actuator. It mainly consists of housing, circuit board, core-less motor, gear and position sensor.
Working principle:
The receiver or MCU outputs a signal to the servo motor. The motor has a built-in reference circuit that gives out reference signal, cycle of 20ms and width of 1.5ms. The motor compares the acquired DC bias voltage to the voltage of the potentiometer and outputs a voltage difference. The IC on the circuit board will decide the rotating direction accordingly and drive the core-less motor. The gear then pass the force to the shaft. The sensor will determine if it has reached the commanded position according to the feedback signal.
Servomotors are used in control systems that requires to have and maintain different angles. When the motor speed is definite, the gear will cause the potentiometer to rotate. When the voltage difference reduces to zero, the motor stops. Normally, the rotation angle range is among 0-90 degrees.
Servomotor comes with many specifications. But all of them have three connection wires, distinguished by brown, red, orange colors (different brand may have different color). Brown one is for GND, red one for power positive, orange one for signal line.
The rotation angle of the servo motor is controlled by regulating the duty cycle of the PWM(Pulse-Width Modulation) signal. The standard cycle of the PWM signal is fixed at 20ms (50 Hz), and the pulse width is distributed between 1ms-2ms. The width corresponds the rotation angle from 0° to 90°. But note that for different brand motor, the same signal may have different rotation angle.
After some basic knowledge, let’s learn how to control a servomotor. In this experiment, you only need a servomotor and several jumper wires.
Hardware Required:
- Servo motor*1
- Breadboard jumper wire* 3
- Arduino board
Connection & Sample Program:
There are two ways to control a servomotor with Arduino. One is to use a common digital sensor port of Arduino to produce square wave with different duty cycle to simulate PWM signal and use that signal to control the position of the motor. Another way is to directly use the Servo function of the Arduino to control the motor. In this way, the program will be easier but it can only control two-contact motor because of the servo function, only digital pin 9 and 10 can be used.
The Arduino drive capacity is limited. So if you need to control more than one motor, you will need external power.
Connect the signal line of motor to digital pin 9. You will find fritzing diagrams below outlining circuit connections for both the Arduino Uno and the Arduino Mega 2560.
Here’s what your project should look like once it’s finished.
Let’s have a look at the code for the tutorial.
int servopin=9;// select digital pin 9 for servomotor signal line int myangle;// initialize angle variable int pulsewidth;// initialize width variable int val; void servopulse(int servopin,int myangle)// define a servo pulse function { pulsewidth=(myangle*11)+500;// convert angle to 500-2480 pulse width digitalWrite(servopin,HIGH);// set the level of servo pin as “high” delayMicroseconds(pulsewidth);// delay microsecond of pulse width digitalWrite(servopin,LOW);// set the level of servo pin as “low” delay(20-pulsewidth/1000); } void setup() { pinMode(servopin,OUTPUT);// set servo pin as “output” Serial.begin(9600);// connect to serial port, set baud rate at “9600” Serial.println("servo=o_seral_simple ready" ) ; } void loop()// convert number 0 to 9 to corresponding 0-180 degree angle, LED blinks corresponding number of time { val=Serial.read();// read serial port value if(val>='0'&&val<='9') { val=val-'0';// convert characteristic quantity to numerical variable val=val*(180/9);// convert number to angle Serial.print("moving servo to "); Serial.print(val,DEC); Serial.println(); for(int i=0;i<=50;i++) // giving the servo time to rotate to commanded position { servopulse(servopin,val);// use the pulse function } } }
Method 2: Let’s first take a look at the Arduino built-in servo function and some of its common statements.
- attach(interface)——select pin for servo, can only use pin 9 or 10.
- write(angle)——used to control the rotation angle of the servo, can set the angle among 0 degree to 180 degree.
- read()——used to read the angle of the servo, consider it a function to read the value in the write() function.
- attached()——determine whether the parameter of the servo is sent to the servo pin.
- detach()—— disconnect the servo and the pin, and the pin(digital pin 9 or 10) can be used for PWM port.
Note: the written form of the above statements are “servo variable name. specific statement ()”, e.g. myservo. Attach (9).
Go ahead and connect the signal line of servo to pin 9. Please refer to the connection diagram mentioned above.
Please remember to place the Servo.h library into your arduino libraries directory.
Please Note : The line of code with #include is incomplete. It should read –
#include <servo.h>
#include /* define a header file. Special attention here, you can call the servo function directly from Arduino's software menu bar Sketch>Importlibrary>Servo, or input #include . Make sure there is a space between #include and . Otherwise, it will cause compile error.*/ Servo myservo;// define servo variable name void setup() { myservo.attach(9);// select servo pin(9 or 10) } void loop() { myservo.write(90);// set rotation angle of the motor }
Download the above code to the controller board and see the result.
Prerequisites
This development track requires an investment a bit of hardware. See below for details –
- Arduino IDE –
- You will need to download and install the Arduino development IDE.
- The approach to installation, configuration, setup of the Arduino IDE is covered in our tutorials.
- Arduino Uno, Sensors, etc. –
- You will need to purchase the Super Learning Kit for Arduino from OzToyLib.
- The Arduino Advent kit has all the sensors you need to perform the tutorials covered in this development track.
- If you do not have an Arduino Uno or Arduino Mega 2560 you might want to head over to Arduino boards and pick one up now.
The Super Learning Kit for the Arduino kit has all the sensors you need to perform the tutorials covered in this development track.
About the Super Learning Kit for Arduino
The Super Learning Starter Kit for Arduino comes packed with ~35+ different electronic bits (Sensors, LEDs, switches, LCD, servo, etc.) and can be purchased with either the Keyestudio UNO R3 or the Keyestudio Mega 2560 board. The Keyestudio Arduino boards can be used to interface with the different electronic bits i.e. sensors, LED’s, switches, servos, etc. included in the starter kit. The starter kit for the Keyestudio Uno R3 offers a great opportunity to explore the world of electronics using the Arduino Development Platform. Interact with the real world through the various sensors, create innovative projects, learn how to program the micro:bit to read data from the sensors and perform certain actions. The starter kit for the Arduino is a great way to dive into the awesome world of electronics and get started with your own STEM (Science, Technology, Engineering, Math) learning journey.
The Arduino advanced study kit walks you through the basics of using the Arduino in a hands-on way. You’ll learn the fundamentals of electronics and working on the Arduino through building several creative projects. The kit includes a selection of the most common and useful electronic components with a book of 32 projects. Starting the basics of electronics, to more complex projects, the kit will get you interacting with the physical world using sensor and actuators. Along with the kit you get access to detailed tutorials and wiring diagrams.
You can purchase the Super Learning Kit for Arduino from OzToyLib.
About the Arduino UNO
The Arduino UNO is the most used and documented board of the whole Arduino family and very easy to setup, play with. The Arduino UNO is a microcontroller board based on the ATmega328 . The Arduino UNO has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz ceramic resonator, a USB connection, a power jack, an ICSP header, and a reset button. Here’s a listing of the some of the features of the Arduino UNO –
- Microcontroller: ATmega328
- Operating Voltage: 5V
- Input Voltage (recommended): 7-12V
- Input Voltage (limits): 6-20V
- Digital I/O Pins: 14 (of which 6 provide PWM output)
- Analog Input Pins: 6
- DC Current per I/O Pin: 40 mA
- DC Current for 3.3V Pin: 50 mA
- Flash Memory: 32 KB of which 0.5 KB used by bootloader
- SRAM: 2 KB (ATmega328)
- EEPROM: 1 KB (ATmega328)
- Clock Speed: 16 MHz
Arduino is an open-source, prototyping platform and its simplicity makes it ideal for hobbyists to use as well as professionals. The Arduino UNO contains everything needed to support the microcontroller; simply connect it to a computer with a USB cable or power it with a AC-to-DC adapter or battery to get started. The Arduino UNO differs from all preceding boards in that it does not use the FTDI USB-to-serial driver chip. Instead, it features the Atmega8U2 microcontroller chip programmed as a USB-to-serial converter. “Uno” means one in Italian and is named to mark the upcoming release of Arduino 1.0. The Arduino Uno and version 1.0 will be the reference versions of Arduno, moving forward. The Uno is the latest in a series of USB Arduino boards, and the reference model for the Arduino platform.
You can read more about the Arduino here – www.arduino.cc.