Caută cod

Lecția 91: Controlul unui servomotor folosind un potențiometru și afișarea unghiului pe un LCD

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

Imagini

SG90 Mini Servo Motor
SG90 Mini Servo Motor
Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for controlling Servo motor with Potentiometer
438-Lesson 91: Controlling a servo motor using a potentiometer and displaying the angle on an LCD
Limba: C++
/*
 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

Resurse și referințe

Fișiere📁

Fișier Fritzing

Alte fișiere