Arduino.ru
Поясните, пожалуйста, мне, тупому, для чего нужна библиотека Servo?
Почему просто не обойтись analogWrite?
Ан нет, есть специальная библиотека, да не одна.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:20
Зарегистрирован: 03.07.2016
Modsley , вы это тролите или о ситуации вообще тупите ?
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:23
Зарегистрирован: 14.01.2018
Нет, я действительно не могу этого понять.
Пишем analogWrite, всё работает вроде. Зачем библиотеки? Они ведь память отъедают, прерывание занимают.
Что они такого особенного делают?
Я совершенно искренне не понимаю.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:26
Зарегистрирован: 03.07.2016
Это совершенно разные системы. Они не совместимы и они для разных систем и систем подходов.
Проще всего они разные. Это как шапка и сапог. Вы же не носите сапог на голове. Потому что шапка это лишняя покупка и занимает место в квартире.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:38
Зарегистрирован: 19.10.2016
Не в первый раз читаю тут о волшебном способе управления серводвигателями через analogWrite(). Откуда это вообще лезет, с какого ютуб-урока?
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:44
Зарегистрирован: 14.01.2018
Уважаемый, вот ничего не понимаю.
Чем PWM, выдаваемый на пин библиотекой Servo отличается от того, который получаем путём analogWrite?
Или для сервы частота другая нужна?
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:48
Зарегистрирован: 19.10.2016
Серве (цифровой) частота не нужна. Нужны импульсы заданной длительности. Сможете на analogWrite гарантированно дать импульс в 961мс?
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 11:55
Зарегистрирован: 14.01.2018
Я имел в виду, что импульсы-то этой самой заданной длительности ведь следуют с какой-то частотой.
В общем, если я правильно понял, analogWrite не обеспечивает заданной точности.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 12:23
Зарегистрирован: 19.10.2016
Я не знаю, что он там серве вообще обеспечивает.
Потому что дергать стандартную серву на той частоте, что выдает analogWrite вообще смысла нет. Среднестатистическая серва ожидает импульсы заданной длительности ~раз в 20мс. Т.е. с частотой 50Гц. 490Гц ШИМ-а Ардуины как бы на порядок выше номинала.
Постоянно импульсы подаются только для того, чтобы поддерживать положение серводвигателя на позиции, в том случае, если на него действует проворачивающая нагрузка. Ну и еще потому что дешевые сервы не с первой команды на позицию выходят. Во всех остальных случаях пульсация в серву не требуется.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 12:24
Зарегистрирован: 14.01.2018
Спасибо. Теперь всё понятно.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 16:51
Зарегистрирован: 24.09.2015
sadman41 пишет:
Серве (цифровой) частота не нужна. Нужны импульсы заданной длительности. Сможете на analogWrite гарантированно дать импульс в 961мс?
Легко. Проблема и разница только в одном месте: analogWrite() нормально работает на серву только при правильной перенастройке таймера и он должен быть .. 16-и битным. То есть далеко не везде. Библиотека Servo.h имитирует верное управление на любом пине .. ценой программного времени микроконтроллера. Это всё и есть ответ на вопрос зачем нужна библиотека.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 17:44
Зарегистрирован: 19.10.2016
Продемонстрируете? Мне интересно на анализаторе глянуть, как analogWrite будет давать нужную длительность.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 19:10
Зарегистрирован: 06.11.2016
Что-то мне подсказывает, что разговор беспредметный. Нет ни модели «сервы» ни скетча, кстати серва что это такое — прецизионный сервопривод на 50-100 Квт или китайская рулевая машинка от игрушечного медвежонка. От этого многое зависит. Если второе, то ему и ШИМа за глаза, если первое то и библиотеки не помогут. О чем спорим? У автора ведь от ШИМа работает.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 19:34
Зарегистрирован: 19.10.2016
Да пусть работает, кто ж запрещает ему рулить сервой, как получается. Мне действительно хочется глянуть, как можно в два счета перестроить таймеры, чтобы analogWrite выдавал 540. 2400мкс каждые 20мс, к примеру. А то я лепил себе облегченную servo.h на таймерах, теперь интересно глянуть — короче выйдет код или нет.
- Войдите на сайт для отправки комментариев
Пнд, 30/04/2018 — 20:41
Зарегистрирован: 24.09.2015
// Примерно так устанавливается 16-и битный таймер на период 20мсек: // @see Arhat.h // v.1 set 16bit timer (only t:[1,3,4,5]) to PWM special for servo motors: // 1/64 FAST-pwm mode with ICP, 50hz (20msec) and set to pwmOut PWM pin, // Установка 16битного таймера и его каналов в типовой ШИМ для серво моторов. Ноги на вывод устанавливать отдельно! // // @example: set timer5 to pwmServo and use 2 servo at pins 44,46: // timerSetServo(5, pwmPinMode(44, PWM_NORMAL)|pwmPinMode(46, PWM_NORMAL)) // ** set pins 44,46 to OUTPUT manually! #define timerSetServo(t,pwmPinMask) \ < \ timerControl(t, A) = (1<// 20мсек = 20000мксек = 5000 тиков таймера или 1 тик = 4мксек. 960/4 = 240. analogWrite(t16pin, 240);
Если Вам надо точно 961мксек, то надо поднять разрешение таймера в 4 раза из 1/64 в 1/16 и увеличить период счета также в 4 раза до 60000.
- Войдите на сайт для отправки комментариев
Урок 3. Библиотеки в Arduino: что это такое и как использовать?
Всем привет! В этом уроке мы познакомимся с назначением библиотек в среде разработки Arduino IDE , о том какие функции они выполняют и как их устанавливать и применять. Начнем!
Сперва, покажу следующий код:
#include
Servo myservo;
void setup()
<
myservo.attach(9);
myservo.write(90);
>
void loop() <>
В данном скетче мы управляем сервоприводом и поворачиваем вал на ней на 90 градусов. В начале кода с помощью директивы #include (нужна для подключения и внесения в работу кода различных файлов) мы подключаем специальную библиотеку под названием Servo.h
Кстати, если кому интересно, скачать ее вы можете вот здесь:
Дак вот, если убрать строчку кода с подключением этой библиотеки, то программа не заработает. Более того, компилятор выдаст вам ошибку, что не знает таких функций, как myservo.attach и Servo.h
Все эти функции мы можем использовать только с помощью библиотеки Servo.h (в таких случаях говорят, что это ее собственный синтаксис).
В библиотеке содержится определенный код, поддерживающий функции для управления сервоприводом и занимающий немало места, и поэтому для упрощения скетча мы просто подключим библиотеку и используем необходимые функции.
Если этого не сделаем, то размер кода, время на его написание и занимаемое им место в памяти намного увеличатся.
Мы выяснили, что библиотеки экономят наше время и упрощают скетч, делая его более практичным, удобным, а самое главное – более понятным!
А все потому, что в ней уже содержится большая часть кода, которую вам не нужно будет писать.
Библиотек для одной только Arduino существует несколько тысяч. Они делятся на встроенные в среду разработки Arduino IDE и не встроенные, то есть, которые необходимо самому скачивать и устанавливать.
Узнать, какие библиотеки уже встроены или подключены в Arduino IDE можно, нажав на раздел Файл – Примеры, как на фото ниже:
Далее перейдем к тем, что нужно самим искать и устанавливать. Чаще всего таковыми являются библиотеки для подключения различных датчиков или модулей. Например:
LiquidCrystal.h — для подключения LCD дисплея
UTFT.h — для подключения TFT экрана
RTClib.h — для работы с модулем часов реального времени
Скачать их можно на сайте https://github.com/
Просто введите в поиске нужное название и скачайте.
Библиотеки при скачивании хранятся, как правило, в ZIP файлах. Их нужно распаковать (например, с помощью программы WinRAR) в папку libraries.


Вот и все. Вы самостоятельно установили библиотеку. Чтобы она фигурировала в вашем коде, подключайте ее с помощью функции #include
Пример: #include
Также для каждой библиотеки вы можете прочитать своеобразную инструкцию, если погуглить. Там будут описаны команды и функции, которая она содержит и в каких случаях их применять.
Поздравляю! Теперь вы научились подключать и использовать библиотеки. Надеюсь, данный урок был для вас полезен и вы продолжите также резво изучать мир Arduino.
Данная статья — является собственностью интернет-магазина РОБОТОТЕХНИКА
Библиотека Servo

Библиотека используется для подключения 3-х выводных сервопривода с ШИМ управлением к плате ардуино. Сигнал управления должен быть 50 Гц (длительность периода 20 миллисекунд), а ширина положительного импульса в микросекундах задает угол поворота (по умолчанию в библиотеке определены: минимальная ширина — 544 мкс, максимальная — 2400 мкс, что соответствует углам 0° и 180°).
Библиотека Servo входит в состав Arduino IDE. На всякий случай архив с библиотекой по ссылке ниже:
Описание библиотеки Servo для Ардуино
#include
Подключение библиотеки. Добавляется в верхнюю часть скетча.
Servo myservo;
Создание экземпляра класса Servo для работы с сервоприводом.
uint8_t attach(int pin)
Задать номер управляющего контакта ардуины pin , подключенного к сервоприводу. После вызова данного метода на указанном контакте начинается генерация ШИМ сигнала частотой 50 Гц и шириной импульса по умолчанию 1500 микросекунд.
myservo.attach(9);
uint8_t attach(int pin, int min, int max)
Задать номер управляющего контакта ардуины pin , подключенного к сервоприводу, а также минимальное min и максимальное max значения ширины импульсов в микросекундах (что будет соответствовать углам 0. По умолчанию min = 544 мкс , max = 2400 мкс .
myservo.attach(9, 1000, 2000);
void detach()
Останавливает генерацию ШИМ сигнала.
myservo.detach();
void write(int value)
Устанавливает угол value сервопривода в градусах. Если значение выходит из установленного диапазона, то оно воспринимается как угол в микросекундах.
myservo.write(45); // Установить угол 45°
void writeMicroseconds(int value)
Устанавливает ширину импульса в микросекундах.
myservo.writeMicroseconds(1250); // Установить ширину импульса 1250 мкс
int read()
Возвращает последнюю записанную ширину импульса в виде угла от 0° до 180°.
int d = myservo.read();
int readMicroseconds()
Возвращает последнюю записанную ширину импульса в микросекундах.
int us = myservo.read();
bool attached()
Возвращает true если сервопривод подключен, иначе — false .
if(!myservo.attached()) Serial.println("Сервопривод не подключен");
Работаем с сервоприводами
Сервопривод — это механизм с электромотором с управлением. Вы можете вращать механический привод на заданный угол с заданной скоростью или усилием.
Наиболее популярны сервоприводы, которые удерживают заданный угол и сервоприводы, поддерживающие заданную скорость вращения.
Сервоприводы имеют несколько составных частей. Привод — электромотор с редуктором. Зачастую скорость вращения мотора бывает слишком большой для практического использования. Для понижения скорости используется редуктор: механизм из шестерней, передающий и преобразующий крутящий момент.
Включая и выключая электромотор, можно вращать выходной вал — конечную шестерню сервопривода, к которой можно прикрепить нечто, чем мы хотим управлять — рычаг в форме круга, крестовины или перекладинки для передачи вращающего движения на рабочий орган. Для контроля положения используется датчик обратной связи — энкодер, который будет преобразовывать угол поворота обратно в электрический сигнал. Для этого часто используется потенциометр. При повороте бегунка потенциометра происходит изменение его сопротивления, пропорциональное углу поворота. Таким образом, с его помощью можно установить текущее положение механизма.
Кроме электромотора, редуктора и потенциометра в сервоприводе имеется электронная начинка, которая отвечает за приём внешнего параметра, считывание значений с потенциометра, их сравнение и включение/выключение мотора. Она-то и отвечает за поддержание отрицательной обратной связи.
К сервоприводу тянется три провода. Два из них отвечают за питание мотора и землю, третий доставляет управляющий сигнал, который используется для выставления положения устройства.

Крутящий момент и скорость поворота
Крутящий момент — векторная физическая величина, равная произведению радиус-вектора, проведённого от оси вращения к точке приложения силы, на вектор этой силы. Характеризует вращательное действие силы на твёрдое тело. Эта характеристика показывает, насколько тяжёлый груз сервопривод способен удержать в покое на рычаге заданной длины. Если крутящий момент сервопривода равен 5 кг×см, то это значит, что сервопривод удержит на весу в горизонтальном положении рычаг длины 1 см, на свободный конец которого подвесили 5 кг. Или, что эквивалентно, рычаг длины 5 см, к которому подвесили 1 кг.
Скорость сервопривода измеряется интервалом времени, который требуется рычагу сервопривода, чтобы повернуться на 60°. Характеристика 0,1 с/60° означает, что сервопривод поворачивается на 60° за 0,1 с. Из неё несложно вычислить скорость в более привычной величине, оборотах в минуту, но так сложилось, что при описании сервоприводов чаще всего используют такую единицу.
Иногда приходится искать компромисс между этими двумя характеристиками, так как если мы хотим надёжный, выдерживающий большой вес сервопривод, то мы должны быть готовы, что эта могучая установка будет медленно поворачиваться. А если мы хотим очень быстрый привод, то его будет относительно легко вывести из положения равновесия. При использовании одного и того же мотора баланс определяет конфигурация шестерней в редукторе.
Виды сервоприводов
Сервоприводы бывают аналоговые и цифровые. Различаются они лишь внутренней управляющей электроникой. Вместо специальной микросхемы аналогового сервопривода у цифрового собрата можно заметить на плате микропроцессор, который принимает импульсы, анализирует их и управляет мотором. Таким образом, в физическом исполнении отличие лишь в способе обработки импульсов и управлении мотором.
Шестерни для сервоприводов бывают из разных материалов: пластиковые, карбоновые, металлические.
Пластиковые, чаще всего нейлоновые, шестерни очень лёгкие, не подвержены износу, более всего распространены в сервоприводах. Они не выдерживают больших нагрузок, однако если нагрузки предполагаются небольшие, то нейлоновые шестерни — лучший выбор.
Карбоновые шестерни более долговечны, практически не изнашиваются, в несколько раз прочнее нейлоновых. Основной недостаток — дороговизна.
Металлические шестерни являются самыми тяжёлыми, однако они выдерживают максимальные нагрузки. Достаточно быстро изнашиваются, так что придётся менять шестерни практически каждый сезон. Шестерни из титана — фавориты среди металлических шестерней, причём как по техническим характеристикам, так и по цене. Они достаточно дорогие.
Существует три типа моторов сервоприводов: обычный мотор с сердечником, мотор без сердечника и бесколлекторный мотор.
Обычный мотор с сердечником (справа) обладает плотным железным ротором с проволочной обмоткой и магнитами вокруг него. Ротор имеет несколько секций, поэтому когда мотор вращается, ротор вызывает небольшие колебания мотора при прохождении секций мимо магнитов, а в результате получается сервопривод, который вибрирует и является менее точным, чем сервопривод с мотором без сердечника. Мотор с полым ротором (слева) обладает единым магнитным сердечником с обмоткой в форме цилиндра или колокола вокруг магнита. Конструкция без сердечника легче по весу и не имеет секций, что приводит к более быстрому отклику и ровной работе без вибраций. Такие моторы дороже, но они обеспечивают более высокий уровень контроля, вращающего момента и скорости по сравнения со стандартными.
Сервоприводы с бесколлекторным мотором появились сравнительно недавно. У бесколлекторных моторов нет щёток, а значит они не создают сопротивление вращению и не изнашиваются, скорость и момент выше при токопотреблении равном коллекторным моторам. Сервоприводы с бесколлекторным мотором — самые дорогие сервоприводы, однако при этом они обладают лучшими характеристиками по сравнению с сервоприводами с другими типами моторов.
Подключение к Arduino
Многие сервоприводы могут быть подключены к Arduino непосредственно. Для этого от них идёт шлейф из трёх проводов:
- красный — питание; подключается к контакту 3.3/5V или напрямую к источнику питания
- коричневый или чёрный — земля
- жёлтый или белый — сигнал; подключается к цифровому выходу Arduino

Обычный хобби-сервопривод во время работы потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать мощный сервопривод, есть смысл задуматься о выделении его в контур с дополнительным питанием.
На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega — 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite() на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite() на 11 и 12 контактах.
Библиотеки для управления сервоприводами (Servo) и для работы с приёмниками/ передатчиками на 433 МГц VirtualWire используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2.
Сервоприводы обычно имеют ограниченный угол вращения 180 градусов, их так и называют «сервопривод 180°». Но существуют сервоприводы с неограниченным углом поворота оси. Это сервоприводы постоянного вращения или «сервоприводы 360°».
Иногда при подключении серводвигателя не отрабатывают заданные команды или отрабатывают некорректно. Причина в том, что сервомоторы требуют достаточно большую мощность для питания, особенно в начале движения ротора. Эти резкие скачки потребляемой мощности могут сильно «просаживать» напряжение на Arduino. Может произойти даже перезагрузка платы. Если подобное происходит, вам надо добавить конденсатор (470 мкФ или больше) между рельсами GND и 5V на вашей макетке. Конденсатор выполняет роль своеобразного резервуара для электрического тока. Когда серводвигатель начинает работать, он получает остатки заряда с конденсатора и от источника питания Arduino одновременно. Длинная нога конденсатора — это позитивный контакт, она подключается к 5V. Отрицательный контакт часто маркируется символом ‘-‘.
Управляем через импульсы
Для начала попробуем управлять вручную без библиотек. Считываем показания из Serial Monitor — нужно ввести число от 0 до 9. Эти значения равномерно распределим на 180 градусов и получим 20 градусов на каждую единицу показаний.
int servoPin = 9; // сигнальный провод от серво на порт 9 int val; void setup() < pinMode(servoPin, OUTPUT); Serial.begin(9600); Serial.println("Servo is ready"); >void loop() < // convert number 0 to 9 to corresponding 0-180 degree angle val = Serial.read(); if (val >= '0' && val > > // define a servo pulse function void servoPulse(int pin, int angle) < // convert angle to 500-2480 pulse width int pulseWidth = (angle * 11) + 500; digitalWrite(pin, HIGH); // set the level of servo pin as high delayMicroseconds(pulseWidth); // delay microsecond of pulse width digitalWrite(pin, LOW); // set the level of servo pin as low delay(20 - pulseWidth / 1000); >
Библиотека Servo
Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека Servo.
Сервопривод постоянного вращения можно управлять с помощью библиотек Servo или Servo2. Отличие заключается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода.
Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:
- attach() — присоединяет объект к конкретному выводу платы. Возможны два варианта синтаксиса для этой функции: servo.attach(pin) и servo.attach(pin, min, max). При этом pin — номер пина, к которому присоединяют сервопривод, min и max — длины импульсов в микросекундах, отвечающих за углы поворота 0° и 180°. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно. Возвращаемого значения нет.
- write() — отдаёт команду сервоприводу принять некоторое значение параметра. Синтаксис: servo.write(angle), где angle — угол, на который должен повернуться сервопривод
- writeMicroseconds() — отдаёт команду послать на сервопривод имульс определённой длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds(uS), где uS — длина импульса в микросекундах. Возвращаемого значения нет.
- read() — читает текущее значение угла, в котором находится сервопривод. Синтаксис: servo.read(), возвращается целое значение от 0 до 180
- attached() — проверка, была ли присоединён объект к конкретному пину. Синтаксис следующий: servo.attached(), возвращается логическая истина, если объект была присоединён к какому-либо пину, или ложь в обратном случае
- detach() — производит действие, обратное действию attach(), то есть отсоединяет объект от пина, к которому был приписан. Синтаксис: servo.detach()
В библиотеке Servo для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.
Пример подключения двух сервоприводов.
#include // создаём объекты для управления сервоприводами Servo myservo1; Servo myservo2; void setup() < // подключаем сервоприводы к выводам 11 и 12 myservo1.attach(11); myservo2.attach(12); >void loop() < // устанавливаем сервоприводы в серединное положение myservo1.write(90); myservo2.write(90); delay(500); // устанавливаем сервоприводы в крайнее левое положение myservo1.write(0); myservo2.write(0); delay(500); // устанавливаем сервоприводы в крайнее правое положение myservo1.write(180); myservo2.write(180); delay(500); >
Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2. Все методы библиотеки Servo2 совпадают с методами Servo.
При работе с сервоприводами на 360 градусов функции работают по другому.
| Функция Arduino | Сервопривод 180° | Сервопривод 360° |
|---|---|---|
| Servo.write(0) | Крайне левое положение | Полный ход в одном направлении |
| Servo.write(90) | Среднее положение | Остановка сервопривода |
| Servo.write(180) | Крайне правое положение | Полный ход в обратном направлении |
Sweep
Скетч File | Examples | Servo | Sweep постоянно поворачивает насадку на 180 градусов и возвращает её обратно. В примере используется встроенная библиотека Servo.
Общая схема — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9).

#include Servo myservo; // создадим объект сервопривода int pos = 0; // начальная позиция void setup() < myservo.attach(9); // сервопривод на выводе 9 >void loop() < for (pos = 0; pos for (pos = 180; pos >= 0; pos -= 1) < // от 180 до 0 градусов myservo.write(pos); // просим повернуться на позицию значения переменной 'pos' delay(15); // ждём 15ms для достижения позиции >>
Knob
Скетч File | Examples | Servo | Knob управляет сервоприводом при помощи потенциометра. В примере используется встроенная библиотека Servo.
Общая схема: у сервопривода — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9). У потенциометра средняя ножка соединяется с аналоговым выходом A0, остальные к питанию и земле.

#include Servo myservo; // создадим объект сервопривода int potpin = 0; // аналоговый выход A0 для потенциометра int val; // значение, получаемое от аналогового выхода void setup() < myservo.attach(9); // сервопривод на выводе 9 >void loop() < val = analogRead(potpin); // считываем данные с потенциометра (от 0 до 1023) val = map(val, 0, 1023, 0, 180); // Преобразуем в интервал от 0 до 180 myservo.write(val); // устанавливаем позицию сервопривода delay(15); // небольшое ожидание, чтобы сервопривод успел выполнить команду >
Случайные повороты
Будем поворачивать серводвигатель на случайную величину. Практического смысла немного, но для демонстрации подойдёт.
#include Servo servo; // создадим объект сервопривода long randomNumber; void setup() < servo.attach(9); randomSeed( analogRead(A0) ); >void loop()
