"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

среда, 19 февраля 2020 г.

19.02.20 Окончание. PDM

  Пульс плотности модуляции , или ДПМ , является одной из форм модуляции используется для представления аналогового сигнала с двоичным сигналом . В сигнале PDM, конкретные амплитуды значение не кодируется в кодовые слова импульсов разного веса , как они были бы в импульсно-кодовой модуляции (PCM); а относительная плотность импульсов соответствует амплитуде аналогового сигнала. Выход в 1-битного ЦАП является таким же , как PDM кодирования сигнала. Широтно-импульсной модуляции (ШИМ) представляет собой частный случай ДПМ , где фиксируется частота коммутации и все импульсы , соответствующие одному образцу являются смежными в цифровом сигнале. Для 50% напряжения с разрешением 8 бит, ШИМ сигнал включится на 128 тактовых циклов , а затем выключить для остальных 128 циклов. С ДПМ и той же тактовой частоте сигнала будет чередоваться между включением и выключением любого другого цикла. В среднем составляет 50% для обоих сигналов, но сигнал ДПМ переключается чаще. При 100% или 0% уровня, они одинаковы.

Двигатель который может находиться в заданном положении, а при воздействии внешних факторов, например, принудительном отклонении вала, удерживает его положение неизменным – называется сервоприводом. Вообще определение звучит несколько иначе:
Сервопривод, это двигатель управляемый отрицательной обратной связью.
Обычно с сервопривода выходит три провода:
  • Плюс питания.
  • Минус питания.
  • Управляющий сигнал.
Блок управления сравнивает сигнал на встроенном датчике положения и сигнал, пришедший по управляющему проводу, если они различаются, то происходит поворот на угол, при котором разница между сигнала нивелируется.
Принцип работы сервопривода
Основные характеристики сервоприводов:
  • Скорость поворота (время, за которое вал поворачивается на угол 60°);
  • Крутящий момент (кг/см, т.е. сколько килограмм может выдерживать двигатель на рычаге в 1 см от вала);
  • Напряжение питания;
  • Потребляемый ток;
  • По способу управления (аналоговый или цифровой, существенной разницы нет, но цифровой более быстродействующий и стабильный).
Обычно период сигнала равен 20 мс, а длительность управляющего импульса:
  • 544 мкс – соответствует 0°;
  • 2400 мкс – соответствует углу 180°.

Сервопривод для Ардуино

Сервопривод – это такой вид привода, который может точно управлять параметрами движения. Другими словами, это двигатель, который может повернуть свой вал на определенный угол или поддерживать непрерывное вращение с точным периодом.

Схема и типы сервоприводов

 

Принцип работы сервопривода основан на обратной связи с одним или несколькими системными сигналами. Выходной показатель подается на вход, где сравнивается его значение с задающим действием и выполняются необходимые действия – например, выключается двигатель. Самым простым вариантов реализации является переменный резистор, который управляется валом – при изменении параметров резистора меняются параметры питающего двигатель тока.
В реальных сервоприводов механизм управления гораздо сложнее и использует встроенные микросхемы-контроллеры. В зависимости от типа используемого механизма обратной связи выделяют аналоговые и цифровые сервоприводы. Первые используют что-то, похожее на потенциометр, вторые – контроллеры.
Сервопривод устройство 
Вся схема управления серво находится внутри корпуса, управляющие сигналы и питание подаются, как правило, идут по трем проводам: земля, напряжение питания и управляющий сигнал.

Подключение серводвигателя к ардуино

Сервопривод обладает тремя контактами, которые окрашены в разные цвета. Коричневый провод ведет к земле, красный – к питанию +5В, провод оранжевого или желтого цвета – сигнальный. К Ардуино устройство подключается через макетную указанным на рисунке образом. Оранжевый провод (сигнальный) подключается к  цифровому пину, черный и красный – к земле и питанию соответственно. Для управления серводвигателем не требуется подключение именно к шим-пинам – принцип управления серво мы уже описывали ранее.
Подключение сервопривода к ардуино
Не рекомендуется подключать мощные серво напрямую к плате , т.к. они создают для схемы питания Arduino ток, не совместимый с жизнью – повезет, если сработает защита. Чаще всего симптомы перегрузки и неправильного питания сервопривода заключаются в “дергании” серво, неприятному звуку и перезагрузке платы. Для питания лучше использовать внешние источники, обязательно объединяя земли двух контуров.

Сервопривод SG90

Сервопривод SG90

Характеристики и подключение SG-90

Если вы собрались купить самый дешевый и простой сервопривод, то SG 90 будет лушим вариантом  Этот серво чаще всего используется в управлении небольшими легкими механизмами с углом поворота от 0° до 180°.
Технические характеристики SG90:
  • Скорость отработки команды 0,12с/60 градусов;
  • Питание 4,8В;
  • Рабочие температуры от -30С до 60 С;
  • Размеры 3,2 х 1,2 х 3 см;
  • Вес 9 г.

Описание SG90

Цвета проводов стандартные. Сервопривод стоит недорого, он не обеспечивает точных настроек начальных и конечных позиций. Для того, чтобы избежать  лишних перегрузок и характерного треска в положении 0 и 180 градусов лучше выставлять крайние точки в 10° и 170°. При работе устройства важно следить за напряжением питания. При сильном завышении  этого показателя могут повредиться механические элементы зубчатых механизмов.

Скетч для управления сервоприводом в Arduino

Управление сервоприводом напрямую через изменение в скетче длительности импульсов – достаточно нетривиальная задача, но у нас, к счастью, есть отличная библиотека Servo, встроенная в среду разработки Arduino. Все нюансы программирования и работы с сервоприводами мы рассмотрим в отдельной статье. Здесь же приведем простейший пример использования Servo.
Алгоритм работы прост:
  • Для начала мы подключаем Servo.h
  • Создаем объект класса Servo
  • В блоке setup указываем, к какому пину подключен серво
  • Используем методы объекта обычным для C++ способом. Самым популярным является метод write, которому мы подаем целочисленное значение в градусах (для сервопривода 360 эти значения будут интерпретироваться по-другому).

Для управления такими сервоприводами с ардуино в вашем распоряжении есть встроенная в IDE библиотека Servo, у неё небольшой набор команд:
  • attach() — добавить переменную к пину. Пример: названиеПривода.attach(9) – к 9 пину подключаем сервопривод. Если вашему приводу нужны нестандартные длины управляющих импульсов (544 и 2400 мкс), то их можно задать через запятую после номера пина, например: servo.attach(pin, min угол (мкс), max угол в МКС));
  • write() — задает угол поворота вала в градусах;
  • writeMicroseconds() — задает угол, через длину импульса в микросекундах;
  • read() — определяет текущее положение вала;
  • attached() — Проверяет, задан ли пин с подключенным сервоприводом;
  • detach() — отмена команды attach.

Пример простого скетча для работы с сервоприводом

Пример проекта, в котором мы сразу сначала устанавливаем серводвигатель на нулевой угол, а затем поворачиваем на 90 градусов.
  1. #include <Servo.h>

  2. Servo servo; // Создаем объект
  3. void setup() {
  4. servo.attach(9)// Указываем объекту класса Servo, что серво присоединен к пину 9
  5. servo1.write(0)// Выставляем начальное положение
  6. }

  7. void loop() {
  8. servo.write(90); // Поворачиваем серво на 90 градусов
  9. delay(1000);
  10. servo.write(1800);
  11. delay(100);
  12. servo.write(90);
  13. delay(1000);
  14. servo.write(0);
  15. delay(1000);
  16. }

Скетч для двух сервпоприводов

А в этом примере мы работаем сразу с двумя сервоприводами:
  1. #include <Servo.h>

  2. Servo servo1; // Первый сервопривод
  3. Servo servo2; // Второй сервопривод

  4. void setup() {
  5. servo1.attach(9)// Указваем объекту класса Servo, что серво присоединен к пину 9
  6. servo2.attach(10)// А этот servo присоединен к 10 пину

  7. }

  8. void loop() {
  9. // Выставялем положения
  10. servo1.write(0);
  11. servo2.write(180);
  12. delay(20);
  13. // Меняем положения
  14. servo2.write(0);
  15. servo1.write(180);
  16. }


Управление сервоприводом с помощью потенциометра

В этом примере поворачиваем серво в зависимости от значения, полученное от потенциометра. Считываем значение и преобразовываем его в угол с помощи функции map:
  1. //Фрагмент стандартного примера использования библиотеки Servo
  2. void loop() {
  3. val = analogRead(A0); // Считываем значение с пина, к которому подключен потенциометр
  4. val = map(val, 010230180); // Преобразуем число в диапазоне от 0 до 1023 в новый диапазон - от 0 до 180.
  5. servo.write(val);
  6. delay(15);
  7. }

map(value, fromLow, fromHigh, toLow, toHigh)

 

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}