Найти в Дзене
Кроконяшка

Энкодер 15bit 5-24V RS485 или датчик абсолютного значения подключение к ардуино.

Всем привет, сегодня речь пойдёт об вот таком сверх точным эндодерм который делит один оборот в 360 градусов на 32768 тесть точность составляет 0.01098 градуса. Максимальная Механическая скорость: 1000 об/мин. Этот энкодер был приобретён на платформе AliExpress (https://alii.pub/73v6wk?erid=2SDnjdvhh2T), а также можно найти его характеристики и ПО на сайте производителя — https://briterencoder.com. На этом сайте представлена вся необходимая информация, включая программу для проверки работы устройства и подробные технические характеристики энкодера. Прежде чем переходить к настройке и подключению энкодера, давайте подробнее рассмотрим его устройство. Данный энкодер является однооборотным, что означает, что каждый оборот начинается с значения 1 и заканчивается 32768. Он использует принцип Кода Грея. Каждое сочетание расположения меток на диске представляет уникальный двоичный код. Для оптических абсолютных энкодеров меткой является отверстие, через которое проходит свет. Пример внешнего

Всем привет, сегодня речь пойдёт об вот таком сверх точным эндодерм который делит один оборот в 360 градусов на 32768 тесть точность составляет 0.01098 градуса. Максимальная Механическая скорость: 1000 об/мин.

Этот энкодер был приобретён на платформе AliExpress (https://alii.pub/73v6wk?erid=2SDnjdvhh2T), а также можно найти его характеристики и ПО на сайте производителя — https://briterencoder.com. На этом сайте представлена вся необходимая информация, включая программу для проверки работы устройства и подробные технические характеристики энкодера.

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

Данный энкодер является однооборотным, что означает, что каждый оборот начинается с значения 1 и заканчивается 32768. Он использует принцип Кода Грея. Каждое сочетание расположения меток на диске представляет уникальный двоичный код. Для оптических абсолютных энкодеров меткой является отверстие, через которое проходит свет. Пример внешнего вида 8-битного Кода Грея представлен ниже.

-2

Энкодер работает на базе оптических приёмников и фотодиодов, что обеспечивает точность и надёжность считывания данных.

Так-же можно ознакомится с работой 3Х битного кода грея, рассмотренного мною в данной статье.

Тепtрь о самом датчик абсолютного значения он называется BRT50-R0M32768-RT1. На нем есть светодиодный индикатор, который сигнализирует о его состоянии. Он меняет цвет в зависимости от настроек и состояния работы устройства, а также может указывать на возможные неисправности. При подаче питания индикатор будет трижды мигать синим, затем бирюзовым и ещё раз синим, что означает, что датчик настроен на заводские параметры.

-3

Если настройки энкодера были изменены, например, с частоты 9600 бод на 11520 бод, индикация изменится: индикатор будет мигать трижды синим, затем бирюзовым и один раз зелёным. При обращении к датчику и получению с него значений индикация смениться на быстрое мигание зеленым.

-4

Для первоначальной настройки и проверки работоспособности абсолютного энкодера, работающего как помним по протоколу RX485 нам понадобиться компьютер, программа скаченная с ОФ сайта и RX485-USB конвертор к примеру такой как у меня.

Для первоначальной настройки и проверки работоспособности абсолютного энкодера, работающего по протоколу RS-485, нам потребуется компьютер, программа, скачанная с официального сайта, и USB-конвертер RS-485, например, такой, как у меня.

  1. Установка драйверов. Первым делом нужно установить драйвера для RS-485-USB конвертера.
  2. Подключение энкодера. Далее подключаем провода к энкодеру в соответствии с указаниями на устройстве: черный — минус, красный — +5-24 В, зеленый — B, белый — A. Подключаем эти провода к соответствующим пинам RS-485-USB конвертера.
  3. Запуск программы. Подключаем конвертер к компьютеру и запускаем программу. В программе находим COM-порт конвертера и подключаемся к устройству. Затем запускаем поиск энкодера. Когда он будет найден, можно будет увидеть его характеристики, проверить работоспособность и при необходимости изменить настройки. Например, можно изменить скорость обмена данными, которая будет сохранена в памяти энкодера.
-6

На официальном сайте данного датчика есть пример использования программного обеспечения.

Когда вы проверили датчик можно переходиться непосредственно к подключению его к Arduino. Первое что необходимо это купить модуль RS485 (https://alii.pub/73cywi?erid=2SDnjc4RCfD) могу порекомендовать такой. Этот модуль используется для передачи данных по протоколу RS-485, который является основным для работы с данным энкодером. С помощью этого модуля Arduino сможет взаимодействовать нашим устройством.

-7

На этом модуле есть светодиоды TX и RX, которые позволяют легко отслеживать работу устройства. Подключение модуля к моему Arduino Nano следующее: D2 — TX, D3 — RX. Питание для модуля подаётся напрямую от 5 вольт контроллера. Энкодер также подключён к 5 вольт питания микроконтроллера, а контакты A и B соединены с соответствующими пинами модуля RS-485. Программа для Arduino:

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
// Пины для SoftwareSerial
#define RS485_RX 2
#define RS485_TX 3
SoftwareSerial rs485Serial(RS485_RX, RS485_TX);
ModbusMaster node;
int lastValue = 0; // Для хранения последнего значения регистра
long rotations = 0; // Для хранения количества оборотов
void setup() {
Serial.begin(115200);
while (!Serial) {}
// Инициализируем программный порт RS-485
rs485Serial.begin(57600);
// Адрес энкодера: 1
node.begin(1, rs485Serial);
Serial.println("Отправка запроса чтения 1 регистра (0x0000) у слейва с адресом 1...");
// Читаем 1 регистр с адреса 0x0000
uint8_t result = node.readHoldingRegisters(0x0000, 1);
if (result == node.ku8MBSuccess) {
lastValue = node.getResponseBuffer(0);
Serial.print("Прочитанное значение: ");
Serial.println(lastValue);
} else {
Serial.print("Ошибка чтения, код: ");
Serial.println(result, HEX);
}
}
void loop() {
// Чтение регистра для получения текущего значения энкодера
uint8_t result = node.readHoldingRegisters(0x0000, 1);
if (result == node.ku8MBSuccess) {
int currentValue = node.getResponseBuffer(0);
// Проверка на переполнение или изменение направления
if (currentValue > lastValue) {
if (currentValue - lastValue >= 16384) { // Порог для половины диапазона 15 бит
rotations++;
}
} else if (currentValue < lastValue) {
if (lastValue - currentValue >= 16384) {
rotations--;
}
}
// Выводим значение и количество оборотов
Serial.print("Значение: ");
Serial.print(currentValue);
Serial.print(" ");
Serial.print("Количество оборотов: ");
Serial.println(rotations);
// Обновляем последнее значение для следующего сравнения
lastValue = currentValue;
} else {
Serial.print("Ошибка при повторном чтении: ");
Serial.println(result, HEX);
}
}

Замечу что программе нужно 2 библиотеки ( #include <ModbusMaster.h>)(#include <SoftwareSerial.h>)

Программа написана так, чтобы помимо вывода 15-битного значения поворота энкодера, также отображать количество оборотов.

-8

Замечу, что хотя датчик абсолютного значения может работать на частоте 115200, по какой-то причине он стабильно работает только на частоте 57600. Возможно, проблема в самой Arduino или в модуле RS485. В будущем планирую проверить его на микроконтроллере STM32 — если интересно, пишите в комментариях, и я расскажу, что получилось. Также важно в программе Arduino IDE указать Address ID, который, как видно в программе имеет значение 1

-9

В заключение скажу, что мне нравится этот энкодер за свою точность. Хотя над программой для него пришлось повозиться, в итоге он работает точно. Главный его недостаток — возможность считывать обороты — я устранил программными методами.

На этом всё! Подписывайтесь на канал, ставьте лайк и до новых встреч в следующих публикациях!