Урок 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)
Вот схема подключения, упомянутая в видео:
Давайте разберем соединения:
- Сервопривод:
- Питание (красный провод) → контакт 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] Настройка скорости реакции сервопривода
/*
* 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
}
Вещи, которые могут вам понадобиться
-
Амазонка
-
Амазонка
-
eBay
-
АлиЭкспрессКупите сервомотор SG90 180 или 360 на AliExpress.s.click.aliexpress.com
Ресурсы и ссылки
-
Внутренний
Файлы📁
Другие файлы
-
Технический паспорт мотора SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB