Пребарување код

Лекција 91: Контролирање на серво мотор со помош на потенциометар и прикажување на аголот на LCD

Лекција 91: Контролирање на серво мотор со помош на потенциометар и прикажување на аголот на LCD

Во овај практичен Arduino туторијал, ќе научите како да комбинирате три основни компоненти во еден функционален проект: серво мотор, потенциометар и I2C LCD дисплеј. До крајот, ќе можете да вртите копче и да гледате како серво раката се движи во реално време додека точниот агол се прикажува на екранот. Овој проект е совршен за изградба на интуитивни физички интерфејси каде што ви треба и визуелна повратна информација и прецизно позиционирање.

Овој проект ја премостува разликата помеѓу аналоген влез и физички излез. Потенциометарот дејствува како ваш аналоген контролен копче, серво моторот ја претвора таа позиција на копчето во физички агол (0 до 180 степени), а LCD екранот обезбедува итна визуелна потврда на тековниот агол. Оваа поставка е основа за безброј практични апликации:

  • Изградба на зглоб на роботска рака со рачно контролно копче за прецизно позиционирање
  • Креирање на pan-and-tilt камера држач каде што ја контролирате насоката со копче
  • Развивање на аналоген мерач кој прикажува вредности на екран за прилагоден инструмент панел
  • Конструирање на механизам за управување на далечински управуван модел на возило со визуелна повратна информација

Хардверски компоненти

За да го изградите овој проект, ќе ви требаат следниве компоненти:

  • Arduino плоча (Uno или слична)
  • Серво мотор (стандарден 5V хоби серво)
  • Потенциометар (10kΩ се препорачува)
  • I2C LCD дисплеј (16x2 или 20x4)
  • Прототипна плоча и jumper жици

Водич за поврзување

Овој проект паметно користи два слободни дигитални пина на Arduino за да обезбеди 5V напојување на потенциометарот и LCD, избегнувајќи ја потребата за дополнителни напојни шини на прототипната плоча. Пин 8 е конфигуриран како излез и поставен на HIGH за напојување на потенциометарот, додека пин 4 го прави истото за VCC на LCD. Оваа техника е корисна кога ви требаат дополнителни 5V извори без додавање на повеќе хардвер.

Поврзувањата се како што следува (во видеото на 05:08):

  • Серво: Сигнална жица на дигитален пин 3, напојување на 5V, заземјување на GND
  • Потенциометар: Централен пин на аналоген пин A0, еден надворешен пин на пин 8 (VCC2), друг надворешен пин на GND
  • LCD: VCC на пин 4 (VCC3), GND на GND, SDA на A4, SCL на A5

Објаснување на кодот

Кодот за овој проект се надоврзува на стандардната серво контрола со додавање на LCD функционалност за прикажување. Ајде да се фокусираме на клучните елементи кои корисникот може да ги конфигурира, а кои ќе треба да ги прилагодите за вашата специфична поставка.

Дефиниции на пинови: Пиновите се дефинирани на врвот на скицата и можат да се променат за да одговараат на вашето поврзување:


int potpin = A0;  // аналоген пин за потенциометар
int servoPin = 3; // дигитален PWM пин за серво (3, 5, 6, 9, 10, 11)
int VCC2 = 8;     // дополнителен 5V пин за потенциометар
int VCC3 = 4;     // дополнителен 5V пин за LCD

LCD конфигурација: I2C адресата е критична и мора да одговара на вашиот специфичен LCD модул. Многу модули користат 0x27, но овој код користи 0x3F. Можеби ќе треба да стартувате I2C скенер скица за да ја најдете вашата адреса:


LiquidCrystal_I2C lcd(0x3F, 16, 2);  // адреса, колони, редови

Прилагодување на резолуцијата на серво: Аналогното читање е поделено со 5 за да се намалат флуктуациите. Можете да ја прилагодите оваа вредност за да балансирате помеѓу стабилност и резолуција. Поголем делител (како 10) дава совршено стабилно читање, но го намалува бројот на серво позиции што можете да ги постигнете:


val = analogRead(potpin)/5;  // подели со 5 за стабилност

Позиционирање на симболот за степени: Кодот вклучува логика за правилно позиционирање на симболот за степени (°) веднаш до вредноста на аголот, без разлика дали е едноцифрен, двоцифрен или трицифрен број. Ова осигурува дека екранот секогаш изгледа уредно и професионално.

Демонстрација на живиот проект

Кога ќе го вклучите проектот, LCD ќе прикаже "Servo with Pot." на првата линија. Како што го вртите потенциометарот, серво раката ќе ротира за да одговара на позицијата на копчето, а втората линија на LCD ќе го прикаже тековниот агол со симбол за степени. Серискиот монитор исто така ги излегува вредностите на аголот за дебагирање (во видеото на 05:36).

Едно нешто што ќе забележите е дека прикажаниот агол може малку да флуктуира помеѓу две вредности. Ова е затоа што аналогното читање од потенциометарот не е совршено стабилно. Кодот се справува со ова со делење на суровото читање со 5, што значително ја намалува флуктуацијата додека сепак обезбедува 180 различни позиции. Ако сакате апсолутно стабилни читања, можете да го зголемите делителот, но ќе изгубите дел од прецизноста во позиционирањето на серво.

Поглавја

  • [00:00] Вовед во проектот
  • [00:31] Преглед на поврзувањето и барања за напојување
  • [01:05] Објаснување на кодот дел 1: LCD поставување
  • [02:36] Објаснување на кодот дел 2: LCD иницијализација и логика за прикажување
  • [03:48] Објаснување на кодот дел 3: Позиционирање на симболот за степени
  • [05:08] Целосна шема на поврзување и врски
  • [05:36] Жива демонстрација и тестирање
  • [06:14] Поправање на флуктуацијата на вредностите и прилагодување на резолуцијата

Слики

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
Јазик: 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
 }

Работи што можеби ќе ви требаат

Ресурси и референци

Датотеки📁

Fritzing датотека

Други датотеки