Lecția 91: Controlul unui servomotor folosind un potențiometru și afișarea unghiului pe un LCD
În acest tutorial Arduino practic, vei învăța cum să combini trei componente esențiale într-un singur proiect funcțional: un servomotor, un potențiometru și un afișaj LCD I2C. La final, vei putea roti un buton și vei urmări brațul servomotorului mișcându-se în timp real, în timp ce unghiul exact este afișat pe ecran. Acest proiect este perfect pentru construirea de interfețe fizice intuitive unde ai nevoie atât de feedback vizual, cât și de poziționare precisă.
Acest proiect face legătura între intrarea analogică și ieșirea fizică. Un potențiometru acționează ca buton de control analogic, servomotorul traduce poziția butonului într-un unghi fizic (0 până la 180 de grade), iar ecranul LCD oferă confirmare vizuală imediată a unghiului curent. Această configurație este fundația pentru nenumărate aplicații practice:
- Construirea unei articulații de braț robotic cu buton de control manual pentru poziționare precisă
- Crearea unui suport de cameră cu mișcare panoramică și verticală unde controlezi direcția cu un buton
- Dezvoltarea unui indicator analogic care afișează valori pe un ecran pentru un panou de instrumente personalizat
- Construirea mecanismului de direcție al unui vehicul model controlat de la distanță cu feedback vizual
Componente Hardware
Pentru a construi acest proiect, vei avea nevoie de următoarele componente:
- Placă Arduino (Uno sau similară)
- Servomotor (servo hobby standard de 5V)
- Potențiometru (10kΩ recomandat)
- Afișaj LCD I2C (16x2 sau 20x4)
- Breadboard și fire de legătură
Ghid de Cablare
Acest proiect folosește inteligent două pini digitali liberi de pe Arduino pentru a furniza alimentare de 5V potențiometrului și LCD-ului, evitând necesitatea unor benzi de alimentare suplimentare pe breadboard. Pinul 8 este configurat ca ieșire și setat la HIGH pentru a alimenta potențiometrul, în timp ce pinul 4 face același lucru pentru VCC-ul LCD-ului. Această tehnică este utilă atunci când ai nevoie de surse suplimentare de 5V fără a adăuga mai mult hardware.
Conexiunile de cablare sunt următoarele (în video la 05:08):
- Servomotor: Firul de semnal la pinul digital 3, alimentarea la 5V, masa la GND
- Potențiometru: Pinul central la pinul analogic A0, un pin exterior la pinul 8 (VCC2), celălalt pin exterior la GND
- LCD: VCC la pinul 4 (VCC3), GND la GND, SDA la A4, SCL la A5
Explicația Codului
Codul pentru acest proiect se bazează pe controlul standard al servomotorului, adăugând funcționalitatea afișajului LCD. Să ne concentrăm pe elementele cheie configurabile de utilizator pe care va trebui să le ajustezi pentru configurația ta specifică.
Definițiile Pinilor: Pinii sunt definiți în partea de sus a schiței și pot fi modificați pentru a se potrivi cablajului tău:
int potpin = A0; // pin analogic pentru potențiometru
int servoPin = 3; // pin digital PWM pentru servomotor (3, 5, 6, 9, 10, 11)
int VCC2 = 8; // pin suplimentar de 5V pentru potențiometru
int VCC3 = 4; // pin suplimentar de 5V pentru LCD
Configurarea LCD: Adresa I2C este critică și trebuie să se potrivească cu modulul tău LCD specific. Multe module folosesc 0x27, dar acest cod folosește 0x3F. S-ar putea să fie nevoie să rulezi o schiță de scanare I2C pentru a-ți găsi adresa:
LiquidCrystal_I2C lcd(0x3F, 16, 2); // adresă, coloane, rânduri
Ajustarea Rezoluției Servomotorului: Citirea analogică este împărțită la 5 pentru a reduce fluctuația. Poți ajusta această valoare pentru a echilibra stabilitatea cu rezoluția. Un divizor mai mare (cum ar fi 10) oferă o citire perfect stabilă, dar reduce numărul de poziții ale servomotorului pe care le poți obține:
val = analogRead(potpin)/5; // împărțire la 5 pentru stabilitate
Poziționarea Simbolului de Grade: Codul include logică pentru a poziționa simbolul de grade (°) corect lângă valoarea unghiului, indiferent dacă este un număr cu una, două sau trei cifre. Acest lucru asigură că afișajul arată întotdeauna curat și profesional.
Demonstrație Live a Proiectului
Când alimentezi proiectul, LCD-ul va afișa „Servo with Pot." pe prima linie. Pe măsură ce rotești potențiometrul, brațul servomotorului se va roti pentru a se potrivi cu poziția butonului, iar a doua linie a LCD-ului va afișa unghiul curent cu simbolul de grade. Monitorul serial afișează și el valoarea unghiului pentru depanare (în video la 05:36).
Un lucru pe care îl vei observa este că unghiul afișat poate fluctua ușor între două valori. Acest lucru se întâmplă deoarece citirea analogică de la potențiometru nu este perfect stabilă. Codul abordează această problemă împărțind citirea brută la 5, ceea ce reduce semnificativ fluctuația, oferind totuși 180 de poziții distincte. Dacă dorești citiri absolut stabile, poți mări divizorul, dar vei pierde din precizia poziționării servomotorului.
Capitole
- [00:00] Introducere în proiect
- [00:31] Prezentarea cablajului și cerințele de alimentare
- [01:05] Explicația codului partea 1: Configurarea LCD
- [02:36] Explicația codului partea 2: Inițializarea LCD și logica de afișare
- [03:48] Explicația codului partea 3: Poziționarea simbolului de grade
- [05:08] Diagrama completă de cablare și conexiuni
- [05:36] Demonstrație live și testare
- [06:14] Remedierea fluctuației valorilor și ajustarea rezoluției
/*
Lesson 91
* S05 Servo with Potentiometer and LCD1602-I2C
*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
Watch full instructions on YouTube https://youtu.be/E-H-4igygzA
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on January 1, 2019 in Ajax, Ontario, Canada
https://robojax.com?vid=robojax-servo-knob
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6, 9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
int VCC3 = 4;// define extra VCC for LCD
int degPos;// degree symbol position
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
// lines bellow are for LCD
pinMode(VCC3, OUTPUT);// set pin 4 as output
digitalWrite(VCC3, HIGH);// set pin 4 HIGH so it acts as 5V pin
lcd.begin(); // initialize the LCD,
// Turn on the backlight and print a message.
lcd.backlight();
}
void loop() {
val = analogRead(potpin)/5; // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023/5, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
lcd.clear();
lcd.print("Servo with Pot.");
lcd.setCursor (0,1); // go to start of 2nd line
lcd.print("Angle:");
lcd.setCursor (7,1); // go to 7 char of of 2nd line
lcd.print(val);// print angle
if(val >99)
{
degPos =10;
}else if(val >9)
{
degPos =9;
}else
{
degPos =8;
}
lcd.setCursor (degPos,1); // go to 11 char of of 2nd line
lcd.print((char)223);// degree symbol
delay(500); // waits for the servo to get there
}
Lucruri de care ai putea avea nevoie
-
AmazonBuy LCD1602-I2C from Amazonamzn.to
-
Amazon
-
Amazon
-
AmazonServo motor on Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
eBay
-
AliExpressPurchase 10pcs LCD1602-I2C from AliExpresss.click.aliexpress.com
-
AliExpressPurchase an LCD1602 from AliExpresss.click.aliexpress.com
-
AliExpressPurchase LCD1602-I2C from AliExpresss.click.aliexpress.com
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Resurse și referințe
-
ExternLCD library from RoboJax (ZIP)robojax.com
-
ExternPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Fișiere📁
Fișier Fritzing
-
LCD LCD1602-I2C module with 4 wires
LCD1602-I2C.fzpz0.01 MB
Alte fișiere
-
Fișa tehnică a motorului SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB -
LCD1602 LiquidCrystal Library
robojax-LCD1602_LiquidCrystal.zip