Jump to content

    
Sign in to follow this  
MiD

Нужно разобраться в протоколе RS485 беговой дорожки.

Recommended Posts

3 hours ago, vguard said:

Ваши рассуждения верны. Пульт шлет скорость и наклон, для чего еще шлет пакет F9/9F Вам до лампочки, просто шлите его также.
Соответственно для решения задачи Вам нужно примерно с теми же паузами между пакетами слать 3 пакета:
00 FF F1 02 00 (скорость) CRC
00 FF F6 02 00 (наклон) CRC
00 FF F9 00 90 - запрос непонятно чего, скорее всего защита от применения пульта с другими дорожками, потому что в ответе 6-й байт формируется явно по какому-то хитрому алгоритму.
Почему-то относительно ранее присылаемых логов у Вас байты в новых логах развернулись (старший бит стал младшим и наоборот). Но это не принципиально байты развернете как нужно без проблем.

 

Байты поменял по совету esaulenka с целью единообразия с Ардуино.

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

Моя мысль была разорвать пульт и нижний блок. Контакты RX TX ардуино подключить к DA DB проводам нижнего блока и пустить пакеты. Единственно не понимаю нужно ли что-то делать с проводами питания и земли. Она же вроде как общая с арудино должна быть.

 

Share this post


Link to post
Share on other sites
On 4/12/2020 at 3:30 PM, esaulenka said:

Как соберёте данные, попробую подобрать алгоритм.

Прогнал данные из скриншота таблички.

Подходит вот такой код:

class Crc8:
    def __init__(self):
        self.poly = 0x31
        self.start = 0
        self.invert = False

    def calc(self, data):
        crc = self.start
        for d in data:
            crc ^= d
            for _ in range(8):
                if crc & 0x80:
                    crc = (crc << 1) ^ self.poly
                else:
                    crc = (crc << 1)
                crc &= 0xFF
        if self.invert:
            crc ^= 0xFF
        return crc

 

Share this post


Link to post
Share on other sites
20 hours ago, MiD said:

Контакты RX TX ардуино подключить к DA DB проводам

(тут картинка рука-лицо, извините)

Как бы попроще объяснить...

UART - это полнодуплексная шина, обмен может осуществляться одновременно в обе стороны: по одному проводу данные передаются в одну сторону, по другому - в другую. Данные совершенно независимы друг от друга, единственное общее - скорость обмена  (так повелось, потому что реализовать проще).

RS232 - в принципе, тот же самый UART, но с другими напряжениями (чуть лучше помехоустойчивость, и вообще - так исторически сложилось).

А вот ваш RS485 - это совершенно другая штука. Тут по-прежнему два провода, но с "логической" точки зрения провод один - данные по этим проводам передаются одинаковые (это сделано для увеличения помехоустойчивости. В данном случае на полутора метрах в домашних условиях - пофиг, а в промышленности RS485 активно используется именно из-за "неубиваемости"). Направление передачи выбирает софт: на драйвере шины есть ножка driver enable, при подаче единицы на которую драйвер включается и "захватывает" шину. Если на шине одновременно больше одного активного драйвера - данные побьются.

Поэтому - никак, вообще никак нельзя подключить RX/TX к A/B.

(Просьба к мимопроходящим гуру. Тут есть некоторые упрощения. Я о них знаю, но давайте не будем флудить. Спасибо.)

 

20 hours ago, MiD said:

Единственно не понимаю нужно ли что-то делать с проводами питания и земли. Она же вроде как общая с арудино должна быть.

Кажется, мы разгадали загадку пропадающего обмена.

Земля у всех устройств должна быть общая, без всяческих "вроде как". Желательно проверить, что земля компьютера (на разъеме USB например, который будете в ардуину тыкать) также не отличается от земли всей этой конструкции.

Иначе эта тема рискует перерасти в "помогите определить, откуда дым пошёл".

Share this post


Link to post
Share on other sites
On 4/15/2020 at 10:33 AM, esaulenka said:

Прогнал данные из скриншота таблички.

Подходит вот такой код:


class Crc8:
    def __init__(self):
        self.poly = 0x31
        self.start = 0
        self.invert = False

    def calc(self, data):
        crc = self.start
        for d in data:
            crc ^= d
            for _ in range(8):
                if crc & 0x80:
                    crc = (crc << 1) ^ self.poly
                else:
                    crc = (crc << 1)
                crc &= 0xFF
        if self.invert:
            crc ^= 0xFF
        return crc

 

Спасибо, за код. Перенес его в синтаксис среды Арудино. Я не знаком с питоном и для меня конено было большим открытием не только визуальное, но и логическое разделение блоков отсутпами!

Самое интересное, всё заработало отлично, CRC считалась, до тех пор пока случайно не убил Арудино Нано. (подключил случайно питание 12В не туда :(  ) Не нашел больше такой же платы дома, взял старую Ardunino Uno и там, при каждом проходе, он расчитывает другой CRC! при одинаковых вводных. Пока не решил, но покурю еще.

 

 

On 4/15/2020 at 10:50 AM, esaulenka said:

(тут картинка рука-лицо, извините)

Как бы попроще объяснить...

UART - это полнодуплексная шина, обмен может осуществляться одновременно в обе стороны: по одному проводу данные передаются в одну сторону, по другому - в другую. Данные совершенно независимы друг от друга, единственное общее - скорость обмена  (так повелось, потому что реализовать проще).

RS232 - в принципе, тот же самый UART, но с другими напряжениями (чуть лучше помехоустойчивость, и вообще - так исторически сложилось).

А вот ваш RS485 - это совершенно другая штука. Тут по-прежнему два провода, но с "логической" точки зрения провод один - данные по этим проводам передаются одинаковые (это сделано для увеличения помехоустойчивости. В данном случае на полутора метрах в домашних условиях - пофиг, а в промышленности RS485 активно используется именно из-за "неубиваемости"). Направление передачи выбирает софт: на драйвере шины есть ножка driver enable, при подаче единицы на которую драйвер включается и "захватывает" шину. Если на шине одновременно больше одного активного драйвера - данные побьются.

Поэтому - никак, вообще никак нельзя подключить RX/TX к A/B.

(Просьба к мимопроходящим гуру. Тут есть некоторые упрощения. Я о них знаю, но давайте не будем флудить. Спасибо.)

 

Кажется, мы разгадали загадку пропадающего обмена.

Земля у всех устройств должна быть общая, без всяческих "вроде как". Желательно проверить, что земля компьютера (на разъеме USB например, который будете в ардуину тыкать) также не отличается от земли всей этой конструкции.

Иначе эта тема рискует перерасти в "помогите определить, откуда дым пошёл".

Да, познания базовые, и тема почти переросла в "откуда пошел дым.." см. пред пост. Еще до вашего поста я подключил как планировал. Сначала вообще ничего не заработало. Затем все остальные провода соединил с пультом оставив в разрыв только DA DB. Добился что дорожка включается от кнопки на ардуино. Но что-то мне подсказывало, что там рандом какой, хотя на кнопку реагировал четко. Так как вчера еще не было кода для увеличения скорости проверить  не смог.

Плата 485 еще не пришла, думаю сейчас задержки с поставками могут быть приличные. И буду решать что с самой ардуино.

Share this post


Link to post
Share on other sites

Ко мне, наконец, пришла RS485 плата. Я опущу "ловлю блох" в своем колхозном коде. Вроде все победил, но до сих пор некоторые моменты работы меня смущают.

Что в итоге? Я полностью отключил пульт. Кабели Safe должны быть замкнуты друг на друга, чтобы все работало. Они разрываются выдергиванием кнопки экстренной остановки дорожки. Запитал Ардуино от самой дорожки и объединил земли. Второй кабель питания пока просто заизолировал.

Сейчас, по кнопке на ардуино, дорожка увеличивает скорость и поднимает полотно. Я считаю это уже успех! Тут самое время поблагодарить всех, кто говорил что делать, что не делать, учил и подсказывал. Большое спасибо! Без поддержки форума я бы не сделал и 20% (а такую попытку я предпринимал в прошлом году)

Ньюансы пока еще конечно остаются. Дорожка поднимается на несколько нажатий верх и опускается сама, а скорость после 5-6 поднятие сбрасывается на 0. 

Пока мое предположение, что значения скорости и наклона становятся больше 255 и 6-го байта уже не достаточно для хранения. Предполагаю, что 5-й байт который в обоих пакетах 0х00 должен пригодиться. Но это пока не проверял, отпишусь по результату.

Плюс, общая стабильность. Надеюсь будет решена, когда вместо макетки и вороха штырьков, хотя бы пропаяю все провода.

TreadMill_bb.jpg

SpeedPkg.JPG

Share this post


Link to post
Share on other sites

Замечательно , что получили помощь.

Но впереди еще много до чего предстоит дойти свими мозгами и в первую очередь руками.

Потом отпишитесь как все сделалаете, выложите схемы или фото как выглядит.

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

 

Share this post


Link to post
Share on other sites

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

Скорость дорожки начинается с 0,8 км\ч, это 0x00;0xAA или 170 в десятичном. Кнопка прибавляет скорость на 0,1 км\ч или на 21 в десятичных значениях.

До 1,3 км\ч математика точно совпадает с фактом из дампов, но дальше начинается разбежка, причем чем дальше, тем сильнее. См. табличку.

Либо я не верно выделяю старший младший байты, но врядли на столько либо есть какая-то альтернативная логика. Из мыслей это сдлеать дапм всего многообразия вариантов и сравнить его со сгенерированным десятичным рядом. Или я принципиально что-то не так считаю.

image.thumb.png.314ba79d22a5722a8278393bdf85bd03.png

 

 

Share this post


Link to post
Share on other sites
26 minutes ago, aaarrr said:

21 * 200 = 4200

Ну, на 2 копейки отличается. Это проблема?

4202 - Это расчетное десятичное значение для скорости 20 км\ч, в HEX  это 0х10 и 0х6А, а с замеров дорожки получается 0х10 и 0х8D. Получается 35 (DEC) разница, т.е. даже больше шага 21

Share this post


Link to post
Share on other sites

Регулировочная характеристика у Вас точно линейная? Может при больших скоростях характеритика отклоняется от линейной. Программно можете её линеаризовать.

Share this post


Link to post
Share on other sites
3 часа назад, MiD сказал:

Кнопка прибавляет скорость на 0,1 км\ч или на 21 в десятичных значениях

Если взять число 0x108D (4237) при скорости 20 км/ч и поделить его на 200, получится не 21, а 21.185. Теперь если это число умножить на 60 - получится 1271.1, а если отбросить дробную часть результата, то 1271 - это 0x4F7, все точно совпадает с вашим подслушанным значением. Чтобы получить еще более точный коэффициент, надо смотреть на значение при максиально возможной скорости (я не знаю, может ваша дорожка умеет быстрее 20 км/ч бежать).

Share this post


Link to post
Share on other sites

При скорости начальной скорости 0.8  и конечной 20км/ч , шаге регулирования 0.1  получается 192 значения.  Могли и без математики обойтись загнав коэффициенты в таблицу . Табличный способ проще  и всегда можно построить нужную зависимость выходных данных от количества нажатий кнопки.

Share this post


Link to post
Share on other sites

Спасибо, большое - все сошлось. Завтра проверю в работе. Меня ввели в заблуждение первые 6 совпадений и я, почему-то, не поставил под сомнение, что шаг может быть не целый.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this