Soft PWM #
ПРЕДУПРЕЖДЕНИЕ
Для работы с функциями библиотеки подключите ее в Вашу программу с помощью инструкции #include <softPwm.h>
Подробнее о подключении библиотеки в пользовательскую программу →
Библиотека реализует программную имитацию широтно-импульсной модуляции (ШИМ) выходного сигнала.
softPwmCreate() #
Инициализирует процесс программной имитации широтно-импульсной модуляции выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
int softPwmCreate(int pin, int value, int range)
Параметры #
pin - номер контакта.
value - длительность импульса, задается в диапазоне от 0 доrange.
range - период ШИМ-сигнала (рекомендуется использовать значение из интервала от 100 до 255)
Возвращаемое значение #
0 при успешном выполнении или отрицательное значение в случае ошибки.
softPwmWrite() #
Изменяет длительность импульса выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
void softPwmWrite(int pin, int value)
Параметры #
pin - номер контакта.
value - длительность импульса, задается в диапазоне от 0 доrange.
Возвращаемое значение #
Ничего.
softPwmStop() #
Завершает процесс программной имитации широтно-импульсной модуляции выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
void softPwmStop(int pin)
Параметры #
pin - номер контакта.
Возвращаемое значение #
Ничего.
Пример использования. Изменение цвета RGB-светодиода #
Пример изменяет цвет RGB-светодиода, подключенного к контактам GPIO-разъема, в последовательности красный → зеленый →синий. В данном примере используется модуль RGB-светодиода KY-016 (HW-479).
Схема подключения:
![]() |
ПРЕДУПРЕЖДЕНИЕ
На Repka Pi 5 пример может быть запущен ТОЛЬКО в 1, 2, 3, 4 или 7 варианте распиновки GPIO-разъема.
#include <stdlib.h>
#include "wiringRP.h"
#include "softPwm.h"
// Глобальные переменные и константы
// Контакт PA8 GPIO-разъема - управляет красным каналом светодиода
const int LED_R = 8;
// Контакт PA9 GPIO-разъема - управляет зеленым каналом светодиода
const int LED_G = 9;
// Контакт PA10 GPIO-разъема - управляет синим каналом светодиода
const int LED_B = 10;
// Период ШИМ сигнала
const int PWM_RANGE = 255;
// Количество контактов для управления светодиодом
const int NUM_CHANNELS = 3;
// Массив номеров контактов для управления светодиодом
const int LED_CHANNELS[] = { LED_R, LED_G, LED_B };
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
if (pinMode(LED_CHANNELS[channel], OUTPUT) < 0) {
goto error;
}
if (softPwmCreate(LED_CHANNELS[channel], 0, PWM_RANGE) < 0) {
goto error;
}
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Плавное последовательное включение/выключение красного, зеленого и синего цветов светодиода
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
for (int i = 0; i <= PWM_RANGE; i++) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
for (int i = PWM_RANGE; i >= 0; i--) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
softPwmStop(LED_CHANNELS[channel]);
digitalWrite(LED_CHANNELS[channel], LOW);
pinMode(LED_CHANNELS[channel], DISABLE);
}
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softPwm.h"
// Глобальные переменные и константы
// Контакт PD15 GPIO-разъема - управляет красным каналом светодиода
const int LED_R = 111;
// Контакт PD16 GPIO-разъема - управляет зеленым каналом светодиода
const int LED_G = 112;
// Контакт PD17 GPIO-разъема - управляет синим каналом светодиода
const int LED_B = 113;
// Период ШИМ сигнала
const int PWM_RANGE = 255;
// Количество контактов для управления светодиодом
const int NUM_CHANNELS = 3;
// Массив номеров контактов для управления светодиодом
const int LED_CHANNELS[] = { LED_R, LED_G, LED_B };
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
if (pinMode(LED_CHANNELS[channel], OUTPUT) < 0) {
goto error;
}
if (softPwmCreate(LED_CHANNELS[channel], 0, PWM_RANGE) < 0) {
goto error;
}
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Плавное последовательное включение/выключение красного, зеленого и синего цветов светодиода
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
for (int i = 0; i <= PWM_RANGE; i++) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
for (int i = PWM_RANGE; i >= 0; i--) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
softPwmStop(LED_CHANNELS[channel]);
digitalWrite(LED_CHANNELS[channel], LOW);
pinMode(LED_CHANNELS[channel], DISABLE);
}
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softPwm.h"
// Глобальные переменные и константы
// Контакт GPIO3_C5 GPIO-разъема - управляет красным каналом светодиода
const int LED_R = 117;
// Контакт GPIO4_B2 GPIO-разъема - управляет зеленым каналом светодиода
const int LED_G = 138;
// Контакт GPIO4_B3 GPIO-разъема - управляет синим каналом светодиода
const int LED_B = 139;
// Период ШИМ сигнала
const int PWM_RANGE = 255;
// Количество контактов для управления светодиодом
const int NUM_CHANNELS = 3;
// Массив номеров контактов для управления светодиодом
const int LED_CHANNELS[] = { LED_R, LED_G, LED_B };
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
if (pinMode(LED_CHANNELS[channel], OUTPUT) < 0) {
goto error;
}
if (softPwmCreate(LED_CHANNELS[channel], 0, PWM_RANGE) < 0) {
goto error;
}
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Плавное последовательное включение/выключение красного, зеленого и синего цветов светодиода
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
for (int i = 0; i <= PWM_RANGE; i++) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
for (int i = PWM_RANGE; i >= 0; i--) {
softPwmWrite(LED_CHANNELS[channel], i);
delay(2);
}
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
for (int channel = 0; channel < NUM_CHANNELS; channel++) {
softPwmStop(LED_CHANNELS[channel]);
digitalWrite(LED_CHANNELS[channel], LOW);
pinMode(LED_CHANNELS[channel], DISABLE);
}
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
Soft Tone #
Библиотека реализует программную имитацию частотно-импульсной модуляции (ЧИМ) выходного сигнала.
ПРЕДУПРЕЖДЕНИЕ
Для работы с функциями библиотеки подключите ее в Вашу программу с помощью инструкции #include <softTone.h>
softToneCreate() #
Инициализирует процесс программной имитации частотно-импульсной модуляции выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
int softToneCreate(int pin)
Параметры #
pin - номер контакта.
Возвращаемое значение #
0 при успешном выполнении или отрицательное значение в случае ошибки.
softToneWrite() #
Изменяет частоту импульсов выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
void softToneWrite(int pin, int freq)
Параметры #
pin - номер контакта.
freq - частота импульсов, в диапазоне от 0 до 5000 Гц.
Возвращаемое значение #
Ничего.
softToneStop() #
Завершает процесс программной имитации частотно-импульсной модуляции выходного сигнала для указанного контакта GPIO-разъема.
Синтаксис #
void softToneStop(int pin);
Параметры #
pin - номер контакта.
Возвращаемое значение #
Ничего.
Пример использования. Воспроизведение мелодии #
Пример управляет генератором частот для воспроизведения мелодии на пьезоэлектрическом динамике, подключенном к указанному контакту GPIO-разъема. В данном примере используется модуль пьезоэлектрического динамика KY-006 (HW-508).
Схема подключения:
![]() |
ПРЕДУПРЕЖДЕНИЕ
Пример может быть запущен ТОЛЬКО в следующих вариантах распиновки GPIO-разъема:
- Repka Pi 3: 1 вариант.
- Repka Pi 4: 1 или 11 вариант.
- Repka Pi 5: 1, 5 или 6 вариант.
#include <stdlib.h>
#include "wiringRP.h"
#include "softTone.h"
// Глобальные переменные и константы
const int frq[17] = {440, 165, 440, 440, 165, 440, 330, 294, 262, 494, 440, 494, 262, 294, 330, 165, 440};
const int pause[17] = {250, 250, 250, 250, 250, 250, 125, 125, 125, 125, 125, 125, 125, 125, 250, 250, 250};
const int TONE_PIN = 12; // Контакт PA12 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(TONE_PIN, OUTPUT) < 0) {
goto error;
}
if (softToneCreate(TONE_PIN) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Воспроизведение мелодии
for (int j = 0; j < 17; j++) {
softToneWrite(TONE_PIN, frq[j]);
delay(pause[j]);
softToneWrite(TONE_PIN, 0);
delay(pause[j]);
}
delay(500);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softToneStop(TONE_PIN);
digitalWrite(TONE_PIN, LOW);
pinMode(TONE_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softTone.h"
// Глобальные переменные и константы
const int frq[17] = {440, 165, 440, 440, 165, 440, 330, 294, 262, 494, 440, 494, 262, 294, 330, 165, 440};
const int pause[17] = {250, 250, 250, 250, 250, 250, 125, 125, 125, 125, 125, 125, 125, 125, 250, 250, 250};
const int TONE_PIN = 122; // Контакт PD26 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(TONE_PIN, OUTPUT) < 0) {
goto error;
}
if (softToneCreate(TONE_PIN) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Воспроизведение мелодии
for (int j = 0; j < 17; j++) {
softToneWrite(TONE_PIN, frq[j]);
delay(pause[j]);
softToneWrite(TONE_PIN, 0);
delay(pause[j]);
}
delay(500);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softToneStop(TONE_PIN);
digitalWrite(TONE_PIN, LOW);
pinMode(TONE_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softTone.h"
// Глобальные переменные и константы
const int frq[17] = {440, 165, 440, 440, 165, 440, 330, 294, 262, 494, 440, 494, 262, 294, 330, 165, 440};
const int pause[17] = {250, 250, 250, 250, 250, 250, 125, 125, 125, 125, 125, 125, 125, 125, 250, 250, 250};
const int TONE_PIN = 63; // Контакт GPIO1_D7 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(TONE_PIN, OUTPUT) < 0) {
goto error;
}
if (softToneCreate(TONE_PIN) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Воспроизведение мелодии
for (int j = 0; j < 17; j++) {
softToneWrite(TONE_PIN, frq[j]);
delay(pause[j]);
softToneWrite(TONE_PIN, 0);
delay(pause[j]);
}
delay(500);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softToneStop(TONE_PIN);
digitalWrite(TONE_PIN, LOW);
pinMode(TONE_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
Soft Servo #
Библиотека реализует программную имитацию широтно-импульсной модуляции (ШИМ) выходного сигнала управления сервоприводами.
ПРЕДУПРЕЖДЕНИЕ
Для работы с функциями библиотеки подключите ее в Вашу программу с помощью инструкции #include <softServo.h>
softServoSetup() #
Инициализирует процесс программной имитации широтно-импульсной модуляции выходного сигнала управления сервоприводами для указанного контакта GPIO-разъема.
Синтаксис #
int softServoSetup(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7)
Параметры #
ПРЕДУПРЕЖДЕНИЕ
Для неиспользуемых контактов необходимо указать значение -1
p0 - номер контакта для 1-го сервопривода.
p1 - номер контакта для 2-го сервопривода.
p2 - номер контакта для 3-го сервопривода.
p3 - номер контакта для 4-го сервопривода.
p4 - номер контакта для 5-го сервопривода.
p5 - номер контакта для 6-го сервопривода.
p6 - номер контакта для 7-го сервопривода.
p7 - номер контакта для 8-го сервопривода.
Возвращаемое значение #
0 при успешном выполнении или отрицательное значение в случае ошибки.
softServoWrite() #
Изменяет длительность управляющего импульса для указанного контакта GPIO-разъема.
Синтаксис #
void softServoWrite(int pin, int value)
Параметры #
pin - номер контакта для сервопривода.
value - значение для вычисления импульса в диапазоне от -250 до 1250.
Возвращаемое значение #
Ничего.
softServoRelease() #
Завершает процесс программной имитации широтно-импульсной модуляции выходного сигнала управления сервоприводами для указанного контакта GPIO-разъема.
Синтаксис #
void softServoRelease(int pin)
Параметры #
pin - номер контакта для сервопривода.
Возвращаемое значение #
Ничего.
Пример использования. Управление сервоприводом #
Пример управляет изменением угла поворота вала ротора сервопривода SG-90, подключенного к указанному контакту GPIO-разъема.
Схема подключения:
![]() |
ПРЕДУПРЕЖДЕНИЕ
Пример может быть запущен ТОЛЬКО в следующих вариантах распиновки GPIO-разъема:
- Repka Pi 3: 1 вариант.
- Repka Pi 4: 1 или 11 вариант.
- Repka Pi 5: 1, 5 или 6 вариант.
#include <stdlib.h>
#include "wiringRP.h"
#include "softServo.h"
// Глобальные переменные и константы
const int SERVO_PIN = 12; // Контакт PA12 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (softServoSetup(SERVO_PIN, -1, -1, -1, -1, -1, -1, -1) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Поворот сервопривода против часовой стрелки
for (int i = -250; i < 1250; i += 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
// Поворот сервопривода по часовой стрелке
for (int i = 1250; i > -250; i -= 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
delay(2000);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softServoRelease(SERVO_PIN);
digitalWrite(SERVO_PIN, LOW);
pinMode(SERVO_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softServo.h"
// Глобальные переменные и константы
const int SERVO_PIN = 122; // Контакт PD26 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (softServoSetup(SERVO_PIN, -1, -1, -1, -1, -1, -1, -1) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Поворот сервопривода против часовой стрелки
for (int i = -250; i < 1250; i += 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
// Поворот сервопривода по часовой стрелке
for (int i = 1250; i > -250; i -= 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
delay(2000);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softServoRelease(SERVO_PIN);
digitalWrite(SERVO_PIN, LOW);
pinMode(SERVO_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
#include "softServo.h"
// Глобальные переменные и константы
const int SERVO_PIN = 63; // Контакт GPIO1_D7 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (softServoSetup(SERVO_PIN, -1, -1, -1, -1, -1, -1, -1) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
// Поворот сервопривода против часовой стрелки
for (int i = -250; i < 1250; i += 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
// Поворот сервопривода по часовой стрелке
for (int i = 1250; i > -250; i -= 5) {
softServoWrite(SERVO_PIN, i);
delay(30);
}
delay(2000);
}
ONDESTROY(){
// Освобождение занятых ресурсов, выключение напряжения на пинах
softServoRelease(SERVO_PIN);
digitalWrite(SERVO_PIN, LOW);
pinMode(SERVO_PIN, DISABLE);
// Завершение работы библиотеки
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();


