Servo Motor with Potentiometer and LCD with Arduino: SP-LCD-1
In this video, we learn how to control the angle of a servo motor using a potentiometer (variable resistor) and display the angle on an LCD1602 or LCD2004 with an I2C module that has four wires.
This is code 1, where we need a breadboard to distribute power from 5V to the potentiometer, servo motor, and LCD. Details have been explained in the video.
Here is the code for use without a breadboard.
351-Code 1 controlling a servo motor
语言: C++
/*
* Original code is taken from the Arduino IDE
* from File->Examples->Servo->Knob
*
* This is Arduino code to use a display to show the angle of a servo motor on an LCD1602 or LCD2004 with an I2C module. The angle is changed by a
* potentiometer (variable resistor)
*
* This is code 1 of this tutorial where a breadboard is needed.
*
* See code SP-LCD-2: http://robojax.com/L/?id=290
* Please watch video instruction: https://youtu.be/xrIiKqvm8hQ
* Updated from original code by
* Ahmad Shamshiri on Nov 22, 2020 at 15:53 in Ajax
* Ontario, Canada
* https://www.youtube.com/robojaxTV
* www.robojax.com
* Get this code and other Arduino codes from Robojax.com.
Learn Arduino step by step in a structured course with all material, wiring diagrams, and libraries
all in one place. Purchase My course on Udemy.com http://robojax.com/L/?id=62
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
//LCD settings
const uint8_t I2C_ADDRESS =0x3f;//watch video. use I2C Scanenr to get the address
const uint8_t LCD_CHAR= 16;
const uint8_t LCD_LINE = 2;
char *TITLE_ANGLE1 ="Angle: ";
LiquidCrystal_I2C lcd(I2C_ADDRESS, LCD_CHAR, LCD_LINE);
unsigned int LCD_VCC=13;//5V pin for LCD
#include <Servo.h>
// start of servo1 settings *******
Servo myservo1; // create servo 1 object to control a servo
int pot1pin = A0; // analog pin used to connect the potentiometer
int pot1VccPin = 12;//pin 12 used as 5V for potentiometer
unsigned int servo1Pin=3;//any pin with ~ which means pin is PWM enabled
unsigned int servo1AngleMin=0;//servo1 minimum angle
unsigned int servo1AngleMax=180;//servo1 maximum angle details
//// do not change the lines below
unsigned int servo1Val=0;// variable to read the value from the analog pin
unsigned int angle1=0;
// END of servo1 settings *******
void setup()
{
Serial.begin(9600);
Serial.println("Servo with Potentiometer");
Serial.println("Robojax.com");
myservo1.attach(servo1Pin); // attaches the servo 1 to the servo object
pinMode(pot1VccPin, OUTPUT);
digitalWrite(pot1VccPin,HIGH);//5V for Potentiometer (variable resistor)
// initialize the LCD
pinMode(LCD_VCC, OUTPUT);
digitalWrite(LCD_VCC,HIGH);//5V for LCD
lcd.begin();
lcd.backlight();
lcd.print("Robojax Servo");
lcd.setCursor(0,1);
lcd.print("Angle: ");
delay(2000);
}
void loop()
{
servo1Val = analogRead(pot1pin); // reads the value of the potentiometer (value between 0 and 1023)
sendServo(servo1Val);//send sevo zero
delay(20);
}// loop end
/*
* sendServo(int value)
* @brief sends the servo the "value" angle position
* @param "value" integer between 0 to 180
* @return none
* Written by Ahmad Shamshiri for robojax.com
* on Nov 22, 2020 in Ajax, Ontario, Canada
*/
void sendServo(int value)
{
// Please watch video instruction: https://youtu.be/xrIiKqvm8hQ
unsigned int newAngle1;
newAngle1 = map(value, 0, 1023, servo1AngleMin, servo1AngleMax); // scale it to use it with the servo (value between servoAngleMin and servoAngleMax)
if(angle1 !=newAngle1)
{
myservo1.write(newAngle1);
lcdDisplay(newAngle1);
angle1 =newAngle1;
delay(100);
}
}//sendServo()
/*
* lcdDisplay(int angle)
* @brief displays the "angle" angle position
* @param "angle" integer between 0 to 180
* @return none
* Written by Ahmad Shamshiri for robojax.com
* on Nov 22, 2020 in Ajax, Ontario, Canada
*/
void lcdDisplay(int angle)
{
//Please watch video instruction: https://youtu.be/xrIiKqvm8hQ
// Robojax.com LCD1602 for Servo motor
clearCharacters();
Serial.print("angle");
Serial.println(angle);
lcd.setCursor((unsigned)strlen(TITLE_ANGLE1), 1);
lcd.print(angle);//print value of angle
lcd.print((char)223);
} //
/*
clearCharacters()
* @brief clears a line of display (erases all characters)
* @param none
* @return does not return anything
* Written by Ahmad Shamshiri
* www.Robojax.com code May 28, 2020 at 16:21 in Ajax, Ontario, Canada
*/
void clearCharacters()
{
for (int i=(unsigned)strlen(TITLE_ANGLE1)-1; i<=LCD_CHAR-1; i++)
{
lcd.setCursor (i,1); //
lcd.write(254);
}
}//clearCharacters
资源与参考
尚无可用资源。
文件📁
没有可用的文件。