Servo1 на сервоприводах

Servo1 на сервоприводах

Если вам нужен проект, который будет использовать все свои сервоприводы и механизмы движения, вы можете создать простого робота-паука. Если у вас есть навыки работы с техникой Fischertechnik, LEGO и K'NEX и лишние сервоприводы, этот проект для Вас. Действительно, этот паук с нелепыми движениями является большой обучающей платформой. Основной целью этого проекта является обучение основам работы сервоприводов, их синхронизации, программированию и пониманию диапазона и силы. Результат будет очень забавным.

Техника Fischertechnik, безусловно, не так популярна, как Lego или K'NEX, но она очень хорошо подходит для осуществления строительных навыков.

Видеопрезентация работы:

Шаг 1. Материалы и инструменты:

  • термоклей
  • набор лезвий
  • винтовёрт Philips
  • дрель с 7/32 сверлом
  • дремель с очень тонким сверлом

Электроника:

  • 6 AA батареек и прищепка
  • 8 микросервоприводов с креплениями
  • более 30 перемычек и контактных разъемов

Программная часть:

Servo+ i2c или опять про сервоприводы

В первой версии LTRover управление сервомоторами камеры было реализовано с использованием платы Arduino, подключенной к Raspberry через UART. В дальнейшем я отказался от этого решения и нашел интересный вариант, который позволяет подключить до 16 сервоприводов, используя I2C. На данный момент мне достаточно двух приводов, но возможность легко увеличить их количество привлекает. Есть несколько нюансов по питанию. На вывод VCC подаем 3.3 вольта с Raspberry, а вот для V+ лучше использовать отдельный источник питания на 5 вольт. На плату Adafruit 16 Channel Servo Driver необходимо самостоятельно установить электролитический конденсатор  из расчета 100 мкФ на один привод. i2c мы настраивали ранее для подключения акселерометра  ADXL345 .

Выполнив уже знакомую нам команду

sudo i2cdetect -y 1

узнаем адрес нашей платы. Скачиваем необходимые пакеты

sudo git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

переходим в папку

cd Adafruit-Raspberry-Pi-Python-Code cd Adafruit_PWM_Servo_Driver Редактируем файл Adafruit_PWM_Servo_Driver.py

sudo nano Adafruit_PWM_Servo_Driver.py

находим строку

self.i2c = Adafruit_I2C(address)

и изменяем на

self.i2c = Adafruit_I2C(address, 0) если Raspberry 256MB или self.i2c = Adafruit_I2C(address, 1) если Raspberry 512MB

Servo1 на сервоприводах

Настройка закончена, выполним

sudo python Servo_Example.py

pwm.setPWM(13, 0, servoMin)

pwm.setPWM(13, 0, servoMax)

указываем номер канала, к которому подключен привод. Останавливаем выполнение стандартной комбинацией Ctrl+С .

Я использую два привода для вращения RaspiCam. Один для перемещения в горизонтальной плоскости (X), другой в вертикальной (Y). В плоскости X камера поворачивается на 180 градусов, в Y — на 90 градусов. Диапазон поворота разобьем на 10 частей. Все эти значения получены экспериментально и вполне удовлетворяют нашим задачам. Я разместил свои файлы в папке home/pi/servo. Для корректной работы туда же необходимо скопировать файлы Adafruit_I2C.py, Adafruit_PWM_Servo_Driver.py .Ниже приведу примеры скриптов.

Arduino: Робо-рука на двух сервоприводах

Никогда раньше не имел дело с микроконтроллерами, поэтому решил начать своё знакомство с Ардуино. Понадобились базовые знания С/C++ и немного электроники.

Цель: “При помощи Arduino Uno и двух сервоприводов (9g SG90 Mini Micro Servo ) написать на листе бумаги любое словосочетание”

D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/1.jpg" /%

Стояли такие задачи:

1) Установить среду разработки под Linux Fedora, получилось не сразу, но долго мучиться не пришлось. Был баг с поискам “Serial Port”, но гугл и терпение сделали свое дело.

2) Разобраться в том, что же такое за чудо сервопривод. в народе “серва”. Так как изначально у меня были сервы с вращением против часовой стрелки, весь код писался под них, но когда пришло время поменять их на новые “дешёвые” SG90, вдруг обнаружилось, что новые вращаются по часовой стрелке! Проблема решается просто: при помощи паяльника, меняются местами провода: на двигателе, и крайние (1ый и 3ий) провода на потенциометре.

D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/4.jpg" /%

3) Собрать техническую конструкцию “руки”, название “рука” звучит конечно громко, но главное чтобы отличалось от “плоттера” .

Для этого:

• Обзавелся макетной платой и горсткой проводов из витой пары, на оба конца провода я припаял ножки от старых электронных компонентов, в моем случае я пожертвовал конденсаторами.

• Выпилил из гетинакса. найденном на помойке радиозавода в 90-х, “плечо” и “предплечье”, их длина 80мм, а расстояние от крепления к серве до другого крепления и стержня 50мм.

D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/2%20.jpg" /%

• Для выведения каракуль сначала использовал стержень от гелевой ручки, но за тонкой линией сложно было скрыть мелкие подёргивания серв, остановился на варианте с фломастером.

• Закрепил первую “серву” в металлической банке.

Всё, конструкция готова, но к сожалению без программной начинки она только немного вздрагивает при подаче питания на Ардуину.

D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/5.jpg" /%

4) Программирование:

Подтянув свои знания в области С/C++, я начал писать код…

  1. Как полагается, на бумажке, я вывел две небольшие формулы определения углов поворота для “серв” по заданной координате (X,Y). Точкой отсчета (0;0) — служит крепление плеча к первому сервоприводу.

D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/Done.jpg" /%

  • После череды экспериментов, я понял, что до конца моей задумки еще далеко, а сервоприводы, с каждым моим багом, всё страдали и страдали от бестолковых значений переменных. Поэтому было принято решение писать сначала визуализированную модель в graphics.h старого доброго BorlandC. Кому интересно, что я там свизуализировал, пишите лично.
  • Теперь, уже не опасаясь за сохранность имущества я продолжал писать код.

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

  • Дальше я задался вопросом: ”Как бы оригинально разместить слова?”, придумал, что пользователем будет задаваться середина и угол наклона слова, что в итоге превратилось только в угол наклона. Вот и здорово, нечего лишними вводными данными мозг людям пудрить.
  • Думал, как не изобретать велосипед и с помощью FreeType использовать метод вывода векторного текста на экран, но не хватило терпения разобраться в структуре библиотек шрифтов. В итоге написал собственную библиотеку Alphabet.h, которая создаёт шаблон из точек, а я уже по этим точкам строил прямые для каждой латинской буквы.
    D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/Arduino%231/Lttr_A.gif" /%
  • Написав цикл по считыванию символов, столкнулся с задачей: “Как же мне не сравнивать каждый ASKII-код символа IF-ом, а сделать сразу, чтобы считанная буква воспринималась функцией?”. Тут я полез задавать вопросы на ГИК форумы, пока ожидал на них регистрации, на авось понадеялся и выложил свой вопрос на “Вопрос и ответ” от Google, не успело пройти 15мин, проблема была решена массивом указателей на функции.
  • Не буду описывать, как создавал библиотеки, об этом хорошо написано на сайте .

    Скажу одно, что создавал их не зря, так как код уменьшился с 600 строк до 60, а это визуально приятней! Правда, созданием библиотек я увеличил вес скетча на 2Кб, 6% — ощутимо!

  • Компиляция прошла успешно! Боялся за память на Arduino и не зря, несмотря на то что в Uno 32Kb, скетч размером больше 29 не пройдет, так как 3Kb заняты загрузчиком:

    Binary sketch size: 29972 bytes (of a 32256 byte maximum)

    Немного переписав букву ”R” через “P”, и “Q” через “O”, уменьшил вес и все заработало как надо!

    Теги: 

    Рекомендуем также прочитать

    Сервоприводы SERVO-E-5
    Электрическая схема и печатная плата регулятора оборотов коллекторного двигателя постоянного тока
    Mалогабаритные электродвигатели