Код для поиска

Урок 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)
  • Потенциометр (переменный резистор, обычно 10 кОм)
  • Соединительные провода
  • Макетная плата (необязательно, для удобства подключения)

Понимание подключения

Подключение для этого проекта простое. Ключевой момент — обеспечить правильное питание и сигнальные соединения как для сервопривода, так и для потенциометра. Сервопривод — это устройство, потребляющее много энергии, поэтому он получает питание напрямую с контакта 5V Arduino. Потенциометр действует как делитель напряжения, и мы считываем напряжение на его движке (среднем контакте), чтобы определить его положение. (в видео на 01:05)

Один из хитрых приемов, используемых в этом проекте, — создание дополнительного источника 5V на цифровом контакте для питания потенциометра, так как на некоторых платах Arduino есть только один выделенный контакт 5V. Это делается в коде путем установки цифрового контакта (контакт 8) в состояние HIGH, что выдает 5V. (в видео на 00:39)

Вот схема подключения, упомянутая в видео:

Подключение Arduino для сервопривода с потенциометром
Подключение Arduino для сервопривода с потенциометром

Давайте разберем соединения:

  • Сервопривод:
    • Питание (красный провод) → контакт 5V Arduino
    • Земля (коричневый/черный провод) → контакт GND Arduino
    • Сигнал (оранжевый/желтый провод) → контакт 3 Arduino (контакт с поддержкой ШИМ)
  • Потенциометр:
    • Левый контакт → контакт GND Arduino
    • Средний контакт (движок) → аналоговый контакт A0 Arduino
    • Правый контакт → контакт 8 Arduino (определен как VCC2 в коде)

Объяснение кода

Код для этого проекта элегантно прост. Он использует несколько ключевых функций Arduino для считывания потенциометра и управления сервоприводом. Давайте сосредоточимся на настраиваемых пользователем частях, которые вы можете изменить для своих собственных проектов. (в видео на 03:00)

В верхней части скетча вы определите контакты и создадите объект сервопривода. Это основные переменные, которые вы будете изменять в зависимости от вашего подключения:

#include <Servo.h>

Servo myservo;  // создаем объект сервопривода для управления сервоприводом

int potpin = A0;  // аналоговый контакт, используемый для подключения потенциометра
int servoPin = 3; // определяем цифровой контакт (с ШИМ) для сервопривода. Можно использовать только контакты 3, 5, 6, 9, 10, 11
int VCC2 = 8;// определяем дополнительный VCC для потенциометра
int val;    // переменная для чтения значения с аналогового контакта

Вот что делает каждая часть:

  • Servo myservo;: Эта строка создает объект с именем myservo, который мы будем использовать для управления нашим конкретным сервоприводом. Вы можете переименовать его, но вы должны использовать то же имя позже в коде.
  • int potpin = A0;: Это определяет, к какому аналоговому контакту подключен движок потенциометра. Если вы переместите провод на другой аналоговый контакт, вы должны обновить это число.
  • int servoPin = 3;: Это устанавливает цифровой контакт для сигнального провода сервопривода. Критически важно использовать контакт с поддержкой ШИМ (обычно обозначенный символом '~' на плате). В комментарии перечислены допустимые контакты для большинства 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 (0В) до 1023 (5В).
  • map(val, 0, 1023, 0, 180): Это ключ ко всему проекту. Она берет сырое значение с потенциометра (от 0 до 1023) и пропорционально преобразует его в угол сервопривода (от 0 до 180 градусов). Например, если потенциометр показывает 511 (примерно половину), функция map() вернет 90, перемещая сервопривод в центральное положение.
  • myservo.write(val): Эта функция принимает вычисленный угол (теперь хранящийся в val) и дает команду сервоприводу повернуться в эту позицию.
  • delay(50): Это добавляет небольшую паузу в конце каждого цикла. Она контролирует частоту обновления. Большая задержка (например, 200 мс) заставляет сервопривод двигаться шагами, а меньшая задержка (например, 50 мс) делает движение очень плавным. Вы можете настроить это значение, чтобы изменить отзывчивость. (в видео на 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
}
 

Вещи, которые могут вам понадобиться

Ресурсы и ссылки

Файлы📁

Другие файлы