Servoblaster raspberry pi

Introduction to Raspberry Pi

Artisan’s Asylum

PWM and Servo Control

Using the GPIO ports provides binary on/off control. Often, more detailed control is required. Dimming LEDs or controlling motor speed are two such examples. One possible way to slow down a motor is to run it on lower voltage (3 volts instead of 5). Lowering the voltage is not possible with the Raspberry Pi (or most microcontrollers) without specialized circuitry. Instead, the Raspberry Pi switches the output on and off very rapidly, making it appear to the motor like the voltage is lower. This technique is called Pulse Width Modulation (PWM). In addition to motor speed control, PWM can also be used to steer a servo motor. Servos are a special class of motors, which do not (usually) spin continuously, but rather set an output angle (position). They are often used for steering robots or adjusting control surfaces on RC planes.

The Raspberry Pi contains a single hardware PWM/servo driver. The pure hardware PWM from the hardware driver provides a very accurate and clean PWM signal. Support for this driver is limited, currently supported by the semi-outdated Adafruit Occidentalis distribution and the more up to date WiringPi library. As there is only a single PWM channel, only 1 servo can be controlled.

To control more than 1 servo, some timing accuracy can be traded off for more channels. Libraries like RPIO and Servoblaster (what we’ll use today) are not a pure hardware solution (they are driven by DMA transfers). Their signal is slightly less clean and might be affected by other programs running on the Raspberry Pi.

Hardware connections

Connect your servo as shown below. For testing purposes, or teeny servos, you can maybe skate by using the 5V connection from the Raspberry Pi. Otherwise, you almost definitely need a battery or external power supply as shown below. Be sure the battery ground is connected to the Raspberry Pi ground.

Servoblaster

Follow these instructions to install Servoblaster:

Servoblaster is controlled by writing into the /dev/servoblaster file. The content is written as = . The first field written is the servo number. The following table shows which output pin each servo channel is connected to.

Servo number GPIO number Pin in P1 header
0 4 P1-7
1 17 P1-11
2 18 P1-12
3 21/27 P1-13
4 22 P1-15
5 23 P1-16
6 24 P1-18
7 25 P1-22

The allowable position values depend on your servo, for mine values between 80 and 249 were accepted. The servo specification often provides the number of steps the servo supports.

Source Code

Appendix A: Adafruit Occidentalis PWM Instructions

The steps to set up the PWM driver are as follows (must be run as root, i.e. with sudo):

  1. Set the frequency in the /sys/class/rpi-pwm/pwm0/frequency file. Somewhere in the 1000Hz-5000Hz range is recommended
  2. Turn on the PWM by writing a value of 1 into the /sys/class/rpi-pwm/pwm0/active file
  3. Adjust the duty cycle by writing a value between 1-100 in the /sys/class/rpi-pwm/pwm0/duty file

PWM Example Code

Servo Control

Controlling a servo is very similar to controlling PWM. The same comments apply to the use of hardware or software servos as for PWM. The biggest difference is that the Raspberry Pi must be specifically put into servo mode (it defaults to pwm mode, so no change is required for pwm). Then, instead of writing to the «duty» file for control, instead the «servo» file is used. The units of the servo file are in steps from 0-32. A setting of 0 will turn the servo to 0 degrees, while a setting of 32 will turn the servo to 180 degrees. The maximum servo value can be changed by modifying the «max_servo» file, but this is not usually necessary.

Источник

Сделать робота на raspberry pi, обновленный pi-tank. Часть 2. Софт

Вторая часть полностью посвящена описанию программного обеспечения, используемого на роботе.

Так как разработанный робот (pi-tank) по большому счету рассчитан на начинающих роботостроителей, то все будет максимально упрощено, а в конце статьи будет приложен образ (image) для raspberry pi для самостоятельного дальнейшего изучения.

Небольшая оговорка. На предлагаемом образе для raspberry pi, рассчитанном на sd карту размером 8 Гб все настроено и установлено. Никаких дополнительных шагов предпринимать не требуется. Это сделано с целью упростить и облегчить часть, связанную с софтом, так как, исходя из практики, не всякий робототехник дотягивает до финиша, когда реализуется многокомпонентный проект.

Поэтому статья посвящена скорее настройке софта «под себя», однако она позволит также пролить свет на то, как все собрать и настроить с нуля.

Основа

В качестве отправной точки при разработке был взят RPi-Cam-Web-Interface. Достаточно древний, но тем не менее, не потерявший своей актуальности «фреймворк».

Как его установить подробно описано на странице проекта и сложностей вызвать:

Есть нюансы для дистрибутива buster (о них написано на сайте проекта), но для Raspbian Stretch, который используется на роботе, все штатно.

После установки доступен web-сервер, который выводит по адресу raspberry-ip:8080/html/ картинку «по умолчанию»:

Данная картинка отличается от того, что можно наблюдать на роботе:

Как не трудно заметить, страница робота располагает стрелками для управления подвесом камеры (pan-tilt), собранном на базе серв sg-90, а также пользовательскими кнопками для управления роботом («фары», «фары выкл» и т.п.).

Назначение кнопок интерфейса интуитивно понятно.

Также на web-странице имеются вкладки для более детальной настройки параметров камеры, а также работы с системой:

Как попасть на raspberry

При загрузке raspberry становится доступна через VNC c учетными данными логин — pi, пароль — raspberry.

wi-fi сеть, к которой по умолчанию подключается — логин — boss, пароль — 1234554321.
Также можно попасть по ssh, пара логин-пароль те же.

Как все работает и где поменять под себя

Вся начинка расположена в директории /var/www/html/, а сам RPi-Cam-Web-Interface стартует из /home/pi/RPi-Cam_Web_Interface.

Управление подвесом камеры осуществляется синими стрелками на web-странице. Сам фреймворк не умеет из коробки управлять сервами. Поэтому используется дополнительный пакет

И здесь есть небольшой нюанс. По умолчанию servoblaster использует gpio4 и gpio17 — пины raspberry для управления подвесами (сигнальные провода серв). По счастливому стечению обстоятельств те же самые пины использует «шапка» raspberry pi — witty pi 3 mini, отвечающая за питание, графики включения и т.п. Поэтому, чтобы железо не мешало друг другу пины для серв были перенесены для целей servoblasterа.

Делается это в /etc/rc.local командой:

При этом 13,15 — это физические пины, а не gpio! Остальные нули — это возможность подключить еще сервы и управлять ими. То есть еще 6 серв можно подключить, обозначив пины вместо нулей.

*Какие пины задействованы servoblasterом в текущий момент можно заглянув в файл — /dev/servoblaster-cfg

Также в /etc/rc.local задаются пины raspberry для управления двигателями:

*В данном случае gpio22 и gpio27 это и есть те пины 13,15, которые использует servoblaster.

Как с нуля настраивается pan-tilt описано на странице проекта здесь.

Как добавляются кнопки также описано на сайте в разделе «User buttons». Чтобы добавить или изменить кнопки («фары» и т.п.) необходимо обратиться к файлу /var/www/html/

Здесь строки означают наименование кнопок, а также соответствующий им скрипт управления.
Сами скрипты управления находятся в /var/www/html/macros. И, вполне возможно, данные скрипты придется править, т.к. при подключении проводов к драйверу двигателей l298n полярность может быть иной и робот поедет не в ту сторону, согласно нажатой кнопке.

Чтобы это исправить, необходимо открыть скрипт, например /var/www/html/macros/left.sh

#!/bin/bash
gpio -g write 9 0
gpio -g write 11 1
gpio -g write 6 0
gpio -g write 5 1
И попробовать комбинации замены 1 и 0 на gpio. Но как правило, можно просто поменять left.sh на forward.sh или на right.sh и т.п. в зависимости от ситуации.

Кнопки интерфейса с приставкой «м», отвечают за так называемый «малый ход»:

Это реализовано в скриптах left-m.sh и т.п. Ранее использовался pwm для управления. Однако стало понятно, что при задержках wi-fi и иных обстоятельствах расстояние, которое реализуется при нажатии на кнопку с pwm различается. Робот то уезжает слишком далеко до момента, когда нажата «стоп», то практически не реагирует, особенно, при разряжающихся батареях.
Поэтому был реализован простой подход в скрипте — подача сигнала и дальнейшее, через паузу, его гашение:

Witty pi 3 mini и управление питанием

Продукт Witty pi 3 mini был приобретен, чтобы минимизировать потери питания при работе от powerbank и увеличить общее время функционирования робота.
Ранее при выключении робота, которое реализовано на web-странице —

включить робота заново без посторонней помощи было невозможно. Были варианты с помощью внешней arduino, но все это было непросто и не эстетично.

Witty pi 3 mini не единственное решение в своем роде, и даже не первое в своей линейке. Но оно более-менее доступное и работающее из коробки.

Софт устанавливается предельно

После установки может потребоваться уточняющая настройка в /home/pi/uwi/uwi.conf

host=’192.168.1.105′;
port=8000;
web_socket_url=’ws://’+host+’:’+port+’/’;
response_timeout=5000;
reconnect_timeout=1000;
debug=0;

Далее при каждой загрузке на web странице raspberry:8000 (127.0.0.1:8000) будет доступен
web-интерфейс с настройками:

Первая вкладка — это просто еще один способ управлять gpio raspberry pi —

вторая вкладка — это непосредственно настройки witty pi —

На температурный датчик можно не обращать внимание, т.к. его точность сомнительна.

Можно настраивать прямо с web-страницы, но так же можно и с помощью скрипта:
/home/pi/wittypi/wittyPi.sh. При запуске скрипта, он выводит то же самое, что доступно на web-странице:

>>> Current temperature: 28.75°C / 83.75°F
>>> Your system time is: Sat 03 Apr 2021 16:20:47 MSK
>>> Your RTC time is: Sat 03 Apr 2021 16:20:48 MSK
>>> Vin=4.73V, Vout=4.68V, Iout=1.13A
Now you can:
1. Write system time to RTC
2. Write RTC time to system
3. Synchronize time
4. Schedule next shutdown
5. Schedule next startup
6. Choose schedule script
7. Set low voltage threshold
8. Set recovery voltage threshold
9. View/change other settings.
10. Reset data.
11. Exit

Здесь необходимо:

  • синхронизировать время на witty pi c системными часами raspberry (3. Synchronize time)
  • записать это время в rtc (1. Write system time to RTC)
  • далее поработать с пробуждением либо засыпанием, но проще сразу выбрать какой-нибудь
  • скрипт

[1] 7:00_on_7:30_off_21:00_on_21:30_off.wpi
[2] on_10m_every_2h.wpi
[3] on_1h_every_2d.wpi
[4] on_30m_everyday_but_weekend.wpi
[5] on_5m_every_20m.wpi
[6] turn_on_every_hour.wpi

Например [5], просыпаться на 5 минут каждые 20 минут.

После выбора скрипта соответствующие интервалы сна будут сразу обозначены:

— обязательно заглянуть в другие настройки (9. View/change other settings. )
Здесь необходимо настроить [5] Dummy load duration [0] — это паразитные импульсы для powerbankа, не дающие ему уснуть. Так как большинство powerbankов снимают питание при минимизированной нагрузке. Диапазон значений 0-255.

Все остальные настройки можно не трогать.

Witty pi предполагает также возможность контроля напряжения питания и корректное отключение при падении, а также включение при изменившихся условиях.

Доступна также более гибкая регулировка в части создания своих собственных графиков включения и выключения — скриптогенератор:

Об этом подробно написано в инструкции.

Пока все. Если что-то забыто или непонятно — пишите.

Источник

Подключаем сервопривод к Raspberry Pi

Сервопривод — механизм с электрическим мотором, который может поворачивать вал на заданный угол и сохранять это положение

Подключение

Сервоприводы подключаются тремя проводами. Два провода (чёрный и красный) — питание, третий (оранжевый, жёлтый, белый или синий) — сигнальный.

Для моего сервопривода MG 996R провода имеют такой цвет. Запитал я его от Raspberry Pi, подключив Vcc к пину №4 (5v), Ground к пину #6 (GND). Оранжевый сигнальный провод — к пину №12 (PWM)

Принцип работы

По сигнальному проводу на сервопривод подаётся ШИМ сигнал. Для любительских сервоприводов частота сигнала обычно равна пятидесяти герцам (импульсы через каждые 20мс). От длительности импульса (а не от скажности импульсов) зависит, на какой угол электромотор повернёт выходной вал сервопривода.

Плата сервопривода преобразует длительность импульса в управляющее напряжении (Uупр), которое поступает на сумматор. Также на сумматор приходит напряжение обратной связи (Uobr), которое регулируется потенциометром, соединённым с выходным валом сервопривода. Сумматор вычисляет разницу между Uупр и Uobr, разница напряжений усиливается и подаётся на электромотор. Электромотор вращает выходной вал, вместе с выходной валом вращается и меняет своё сопротивление потенциометр, из-за изменения сопротивления меняется напряжение обратной связи. Электромотор остановится, когда разница между напряжением обратной связи и управляющим напряжением станет равна нулю.

Программирование

Теперь попробуем всё это запрограммировать. Для работы с gpio я предпочитаю использовать библиотку wiringPi. В Raspberry Pi аппаратный шим находится на пинах BCM18 (порядковый номер 12, в нотификации wiringPi — 1).

Тактирующий осциллятор на аппаратном ШИМ Raspberry Pi имеет частоту 19.200.000 Гц (19.2 МГц). Чтобы получить частоту в 50Гц, необходимую для сервопривода, зададим делителю частоты значение 192 при помощи функции pwmSetClock , а значение соответствующее максимальному коэффициенту заполнения импульса равным 2000 функцией pwmSetRange .

19.200.000 / 192 / 2000 = 50

Как было сказано выше — угол поворота вала зависит от длительности импульса. Длительность импульса зависит от величины коэффициента заполнения, который задаётся вторым аргументом функции pwmWrite . При коэф. заполнения 1 (значение 2000) длительность импульса составит 20мс, при коэф. заполнения 0.05 (значение 100) 1мс

Большинство сервоприводов рассчитаны на приём импульсов длительностью от 1 до 2 мс

1мс — крайнее левое положение, 1.5мс — центральное положеник, 2мс — крайнее правое положение. Задавая длительность импульса в диапазоне 1-2мс, можно повернуть вал сервопривода в нужное положение

В реальности диапазон длительности импульсов, приводящих к повороту вала, может несколько отличаться и устанавливается экспериментальным путём. Для моего сервопривода (MG 996R) он составил 0.35мс (коэф. заполнения 1.75%) — 2.63мс (коэф. заполнения 13.15%)

Рассчёт угла поворота вала сервопривода

Напишем функцию, которая переводит требуемый угол поворота в градусах в значение коэффициента заполнения, который выступает аргументом функции pwmWrite и определяет на какой угол повернётся вал сервопривода.

Полностью программа будет выглядеть так. Угол поворота задаётся как параметр в командной строке при запуске программы:

Вал сервопривода встаёт в положение 60 градусов

Источник

Adblock
detector