Лекција 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] Поправање на флуктуацијата на вредностите и прилагодување на резолуцијата
/*
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
}
Работи што можеби ќе ви требаат
-
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
Ресурси и референци
-
НадворешноLCD library from RoboJax (ZIP)robojax.com
-
НадворешноPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Датотеки📁
Fritzing датотека
-
LCD LCD1602-I2C модул со 4 жици
LCD1602-I2C.fzpz0.01 MB
Други датотеки
-
SG90 Серво мотор datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB -
LCD1602 LiquidCrystal Library
robojax-LCD1602_LiquidCrystal.zip