- Raspberry pi 3 сервопривод
- Управление несколькими сервоприводами на Raspberry Pi для механизма поворота/наклона PI-камеры
- Управление несколькими сервоприводами на Raspberry Pi для механизма поворота/наклона PI-камеры
- Шаг 1: компоненты
- Шаг 3: схема подключения
- Шаг 4: калибровка сервоприводов
- Шаг 5: создание скрипта Python
- Шаг 6: Механизм поворота и наклона
- Шаг 7: самодельный механизм поворота и наклона
- Шаг 8: подключение электроники
- Шаг 9: скрипт Python
- Шаг 10: циклический тест для сервоприводов
- Шаг 11: Заключение
- Raspberry Pi — ШИМ и Сервопривод
- Что такое PWM (ШИМ)?
- Программная реализация ШИМ
- Генерирование ШИМ сигнала с использованием аппаратных ресурсов Raspberry Pi
- Генерирование аппаратного ШИМ сигнала на Python
- Управление сервоприводом
- Управление сервоприводом с помощью программно сформированного ШИМ
- Управление сервоприводом с помощью ШИМ, сформированного через DMA
- Servoblaster
- Adafruit 16-channel servo driver
- Dr. Monk’s DIY Electronics Blog
- Thursday, July 26, 2012
- Raspberry Pi GPIO driving Servo
- Raspberry pi 3 сервопривод
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- Re: Controlling servos
- PWM (Pulse Width Modulation):
- Servo Motor and PWM:
Raspberry pi 3 сервопривод
Управление несколькими сервоприводами на Raspberry Pi для механизма поворота/наклона PI-камеры
Управление несколькими сервоприводами на Raspberry Pi для механизма поворота/наклона PI-камеры
В этом обучающем проекте будет рассмотрено управление несколькими сервоприводами для позиционирования PI-камеры с помощью механизма поворота/наклона с использованием Raspberry Pi 3 Model B и программы на Python.
У подобной камеры с механизмом поворота/наклона множество применений. Это может быть система видеонаблюдения или робот с дистанционным управлением. У Raspberry PI вычислительной мощности достаточно и что бы реализовать относительно несложную обработку изображений и к примеру, реализовать автоматическое слежение за движущимся объектом или поиск нужного объекта. И многое другое. Примеры реализации некоторых подобных вещей будут рассмотрены в будущих обучающих проектах.
Шаг 1: компоненты
С помощью ШИМ (широтно-импульсная модуляция) можно управлять мощностью нагрузки, яркостью свечения светодиода, скоростью вращения моторов, регулировать напряжение в преобразователях напряжения и т.д.
Принцип работы следующий. Генератор создаёт прямоугольные импульсы определённой частоты. Эта частота постоянна, а длительность импульса можно изменять. К примеру, если нужно управлять яркостью свечения светодиода, для этого можно использовать ЦАП (цифро-аналоговый преобразователь, DAC). У Raspberry Pi нет аналогового выхода (ЦАП), вместо него можно использовать ШИМ. Чем больше длительность импульса, тем больше среднее значение напряжения и наоборот, чем меньше длительность импульса, тем меньше среднее напряжение.
В случае со светодиодом, если частота будет слишком низкая, визуально светодиод будет мигать, а не менять яркость.
Кроме уже упомянутого, ШИМ используется и при управлении некоторых сервоприводов, контроллеров оборотов коллекторных или BLDC моторов и прочих вещах, используемых в моделизме и робототехнике. В данном случае нас интересуют сервоприводы. Угол, на который будет проворачиваться сервопривод задаётся длительностью импульса.
Шаг 3: схема подключения
Сервоприводы будут подключены к внешнему источнику питания 5В, а управляющий провод к Raspberry Pi. Цвета проводов у различных сервоприводов могут отличаться, в данном случае для SG90 распиновка следующая:
- коричневый — «земля»
- красный — «+5В»
- желтый — сигнальный
К GPIO 17 подключается управляющий провод сервопривода наклона, к GPIO 27 сервопривод поворота. Дополнительно для защиты выводов Raspberry Pi можно использовать резистор 1кОм.
Если Вы также будете использовать отдельные источники питания для Raspbery Pi и сервоприводов, обязательно соедините их земли, в противном случае электроника может выйти из строя. В данном случае земля от внешнего источника питания для сервоприводов подключена к выводу земли (возле GPIO 17) на Raspberry Pi.
Шаг 4: калибровка сервоприводов
У SG90 от различных производителей (могут выпускаться со своей наклейкой, например, «FeeTech FS90» или как в оригинальной «TowerPro SG90») параметры сервопривода могут немного отличаться. Если питающее напряжение обычно до 4.8-5в, частота управляющих импульсов 50Гц (т.е. период следования сигнала 20мс), а угол, на который проворачивается сервопривод примерно 180градусов, то длительность управляющего импульса очень часто отличается.
К примеру длительность управляющего импульса может быть от 1мс до 2мс или от 0.75мс до 1.85мс или от 0.5мс до 2.4мс и т.д. Для сервоприводов от одного производителя, длительность управляющего импульса тоже может немного отличаться. Калибровка — это определение, какие длительности импульсов соответствуют минимальной и максимальной длительность управляющего импульса и каким углам проворачивания вала сервопривода они соответствуют.
Под нейтральным положением может подразумеваться то положение, в которое проворачивается вал при средней длительности импульса (в данном случае это 1.5мс). Обозначать в градусах могут как на картинке выше, т.е. нейтральное 90 градусов и крайние положения как 0 и 180. Или под нейтральным подразумевать 0 градусов, а крайние обозначать как -90 и +90. С обозначениями углов это условность, могут быть и другие варианты. В данном случае будет использоваться первый вариант.
Для программирования позиции сервопривода с использованием Python очень важно знать соответствующий коэффициент заполнения (англ. duty cycle) для вышеуказанных позиций (задаётся в процентах). К примеру длительность импульса 2мс, при периоде следования сигнала 20мс это коэффициент заполнения 10%. Давайте сделаем вычисления для всех углов:
- исходное положение ==> (0 градусов) длительность импульса 1мс ==> коэффициент заполнения = 1мс/20мс*100% = 5%
- нейтральное положение ==> (90 градусов) длительность импульса 1,5мс ==> коэффициент заполнения = 1,5мс/20мс*100% = 7,5%
- конечная позиция ==> (180 градусов) длительность импульса 2мс ==> коэффициент заполнения = 2мс/20мс*100% = 10%
Таким образом коэффициент заполнения варьируется от 5% до 10%.
Давайте откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):
Импортируем модуль RPI.GPIO и называем его GPIO:
import RPi.GPIO as GPIO
Определите, какие схемы нумерации выводов хотите использовать (BCM или BOARD). Я провел этот тест с BOARD, поэтому используемые контакты были физическими (GPIO 17 это контакт 11 и GPIO 27 это контакт 13). Мне было легко их идентифицировать и не ошибиться во время теста (в финальной программе я буду использовать BCM). Выбираем:
Определяем вывод сервопривода, который будет использоваться:
Если хотите использовать схему BCM, последние 2 команды должны быть заменены на:
GPIO.setmode(GPIO.BCM)
tiltPin = 17
Теперь указываем, что этот вывод будет работать как выход:
Настраиваем частоту, для SG90 нужно 50 Гц:
tilt = GPIO.PWM(tiltPin, 50)
Включаем генерацию сигнала ШИМ на выводе и задаём начальный коэффициент заполнения равный нулю:
Теперь мы можем устанавливать различные значения коэффициента заполнения и наблюдать за движением сервопривода. Давайте начнем с 5% и посмотрим, что происходит:
Сервопривод перешел в «нулевое положение». Сервопривод продолжал вращаться, при задании заполнения вплоть до 3%. При задании заполнения 2% сервопривод оставался в том же положении. После чего начав задавать значения больше 2%, движение сервопривода в моём случае начало происходить при установке коэффициента заполнения более 3%. Итак, 3% — это минимальное заполнение (позиция «0 градусов») для этого сервопривода.
То же самое произошло и с максимальным коэффициентом заполнения. Для начала установлено 10%:
Затем задавались большие значения, сервопривод продолжал проворачиваться при установке коэффициента заполнения вплоть до 13%. Таким образом максимальный коэффициент заполнения для данного сервопривода это 13%, угол, на который проворачивается вал сервопривода составил примерно 180 градусов (но это в данном случае, в зависимости от сервопривода физический угол может оказаться и больше и меньше). Итак, в результате калибровки получены следующие данные:
0 градусов ==> заполнение 3%
90 градусов ==> заполнение 8%
180 градусов ==> заполнение 13%
После окончания калибровки останавливаем ШИМ и очищаем GPIO:
Для второго сервопривода процедура калибровки аналогична.
Шаг 5: создание скрипта Python
Для управления сервоприводами с использованием ШИМ, функции на Python нужно передавать значение коэффициента заполнения, указываемого в процентах. В данном случае удобней будет оперировать не коэффициентом заполнения, а градусами.
Сделать это очень просто. Мы знаем, что диапазон заполнения в пределах от 3% до 13% и что это эквивалентно диапазону углов от 0 до 180 градусов. Так же мы знаем, что зависимость линейная.
Позже в коде пересчёт заданного угла в коэффициент заполнения соответственно будет таким:
dutycycle = angle/18 + 3
Давайте создадим файл «angleServoCtrl.py» скрипта на Python для выполнения тестов. По сути, мы повторим то, что мы делали раньше в Python Shell:
Функция setServoAngle(servo, angle) получает в качестве аргументов номер вывода GPIO, к которому подключен сервопривод и значение угла, в который сервопривод должен провернуться.
В консоли этот скрипт запускается так:
sudo python3 angleServoCtrl.py 17 45
Вышеприведенная команда установит сервопривод, подключенный к GPIO 17, под углом 45 градусов.
Файл «angleServoCtrl.py» можно скачать по ссылке .
Шаг 6: Механизм поворота и наклона
На следующем изображении показано, как работает механизм:
В этом проекте pan/tilt механизм будет вращать камеру только в диапазоне углов от 30 до 150 градусов.
Этого диапазона будет достаточно для камеры.
Шаг 7: самодельный механизм поворота и наклона
Вы можете взять готовый механизм поворота и наклона, на подобии как на изображении в предыдущем шаге или сделать свой собственный.
В этом проекте будет использован самодельный:
Шаг 8: подключение электроники
После сборки механизма поворота/наклона, подключите сервоприводы по схеме из третьего шага. Последовательность подключения электроники:
- отключить питание Raspberry Pi и сервоприводов
- соберите всю схему
- на всякий случай ещё раз всё перепроверьте
- включите питание Raspberry Pi
- если все в порядке, подключите питание сервоприводов
Подключать и настраивать камеру пока не будем, это будет рассмотрено в следующем обучающем проекте.
Шаг 9: скрипт Python
Создадим скрипт «servoCtrl.py» для одновременного управления обоими сервоприводами:
При запуске скрипта в качестве параметров нужно указать углы для обоих сервоприводов:
sudo python3 servoCtrl.py 45 120
Приведенная выше команда установит сервопривод поворота в позицию «45 градусов», сервопривод наклона в позицию «120 градусов». Если скрипту не будут переданы параметры, оба сервопривода провернуться в позицию «90 градусов».
Файл крипта «servoCtrl.py» можно скачать по ссылке .
Шаг 10: циклический тест для сервоприводов
Создадим скрипт » servoTest.py» для автоматического движения обоими сервоприводами в диапазоне углов от 30 до 150 градусов:
Осциллограф только для иллюстрации теории ШИМ, как объяснялось ранее.
Приведенный выше код скрипта «servoTest.py» можно скачать по ссылке .
Шаг 11: Заключение
Сделанное в этом обучающем проекте можно использовать для различных целей, некоторые примеры реализации будут рассмотрены в следующих обучающих проектах. К примеру управление и просмотр изображения с RPi-камеры через веб-страницу:
Или создание автоматического слежения за предметом:
Raspberry Pi — ШИМ и Сервопривод
Raspberry Pi имеет несколько путей реализации PWM (ШИМ) (Широтно-импульсной модуляции). Мы рассмотрим как реализовать, ШИМ программно, и задействуем для генерации ШИМ аппаратные ресурсы Raspberry Pi. Сначала будем менять яркость светодиода, а затем научимся управлять сервоприводом.
Что такое PWM (ШИМ)?
Программная реализация ШИМ
Напишем скрипт pwm_soft.py:
Светодиод будет плавно загораться и плавно гаснуть.
Программная реализация ШИМ позволяет сформировать ШИМ-сигнал на любому выводе. В этом примере мы используем RPi.GPIO для программной генерации ШИМ сигнала. А это значит, что тратятся вычислительные ресурсы микрокомпьютера. Если микрокомпьютер будет отвлекаться на другие задачи, ШИМ сигнал будет искажаться и не будет стабильным. Это не принципиально, если ШИМ применяется для управления яркостью светодиода. Но может стать неприемлемым, когда ШИМ применяется для формирования управляющего сигнала. Например, при управлении сервоприводами программная реализация ШИМ не может стабильно удерживать сервоприводы в заданном положении. Это заметно на видео ниже.
Raspberry Pi имеет техническую возможность использовать аппаратный ресурс для генерации ШИМ.
Генерирование ШИМ сигнала с использованием аппаратных ресурсов Raspberry Pi
Подключим светодиод к GPIO18 как указано на схеме:
Первый выход ШИМ заведен на GPIO18, другие каналы ШИМ задействованы на аудио-выходе. Выполним следующие команды для формирования на GPIO18 ШИМ сигнала. Настраиваем первый канал PWM (GPIO18):
Задаем скважность от 0 до 1024:
Светодиод должен светиться вполсилы. Поэкспериментируйте с ШИМ. Попробуйте задать следующие значения:
Генерирование аппаратного ШИМ сигнала на Python
Напишем срипт pwm.py:
Светодиод будет плавно загораться и плавно гаснуть. Аппаратная реализация ШИМ обеспечивает более стабильный результат. К сожалению аппаратный выход в Raspberry Pi только один. Но существует еще пара методов генерирования ШИМ. Через DMA, и использование внешнего PWM контроллера (ШИМ контроллера). Эти методы рассмотрим ниже для управления сервоприводами, поскольку на светодиодах разница не будет заметна.
Управление сервоприводом
Обычно сервоприводы используют питание 5В. Маломощный сервопривод можно питать от Raspberry Pi. Но если привод потребляет достаточно большой ток, или Вам нужно подключить несколько сервомашинок, лучше не нагружать Raspberry Pi и использовать отдельный источник питания. Схема подключения сервопривода:
Управление сервоприводом с помощью программно сформированного ШИМ
Запустим servo.py:
Я намеренно вставил функции print в код. Наличие этих функций оказывает описанную ранее проблему нестабильности программно сформированного ШИМ. Сервомашинка НЕ фиксируется в заданном положении и дергается. Если удалить инструкции print, проблема уменьшается или вообще исчезает.
Управление сервоприводом с помощью ШИМ, сформированного через DMA
Создаем срипт servo_dma.py:
Теперь сервопривод работает стабильно. То есть, для управления сервоприводами о программном ШИМ желательно вообще забыть.
Подробности использования RPIO читайте здесь: http://pythonhosted.org/RPIO/pwm_py.html#examples
На этом видео видно разницу между различными способами генерирования ШИМ сигнала:
Servoblaster
Установим Servoblaster:
Проверяем установился ли Servoblaster корректно:
Можно просмотреть конфиг Servoblaster-а:
Выводы на которые можно подключать сервоприводы приведены в следующей таблице:
Допустимые значения положения зависят от вашего сервопривода. В большинстве случаев они лежат в диапазоне от 80 до 249. Напишем следующий срипт для управления сервоприводом:
Есть одна особенность Servoblaster. Пока он запущен, он занимает 8 указанных в таблице выходов и под другие цели Вы их уже не сможете задействовать. Попробуйте запустить ранее написанные скрипты:
Сервомашинка не работает как следует.
Попробуем остановить демон Servoblaster и повторить попытку. Останавливаем Servoblaster с помощью команды:
Проверяем нет теперь servod в запущенных процессах:
Повторяем запуск скриптов:
Все работает как следует. Запускаем servod командой:
Возникает вопрос: а что делать, если надо задействовать лишь несколько каналов, а не все 8? Servoblaster можно конфигурировать благодаря следующим опциям:
—pcm tells servod to use PCM rather than PWM hardware to implement delays —idle-timeout=Nms tells servod to stop sending servo pulses for a given output N milliseconds after the last update —cycle-time=Nus Control pulse cycle time in microseconds, default 20000us —step-size=Nus Pulse width increment step size in microseconds, default 10us —min=
Сейчас нас интересует опция —p1pins. Остановим Servoblaster:
И запустим его с новыми опциями:
Теперь Servoblaster занимать одну ногу P1-11 (GPIO17). Проверить это можно просмотрев конфиг:
Если перезагрузить Raspbery Pi, Servoblaster снова будет работать с начальными настройками. Для того, чтобы при старте системы Servoblaster запускался с Вашими настройками, укажите их в файле /etc/init.d/servoblaster
Adafruit 16-channel servo driver
Dr. Monk’s DIY Electronics Blog
Open Source hardware, Arduino, Raspberry Pi, micro:bit, BeagleBone, DIY electronic construction, reviews, projects, how-tos and recipes.
Thursday, July 26, 2012
Raspberry Pi GPIO driving Servo
I have experimented with GPIO on the Raspberry Pi, just turning an LED on and off here. But since then Ben Croston has improved the RPi GPIO Python library to do most of the work in C and I can confirm that it is a lot faster. Driving servo motors requires precise timing, so I decided to see how the Pi would perform this task.
Here is a video of the servo in action. It is set to stay on the left for a few seconds, then move to the middle position, then swing all the way to the right, then scoot back to the left.
As you can see it works, but is rather jittery. This would make it okay for some applications.
Here is what I did, for anyone wishing to try it for themselves.
I did not like the idea of using the GPIO pin to directly drive the control signal for the servo. You may get away with it, but I wouldn’t risk it, and it may not work as the GPIO pins are 3V where as the servo expects a 5V control signal.
The transistor I used was a BC548, but any similar NPN transistor (like the 2N2222) should do the trick.
To build this prototype, I used Adafruit’s Cobbler. This very handy little gadget allows you to link the GPIO connector to breadboard.
You might want to open this up to full size to see what’s going on.
The transistor is in the bottom three rows. The bottom most row being connected to GND on the cobbler, the base connection (second row up) is linked by a 1kΩ resistor to #17 on the cobbler.
An external 5V power supply was used to provide the power to the servo. I tried using the 5V connection from the servo, but even with big (2200µF) and small capacitors across the supply, the load from the servo was enough to crash the Pi. This external power supply was connected to the red and green jumper leads to the left.
A second 1kΩ resistor is connected from the external +5V to the collector of the transistor (third row up) using another 1kΩ resistor.
The connections to the servo are GND, +5V (from the external supply) and the control signal from the collector of the transistor (yellow lead).
You will need to install the new version of the RPi.GPIO library from here. I used version 0.3.1a.
It requires you install python3-dev by entering the following from the terminal:
sudo apt-get install python3-dev
To install the library itself, fetch the archive from the link above, unpack into a directory and then run the command:
sudo python3 setup.py install
If you need more instructions on this, see my earlier post here . This part of the installation is the same, except I am now using python3 instead of python.
Here is the Python program to generate the pulses.
import RPi.GPIO as GPIO
import time
pin = 17
refresh_period = 0.02
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, True)
while True:
for i in range(1, 100):
GPIO.output(pin, False)
time.sleep(0.001)
GPIO.output(pin, True)
time.sleep(refresh_period)
for i in range(1, 100):
GPIO.output(pin, False)
time.sleep(0.0015)
GPIO.output(pin, True)
time.sleep(refresh_period)
for i in range(1, 100):
GPIO.output(pin, False)
time.sleep(0.002)
GPIO.output(pin, True)
time.sleep(refresh_period)
This has to be run as root, so save it in a file called ‘servo_test.py’ and then run it with the command:
sudo python3 servo_test.py
The program generates pulses for the servo that look like this:
The pulses need to be about 20 mS apart, and the length of each pulse determines the servo position. A pulse of 1.5mS puts it in the middle position, 1.0mS one side and 2.0mS the other side.
Conclusion
The Pi can generate pulses fast enough to control a servo, but the operating system means that the pulses are not terribly reliable. The process may get interrupted at any time, lengthening the pulses, resulting in the jitter that you see.
If you want true accurate control, then you probably need to have the Pi delegate looking after the servos to an Arduino, as I do in my Pi with Arduino over USB blog post.
About the Author
These are my books. Click on the image below to find out more about them.
Raspberry pi 3 сервопривод
Hi, I am new to the Raspberry Pi and have limited electronics knowledge. I’ve done a fair bit of googling around how to control servos with the pi and there is a lot of different information. I eventually used the circuit layout from this:
I used the GPIO library https://pypi.python.org/pypi/RPi.GPIO and a variation on this program to get the servo moving:
I have a few questions:
[*] What GPIO commands should I use to control the servo? The above worked, but I’m not sure what it is actually doing. Can I just turn the GPIO to ON?
[*] Is controlling servos directly via GPIO pins «safe» for the pi?
[*] Should I buy a board for this? If so, which one and how should I connect?
Re: Controlling servos
Servos generally have a rather arcane interface (servos pre-date digital electronics).
To set the position of a servo you need to send it regular pulses (50 times a second is fairly normal). So every 20 ms you need to send a pulse.
The length of the pulse determines the servo position. A 1.5 ms on pulse during the 20 ms means go to the centre position. Shorter pulses move clockwise, longer pulses move anti-clockwise (there is a 1 in 2 chance I have the directions wrong).
Just setting the gpio high or low and not changing it means nothing to the servo. It needs pulses.
It is safe to drive the control signal directly from a gpio.
You don’t need to buy external hardware. Some people think you may have less jitter if you use external hardware. Personally I’d only buy an interface board if the software solution fails.
Re: Controlling servos
Thanks, great reply!
What’s the best way of programmatically sending the pulses? Should I write something like this:
Re: Controlling servos
That is absolutely the correct way.
It will work, but.
Python (like everything else) is being interrupted by the operating system to let other programs run. They will cause jitter in the pulse when your program is interrupted between the start and stop pulse lines. It may be OK for your use, it depends on what you want to do.
There is a solution. Use one of the software solutions which use DMA to time the pulses. DMA is not affected by operating system interrupts. Look for servoblaster, piblaster, pipwm etc., or my own pigpio.
Re: Controlling servos
These will handle the timing for you, producing a steady stream of pulses.
Trying to drive servo PWM from script is not likely to work very well because timing will be variable and your servos will probably jitter. Use a library that runs timing from hardware or high-priority kernel code.
An alternative is a dedicated servo controller to take the load off the Pi.
E.g. http://www.hobbytronics.co.uk/pololu-se . word=servo
Re: Controlling servos
Re: Controlling servos
I don’t know what you want to use your Servo for, but if it’s for something that doesn’t need much precision (such as moving in increments of 10 degrees or more) using a software implementation of pulse-width modulation (PWM) is the easiest approach.
Simply connect the signal wire to a GPIO pin, the positive and negative to 5V and GND respectively (assuming it’s a 5V Servo), and set the GPIO pin to a PWM pin at 50Hz for the required duty cycle.
I’ve made the following video that walks you through the steps:
Hope that helps!
Re: Controlling servos
Re: Controlling servos
My biped robot uses no external chips to control the 6 servos, its all just software PWM (servoblaster):
http://www.raspberrypi.org/phpBB3/viewt . 37&t=47315
The view that software PWM is very «jittery» assumes the pi is slower than it is IMO. I find it fine in practice.
Re: Controlling servos
Re: Controlling servos
You may like to look at the Raspy Juice board.
It has an ATMEGA controller to drive four servos leaving the PI free for other jobs. In addition, it has a good power regulator on board to allow the Pi to be powered by anything from 6 to 23 volts.
You can get it from http://www.2wattelements.com/ or Adafruit.
Re: Controlling servos
JontyMC wrote: Hi, I am new to the Raspberry Pi and have limited electronics knowledge. I’ve done a fair bit of googling around how to control servos with the pi and there is a lot of different information. I eventually used the circuit layout from this:
I used the GPIO library https://pypi.python.org/pypi/RPi.GPIO and a variation on this program to get the servo moving:
I have a few questions:
[*] What GPIO commands should I use to control the servo? The above worked, but I’m not sure what it is actually doing. Can I just turn the GPIO to ON?
[*] Is controlling servos directly via GPIO pins «safe» for the pi?
[*] Should I buy a board for this? If so, which one and how should I connect?
Raspberry Pi is an ARM architecture processor based board designed for electronic engineers and hobbyists. The PI is one of most trusted project development platforms out there now. With higher processor speed and 1 GB RAM, the PI can be used for many high profile projects like Image processing and Internet of Things.
For doing any of high profile projects, one need to understand the basic functions of PI. We will be covering all the basic functionalities of Raspberry Pi in these tutorials. In each tutorial we will discuss one of functions of PI. By the end of this Raspberry Pi Tutorial Series, you will be able to do high profile projects by yourself. Go through below tutorials:
In this tutorial we will Control Servo Motor with Raspberry Pi. Before going to servo let’s talk about PWM because the concept of controlling Servo Motor comes from it.
PWM (Pulse Width Modulation):
We have previously talked about PWM many times in: Pulse width Modulation with ATmega32 , PWM with Arduino Uno, PWM with 555 timer IC and PWM with Arduino Due. PWM stands for ‘Pulse Width Modulation’. PWM is a method used for getting variable voltage from a stable power supply. For better understanding PWM consider the circuit below,
In above figure, if the switch is closed continuously over a period of time, the LED will be ‘ON’ during this time continuously. If the switch is closed for half second and opened for next half second, then LED will be ON only in the first half second. Now the proportion for which the LED is ON over the total time is called the Duty Cycle, and can be calculated as follows:
Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
Duty Cycle = (0.5/ (0.5+0.5)) = 50%
So the average output voltage will be 50% of the battery voltage.
As we increase the ON and OFF speed to a level we will see the LED being dimmed instead of being ON and OFF. This is because our eyes cannot catch frequencies higher than 25Hz clearly. Consider 100ms cycle, LED being OFF for 30msec and ON for 70msec. We will have 70% of stable voltage at the output, so LED will glow continuously with 70% of intensity.
Duty Ratio goes from 0 to 100. ‘0’ means completely OFF and ‘100’ being completely ON. This Duty Ratio is very important for the Servo Motor. The position of Servo Motor is being determined by this Duty Ratio. Check this for PWM demonstration with LED and Raspberry Pi.
Servo Motor and PWM:
A Servo Motor is a combination of DC motor, position control system and gears. Servos have many applications in the modern world and with that, they are available in different shapes and sizes. We will be using SG90 Servo Motor in this tutorial, it is one of the popular and cheapest one. SG90 is a 180 degree servo. So with this servo we can position the axis from 0-180 degrees.
A Servo Motor mainly has three wires, one is for positive voltage, another is for ground and last one is for position setting. The Red wire is connected to power, Brown wire is connected to ground and Yellow wire (or WHITE) is connected to signal.
In servo, we have a control system which takes the PWM signal from Signal pin. It decodes the signal and gets the duty ratio from it. After that, it compares the ratio to the predefined positions values. If there is a difference in the values, it adjusts the position of the servo accordingly. So the axis position of the servo motor is based on the duty ratio of the PWM signal at the Signal pin.
The frequency of PWM (Pulse Width Modulated) signal can vary based on type of servo motor. For SG90 the frequency of PWM signal is 50Hz. To find out the frequency of operation for your servo, check the Datasheet for that particular model. So once the frequency is selected, the other important thing here is the DUTY RATIO of the PWM signal.
The table below shows the Servo Position for that particular Duty Ratio. You can get any angle in between by choosing the value accordingly. So for 45º of servo the Duty Ratio should be ‘5’ or 5%.