Pretraži kod

Lekcija 91: Upravljanje servo motorom pomoću potenciometra i prikazivanje ugla na LCD ekranu

Lekcija 91: Upravljanje servo motorom pomoću potenciometra i prikazivanje ugla na LCD ekranu

U ovom praktičnom Arduino tutorijalu naučit ćete kako kombinovati tri bitne komponente u jedan funkcionalan projekat: servo motor, potenciometar i I2C LCD ekran. Do kraja, moći ćete okretati dugme i gledati kako se servo ruka pomjera u realnom vremenu dok se tačan ugao prikazuje na ekranu. Ovaj projekat je savršen za izgradnju intuitivnih fizičkih interfejsa gdje su vam potrebni i vizuelna povratna informacija i precizno pozicioniranje.

Ovaj projekat premošćuje jaz između analognog ulaza i fizičkog izlaza. Potenciometar služi kao vaša analogna kontrolna dugmad, servo motor pretvara poziciju dugmeta u fizički ugao (0 do 180 stepeni), a LCD ekran pruža trenutnu vizuelnu potvrdu trenutnog ugla. Ova postavka je temelj za bezbroj praktičnih primjena:

  • Izgradnja zgloba robotske ruke s ručnom kontrolnom dugmadom za precizno pozicioniranje
  • Kreiranje pan-tilt nosača kamere gdje kontrolišete smjer dugmetom
  • Razvoj analognog mjerača koji prikazuje vrijednosti na ekranu za prilagođenu instrumentnu ploču
  • Konstrukcija mehanizma upravljanja modela vozila na daljinsko upravljanje s vizuelnom povratnom informacijom

Hardverske komponente

Za izgradnju ovog projekta trebat će vam sljedeće komponente:

  • Arduino ploča (Uno ili slična)
  • Servo motor (standardni 5V hobi servo)
  • Potenciometar (preporučuje se 10kΩ)
  • I2C LCD ekran (16x2 ili 20x4)
  • Breadboard i žice za spajanje

Vodič za povezivanje

Ovaj projekat pametno koristi dva slobodna digitalna pina na Arduinu za napajanje potenciometra i LCD ekrana s 5V, izbjegavajući potrebu za dodatnim naponskim trakama na breadboardu. Pin 8 je konfigurisan kao izlaz i postavljen na HIGH za napajanje potenciometra, dok pin 4 radi isto za VCC LCD ekrana. Ova tehnika je korisna kada su vam potrebni dodatni 5V izvori bez dodavanja više hardvera.

Veze su sljedeće (u videu na 05:08):

  • Servo: Signalna žica na digitalni pin 3, napajanje na 5V, uzemljenje na GND
  • Potenciometar: Srednji pin na analogni pin A0, jedan vanjski pin na pin 8 (VCC2), drugi vanjski pin na GND
  • LCD: VCC na pin 4 (VCC3), GND na GND, SDA na A4, SCL na A5

Objašnjenje koda

Kod za ovaj projekat nadograđuje standardnu servo kontrolu dodavanjem LCD funkcije prikaza. Fokusirajmo se na ključne elemente koje korisnik može konfigurisati, a koje ćete morati prilagoditi svojoj specifičnoj postavci.

Definicije pinova: Pinovi su definirani na vrhu skice i mogu se promijeniti kako bi odgovarali vašem povezivanju:


int potpin = A0;  // analogni pin za potenciometar
int servoPin = 3; // digitalni PWM pin za servo (3, 5, 6, 9, 10, 11)
int VCC2 = 8;     // dodatni 5V pin za potenciometar
int VCC3 = 4;     // dodatni 5V pin za LCD

LCD konfiguracija: I2C adresa je ključna i mora odgovarati vašem specifičnom LCD modulu. Mnogi moduli koriste 0x27, ali ovaj kod koristi 0x3F. Možda ćete morati pokrenuti I2C skener skicu da pronađete svoju adresu:


LiquidCrystal_I2C lcd(0x3F, 16, 2);  // adresa, kolone, redovi

Podešavanje rezolucije serva: Analogno očitavanje dijeli se s 5 kako bi se smanjile fluktuacije. Ovu vrijednost možete prilagoditi kako biste uravnotežili stabilnost i rezoluciju. Veći djelitelj (poput 10) daje savršeno stabilno očitavanje, ali smanjuje broj pozicija serva koje možete postići:


val = analogRead(potpin)/5;  // podijelite s 5 radi stabilnosti

Pozicioniranje simbola stepena: Kod uključuje logiku za pravilno pozicioniranje simbola stepena (°) pored vrijednosti ugla, bilo da se radi o jednocifrenom, dvocifrenom ili trocifrenom broju. Ovo osigurava da ekran uvijek izgleda uredno i profesionalno.

Demonstracija projekta uživo

Kada uključite projekat, LCD će prikazati "Servo with Pot." u prvom redu. Dok okrećete potenciometar, servo ruka će se rotirati kako bi odgovarala poziciji dugmeta, a drugi red LCD ekrana prikazat će trenutni ugao sa simbolom stepena. Serijski monitor također ispisuje vrijednost ugla u svrhu otklanjanja grešaka (u videu na 05:36).

Jedna stvar koju ćete primijetiti je da prikazani ugao može lagano fluktuirati između dvije vrijednosti. To je zato što analogno očitavanje s potenciometra nije savršeno stabilno. Kod to rješava dijeljenjem sirovog očitavanja s 5, što značajno smanjuje fluktuaciju dok i dalje pruža 180 različitih pozicija. Ako želite apsolutno stabilna očitavanja, možete povećati djelitelj, ali ćete izgubiti dio preciznosti u pozicioniranju serva.

Poglavlja

  • [00:00] Uvod u projekat
  • [00:31] Pregled povezivanja i zahtjevi za napajanje
  • [01:05] Objašnjenje koda dio 1: LCD postavka
  • [02:36] Objašnjenje koda dio 2: LCD inicijalizacija i logika prikaza
  • [03:48] Objašnjenje koda dio 3: Pozicioniranje simbola stepena
  • [05:08] Potpuna šema povezivanja i veze
  • [05:36] Demonstracija uživo i testiranje
  • [06:14] Popravljanje fluktuacije vrijednosti i podešavanje rezolucije

Slike

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
Jezik: 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
 }

Stvari koje bi vam mogle zatrebati

Resursi i reference

Datoteke📁

Fritzing datoteka

Ostale datoteke