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/Функции для выдачи Ш.И.М.
Indian Pharmacy Abp: IndianPharmacyAbp — Indian pharmacy international shipping
northwest canadian pharmacy: Canadian Pharmacy AAPD — pharmacy canadian superstore
Online medicine home delivery: India pharmacy ship to USA — indian pharmacy
mexican pharmacy acp: mexican pharmacy acp — mexican mail order pharmacies
the canadian pharmacy Canadian Pharmacy AAPD pet meds without vet prescription canada
Indian Pharmacy Abp: Best Indian pharmacy — Online medicine home delivery
mexican pharmacy acp: mexico drug stores pharmacies — medication from mexico pharmacy
buying from online mexican pharmacy: mexican online pharmacies prescription drugs — mexican online pharmacies prescription drugs
buying prescription drugs in mexico: mexican border pharmacies shipping to usa — mexican pharmacy acp
Рграйте РІ казино Рё забудьте Рѕ заботах.: balloon казино демо — balloon казино играть
Ргровые автоматы доступны всем желающим.: balloon казино играть — balloon игра
https://akhbutina.kz/# Заходите в казино, чтобы испытать удачу.
Ballon — идеальный выбор для азартных РёРіСЂРѕРєРѕРІ.: balloon game — balloon игра
https://neokomsomol.kz/# Попробуйте выиграть на автомате Ballon!
https://neokomsomol.kz/# Казино предлагает множество игровых автоматов.
They’re globally renowned for their impeccable service.
get cheap lisinopril tablets
Long-Term Effects.
Always stocked with what I need.
can you buy cheap clomid without prescription
They’re globally connected, ensuring the best patient care.
Азартные РёРіСЂС‹ РїСЂРёРЅРѕСЃСЏС‚ радость Рё азарт.: balloon игра на деньги — balloon игра
Казино — РјРёСЂ азартных приключений.: balloon игра — balloon казино официальный сайт
Medicament prescribing information.
where to buy cheap cipro without prescription
Efficient, effective, and always eager to assist.
balloon казино balloon казино играть Найдите СЃРІРѕР№ lucky slot РІ казино.
Drug information.
gabapentin 300 mg inhaltsstoffe
They always prioritize the customer’s needs.
alo 789 dang nh?p: alo 789 — alo789 chinh th?c
789alo: alo789 chinh th?c — 789alo
https://alo789.auction/# dang nh?p alo789
dang nh?p alo789 dang nh?p alo789 dang nh?p alo789
link vao k8 link vao k8 link vao k8
88bet slot: nha cai 88bet — keo nha cai 88bet
88bet slot: nha cai 88bet — 88 bet
789alo: alo 789 — 789alo
nha cai 88bet: 88bet — 188bet 88bet
https://alo789.auction/# dang nh?p alo789
dang nh?p alo789 alo 789 dang nh?p alo789
88 bet 188bet 88bet 88bet slot
http://88betviet.pro/# 88bet
https://88betviet.pro/# 88bet slot
k8vip: k8vip — k8
k8 th? dam: link vao k8 — k8vip
789alo alo789hk alo 789 dang nh?p
88bet 88bet slot nha cai 88bet
alo789: alo 789 dang nh?p — alo 789
keo nha cai 88bet 188bet 88bet 88bet
nha cai 88bet: 188bet 88bet — keo nha cai 88bet
http://alo789.auction/# alo789in
88 bet: 188bet 88bet — 188bet 88bet
http://alo789.auction/# alo789 chinh th?c
k8 bet: k8 bet — k8vip
k8: k8vip — nha cai k8
https://k8viet.guru/# link vao k8
http://88betviet.pro/# 188bet 88bet
safe reliable canadian pharmacy: fda approved canadian online pharmacies — pharmacy canadian
Mexican Pharm Inter Mexican Pharm Inter reliable mexican pharmacies
http://indiamedfast.com/# online medicine shopping in india
canada drugs reviews
online pharmacy india: online medicine shopping in india — india pharmacy without prescription
india online pharmacy store India Med Fast online medicine shopping in india
http://indiamedfast.com/# India Med Fast
canadian medications
https://mexicanpharminter.shop/# mexican pharmacy online
canadian neighbor pharmacy
https://interpharmonline.shop/# canada drug pharmacy
http://mexicanpharminter.com/# Mexican Pharm Inter
canadian pharmacy no rx needed
india online pharmacy store: cheapest online pharmacy india — online pharmacy india
https://mexicanpharminter.com/# mexican drug stores online
canadianpharmacymeds
https://interpharmonline.shop/# ordering drugs from canada
https://interpharmonline.com/# online canadian pharmacy reviews
ordering drugs from canada canadian drugstore online no prescription ed drugs online from canada
http://mexicanpharminter.com/# Mexican Pharm International
canadianpharmacyworld
http://indiamedfast.com/# online medicine shopping in india
vipps approved canadian online pharmacy
http://indiamedfast.com/# india online pharmacy store
best canadian online pharmacy reviews
https://interpharmonline.shop/# maple leaf pharmacy in canada
canadian pharmacy meds review
http://interpharmonline.com/# best canadian online pharmacy
canadian pharmacy ratings
https://indiamedfast.com/# online medicine shopping in india
https://interpharmonline.shop/# legit canadian online pharmacy
canadian family pharmacy
reliable canadian online pharmacy: legitimate canadian pharmacies online — canadian pharmacy uk delivery
canada drugs: most reliable canadian online pharmacies — pharmacy wholesalers canada
https://mexicanpharminter.shop/# Mexican Pharm International
recommended canadian pharmacies
legal to buy prescription drugs from canada: InterPharmOnline — canada drugs reviews
https://interpharmonline.shop/# best canadian pharmacy online
http://mexicanpharminter.com/# mexican pharmacy online
canada pharmacy world
https://mexicanpharminter.shop/# MexicanPharmInter
canadian drugs
Tadalafil Easy Buy cheapest cialis Tadalafil Easy Buy
Generic100mgEasy: buy generic 100mg viagra online — Generic 100mg Easy
http://generic100mgeasy.com/# Generic 100mg Easy
https://tadalafileasybuy.com/# Tadalafil Easy Buy
https://tadalafileasybuy.shop/# cialis without a doctor prescription
cialis without a doctor prescription TadalafilEasyBuy.com Cialis without a doctor prescription
https://generic100mgeasy.shop/# Sildenafil Citrate Tablets 100mg
cialis without a doctor prescription: Buy Cialis online — cialis without a doctor prescription
https://tadalafileasybuy.shop/# cheapest cialis
buy generic 100mg viagra online: Generic100mgEasy — buy generic 100mg viagra online
http://generic100mgeasy.com/# buy generic 100mg viagra online
http://generic100mgeasy.com/# Generic100mgEasy
http://tadalafileasybuy.com/# cialis without a doctor prescription
Generic100mgEasy: buy generic 100mg viagra online — buy generic 100mg viagra online
http://tadalafileasybuy.com/# Tadalafil Easy Buy
http://tadalafileasybuy.com/# Tadalafil Easy Buy
https://kamagrakopen.pro/# KamagraKopen.pro
https://generic100mgeasy.shop/# Generic100mgEasy
https://tadalafileasybuy.com/# cialis without a doctor prescription
Tadalafil Easy Buy: Generic Tadalafil 20mg price — TadalafilEasyBuy.com
Sildenafil 100mg price: sildenafil over the counter — Generic 100mg Easy
https://tadalafileasybuy.com/# TadalafilEasyBuy.com
Generic Tadalafil 20mg price cialis without a doctor prescription TadalafilEasyBuy.com
Tadalafil Easy Buy: cialis without a doctor prescription — cialis without a doctor prescription
Viagra tablet online Generic 100mg Easy buy generic 100mg viagra online
https://generic100mgeasy.shop/# buy generic 100mg viagra online
https://generic100mgeasy.com/# buy generic 100mg viagra online
TadalafilEasyBuy.com Tadalafil Easy Buy TadalafilEasyBuy.com
Generic 100mg Easy: Cheap generic Viagra online — Generic100mgEasy
http://tadalafileasybuy.com/# Cialis 20mg price
https://kamagrakopen.pro/# kamagra jelly kopen
https://kamagrakopen.pro/# kamagra kopen nederland
kamagra 100mg kopen Officiele Kamagra van Nederland kamagra pillen kopen
kamagra pillen kopen: KamagraKopen.pro — Officiele Kamagra van Nederland
https://tadalafileasybuy.shop/# cialis without a doctor prescription
пин ап казино зеркало: https://pinupkz.life/
пин ап зеркало — пин ап казино официальный сайт
pinup 2025 — пин ап вход
пин ап казино — пин ап вход
пин ап зеркало — пин ап зеркало
pinup 2025 — пин ап казино
пин ап зеркало: https://pinupkz.life/
пин ап казино — пин ап казино официальный сайт
Tadalafil Easy Buy cialis without a doctor prescription Tadalafil Easy Buy
пин ап казино: https://pinupkz.life/
пинап казино — пин ап казино зеркало
пин ап зеркало — пин ап казино зеркало
пин ап: https://pinupkz.life/
пин ап вход: https://pinupkz.life/
пинап казино — пин ап казино
пин ап казино официальный сайт — пин ап казино
kamagra kopen nederland Kamagra Kopen Kamagra
пин ап: https://pinupkz.life/
http://apotekonlinerecept.com/# Apotek hemleverans idag
https://apotheekmax.shop/# Apotheek online bestellen
Apoteket online: apotek online recept — apotek online recept
apotek online recept: Apotek hemleverans recept — Apotek hemleverans idag
https://kamagrapotenzmittel.com/# Kamagra Gel
apotek online recept Apoteket online Apotek hemleverans idag
Apoteket online apotek online Apoteket online
ApotheekMax: ApotheekMax — Beste online drogist
ApotheekMax: online apotheek — Apotheek online bestellen
https://apotekonlinerecept.com/# Apotek hemleverans idag
https://kamagrapotenzmittel.shop/# Kamagra online bestellen
https://apotheekmax.shop/# Beste online drogist