Расширенный ввод-вывод

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 и модуля 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).

Схема подключения:

Схема подключения Repka Pi 5 и модуля пьезоэлектрического динамика 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-разъема.

Схема подключения:

Схема подключения Repka Pi 5 и сервопривода SG-90

ПРЕДУПРЕЖДЕНИЕ

Пример может быть запущен ТОЛЬКО в следующих вариантах распиновки 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();

3629 просмотров0 комментариев
0

Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Разделы

Навигация

ВойтиРегистрация