Энкодер FLASH-I2C: различия между версиями
(Новая страница: «мини|Внешний вид FLASH-I2C '''Энкодер FLASH-I2C''' -является устройством ввода данны...») |
Нет описания правки |
||
(не показаны 3 промежуточные версии 1 участника) | |||
Строка 7: | Строка 7: | ||
Модуль можно использовать в любых проектах где требуется тактовая кнопка, потенциометр или энкодер, а так же в тех проектах где требуется диммирование устройств без участия других микроконтроллеров. | Модуль можно использовать в любых проектах где требуется тактовая кнопка, потенциометр или энкодер, а так же в тех проектах где требуется диммирование устройств без участия других микроконтроллеров. | ||
== Характеристики == | |||
* Напряжение питания: 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|мини|342x342пкс]] | |||
У модуля имеются две колодки выводов: разъём '''I2C''' (GND, Vcc, SDA, SCL) и разъём '''D/A''' (GND, Vcc, Signal). | |||
* '''SCL''' - вход/выход линии тактирования шины I2C. | |||
* '''SDA''' - вход/выход линии данных шины I2C. | |||
* '''Vcc''' - вход питания 3,3 или 5 В. | |||
* '''GND''' - общий вывод питания. | |||
* '''Signal''' - программируемый выход модуля. | |||
Модуль подключается к Arduino по '''шине I2C'''. | |||
Устройства которыми модуль управляет в автономном режиме, подключаются к колодке '''D/A'''. | |||
== Подключение == | |||
[[Файл:Imageвнеш.png|мини|389x389пкс|Внешний вид макета]] | |||
Модуль подключается к аппаратной или программной шине I2C Arduino и имеет адрес 0x68. Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO. | |||
Модуль может работать в автономном режиме, при этом необязательно подключать ведущее устройство к колодке I2C, достаточно подать питание на Vcc и GND, но, перед этим, модулю необходимо установить опцию работы вывода '''S''' при помощи ведущего устройства функцией PinMode( РЕЖИМ ). Опция будет сохранена в энергонезависимой памяти модуля. | |||
===Программа=== | |||
Программа демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.<syntaxhighlight lang="c"> | |||
#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); // | |||
} // | |||
</syntaxhighlight> |
Текущая версия от 21:49, 11 мая 2022
Энкодер 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.
- Задавать количество оборотов вала энкодера, как для автономной работы, так и для определения его положения.
- Указывать частоту для сигнала ШИМ, если таковой формируется на выходе модуля.
Контакты датчика
У модуля имеются две колодки выводов: разъём 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); // } //