Les 91: Beheer van 'n Servomotor deur 'n Potensiometer te Gebruik en die Hoek op 'n LCD te Vertoon
In hierdie praktiese Arduino-tutoriaal sal jy leer hoe om drie noodsaaklike komponente in een funksionele projek te kombineer: 'n servomotor, 'n potensiometer en 'n I2C-LCD-skerm. Teen die einde sal jy 'n knop kan draai en 'n servo-arm in reële tyd sien beweeg terwyl die presiese hoek op die skerm vertoon word. Hierdie projek is perfek vir die bou van intuïtiewe fisiese koppelvlakke waar jy beide visuele terugvoer en presiese posisionering nodig het.
Hierdie projek oorbrug die gaping tussen analoog invoer en fisiese uitset. 'n Potensiometer dien as jou analoog beheerknop, die servomotor vertaal daardie knop-posisie in 'n fisiese hoek (0 tot 180 grade), en die LCD-skerm verskaf onmiddellike visuele bevestiging van die huidige hoek. Hierdie opstelling is die fondament vir talle praktiese toepassings:
- Bou van 'n robotarm-gewrig met 'n handbeheerknop vir presiese posisionering
- Skep van 'n pan-en-tilt-kameramontuur waar jy die rigting met 'n knop beheer
- Ontwikkel van 'n analoog meter wat waardes op 'n skerm vertoon vir 'n pasgemaakte instrumentpaneel
- Konstrueer van 'n afstandbeheerde modelvoertuig se stuurmeganisme met visuele terugvoer
Hardeware-komponente
Om hierdie projek te bou, sal jy die volgende komponente nodig hê:
- Arduino-bord (Uno of soortgelyk)
- Servomotor (standaard 5V-stokperdjie-servo)
- Potensiometer (10kΩ aanbeveel)
- I2C-LCD-skerm (16x2 of 20x4)
- Broodbord en springdrade
Bedradingsgids
Hierdie projek gebruik slim twee ongebruikte digitale penne op die Arduino om 5V-krag aan die potensiometer en LCD te verskaf, wat die behoefte aan ekstra kragrelings op die broodbord uitskakel. Pen 8 word as 'n uitset gekonfigureer en HOOG gestel om die potensiometer van krag te voorsien, terwyl pen 4 dieselfde doen vir die LCD se VCC. Hierdie tegniek is nuttig wanneer jy addisionele 5V-bronne nodig het sonder om meer hardeware by te voeg.
Die bedradingsverbindings is soos volg (in video by 05:08):
- Servo: Seindraad na digitale pen 3, krag na 5V, grond na GND
- Potensiometer: Middelpen na analoog pen A0, een buitenste pen na pen 8 (VCC2), ander buitenste pen na GND
- LCD: VCC na pen 4 (VCC3), GND na GND, SDA na A4, SCL na A5
Kode-verduideliking
Die kode vir hierdie projek bou voort op standaard servo-beheer deur LCD-vertoonfunksionaliteit by te voeg. Kom ons fokus op die sleutel gebruikerskonfigureerbare elemente wat jy vir jou spesifieke opstelling sal moet aanpas.
Pen-definisies: Die penne word bo-aan die skets gedefinieer en kan verander word om by jou bedrading te pas:
int potpin = A0; // analoog pen vir potensiometer
int servoPin = 3; // digitale PWM-pen vir servo (3, 5, 6, 9, 10, 11)
int VCC2 = 8; // ekstra 5V-pen vir potensiometer
int VCC3 = 4; // ekstra 5V-pen vir LCD
LCD-konfigurasie: Die I2C-adres is krities en moet ooreenstem met jou spesifieke LCD-module. Baie modules gebruik 0x27, maar hierdie kode gebruik 0x3F. Jy mag dalk 'n I2C-skandeerder-skets moet laat loop om jou adres te vind:
LiquidCrystal_I2C lcd(0x3F, 16, 2); // adres, kolomme, rye
Servo-resolusie-aanpassing: Die analoog lesing word deur 5 gedeel om fluktuasie te verminder. Jy kan hierdie waarde aanpas om stabiliteit teen resolusie te balanseer. 'n Hoër deler (soos 10) gee 'n perfek stabiele lesing maar verminder die aantal servo-posisies wat jy kan bereik:
val = analogRead(potpin)/5; // deel deur 5 vir stabiliteit
Graadsimbool-posisionering: Die kode sluit logika in om die graadsimbool (°) korrek langs die hoekwaarde te plaas, of dit nou 'n een-, twee- of drie-syfergetal is. Dit verseker dat die vertoning altyd skoon en professioneel lyk.
Lewende projek-demonstrasie
Wanneer jy die projek aanskakel, sal die LCD "Servo with Pot." op die eerste lyn vertoon. Soos jy die potensiometer draai, sal die servo-arm roteer om by die knop-posisie te pas, en die tweede lyn van die LCD sal die huidige hoek met 'n graadsimbool wys. Die reeksmonitor gee ook die hoekwaarde uit vir ontfoutingsdoeleindes (in video by 05:36).
Een ding wat jy sal opmerk, is dat die vertoonde hoek effens tussen twee waardes kan fluktueer. Dit is omdat die analoog lesing van die potensiometer nie perfek stabiel is nie. Die kode spreek dit aan deur die rou lesing deur 5 te deel, wat die fluktuasie aansienlik verminder terwyl dit steeds 180 afsonderlike posisies bied. As jy absoluut stabiele lesings wil hê, kan jy die deler verhoog, maar jy sal 'n bietjie presisie in die servo-posisionering verloor.
Hoofstukke
- [00:00] Inleiding tot die projek
- [00:31] Bedradingsoorsig en kragvereistes
- [01:05] Kode-verduideliking deel 1: LCD-opstelling
- [02:36] Kode-verduideliking deel 2: LCD-inisialisering en vertoonlogika
- [03:48] Kode-verduideliking deel 3: Graadsimbool-posisionering
- [05:08] Volledige bedradingdiagram en verbindings
- [05:36] Lewende demonstrasie en toetsing
- [06:14] Regstelling van waarde-fluktuasie en aanpassing van resolusie
/*
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
}
Goedere wat jy dalk nodig het
-
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
Hulpbronne en verwysings
-
BuitenburgLCD library from RoboJax (ZIP)robojax.com
-
BuitenburgPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Lêers📁
Fritzing-lêer
-
LCD LCD1602-I2C module with 4 wires
LCD1602-I2C.fzpz0.01 MB
Ander lêers
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB -
LCD1602 LiquidCrystal Library
robojax-LCD1602_LiquidCrystal.zip