Подключение цифровой линейки к ардуино

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Spell, 9 мар 2018.

  1. Spell

    Spell Нерд

    Приобрёл я себе цифровую линейку на 200 мм https://www.banggood.com/0-200mm-0_...External-Display-p-1013030.html?rmmds=myorder и хотел подключить к компьютеру.
    Повелся я на рекламу, что там USB-порт. Оказалось, что он только геометрически USB. А на самом деле там тактируемый последовательный порт, который передает в формате 21-битного протокола. Т.е. просто воткнуть и прочитать данные не получится.
    Вообще линейка состоит из двух частей : датчика на линейке и цифрового индикатора.
    Датчик считывает положение с линейки и передает эти данные на индикатор через 21-битный протокол обмена. Индикатор пересчитывает эти данные в человеческую форму в мм или дюймы. Он же устанавливает 0.
    Фактически я пытаюсь сделать индикатор.
    Благодаря вот этой статье http://www.shumatech.com/web/21bit_protocol?page=0,0 мне удалось создать для ардуино процедуру, которая считывает эти данные. Если коротко, то полученный код надо разделить на 2560 и получится абсолютное значение в дюймах. Дальше, чтобы получить миллиметры, надо значение в дюймах умножить на 25,4.
    И вроде все работает. Но тут натолкнулся на ....
    В некоторой точке линейки (даже не по середине) передаваемое по интерфейсу значение доходит до 0. А следующая позиция становится 2097151. Это 2 в степени 21.
    При этом линейка нормально отображает данные на индикаторе. Т.е., видимо, так и задумано.
    А я туплю. Как это обсчитать?
    По считанным данным получается следующее:
    Точка 0 - 15227
    точка 151,08 мм - 0
    точка 151,09 - 2097151
    точка 200 мм - 2092220
    До точки 151.08 и после нее расчет значений подчиняется одному закону.

    Подкиньте идейку как правильно учесть этот переход через 0?

    ЗЫ. Простите, что много букв. Короче не получилось.
     
  2. Spell

    Spell Нерд

    Эх! Я сам допер.
    Все очень просто.
    Все большие числа после 0 - это отрицательные числа в дополнительном коде.
    Правда, есть тонкость. Т.к. код 21-битный, то укладывать его приходится в переменную типа long. А этот тип, как известно, занимает 4 байта, т.е. 32-битный.
    Поэтому, после чтения данных надо сделать проверку на установленный 21 бит (это означает, что число отрицательное), и в случае положительного ответа установить в 1 все биты старше 21 - го.
    Если этого не сделать, то число в 32-битном варианте получится не в дополнительном коде, и, соответственно, будет неправильно интерпретировано.
    После этого мы получаем линейную шкалу, где 2560 ед. шкалы = 1 дюйму (или 25,4 мм).
    Всё. Дальше дело техники. Можно без труда подключать эти линейки к компу хоть по сотне на один.
     
    mcureenab нравится это.