Использование портов gpio в raspberry pi. часть 1

API VL53L0X

Большая часть функциональности этой библиотеки основана на API VL53L0X, предоставленной компанией производителем. Отдельные комментарии в коде цитируются или перефразированы из исходного кода API, руководства пользователя API (UM2039) и Технического описание VL53L0X.

Для получения дополнительной информации о коде библиотеки и о том, как он был получен из API, см. комментарии в файле VL53L0X.cpp на GitHub.

Эта библиотека предназначена для того, чтобы обеспечить более быстрый и простой способ начать использование VL53L0X с Arduino-совместимым контроллером, в отличие от настройки и компиляции API-интерфейса ST для Arduino.

Библиотека имеет более упрощенный интерфейс, а также меньший объем памяти. Однако она не реализует некоторые из более продвинутых функциональных возможностей, доступных в API (например, калибровка датчика для правильной работы под стеклом), и имеет менее надежную проверку ошибок.

Для продвинутых приложений, особенно когда хранение и память менее важны, рассмотрите возможность использования API VL53L0X напрямую (скачать документацию API можно выше).

Модуль ESP-12E

Отладочная плата оснащена модулем ESP-12E, содержащим микросхему ESP8266 с RISC микропроцессором Tensilica Xtensa 32-bit LX106, который работает с регулируемой тактовой частотой от 80 до 160 МГц и поддерживает RTOS.

Характеристики ESP-12E

  • 32-разрядный LX106 от Tensilica Xtensa
  • Тактовая частота от 80 до 160 МГц
  • 128 КБ встроенной оперативной памяти
  • 4 МБ внешней внешней флеш-памяти
  • Приемопередатчик Wi-Fi 802.11b/g/n

Рисунок 1 – ESP8266 NodeMCU

Также данный модуль имеет 128 КБ ОЗУ и 4 МБ флеш-памяти (для хранения программ и данных), достаточных, чтобы справиться с большими строками, которые составляют веб-страницы, данными в JSON/XML и всем, что мы сегодня добавляем на устройства IoT.

ESP8266 содержит встроенный приемопередатчик Wi-Fi 802.11b/g/n HT40, поэтому он может не только подключаться к сети Wi-Fi и взаимодействовать с интернетом, но и устанавливать собственную сеть, позволяя другим устройствам подключаться напрямую к нему. Это делает ESP8266 NodeMCU еще более универсальным.

Отличия активного и пассивного зуммера

Главное отличие активного зуммера от пассивного заключается в том, что активный зуммер генерирует звук самостоятельно. Для этого пользователь должен просто включить или выключить его, другими словами, подав напряжение на контакты или обесточив. Пассивный зуммер же требует источника сигнала, который задаст параметры звукового сигнала. В качестве такого источника может выступать плата Ардуино. Активный зуммер будет выдавать более громкий звуковой сигнал в сравнении с его конкурентом. Частота излучаемого звука активного зуммера составляет значения 2,5 кГц +/- 300Гц. Напряжение питания для пищалки варьируется от 3,5 до 5 В.

Активный пьезоизлучатель предпочтительней еще из-за того, что в скетче не потребуется создавать дополнительный фрагмент кода с задержкой, влияющий на рабочий процесс. Также для определения того, что за элемент находится перед пользователем, можно измерить сопротивление между двумя проводами. Более высокие значения будут указывать на активный зуммер ардуино.

По своей геометрической форме пищалки никак не различаются, и отнести элемент к тому или иному виду по данной характеристике не представляется возможным. Визуально зуммер можно идентифицировать, как активный, если на плате присутствуют резистор и усилитель. В пассивном зуммере в наличии только маленький пьезоэлемент на плате.

Тестирование

Чтобы заставить двигатели работать, дважды щёлкните LXTerminal на рабочем столе, чтобы открыть окно терминала. Здесь вы будете писать код Python, используя программу под названием Nano. Nano — это текстовый редактор, похожий на Notepad или TextEdit, я научу вас некоторым командам, если вы с ними не знакомы.

Чтобы включить двигатель в течение двух секунд, используйте следующий код:

Первые две строки говорят Python, что необходимо в программе.

В первой строке вы задаёте доступ к модулю RPi.GPIO. Этот модуль выполняет всю тяжёлую работу, связанную с поворотом контактов GPIO on и off на Raspberry Pi.

Вторая строка выводит модуль time в sleep, чтобы сделать pause, давая script время выполнить определённое действие и оставляя мотор включенным на несколько секунд.

Функция setmode указывает RPi.GPIO нумерацию на плате  Raspberry Pi. Цифры 16, 18 и 22 сообщают Python номера pins, связанных с двигателями.

Вы можете указать L293D повернуться в одном направлении через pin A, в другом — pin B. Чтобы включить on, используйте pin Enable, обозначенный E в тестовом сценарии — это pin 22. Я расскажу об этом чуть позже.

Наконец, укажите Raspberry Pi все выходы, которые делаются с GPIO.OUT.

Когда скрипт настроен, Raspberry Pi готова включить моторы. Он включит несколько выводов, подождет две секунды, затем выключит их, как показано в оставшейся части script.

Сохраните и выйдите, нажав CTRL-X, в нижней части сообщения появится запрос подтвердить изменения. Нажмите Y и Enter для подтверждения. Теперь вы снова в командной строке, чтобы запустить script и увидеть, как вращается двигатель.

Если двигатель не вращается, проверьте проводку или батареи. Отладка и выяснение причин могут раздражать, но это полезный шаг в изучении нового!

Настройка порта GPIO

Итак, с регистрами разобрались, настало время практики. Все примеры в этой статье для микроконтроллера STM32F103C8. В моем распоряжении есть вот такая отладочная плата:

На ней установлен кварцевый резонатор на 8 МГц и светодиод на порту PB12. Вот с помощью этого светодиода мы и устроим Hello, World!

Задача ясна: настраиваем PB12 на выход в режиме push-pull и с помощью регистра ODR дергаем 12-й пин порта GPIOB туда-сюда! Но мы забыли об одной маленько детали: RCC. Дело в том, что по-умолчанию после сброса микроконтроллера все периферийные модули отключены от источника тактового сигнала, в том числе и GPIO. А подать тактирование можно с помощью регистров RCC. В 3-ей части я про это говорил. Для начала нужно определить, к какой шине у нас подключен GPIOB. Открываем даташит на микроконтроллер, ищем вот эту таблицу:

Рис. 8. Таблица шин и периферийных устройств

GPIOB у нас подключен к шине APB2. Идем в Reference manual, открываем раздел про RCC, переходим к пункту 7.3.7 APB2 peripheral clock enable register (RCC_APB2ENR). С помощью этого регистра можно подать тактовый сигнал на устройства шины APB2:

Рис. 9. Регистр RCC_APB2ENR

В регистре RCC_APB2ENR много флагов для разной периферии, в том числе и для нашего GPIOB, флаг называется IOPBEN. Перед началом инициализации PB12 нам надо установить этот бит в единицу.

Поехали программировать! За основу возьмем проект из 2-й части: https://github.com/DiMoonElec/stm32f103c8_empty_project. Создадим функцию инициализации порта:

void PortInit(void)
{
}

GPIOB

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB

PB12CRH:

GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
//MODE: выход с максимальной частотой 2 МГц
//CNF: режим push-pull
GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
void PortInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB
  
  GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
  //MODE: выход с максимальной частотой 2 МГц
  //CNF: режим push-pull
  GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
}

ODRPB12

void PortSetHi(void)
{
  GPIOB->ODR |= (1<<12);
}
void PortSetLow(void)
{
  GPIOB->ODR &= ~(1<<12);
}

GPIOB->ODR |= (1<<12)STM32

void PortSetHi(void)
{
  GPIOB->BSRR = (1<<12);
}

void PortSetLow(void)
{
  GPIOB->BRR = (1<<12);
}

 (1<<12)0x1000BSRRBRRрис. 5, 6

Ни и простой main() для проверки:

void main()
{
  int i;
  PortInit();
  
  for(;;)
  {
    PortSetHi();
    for(i=0; i<0x40000; i++)
      ;

    PortSetLow();
    for(i=0; i<0x40000; i++)
      ;
  }
}

BP12«Hello, World!»

Давайте теперь настроим какой-нибудь вывод порта, например PB15, на вход с подтяжкой к питанию. При подключении PB15 к минусу, у нас будет зажигаться светодиод. Задача ясна, преступаем к реализации. В PortInit() добавим пару строк:

/// Настраиваем PB15 на вход с подтяжкой к питанию ///
GPIOB->CRH &= ~(GPIO_CRH_MODE15 | GPIO_CRH_CNF15);
//MODE: вход, оставляем в нуле
//CNF: вход с pull-up / pull-down
GPIOB->CRH |= (0x00 << GPIO_CRH_MODE15_Pos) | (0x02 << GPIO_CRH_CNF15_Pos);

GPIOB->ODR |= (1<<15); //Включаем подтяжку вверх

PB12MODE/CNFODRODRCNF=10Input with pull-up / pull-downODRReference manual

Рис. 10. Таблица конфигурации порта

Функция PortInit() приобретает такой вид:

void PortInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB
  
  /// Настраиваем PB12 на выход ///
  GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
  //MODE: выход с максимальной частотой 2 МГц
  //CNF: режим push-pull
  GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
  
  /// Настраиваем PB15 на вход с подтяжкой к питанию ///
  GPIOB->CRH &= ~(GPIO_CRH_MODE15 | GPIO_CRH_CNF15);
  //MODE: вход, оставляем в нуле
  //CNF: вход с pull-up / pull-down
  GPIOB->CRH |= (0x00 << GPIO_CRH_MODE15_Pos) | (0x02 << GPIO_CRH_CNF15_Pos);
  
  GPIOB->ODR |= (1<<15); //Включаем подтяжку вверх
}

PB15IDR

int ReadPort(void)
{
  if(GPIOB->IDR & (1<<15))
    return 1;
  return 0;
}

IDR

В этом случае main() будет выглядеть вот так:

void main()
{
  PortInit();
  
  for(;;)
  {
    if(ReadPort())
      PortSetHi();
    else
      PortSetLow();
  }
}

stm32f103c8PB12PB15PP12PB15PB15ReadPort()PB12

На этом все, продолжение следует! Продолжение.

Распиновка разъемов GPIO Raspberry Pi

Внимание! В отличие от плат Arduino, напряжение логических уровней Raspberry Pi является 3,3 В. Максимальное напряжение, которое могут выдержать вход/выходы составляет 3,3 В а не 5 В

Подав напряжение, например 5 В, можно вывести одноплатник из строя.

Таблица распиновки GPIO pin (WiringPi Pin)

WiringPi Pin Назначение Physical Pin Назначение WiringPi Pin
Питание 3.3В 1 2 Питание 5В
8 GPIO 2 (SDA1) I²C 3 4 Питание 5В
9 GPIO 3 (SCL1 ) I²C 5 6 Земля
7 GPIO 4 (GPCLK0) 7 8 GPIO 14 (TXD0) 15
Земля 9 10 GPIO 15 (RXD0) 16
GPIO 17 (GPIO_GEN0) SPI1_CE1 11 12 GPIO 18 (PWM0) SPI1_CE0 1
2 GPIO 27 (GPIO_GEN2) 13 14 Земля
3 GPIO 22 (GPIO_GEN3) 15 16 GPIO 23 4
Питание 3.3В 17 18 GPIO 24 5
12 GPIO 10 (SPI0_MOSI) 19 20 Земля
13 GPIO 9 (SPI0_MISO) 21 22 GPIO 25 6
14 GPIO 11 (SPI0_SCLK) 23 24 GPIO 8 SPI0_CE0 10
Земля 25 26 GPIO 7 SPI0_CE1 11
ID_SD 27 28 ID_SC
21 GPIO 5 (GPCLK1) 29 30 Земля
22 GPIO 6 (GPCLK2) 31 32 GPIO 12 (PWM0) 26
23 GPIO 13 (PWM1) 33 34 Земля
24 GPIO 19 (PWM1) (SPI1_MISO) 35 36 GPIO 16 SPI1_CE2 27
25 GPIO 26 37 38 GPIO 20 (SPI1_MOSI) 28
Земля 39 40 GPIO 21 (SPI1_SCLK) 29
  • Physical Pin: нумерация, отвечающая за физическое расположение контакта на гребенке.
  • GPIO: нумерация контактов процессора Broadcom. Может пригодиться при работе с пакетом .
  • WiringPi Pin: нумерация контактов для пакета Wiring Pi. Это Arduino-подобная библиотека для работы с GPIO-контактами.
  • ШИМ: плата имеет два канала ШИМ по два потока в каждом.

    • PWM0, ;
    • PWM1, .
  • I²C: SDA1, SCL1. Для общения с периферией по синхронному протоколу, через два провода.
  • SPI: К  можно подключить два ведомых устройства, а к  — три. Выбор осуществляется сигналом на пине CEx.

    • SCLK — Serial CLocK
    • CE — Chip Enable (often called Chip Select)
    • MOSI — Master Out Slave In
    • MISO — Master In Slave Out
    • MOMI — Master Out Master In
  • UART: , . Асинхронный протокол последовательной передачи данных по двум проводам  и 

Пины питания и заземления

Контакты питания и заземления используются для питания внешних цепей. Все Raspberry Pi со стандартными контактами 40 GPIO будут иметь два контакта 5В и два контакта 3.3В, всегда в одном и том же месте.

Наряду с контактами 5 В и 3,3 В доступны 8 заземляющих контактов (GND). Контакты питания и заземления позволяют питать ваши компоненты Raspberry Pi, такие как светодиоды и двигатели. Однако помните, что перед тем, как на что-либо подавать питание через эти контакты, всегда следует устанавливать надлежащие компоненты или внешнюю схему. Питание чего-либо со слишком большим током или значительными скачками напряжения, например, двигатель без соответствующего контроллера мотора, повредит контакты и может сделать их непригодными для использования.

Управление GPIO «Малины» через Python

И теперь самое интересное: как выполняется управление GPIO Raspberry Pi через Пайтон.

Абсолютно отсутствует необходимость рассказывать о самом языке Python и подробно описывать библиотеку. Эту информацию легко найти на официальных сайтах соответствующих проектов – лучше изложить материал, чем там, крайне тяжело.

Однако есть смысл просто продемонстрировать некоторые принципы взаимодействия с GPIO. Конечно, перед написанием кода следует подключить устройство, с которым нужно работать к GPIO.

Первое, что потребуется сделать – это подключить библиотеку, делается это так: import PRi.GPIO as GPIO.

Далее нужно дать интерпретатору понять, что обращение к портам будет выполняться по их названиям. Это выполняется инструкцией: GPIO.setmode(GPIO.BCM). Предварительно также рекомендуется сбросить текущее состояние интерфейса (мало ли каково оно, хотя это и не критично) – GPIO.cleanup().

Далее можно сконфигурировать порты на выход и вход. Первое делается так: GPIO.setup(НОМЕР_ПОРТА, GPIO.OUT), а второе – GPIO.setup(НОМЕР_ПОРТА, GPIO.IN).

То есть, как можно убедиться, абсолютно ничего сложного в работе с GPIO нет. Главное – знать название портов (возможно почерпнуть из схемы) и функции, предусмотренные библиотекой.

Метод переходных процессов: чтение аналоговых данных

Как кратко упоминалось в введении, Raspberry Pi не умеет считывать электрические аналоговые сигналы или данные. Причина отсутствия этого функционала заключается в том, что у микроконтроллера BCM (Broadcom) в Raspberry Pi нет встроенной схемы аналого-цифрового преобразователя. Два альтернативных метода, которые могут позволить RPi считывать электрические аналоговые сигналы, заключаются в подключении внешней микросхемы АЦП (MCP3008) или использовании простой схемы заряда-разряда. В данном проекте мы будем использовать схему заряда-разряда для чтения электрических аналоговых сигналов. Схема заряда-разряда позволяет RPi считывать непрерывные данные, используя метод переходных процессов. Работа метода переходных процессов основана на наблюдении, как реагирует RC цепь (резистор-конденсатор) на фронт импульса (переход от низкого уровня к высокому) в течение заданного периода времени. Поведение электрического отклика RC цепи основано на заряде и разряде конденсатора, принимающего электрический импульс или ступенчатый сигнал. Рисунок 2 показывает модель электрической схемы базовой RC цепи. Осциллограммы прикладываемого ступенчатого сигнала и отклика цепи заряда-разряда показаны на рисунке 3. Для создания RC цепи и получения формы сигнала отклика я использовал бесплатный программный пакет моделирования схем Micro-Cap.

Рисунок 2 – Базовая RC цепь, используемая в методе переходных процессов

Обратите внимание: R2 – это аналоговое устройство, предоставляющее схеме значения непрерывного сигналаРисунок 3 – Входной импульсный сигнал и отклик RC цепи заряда-разряда . Кроме того, как показано на рисунке 3, сигнал входного импульса подается на RC цепь на 5 мс (миллисекунд)

Конденсатор (C1) заряжается в течение этого времени через резисторы R1 и R2. После того, как конденсатор полностью зарядится, при спаде импульса входного сигнала конденсатор разряжается через резистор R3. Время разряда устанавливается на 1 мс. Эти заряд и разряд конденсатора могут быть выполнены с помощью кода на питоне, реализованного на RPi. Поскольку этот цикл заряда и разряда выполняется непрерывно, в скрипте на питоне используется программный счетчик для предоставления эквивалентного непрерывного значения данных аналогового устройства, считываемых Raspberry Pi. Значение программного счетчика постоянно обновляется и отображается в основном коде приложения, находящемся в бесконечном цикле. Если вам интересно электрическое поведение RC цепи, ниже приведен файл Micro-Cap. Ниже приведены две принципиальные схемы, показывающие цепи заряда и разряда, подключенные к RPi. На рисунках 4 и 5 показано, что цепи заряда и разряда подключены к GPIO выводам 18 и 23 Raspberry Pi

Кроме того, как показано на рисунке 3, сигнал входного импульса подается на RC цепь на 5 мс (миллисекунд). Конденсатор (C1) заряжается в течение этого времени через резисторы R1 и R2. После того, как конденсатор полностью зарядится, при спаде импульса входного сигнала конденсатор разряжается через резистор R3. Время разряда устанавливается на 1 мс. Эти заряд и разряд конденсатора могут быть выполнены с помощью кода на питоне, реализованного на RPi. Поскольку этот цикл заряда и разряда выполняется непрерывно, в скрипте на питоне используется программный счетчик для предоставления эквивалентного непрерывного значения данных аналогового устройства, считываемых Raspberry Pi. Значение программного счетчика постоянно обновляется и отображается в основном коде приложения, находящемся в бесконечном цикле. Если вам интересно электрическое поведение RC цепи, ниже приведен файл Micro-Cap. Ниже приведены две принципиальные схемы, показывающие цепи заряда и разряда, подключенные к RPi. На рисунках 4 и 5 показано, что цепи заряда и разряда подключены к GPIO выводам 18 и 23 Raspberry Pi.

Рисунок 4 – Интерфейс Raspberry Pi для цепи заряда конденсатора C1Рисунок 5 – Интерфейс Raspberry Pi для цепи разряда конденсатора C1

Теперь, когда мы разобрались с базовыми знаниями о том, как считывать электрические аналоговые сигналы или данные, используя метод переходных процессов, давайте соберем схему устройства с аналоговым интерфейсом на Raspberry Pi!

О датчике VL53L0X

VL53L0X использует измерения дальности инфракрасного излучения для измерения дальности, что позволяет ему получать точные результаты независимо от цвета и поверхности цели.

Датчик VL53L0X от Adafruit (слева) и Pololu (справа)

Измерения расстояния могут быть считаны через цифровой интерфейс I²C. Плата имеет линейный регулятор 2,8 В и встроенные регуляторы уровня, которые позволяют ей работать в диапазоне входного напряжения от 2,6 В до 5,5 В, а расстояние между выводами 0,1″ облегчает использование со стандартными макетами без припоя.

Характеристики

  • Размеры: 0,5″ × 0,7″ × 0,085″ (13 мм × 18 мм × 2 мм)
  • Вес: 0,5 г (0,02 унции)
  • Рабочее напряжение: от 2,6 В до 5,5 В
  • Ток питания: 10 мА (типичное среднее значение во время активного измерения). Зависит от конфигурации, цели и среды. Пиковый ток может достигать 40 мА.
  • Выход (I²C): считывание 16-битного расстояния (в миллиметрах)
  • Диапазон измерения расстояния: до 2 метров (6,6 фута).

График таблицы характеристик VL53L0X типичной производительности измерения дальности (в режиме по умолчанию):

Эффективный диапазон зависит от конфигурации, цели и среды. В техническом описании не указан минимальный диапазон, но эффективный предел составляет около 3 см.

Распиновка

Для использования платы VL53L0X необходимо как минимум четыре соединения (см. схему ниже):

  • VIN,
  • GND,
  • SCL,
  • SDA.

Вывод VIN должен быть подключен к источнику от 2,6 до 5,5 В, а заземление должно быть подключено к 0 вольт. Встроенный линейный регулятор напряжения преобразует VIN в источник питания 2,8 В для интегральной схемы VL53L0X.

Контакты I²C, SCL и SDA подключены к встроенным переключателям уровня, что делает их безопасными для использования при напряжениях свыше 2,8 В; они должны быть подключены к шине I²C, работающей на том же логическом уровне, что и VIN.

Вывод XSHUT является входом, а вывод GPIO1 — выходом с открытым стоком; оба контакта вытянуты платой до 2,8 В. Они не подключены к переключателям уровня на плате и не допускают 5 В, но их можно использовать как есть со многими микроконтроллерами 3,3 В и 5 В: микроконтроллер может считывать выходной сигнал GPIO1, пока его логический верхний порог ниже 2,8 В, и микроконтроллер может чередовать свой собственный выход между состояниями низкого и высокого импеданса, чтобы управлять выводом XSHUT. В качестве альтернативы, 4-канальный двунаправленный логический переключатель уровня может использоваться снаружи с этими выводами.

PIN (пин, вывод) Описание
VDD Регулируемый выход 2,8 В. Почти 150 мА доступно для питания внешних компонентов. Если вы хотите обойти внутренний регулятор, вместо этого вы можете использовать этот вывод в качестве входа 2,8 В с отключенным VIN.
VIN Это основной источник питания от 2,6 до 5,5 В. Переключатели уровня SCL и SDA поднимают линии I²C высоко до этого уровня.
GND Заземление (0 В) для подключения вашего источника питания.
SDA Сдвинутая по уровню линия данных I²C: ВЫСОКИЙ (HIGH) это VIN, НИЗКИЙ (LOW) — это 0 В
SCL Линия синхронизации I²C со сдвигом уровня: ВЫСОКИЙ (HIGH) это VIN, НИЗКИЙ (LOW) — это 0 В
XSHUT Этот вывод является активным-низким входом отключения; плата тянет его до VDD, чтобы включить датчик по умолчанию. Низкий уровень этого вывода переводит датчик в аппаратный режим ожидания. Этот вход не смещен по уровню.
GPIO1 Программируемый выход прерывания (логический уровень VDD). Этот вывод не сдвинут по уровню.

Как работать с универсальными линиями ввода-вывода GPIO ? Печать

Изменено: Вт, 9 Июл, 2019 at 9:29 AM

В роутерах RTU предусмотрены 4 универсальных порта ввода-вывода GPIO (маркировка I1, I2, I3 и I4).

Выводы являются независимыми, могут быть программно сконфигурированы в Операционной системе и предполагают три режима использования:

1. Подключение резистивных датчиков.

2. Управление нагрузкой. В данном режиме выводы I1 — I4 можно объединять для увеличения нагрузочной способности выхода.

3. Измерение напряжения (режим работы по умолчанию).

PULLUP — «Подтягивающий» резистор к питанию.

PULLDOWN — «Подтягивающий» резистор к заземлению.

ADC — АЦП.

1. Конфигурирование GPIO через WEB

Начиная с прошивки 1.5 в роутеры RTU добавлена возможность управления режимами через WEB

Необходимо перейти во вкладку Сервисы -> GPIO

Описание:

Mode 1 — Режим «Измерение напряжения»

Mode 2 — Режим «Подключение резистивных датчиков»

Mode 3 — Режим «Управление нагрузкой»

Выбирая нужные пункты, включаются необходимые режимы.

ВНИМАНИЕ!!! После перезагрузки роутера, параметры примененные в WEB не сохраняются. 2

Конфигурирование GPIO через Консоль

2. Конфигурирование GPIO через Консоль

Каждый GPIO имеет определенный индекс и направление по умолчанию, в операционной системе, приведем таблицу соответствий:

Порт Обозначение Индекс в ОС Направление по умолчанию
I1 GPIO0PULLUP # gpio71 OUT
GPIO0PULLDOWN gpio67 OUT
ADC0 (LRADC5) 5 IN
I2 GPIO1PULLUP # gpio68 OUT
GPIO1PULLDOWN gpio70 OUT
ADC1 (LRADC0) IN
I3 GPIO2PULLUP # gpio74 OUT
GPIO2PULLDOWN gpio121 OUT
ADC2 (LRADC4) 4 IN
I4 GPIO3PULLUP # gpio64 OUT
GPIO3PULLDOWN gpio122 OUT
ADC3 (LRADC6) 6 IN

# — инвертированный сигнал.

Все GPIO расположены по пути /sys/class/gpio/

Если мы работаем с PULLDOWN, #PULLUP должен быть выключен!

Если мы работаем с #PULLUP, выключен должен быть уже PULLDOWN!

Для примера включим на входе I1 режим измерения напряжения:

echo 71 > /sys/class/gpio/export

echo in > /sys/class/gpio/gpio71/direction

echo 67 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio67/direction

echo 0 > /sys/class/gpio/gpio67/value

Пример измерения напряжения на входе I1:cat /sys/bus/iio/devices/iio\:device0/in_voltage5_rawПолучаем N (для примера 2686)

Формула для расчета:0..18В — Это разброс напряжения.0В = 0(18/4096)*N=X

(18/4096)*2686=11,80V

Теперь включим на I1 режим «Подключения резистивных датчиков»:

echo 71 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio71/direction

echo 0 > /sys/class/gpio/gpio71/value

echo 67 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio67/direction

echo 0 > /sys/class/gpio/gpio67/value

Формула определения зависимости сопротивления резистивного датчика от цифровых показаний adc_raw:

R = 0.543 * adc_raw

И третий режим «Управление нагрузкой»:

echo 71 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio71/direction

echo 1 > /sys/class/gpio/gpio71/value

echo 67 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio67/direction

echo 1 > /sys/class/gpio/gpio67/value

Тогда для управления током будем подавать команду

echo 1 > /sys/class/gpio/gpio67/value — рабочий ток идет через нагрузку

echo 0 > /sys/class/gpio/gpio67/value — рабочий ток НЕ идет через нагрузку

Для того, чтобы постоянно не подавать команды инициализации GPIO, их можно внести в файл /etc/rc.local

Тогда после перезагрузки будет включаться необходимый режим автоматически.

Вы могли заметить т.к. PULLUP # инвертирован:1 — вЫключает PULLUP #0 — включает PULLUP #1 — включает PULLDOWN0 — вЫключает PULLDOWN

3. Подключение токовых датчиков(сенсоров) 4-20мА к универсальным линиям

Для подключения токовых датчиков, необходимо использовать режим «Измерение напряжения»

Типовая схема подключения токовых датчиков к RTU:

Сигналы токовой петли преобразуются в напряжение и их можно считывать через АЦП

Сопутствующие статьи:

Дополнительная информация:

Wiki на GITHUBСтраница роутера на сайте TeleofisКонтроллеры на платформе роутера RTU

Была ли эта статья полезной?
Да
Нет

Отправить отзыв К сожалению, мы не смогли помочь вам в разрешении проблемы. Ваш отзыв позволит нам улучшить эту статью.

Упрощенная схема ввода — вывода

В упрощенном варианте принцип работы портов в цифровых режимах записи и чтения удобно рассмотреть на схеме, приведенной на рисунке 2. 

Диодная защита

На внешнем выводе I/O Pin стоит защита от напряжения. При превышении напряжения на выводе откроется верхний диод и сбросит напряжение на линию питания. При возникновении на выводе отрицательного напряжения, откроется нижний диод и погасит всплеск на землю. Данная защита рассчитана на незначительные скачки напряжения.

В микроконтроллерах есть выводы, которые обозначены как «входы, толерантные к TTL сигналам». В спецификации указано, что на эти входы может подаваться внешнее напряжение до 5,25 вольт. Дело в том, что в схемотехнике данных выводов отсутствует верхний диод к питанию. Получается, что при приложении внешнего напряжения, превышающего напряжение питания МК, ток через вывод не течет — верхнего диода нет, а вывод может быть только входом. Часть Output Driver в данном случае должна быть отключена.

Вывод

Работа выходного тракта осуществляется включением ключа «Output Enable» в схеме. В библиотеке SPL за это отвечает параметр:

Когда порт работает на выход, то вариантов настройки не много. В основном режиме ключ «Pull-Down» закрыт и транзисторы, переключаясь попарно, передают «0» или «1» со входа на выход. За закрытое положение ключа в SPL отвечает параметр:

В режиме с открытым стоком ключ «Open Drain» открыт и верхний транзистор отвязан от выходной линии. Получается, что он не может передать «1» на выход. В то же время нижний транзистор работает как раньше и сбрасывает состояние выхода в «0» при открытии. Этот режим подходит для линий или шин в которых есть внешняя подтяжка к линии питания, например в I2C. В таком случае после закрытия транзистора земли, на линии появится «1» за счет этой общей подтяжки к питанию. За включение этого режима ключа в SPL отвечает параметр:

Когда интересует чтение внешних данных, приходящих на пин, то собственный тракт выхода следует отключить. В SPL:

Hi-Z

Когда резисторы подтяжки Pull Up и Pull Down отключены, и при этом отключен выходной тракт, ключ Output Enabled выключен, внешний вывод становится «висящим». Это состояние называется высокоомным или Hi-Z состоянием. Такой режим может применяться, например, для прослушивания какой-нибудь линии в шине. Поскольку сопротивление нашего вывода очень велико, то его присутствие никак не сказывается на работе шины. В тоже время, поскольку это, по существу, висящий провод, то он ловит всевозможные помехи и наводки. Для борьбы с наводками используются подтягивающие резисторы.

В SPL подтяжки выключаются так:

Подтяжка к питанию

При включении резистора Pull Up, сопротивление которого ~50кОм, шумы на выводе подавятся. На внешнем выводе по умолчанию появится логическая «1». В тоже время, если к выводу подключена кнопка, замыкающая линию на землю, то на выводе появится логический «0». В SPL:

Подтяжка к земле

При включении резистора Pull Down сопротивление которого также ~50кОм, на выводе устанавливается «0». В SPL:

С целью снижения энергопотребления и повышения надежности рекомендуется все неиспользованные пины включить в режим Pull Up. В таком случае их не будет дергать из одного логического состояния в другое помехами, а в случаем КЗ линия не выгорит.

Триггер Шмитта

В тракте считывания может быть включен триггер Шмитта. Этот триггер известен тем, что имеет гистерезис и при некотором отклонении напряжения dU от заданного логического уровня на входе сохраняет текущее логическое значение на выходе.

Например, если ножка настроена на вход и напряжение на ней равно напряжению питания, то микроконтроллер трактует это, как наличие логической «1» на входе. Если в какой-то момент на линии появится помеха, или наводка такая, что напряжение на входе просядет меньше чем на dU, то микроконтроллер будет по-прежнему трактовать это как логическую «1». С логическим нулем ситуация аналогичная.

В SPL, выключен:

включен:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: