WiringPi включает в себя программно-управляемый обработчик ШИМ (Soft PWM), способный выводить сигнал ШИМ на любой из выводов GPIO Raspberry Pi (или Banana Pi, Orange Pi, NanoPi, Odroid и т.п.).
Есть некоторые ограничения. Для поддержания низкой загрузки процессора минимальная ширина импульса составляет 100 мкс. Это в сочетании с предлагаемым по умолчанию диапазоном 100 дает частоту ШИМ 100 Гц. Вы можете уменьшить диапазон, чтобы получить более высокую частоту за счет разрешения, или увеличить, чтобы получить большее разрешение, но это снизит частоту. Если вы измените ширину импульса в коде драйвера, то имейте в виду, что при задержках менее 100 мкс (WiringPi делает это в программном цикле) загрузка ЦП резко возрастет, а управление более чем одним выводом будет практически невозможно.
Также обратите внимание, что хотя подпрограммы могут работают с более высоким приоритетом или с приоритетом в реальном времени, Linux по-прежнему может влиять на точность генерируемого сигнала. Впрочем, даже несмотря на ограничения, с помощью этих функций можно управлять устройствами вроде светодиодов и моторов.
Soft PWM/Программная ШИМ на C/C++
Чтобы использовать эти функции в своей программе на C/C++, нужно включить следующие библиотеки/файлы:
#include <wiringPi.h> #include <softPwm.h>
При компиляции вашей программы, вы должны будете подключить pthread
, а также библиотеку wiringPi
, выглядеть это будет примерно так:
cc -o myprog myprog.c -lwiringPi -lpthread
Описание функций softPwm.h
Доступны следующие функции:
softPwmCreate (int, int, int)
Задает контакт, на котором будет генерироваться программная ШИМ. Можно использовать любой GPIO-контакт (int pin
), а распиновкой служит та, что используется функцией wiringPiSetup()
. Если вписать в параметре int range
значение «100», то диапазон значений на этом контакте будет от «0» (выкл) до «100» (полный ход).
int softPwmCreate (int pin, int value, int range);
Если операция пройдет успешно, функция вернет «0». Если функция вернет другое значение, то о том, что случилось, можно узнать у глобальной переменной errno
.
softPwmWrite (int, int)
Обновляет значение (int value
) ШИМ на указанном контакте (int pin
). Значение проверяется на предмет того, не выходит ли оно за пределы заданного диапазона. Контакты, которые ранее не были инициализированы при помощи функции softPwmCreate()
, будут просто проигнорированы.
void softPwmWrite (int pin, int value);
softPwmStop (int)
Эта функция отключает ШИМ на данном выводе (int pin
).
void softPwmStop (int pin);
Пример программы
#include <iostream> /* * Включаем необходимые библиотеки */ #include <wiringPi.h> #include <softPwm.h> #define PIN 23 #define RANGE 100 #define VALUE 50 using namespace std; int main() { /* * Инициализируем WiringPi */ if (wiringPiSetup() == 0) { /* * Задает контакт, на котором будет генерироваться Soft PWM * GPIO-контакт 23, диапазон значений - 100, значение - 50 */ softPwmCreate(PIN, VALUE, RANGE); cout << "softPwmCreate(PIN, VALUE, RANGE);" << endl; cout << "PIN: " << PIN << endl; cout << "RANGE: " << RANGE << endl; cout << "VALUE: " << VALUE << endl; cout << endl; /* * Обновляем значение (value) ШИМ на 25 */ softPwmWrite(PIN, 25); cout << "softPwmWrite(PIN, 25);" << endl; cout << "PIN: " << PIN << endl; cout << "VALUE: " << 25 << endl; cout << endl; delay(5000); /* * Обновляем значение (value) ШИМ на 50 */ softPwmWrite(PIN, 50); cout << "softPwmWrite(PIN, 50);" << endl; cout << "PIN: " << PIN << endl; cout << "VALUE: " << 50 << endl; cout << endl; delay(5000); /* * Обновляем значение (value) ШИМ на 75 */ softPwmWrite(PIN, 75); cout << "softPwmWrite(PIN, 75);" << endl; cout << "PIN: " << PIN << endl; cout << "VALUE: " << 75 << endl; cout << endl; delay(5000); /* * Обновляем значение (value) ШИМ на 100 */ softPwmWrite(PIN, 100); cout << "softPwmWrite(PIN, 100);" << endl; cout << "PIN: " << PIN << endl; cout << "VALUE: " << 100 << endl; cout << endl; delay(5000); /* * Отключаем ШИМ на GPIO-контакте 7 */ softPwmStop(PIN); cout << "softPwmStop(PIN);" << endl; cout << "PIN: " << PIN << endl; } return 0; }
Инициализировать WiringPi можно при помощи функций wiringPiSetup()
, wiringPiSetupGpio()
и wiringPiSetupPhys()
. Функция wiringPiSetupSys()
недостаточно быстра, поэтому вам нужно будет запускать программы при помощи sudo.
Компиляция, сборка и запуск программы
- Сознаём файл
wiringpi_soft_pwm.cpp
и вставляем вышеприведённый код:nano wiringpi_soft_pwm.cpp
- Компилируем и собираем программу:
g++ -Ofast -Wall wiringpi_soft_pwm.cpp -lwiringPi -lpthread -o wiringpi_soft_pwm
- Запускаем программу:
./wiringpi_soft_pwm
Результат
Soft PWM/Программная ШИМ на Java
В Pi4J есть библиотека/и для работы с ШИМ с помощью Java на Raspberry Pi, Banana Pi, Orange Pi, Nano Pi и Odroid. Все классы и интерфейсы находятся в пакетах com.pi4j.io.gpio.*;
и com.pi4j.wiringpi.*;
.
Интерфейс GpioPinPwm
Этот интерфейс является расширением интерфейса GpioPin
с чтением значений PWM.
getPwm()
Возвращает значение, установленное в данный момент для выхода ШИМ:
Если это аппаратная Широтно-импульсная модуляция, значение будет в диапазоне от 0 до 1024, а если это программная Широтно-импульсная модуляция, значение будет в диапазоне от 0 до 100.
int getPwm();
Интерфейс GpioPinPwmOutput
Этот интерфейс является расширением интерфейса GpioPinPwm
и добавляет операции для установки выходного значения PWM.
setPwm(int)
Устанавливает значение/длину рабочего цикла ШИМ.
Если это аппаратная Широтно-импульсная модуляция, значение должно быть в диапазоне от 0 до 1024, а если это программная Широтно-импульсная модуляция, значение должно быть в диапазоне от 0 до 100.
void setPwm(int value);
setPwmRange(int)
Устанавливает диапазон ШИМ. По умолчанию 1024 для аппаратного ШИМ, для программного — 100.
void setPwmRange(int range);
Примеры программы
Данный пример кода генерирует программную ШИМ на одном выводе GPIO одноплатного компьютера Orange Pi PC. Если вы планируете запустить этот пример кода на другой плате, тогда не забудьте указать правильную платформу:
- Raspberry Pi:
PlatformManager.setPlatform(Platform.RASPBERRYPI);
- Banana Pi:
PlatformManager.setPlatform(Platform.BANANAPI);
- Banana Pro:
PlatformManager.setPlatform(Platform.BANANAPRO);
- Synovoip BPI:
PlatformManager.setPlatform(Platform.BPI);
- Odroid:
PlatformManager.setPlatform(Platform.ODROID);
- Orange Pi:
PlatformManager.setPlatform(Platform.ORANGEPI);
- NanoPi:
PlatformManager.setPlatform(Platform.NANOPI);
- Simulated:
PlatformManager.setPlatform(Platform.SIMULATED);
Тоже самое по поводу пинов, для Orange Pi — это com.pi4j.io.gpio.OrangePiPin
, для Nano Pi — com.pi4j.io.gpio.NanoPiPin
и т.д..
import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinPwmOutput; import com.pi4j.io.gpio.OrangePiPin; import com.pi4j.platform.Platform; import com.pi4j.platform.PlatformAlreadyAssignedException; import com.pi4j.platform.PlatformManager; import com.pi4j.util.Console; public class SoftPWMPi4J { public static void main(String[] args) { try { PlatformManager.setPlatform(Platform.ORANGEPI); /* * Создаём Pi4J консольную оболочку/помощника */ Console console = new Console(); /* * Выводим заголовок программы */ console.title("<-- Проект Pi4J -->", "Пример SoftPWM (Программная ШИМ на Java)"); /* * Разрешаем пользователю выйти из программы, используя CTRL-C */ console.promptForExit(); /* * Создаем контроллер gpio */ GpioController gpio = GpioFactory.getInstance(); /* * Предоставим вывод как программный выход ШИМ, выводы, которые * поддерживают аппаратный ШИМ, должны быть предоставлены как нормальные * выходы ШИМ */ GpioPinPwmOutput pwm = gpio.provisionSoftPwmOutputPin(OrangePiPin.GPIO_23); /* * При желании мы можем установить диапазон ШИМ (100 - диапазон по * умолчанию) */ pwm.setPwmRange(100); /* * Подсказываем пользователю, что мы готовы */ console.println(" ... Успешно подготовлен ШИМ вывод: " + pwm.toString()); console.emptyLine(); /* * Устанавливаем длину рабочего цикла ШИМ 100 (ПОЛНОСТЬЮ ВКЛ) */ pwm.setPwm(100); console.println("Длина рабочего цикла программной ШИМ: " + pwm.getPwm()); console.println("Нажмите ENTER, чтобы установить значение ШИМ 50"); System.console().readLine(); /* * Устанавливаем длину рабочего цикла ШИМ 50 (РАБОЧИЙ ЦИКЛ 1/2 или 50%) */ pwm.setPwm(50); console.println("Длина рабочего цикла программной ШИМ: " + pwm.getPwm()); console.println("Нажмите ENTER, чтобы установить значение ШИМ 0 (остановить PWM)"); System.console().readLine(); /* * Устанавливаем длину рабочего цикла ШИМ 0 (ПОЛНОСТЬЮ ВЫКЛ) */ pwm.setPwm(0); console.println("Длина рабочего цикла программной ШИМ: " + pwm.getPwm()); /* * Останавливаем все потоки GPIO, выключив контроллер GPIO (этот метод * принудительно отключит все потоки мониторинга GPIO и запланированные * задачи) */ gpio.shutdown(); } catch (PlatformAlreadyAssignedException e) { e.printStackTrace(); } } }
Компиляция, сборка и запуск программы
- создаём java файл и вставляем код:
nano SoftPWMPi4J.java
- компилируем файл:
javac -classpath .:classes:/opt/pi4j/lib/'*' SoftPWMPi4J.java
- запускаем программу:
sudo java -classpath .:classes:/opt/pi4j/lib/'*' SoftPWMPi4J
Результат
Примечания
- Каждый «цикл» выхода ШИМ занимает 10 мс со значением диапазона по умолчанию 100, поэтому попытка изменить значение ШИМ более 100 раз в секунду будет бесполезной.
- Каждый вывод, активированный в режиме soft PWM, использует приблизительно 0,5% ЦП.
- В настоящее время нет способа отключить softPWM на выводе во время работы программы.
- Вы должны держать свою программу в рабочем состоянии, чтобы поддерживать выход ШИМ.
Материалы
Software PWM Library
Широтно-импульсная модуляция
The Pi4J Project
Установка Pi4J на Raspberry Pi и Orange Pi, Banana Pi
Установка и настройка BPI-WiringPi/WiringPi на Banana Pi
Установка и настройка WiringOP/WiringPi на Orange Pi PC
ШИМ управление активным охлаждением на Raspberry Pi, Orange Pi, Banana Pi
Raspberry Pi:Библиотеки/WiringPi/Функции для выдачи Ш.И.М.
Блог о недвижимости — https://avgust-shop.ru/
cometa casino официальный сайт — https://unlim-cassinoss7.xyz/
casino cometa зеркало cometaofficial online — https://unlimcassino.xyz/
https://clomid.store/# cost cheap clomid without dr prescription
zithromax 250 mg tablet price: zithromax online pharmacy canada — zithromax online usa
buy cytotec in usa cytotec buy online usa buy cytotec online fast delivery
http://lisinoprilus.com/# cheapest price for lisinopril india
buy cytotec over the counter: buy cytotec pills online cheap — buy misoprostol over the counter
drugs1st drugs1st drugs1st
Куда съездить отдохнуть? — http://wheatgrasssaloon.com/tag/livingston-gallery-walk/
semaglutide tablets store: semaglutide tablets store — buy rybelsus online
Куда съездить отдохнуть? — https://www.gut-edermann.info/en/gourmet/
what causes ed: drugs1st — drugs1st
https://kamagra.men/# п»їkamagra
https://edpills.men/# pills for erectile dysfunction online
rybelsus semaglutide tablets: buy semaglutide — buy semaglutide
https://cenforce.icu/# cenforce.icu
how to get ed meds online: buy erectile dysfunction treatment — cheap erection pills
buy cenforce: Buy Cenforce 100mg Online — cenforce for sale
natural ed medications: drugs1st — drugs1st
order cenforce: cenforce for sale — cenforce
Куда съездить отдохнуть? — http://www.l-3nss.com/index.php?option=com_content&view=article&id=64&Itemid=211
пин ап казино зеркало: pinup2025.com — pinup 2025
Всем привет! Подскажите, где найтиразные статьи о недвижимости? Сейчас читаю -https://kupit-dom-v-anape.ru/
slot tr online: slot oyunlar? — slot oyunlar?
slot tr online slot oyunlar? az parayla cok kazandiran slot oyunlar?
Всем привет! Может кто знает, где почитатьразные статьи о недвижимости? Сейчас читаю -https://snegirieko.com/
https://slottr.top/# en kazancl? slot oyunlar?
yatД±rД±m bonusu veren siteler: yurt dД±ЕџД± bahis sitesi — 2025 bahis siteleri deneme bonusu
Всем привет! Может кто знает, где найтиполезные статьи о недвижимости? Сейчас читаю -https://mos-prostor.ru/
https://slottr.top/# slot siteleri
en kazancl? slot oyunlar?: slot oyunlar? — slot siteleri
Всем привет! Подскажите, где найтиполезные статьи о недвижимости? Сейчас читаю -https://domaizpolistirolbetona.ru/
http://slottr.top/# en kazancl? slot oyunlar?
en gГјvenilir yatД±rД±m siteleri casino turkey casino bonus
Всем привет! Подскажите, где почитатьполезные статьи о недвижимости? Пока нашел -https://xn—-7sbagbodaxiat9a3dihr.xn--p1ai/
http://casinositeleri2025.pro/# en Г§ok kazandД±ran bahis siteleri
bilinmeyen siteler: yurt dД±ЕџД± bahis sitesi — bonus veren bahis siteleri yasal
betler: lisanslД± bahis sitesi — yeni bahis siteleri deneme bonusu
slot oyunlar? slot siteleri en kazancl? slot oyunlar?
http://pinup2025.com/# пин ап казино зеркало
gГјvenilir casino siteleri: katД±lД±m bonusu veren bahis siteleri — by casino
https://casinositeleri2025.pro/# en iyi bet siteleri
en kazancl? slot oyunlar?: slot siteleri — slot oyunlar? puf noktalar?
https://casinositeleri2025.pro/# gerçek paralı casino oyunları
az parayla cok kazandiran slot oyunlar?: slot oyunlar? puf noktalar? — slot tr online
pinup 2025 пин ап пин ап вход
https://pinup2025.com/# pinup 2025
pinup2025.com: пин ап казино официальный сайт — pinup 2025
betboo giriЕџ ilk giriЕџte bonus veren bahis siteleri yeni deneme bonusu veren siteler 2025
slot tr online slot oyunlar? puf noktalar? en kazancl? slot oyunlar?
en cok kazand?ran slot oyunlar?: en kazancl? slot oyunlar? — slot tr online
en cok kazand?ran slot oyunlar?: slot tr online — slot tr online
https://mexicanpharmi.com/# buying prescription drugs in mexico online
http://canadianpharmi.com/# best ed pills at gnc
how to treat ed: Canada Pharmacy online reviews — best male enhancement
mexico drug stores pharmacies Legit online Mexican pharmacy mexico drug stores pharmacies
reputable indian pharmacies: Best online Indian pharmacy — indian pharmacy paypal
http://canadianpharmi.com/# men with ed
http://indiapharmi.com/# indian pharmacies safe
online pharmacy india Online medicine home delivery best india pharmacy
ed meds pills drugs Canada pharmacy online prescription drugs online without doctor
п»їbest mexican online pharmacies: Legit online Mexican pharmacy — reputable mexican pharmacies online
http://indiapharmi.com/# top 10 online pharmacy in india
treatment for ed: canadian pharmi — erectile dysfunction drug
https://canadianpharmi.com/# over the counter ed treatment
https://indiapharmi.com/# indian pharmacy paypal
india online pharmacy Indian online pharmacy ship to USA buy prescription drugs from india
https://mexicanpharmi.com/# buying prescription drugs in mexico
medication from mexico pharmacy: mexican pharmacy — reputable mexican pharmacies online
https://canadianpharmi.com/# levitra without a doctor prescription
https://indiapharmi.com/# top online pharmacy india
india online pharmacy: Pharmacies in India that ship to USA — Online medicine order
mexican rx online: mexicanpharmi — pharmacies in mexico that ship to usa
buying from online mexican pharmacy Legit online Mexican pharmacy buying prescription drugs in mexico
Интересная статья про кредиты и финансы — https://probankrotstvo.webnode.ru/
п»їcipro generic: cipro pharmacy — cipro
canadian online pharmacy prednisone Predni Best prednisone 10mg price in india
generic amoxicillin 500mg: AmoxStar — amoxicillin generic
https://clomidonpharm.com/# where to get clomid
http://amoxstar.com/# amoxicillin 500 mg online
prednisone online for sale: prednisone 50 — prednisone daily
https://clomidonpharm.com/# buying clomid without rx
buy amoxicillin 500mg: amoxicillin medicine — amoxicillin 500 tablet
prednisone oral: buy prednisone without prescription — where to buy prednisone without prescription
п»їcipro generic antibiotics cipro buy cipro no rx
prednisone tabs 20 mg: how can i order prednisone — prednisone pills cost
http://prednibest.com/# prednisone prescription drug
prednisone pills for sale: 3000mg prednisone — prednisone 10mg prices
where to buy generic clomid without rx clomidonpharm where can i buy clomid prices
http://prednibest.com/# prednisone 20 mg
buy cipro without rx ci pharm delivery buy cipro online usa
amoxicillin 500 tablet: Amox Star — amoxicillin 500mg capsules uk
http://amoxstar.com/# buy amoxicillin online with paypal