Soek Kode

Les 91: Beheer van 'n Servomotor deur 'n Potensiometer te Gebruik en die Hoek op 'n LCD te Vertoon

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

Beelde

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

Goedere wat jy dalk nodig het

Hulpbronne en verwysings

Lêers📁

Fritzing-lêer

Ander lêers