Энкодер FLASH-I2C: различия между версиями

Материал из MIK32 микроконтроллер
Нет описания правки
 
(не показана 1 промежуточная версия 1 участника)
Строка 54: Строка 54:
== Подключение ==
== Подключение ==
[[Файл:Imageвнеш.png|мини|389x389пкс|Внешний вид макета]]
[[Файл:Imageвнеш.png|мини|389x389пкс|Внешний вид макета]]
Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68. Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO.
Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68. Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.


Модуль может работать в автономном режиме, при этом необязательно подключать ведущее устройство к колодке I2C, достаточно подать питание на Vcc и GND, но, перед этим, модулю необходимо установить опцию работы вывода '''S''' при помощи ведущего устройства функцией PinMode( РЕЖИМ ). Опция будет сохранена в энергонезависимой памяти модуля.
Модуль может работать в автономном режиме, при этом необязательно подключать ведущее устройство к колодке I2C, достаточно подать питание на Vcc и GND, но, перед этим, модулю необходимо установить опцию работы вывода '''S''' при помощи ведущего устройства функцией PinMode( РЕЖИМ ). Опция будет сохранена в энергонезависимой памяти модуля.


=== Программа ===
===Программа===
<syntaxhighlight lang="c">
Программа демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.<syntaxhighlight lang="c">
#include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
#include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
const int ADDRESS    = 0x09;                    // Определяем адрес модуля.
const int ADDRESS    = 0x09;                    // Определяем адрес модуля.

Текущая версия от 21:49, 11 мая 2022

Внешний вид FLASH-I2C

Энкодер FLASH-I2C -является устройством ввода данных с подключением по шине I2С. У модуля есть программируемый выход, значительно расширяющий его возможности.

Модуль способен работать как энкодер (отправляя количество тактов поворота вала в одну и другую сторону), как потенциометр (отправляя точное положение вала относительно точки сброса), как тактовая кнопка (отправляя события и состояния кнопки, в т.ч. и время её удержания), а так же модуль способен работать автономно (управляя сигналом на выходе без подключения к шине I2C).

Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.

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

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

  • Напряжение питания: 3,3 В или 5 В (постоянного тока).
  • Потребляемый ток: до 10 мА (без нагрузки на программируемом выходе).
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выходе Signal: 3,3 В.
  • Аналоговый уровень на выходе Signal: от 0 до 3,3 В.
  • Разрешение ШИМ: 8 бит.
  • Разрешение ЦАП: 8 бит (ШИМ + RC-фильтр).
  • Частота ШИМ: устанавливается программно от 1 до 12000 Гц (по умолчанию 1,5 кГц).
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 30 х 30 мм.

Описание датчика

Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. Модуль самостоятельно обрабатывает сигналы энкодера (и его тактовой кнопки). Отличием данного модуля является наличие вывода, который можно запрограммировать для работы в качестве выхода без дальнейшего подключения модуля к шине I2C (без подключения к внешнему микроконтроллеру). Вывод модуля может работать как выход кнопки энкодера, как выход кнопочного переключателя (триггер), как выход с ШИМ (для управления моторами), как выход с логарифмической ШИМ (для управления светодиодами), как выход управления сервоприводами и как аналоговый выход (имитация ЦАП) с напряжением от 0 до 3,3 В. Режим работы выхода сохраняется и после отключения питания. Значит вывод можно однократно запрограммировать и использовать модуль в проектах без подключения к шине I2C.

Модуль позволяет:

  • Получать количество тактов поворота энкодера в одну и другую сторону.
  • Получать состояние и события кнопки вала энкодера.
  • Получать время удержания кнопки вала энкодера.
  • Получать точное положение вала энкодера относительно точки сброса.
  • Сбрасывать положение вала энкодера.
  • Автономно работать управляя сигналом на выходе без подключения к шине I2C.
  • Задавать количество оборотов вала энкодера, как для автономной работы, так и для определения его положения.
  • Указывать частоту для сигнала ШИМ, если таковой формируется на выходе модуля.

Контакты датчика

Imageгш.png

У модуля имеются две колодки выводов: разъём I2C (GND, Vcc, SDA, SCL) и разъём D/A (GND, Vcc, Signal).

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • Vcc - вход питания 3,3 или 5 В.
  • GND - общий вывод питания.
  • Signal - программируемый выход модуля.

Модуль подключается к Arduino по шине I2C.

Устройства которыми модуль управляет в автономном режиме, подключаются к колодке D/A.

Подключение

Внешний вид макета

Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68. Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.

Модуль может работать в автономном режиме, при этом необязательно подключать ведущее устройство к колодке I2C, достаточно подать питание на Vcc и GND, но, перед этим, модулю необходимо установить опцию работы вывода S при помощи ведущего устройства функцией PinMode( РЕЖИМ ). Опция будет сохранена в энергонезависимой памяти модуля.

Программа

Программа демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.

#include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
const int ADDRESS     = 0x09;                    // Определяем адрес модуля.
const int REG_DATA    = 0x10;                    // Определяем адрес регистра REG_DATA.
const int FLG_PRESSED = 5;                       // Определяем номер бита FLG_PRESSED в регистре REG_DATA.
byte      DATA;                                  // Объявляем переменную для хранения байта данных считанных с регистра.
                                                 //
void setup(){                                    //
    Serial.begin(9600);                          // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
    while(!Serial){;}                            // Ждём готовность к работе аппаратной шины UART.
    Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
    Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
}                                                //
                                                 //
void loop(){                                     //
    Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
    Wire.write(REG_DATA);                        // Функция write() помещает значение своего аргумента в буфер для передачи.
    Wire.endTransmission(false);                 // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется).
    Wire.requestFrom(ADDRESS, 1);                // Читаем из модуля с адресом ADDRESS, 1 байт данных в буфер библиотеки Wire. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
    if   ( Wire.available() ){DATA=Wire.read();} // Если в буфере библиотеки Wire есть данные, то читаем 1 байт в переменную DATA.
    while( Wire.available() ){     Wire.read();} // Если в буфере библиотеки Wire есть еще данные, то читаем их в никуда (чистим буфер).
    if   ( DATA & bit(FLG_PRESSED) ){            // Если в полученном байте DATA установлен бит FLG_PRESSED, значит кнопка нажата.
           Serial.println("Кнопка нажата");      //
    }else{ Serial.println("Кнопка отпущена"); }  //
    delay(1000);                                 //
}                                                //