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
/*
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
-
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
Resursi i reference
-
EksternoLCD library from RoboJax (ZIP)robojax.com
-
EksternoPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Datoteke📁
Fritzing datoteka
-
LCD LCD1602-I2C modul sa 4 žice
LCD1602-I2C.fzpz0.01 MB
Ostale datoteke
-
SG90 Servo motor tehnički list
robojax-servo-SG90_datasheet.pdf0.12 MB -
LCD1602 LiquidCrystal Library
robojax-LCD1602_LiquidCrystal.zip