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

Лекција 86: Контрола на позицијата на серво мотор со помош на потенциометар

Лекција 86: Контрола на позицијата на серво мотор со помош на потенциометар

Замислете се како вртите обична рачка и гледате како механичка рака прецизно го следи секое ваше движење. Тоа е магијата на комбинирање на потенциометар со серво мотор. Овој проект, дел од курсот Arduino Step by Step од Robojax, демонстрира основен и неверојатно корисен концепт во електрониката: претворање на аналоген влез во прецизно физичко движење. Ќе научите како да читате променлив напон од потенциометар, да ја мапирате таа вредност во опсег на агли и да му наредите на серво моторот да се ротира до точно таа позиција. Ова е вашата порта кон изградба на интуитивни и интерактивни проекти каде рачната контрола се среќава со автоматизацијата.

Примените на оваа вештина се огромни и практични. Еве само неколку идеи за да ве инспирираат:

  • Контрола на роботска рака: Користете потенциометар за рачно позиционирање на секој зглоб од роботска рака за прецизни операции на земање и ставање.
  • Систем за панорамирање и навалување на камера: Изградете далечински управувана камера-носач за временски интервали или надзор, непречено панорамирајќи и навалувајќи со вртење на копче.
  • Реплика на аналоген мерач: Креирајте физички инструмент-табла (како брзиномер или температурно копче) што се движи врз основа на податоци од сензори, при што потенциометарот делува како рачна контрола или алатка за калибрација.
  • Интерактивни уметнички инсталации: Креирајте кинетички скулптури што реагираат на влез од гледачите, каде вртењето на копче ја менува позицијата на подвижните делови.
  • Управување на модел на возило: Контролирајте го аголот на управување на модел на автомобил или брод од далечина, обезбедувајќи поинтуитивно и аналогно чувство отколку дигитални копчиња.

Овој водич е заснован на видео-туторијалот Lesson 86: Control position of a servo motor using potentiometer од Robojax (во видеото на 00:00). Ве води низ целиот процес, од разбирање на жиците до објаснување на кодот што прави сè да работи. Да започнеме.

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

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

  • Arduino плоча (на пр., Uno, Nano)
  • Стандарден серво мотор (на пр., SG90 или MG996R)
  • Потенциометар (променлив отпорник, обично 10kΩ)
  • Поврзувачки жици
  • Прототипна плоча (опционално, за полесно поврзување)

Разбирање на жиците

Поврзувањето за овој проект е едноставно. Клучот е да се обезбедат точни напојувања и сигнални врски и за серво моторот и за потенциометарот. Серво моторот е уред што троши многу енергија, па затоа добива напојување директно од 5V пин на Arduino. Потенциометарот делува како разделувач на напон, а ние го читаме напонот на неговиот лизгач (средниот пин) за да ја одредиме неговата позиција. (во видеото на 01:05)

Еден паметен трик што овој проект го користи е создавање дополнителен 5V извор на дигитален пин за напојување на потенциометарот, бидејќи некои Arduino плочи имаат само еден посветен 5V пин. Ова се прави во кодот со поставување на дигитален пин (пин 8) на HIGH, што излегува 5V. (во видеото на 00:39)

Еве го дијаграмот за поврзување споменат во видеото:

Arduino поврзување за серво мотор со потенциометар
Arduino поврзување за серво мотор со потенциометар

Ајде да ги разложиме врските:

  • Серво мотор:
    • Напојување (црвена жица) → 5V пин на Arduino
    • Земја (кафеава/црна жица) → GND пин на Arduino
    • Сигнал (портокалова/жолта жица) → пин 3 на Arduino (пин со PWM можност)
  • Потенциометар:
    • Лев пин → GND пин на Arduino
    • Среден пин (лизгач) → аналоген пин A0 на Arduino
    • Десен пин → пин 8 на Arduino (дефиниран како VCC2 во кодот)

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

Кодот за овој проект е елегантно едноставен. Користи неколку клучни Arduino функции за читање на потенциометарот и контрола на серво моторот. Ајде да се фокусираме на деловите што корисникот може да ги конфигурира и што можете да ги прилагодите за вашите сопствени проекти. (во видеото на 03:00)

На врвот на скицата, ќе ги дефинирате пиновите и ќе го креирате серво објектот. Овие се главните променливи што ќе ги менувате врз основа на вашето поврзување:

#include <Servo.h>

Servo myservo;  // креирај серво објект за контрола на серво мотор

int potpin = A0;  // аналоген пин што се користи за поврзување на потенциометарот
int servoPin = 3; // дефинирај дигитален пин (со PWM) за серво. Може да се користат само пинови 3, 5, 6, 9, 10, 11
int VCC2 = 8;// дефинирај дополнителен VCC за потенциометарот
int val;    // променлива за читање на вредноста од аналогниот пин

Еве што прави секој дел:

  • Servo myservo;: Оваа линија креира објект со име myservo што ќе го користиме за контрола на нашиот специфичен серво мотор. Можете да го преименувате, но мора да го користите истото име подоцна во кодот.
  • int potpin = A0;: Ова дефинира кој аналоген пин е поврзан со лизгачот на потенциометарот. Ако ја преместите жицата на друг аналоген пин, мора да го ажурирате овој број.
  • int servoPin = 3;: Ова го поставува дигиталниот пин за сигналната жица на серво моторот. Клучно е да користите пин со PWM можност (обично оние означени со '~' на плочата). Коментарот ги наведува валидните пинови за повеќето Arduino плочи.
  • int VCC2 = 8;: Ова е пинот што го користиме како секундарен 5V извор за потенциометарот. Ако имате плоча со повеќе 5V пинови, можете да го поврзете директно и да го отстраните овој дел од кодот.

Во функцијата setup(), кодот го иницијализира сервото и го поставува дополнителниот пин за напојување. Функцијата myservo.attach(servoPin) е суштинска бидејќи му кажува на Arduino кој пин е поврзан со сигналната жица на сервото.

void setup() {
  Serial.begin(9600);          //  поставување на сериска комуникација
  myservo.attach(servoPin);  // го прикачува сервото на пин 3 на серво објектот

  pinMode(VCC2, OUTPUT);// поставување на пин 8 како излез
  digitalWrite(VCC2, HIGH);// поставување на пин 8 на HIGH за да дејствува како 5V пин
}

Основната логика е во функцијата loop(). Таа ја чита вредноста на потенциометарот, ја прилагодува на агол и му наредува на сервото да се движи. Двете клучни функции тука се analogRead() и map(). (во видеото на 04:27)

void loop() {
  val = analogRead(potpin);            // ја чита вредноста на потенциометарот (вредност помеѓу 0 и 1023)
  val = map(val, 0, 1023, 0, 180);     // ја прилагодува за употреба со сервото (вредност помеѓу 0 и 180)
  myservo.write(val);                  // ја поставува позицијата на сервото според прилагодената вредност
  Serial.print(val);
  Serial.println();
  delay(50);                           // чека сервото да стигне до целта
}

Еве како функционира:

  • analogRead(potpin): Оваа функција го чита напонот од лизгачот на потенциометарот и враќа вредност помеѓу 0 (0V) и 1023 (5V).
  • map(val, 0, 1023, 0, 180): Ова е клучот за целиот проект. Ја зема суровата вредност од потенциометарот (0 до 1023) и пропорционално ја претвора во агол на сервото (0 до 180 степени). На пример, ако потенциометарот чита 511 (околу половина), функцијата map() ќе врати 90, поместувајќи го сервото во неговата централна позиција.
  • myservo.write(val): Оваа функција го зема пресметаниот агол (сега зачуван во val) и му кажува на сервото да се ротира на таа позиција.
  • delay(50): Ова додава мала пауза на крајот од секоја јамка. Ја контролира брзината на ажурирање. Поголемо доцнење (како 200ms) прави сервото да се движи во чекори, додека помало доцнење (како 50ms) го прави движењето многу мазно. Можете да го прилагодите ова за да ја промените реактивноста. (во видеото на 07:26)

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

Во видеото, можете да го видите проектот во акција. Како што се врти копчето на потенциометарот, рачката на серво моторот пропорционално ја следи неговата позиција. Серискиот монитор ја печати тековната вредност на аголот, потврдувајќи дека мапирањето работи правилно. Кога потенциометарот е на минималната позиција, сервото е на 0 степени. Како што го вртите копчето до максимум, сервото мазно се ротира до 180 степени. (во видеото на 06:33)

Оваа повратна јамка во реално време ја демонстрира беспрекорната интеграција на аналоген сензор со дигитален актуатор, создавајќи реактивен и интуитивен контролен систем.

Поглавја

  • [00:00] Вовед и преглед на проектот
  • [01:05] Шема и дијаграм на поврзување
  • [02:07] Демонстрација на физичко поврзување
  • [03:00] Објаснување на кодот
  • [06:33] Демонстрација и тестирање во живо
  • [07:26] Прилагодување на брзината на одговор на сервото

Слики

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Јазик: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#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

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
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 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();
  delay(50);                           // waits for the servo to get there
}
 

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

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

Датотеки📁

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