Протокол общения контроллера Speedway mini IV с "курком"

Автор dimap, 18 Авг. 2018 в 13:20

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

dimap

Честно говоря дефолтный "компьютер" с курком на минике достаточно отстоен (начиная хотя бы с точности измерения им напряжения батареи). В общем я задумался потенциально заменить его (не меняя контроллер) или же поставить свой самодельный БК параллельно, в связи с чем встал вопрос о протоколе обмена между контроллером и штатным БК. Поискал по форумам, но полноценного ответа на мой вопрос не нашел. Возможно я не там искал и кто-то сейчас ткнет меня в ссылку, но я пока решил сам попробовать отреверсить, как контроллер в минике управляется штатным БК. Возможно эта тема будет кому-то интересна/полезна, а кто-то даже захочет помочь с анализом собранных данных.

На данный момент удалось выяснить следующее:

1. В БК приходит 5 проводов:
  красный -- питание от батареи
  оранжево/красный -- включение/отключение батареи
  черный -- земля
  зеленый -- управление газом
  желтый -- данные от контроллера
  синий -- данные к контроллеру

2. Управление газом происходит по средством изменения напряжения на зеленом проводе от 0.8В (курок отпущен) до 3.7В (полный газ).

3. Контроллер и БК общаются по UART, baudrate 1200, 15-ти байтовым фреймами, асинхронно, с частотой 5Hz.

4. БК хранит все свои настройки внутри себя и 5 раз в секунду шлет их в контроллер, который уже меняет свой режим работы в зависимости от этих настроек. Контроллер со своей стороны 5 раз в секунду шлет в БК свой статус (где скорее всего в том или ином виде есть информация о скорости вращения МК).

5. Сам протокол я пока не смог полностью расшифровать, но кое что уже удалось идентифицировать.

Данные от БК к контроллеру
Пример данных (15-ти байтовые фреймы):
1, 3, 64, 0, 0, 74, 2, 100, 0, 128, 2, 0, 0, 0, 236,
1, 3, 65, 0, 0, 79, 2, 100, 0, 128, 2, 0, 0, 0, 232,
1, 3, 66, 0, 0, 80, 2, 100, 0, 128, 2, 0, 0, 0, 244,
1, 3, 67, 0, 0, 117, 2, 100, 0, 128, 2, 0, 0, 0, 208,
1, 3, 68, 0, 0, 126, 2, 100, 0, 128, 2, 0, 0, 0, 220,
1, 3, 69, 0, 0, 115, 2, 100, 0, 128, 2, 0, 0, 0, 208,


Как видно, сначала идут два байта 1 и 3 (они не меняются), скорее всего это идентификатор фрейма БК-контроллер, дальше один байт -- счетчик, который просто циклично меняет свое значение от 0 до 255 по кругу.
7-й байт -- битовый вектор флагов, значений параметров P4-P7 (0000 P7 P6 P5 P4)
8-й байт -- значение параметра P8
11-й байт -- значение параметра P9
15-й байт -- контрольная сумма (побитовый xor первых 14-ти байт)
Остальные пока не идентифицировал.
Итого имеем:
1, 3, counter, unk, unk, unk, P4-P7 bits, P8, unk, unk, P9, unk, unk, unk, checksum

Данные от контроллера к БК
Пример данных (15-ти байтовые фреймы):
54, 63, 0, 101, 101, 101, 0, 101, 101, 101, 101, 218, 150, 101, 69,
54, 64, 0, 30, 30, 30, 0, 30, 30, 30, 30, 147, 79, 30, 170,
54, 65, 0, 99, 99, 99, 0, 99, 99, 99, 99, 216, 148, 99, 59,
54, 66, 0, 28, 28, 28, 0, 28, 28, 28, 28, 145, 77, 28, 168,
54, 67, 0, 97, 97, 97, 0, 97, 97, 97, 97, 214, 146, 97, 49,
54, 68, 0, 106, 106, 106, 0, 106, 106, 106, 106, 223, 155, 106, 54,


Первый байт -- идентификатор фрейма контроллер-БК, второй -- счетчик, 15-й -- контрольная сумма, остальные пока восстановить не смогу.
3-й и 7-й в моих логах всегда 0.
4, 5, 6, 10 и 14 -- всегда имеют равные значения
Так же заметил некоторые интересные зависимости, например вот так во времени выглядят 11, 12 и 13-й байты:

Итого имеем:
54, counter, unk, unk, unk, unk, unk, unk, unk, unk, unk, unk, unk, unk, checksum

Прикладываю собранные логи, если кому будет интересно тоже поразбираться с протоколом. Там совсем небольшой кусочек, в котором я сперва газовал курком, а потом переключал режим ограничения скорости 3-1-2-3:
Контроллер-БК:
БК-Контроллер:

PS: Да, у меня "синий" БК.

bambirtuya


dimap

#2
Удалось так же распарсить как БК сообщает контроллеру про значения P4, P5, P6, P7 и P9

P4-P7 это битовые флаги, младшие 4 бита в 7-ом байте, то есть битовое представление 7-го байта выглядит так (от старшего бита к младшему):



76543210
not usednot usednot usednot usedP7P6P5P4
Например, у меня конфиг: P4 -- кмч, P5 -- старт с толчком, P6 -- круиз отключен, P7 -- плавный старт, получаем следующий байт конфигурации: 0000 0010
Или 2 в десятичном представлении (что и видно в логах к моему первому посту)

С P9 все тоже просто, это 11-ый байт, у меня стоит максимальный уровень рекуперации и значение этого байта равно 2, при среднем будет 1, а если отключить, то 0.

По определению скорости пока не разобрался, но есть пара мыслей, посмотрим, что получится понять.

dimap

#3
"Разобрался", как БК вычисляет скорость и понимает, что активен рекуп.

Я не буду описывать, как мне удалось это понять и просто приведу кусочек кода на питоне, который вычисляет скорость (p -- это 15-ти байтовый фрейм данных от контроллера):

b8 = p[8] - p[13]
if b8 < 0:
b8 = b8 + 256

speed = int(((p[7] - p[13]) * 256 + b8) / 1024.0 * 50)



Соотвественно значение [b-b](p[7] - p[13]) * 256 + b8[/b-b] это обороты двигателя в некоторой системе координат. В моих экспериментах это значение менялось в диапазоне от 0 до 988, что соотвествовало изменению скорости на БК от 0 до 49 (опыты делал на вывешенном без нагрузки колесе). В коде выше значение 50 просто подобрано, чтобы вычисляемое значение скорости наиболее соотвествовало показанию БК (на котором параметр P2 выставлен в 17).
В МК миника 30 магнитов (кажется это так :bw:, поправьте, кто разбирал колесо), у меня получилось, что ближе всего это значение похоже на количество полюсов, которые проходят через одну точку в секунду.

Флаг рекуперации определяется по значению:
regen = ((p[4] - p[13]) & 32)

Возможно, что это какой-то стандартный радиомодельный протокол, но я их не знаю, поэтому просто "подогнал" способ вычисления значений под показания БК :)

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

Мне пока никак не удается понять каким образом БК сообщает контроллеру про скоростной режим. Эти данные не присуствуют в явном виде в фреймах от БК к контроллеру (где я расшифровал почти все значения, кроме одного байта, который пока похож на рандомный шум, в то время как все остальные или имеют фиксированные значения всегда или я уже определил их значения).

dimap

#4
В общем, по скорости у меня получилось вывести вот такую зависимость, если обозвать [b-b](p[7] - p[13]) * 256 + b8[/b-b] из прошлого сообщения mcount, то получается:

speed = (mcount / (P2 * 2,74)) * P0 * 2,54 * pi / 100 * 3,6

где P0 и P2 это значения из настроек
Цитировать(то есть P2 это вовсе не диаметр переднего колеса, как много где пишут, а скорее количество полюсов магнитов в МК)
2,54 -- преобразуем дюймы в сантиметры
100 -- сантиметры в метры
3,6 -- метры в секунду в километры в час
2,74 -- magik number, который я вычислил опытным путем (вообще это конечно костыль, благодаря которому вся формула сходится, но строго объяснить этот параметр пока не получилось)

djonny

#5
Спасибо за тему, интересно. Думал когда же народ понимающий займется этими самиками изнутри. Еще я считаю, что курок никак кодом не сообщает контроллеру о скоростном режиме, а все простейшие преобразования происходят внутри курка и отражаются только на выходном напряжении. А еще было бы очень полезно, если бы можно было программу в этих БК или контроллерах корректировать, потому что в фуфломоторс все плохо с нормальными инженерами. Например сделать на зеленых курках настраиваемую мощность рекуперации, как это было на синих..., время отключения курка с трех минут изменить на большее, сделать действительно юзабильные кривые плавного старта.

ShamaN4ik79

#6
Подписался.
А еще лучшее применение: покупать на али курки за 1 т.р. (а не за 2500р. оригинальные) и программить их для разного ЭТ (возможно слив EEPROM  с оригинального курка для начала). Но тот нужно подключиться к самому процу.
Даташит на проц прилепил.
Minimotors Dualtron II Limited 2017 (gen1, синий курок)
Minimotors Speedway 2017 (EcoDrift Starway) mini 4
Minimotors Speedway 2020 mini 4 Pro

Maksuxa2003

Офигеть вы умные. Я нихера не понял вообще :-D

dimap

#8
Цитата: djonny от 29 Авг. 2018 в 11:14
Спасибо за тему, интересно. Думал когда же народ понимающий займется этими самиками изнутри. Еще я считаю, что курок никак кодом не сообщает контроллеру о скоростном режиме, а все простейшие преобразования происходят внутри курка и отражаются только на выходном напряжении. А еще было бы очень полезно, если бы можно было программу в этих БК или контроллерах корректировать, потому что в фуфломоторс все плохо с нормальными инженерами. Например сделать на зеленых курках настраиваемую мощность рекуперации, как это было на синих..., время отключения курка с трех минут изменить на большее, сделать действительно юзабильные кривые плавного старта.
Курок действительно никак не сообщает контроллеру про скоростной режим, по крайней мере я пока не нашел. Но вот и выходное напряжение курка не меняется в зависимости от режима (это я проверял), то есть пока совсем не понимаю как контроллер узнает про ограничение (а я на 99% уверен, что именно контроллер ограничивает скорость, а не курок).
Плавный старт это опять же к контроллеру, курок этим не управляет.

Перепрограммировать штатный курок возможно, но кажется будет крайне "дорогая" разработка, я по крайней мере не возьмусь :) не найду
столько свободного времени. Сейчас планирую сделать свой дисплейчик с нормальным отображением оставшегося заряда и прочей статистикой, буду покдлючать одновременно со штатным курком.

dimap

Собрал "черновик" дисплея на ардуинке, чтобы проверить свою гипотезу по расчету скорости.



Кажется все работает (есть небольшая задержка с отображением данных в сравнении со штатным БК, но это исправится).

DarkByte

#10
Спасибо за информацию, наткнулся когда начал разбирать протокол обмена между китайским контроллером МК и LCD дисплеем.

В пакете от контроллер к LCD возможно правильнее будет выполнять операцию xor между байтами 3-12 и 13, вместо операции вычитания. Пример пакетов:
Цитировать36 2b 00 09 09 09 00 09 45 09 09 7e 3a 09 15  => 36 2b 00 00 00 00 f7 00 3c 00 00 75 31 00 15
36 2c 00 32 32 32 00 32 6e 32 3c a7 63 32 8c  => 36 2c 00 00 00 00 ce 00 3c 00 0a 75 31 00 8c
36 2d 00 37 37 37 00 37 6e 37 41 ac 68 37 f0  => 36 2d 00 00 00 00 c9 00 37 00 0a 75 31 00 f0
36 2e 00 30 30 30 00 30 67 30 3a a5 61 30 81  => 36 2e 00 00 00 00 d0 00 37 00 0a 75 31 00 81
36 2f 00 35 35 35 00 35 6c 35 3f aa 66 35 86  => 36 2f 00 00 00 00 cb 00 37 00 0a 75 31 00 86
36 30 00 2e 2e 2e 00 2e 65 2e 38 a3 5f 2e a7  => 36 30 00 00 00 00 d2 00 37 00 0a 75 31 00 a7
36 31 00 33 33 33 00 33 6a 33 3d a8 64 33 9c  => 36 31 00 00 00 00 cd 00 37 00 0a 75 31 00 9c
36 32 00 2c 2c 2c 00 2c 63 2c 2c a1 5d 2c b7  => 36 32 00 00 00 00 d4 00 37 00 00 75 31 00 b7

В пакете от LCD к контроллеру, в моём случае в байтах 3 4 и 6 значение меняется в зависимости от выбранного уровня ускорения. На уровне 0 значение 0, 1-3, 2-6, 3-9, 4-12, 5-15. В байте 8 ограничитель максимальной скорости (P07). В байте 12 число магнитов в колесе (насколько я понял) (P02). В байте 9 битовые флаги разных состояний (вкл\выкл света, круиз). Байт 8 - псевдослучайное число, которое всегда начинается с одного и того же значения. Байт 14 - контрольная сумма. Пример пакета:
Цитировать01 03 6f 0f 0f 81 0f 00 64 80 00 00 34 38 0b  =>   1   3 111  15  15 129  15   0 100 128   0   0  52  56  11
01 03 70 0f 0f 7a 0f 00 64 80 00 00 34 38 ef  =>   1   3 112  15  15 122  15   0 100 128   0   0  52  56 239
01 03 71 0f 0f 7f 0f 00 64 80 00 00 34 38 eb  =>   1   3 113  15  15 127  15   0 100 128   0   0  52  56 235
01 03 72 0f 0f 80 0f 00 64 80 00 00 34 38 17  =>   1   3 114  15  15 128  15   0 100 128   0   0  52  56  23
01 03 73 0f 0f 25 0f 00 64 80 00 00 34 38 b3  =>   1   3 115  15  15  37  15   0 100 128   0   0  52  56 179

DarkByte

Цитата: DarkByte от 27 Сен. 2018 в 21:24В пакете от контроллер к LCD возможно правильнее будет выполнять операцию xor между байтами 3-12 и 13, вместо операции вычитания
Был не прав, всё таки тут вычитание/сложение, а не xor применяется. Чтобы в вашей теме не флудить своим контроллером, создал свою.

zy_tm

Интересная тема, наткнулся на статью на хабре, может чем то поможет
Там вроде и про софт для прошивки МК и про отладочную плату...

Ссылку не могу вставить, гуглится по словам: "habr Знакомство с микроконтроллерами Renesas на примере линейки RL78"


Александр Туржов

Вопрос, можно ли перевести speedway mini 4 с 48в на 60в и что для этого нужно? Хочу расширить пробег запасными батареями, которых у меня уже 3 шт. Но они на 60в(16s)

electro05

Цитата: Александр Туржов от 02 Фев. 2020 в 17:11
Вопрос, можно ли перевести speedway mini 4 с 48в на 60в и что для этого нужно? Хочу расширить пробег запасными батареями, которых у меня уже 3 шт. Но они на 60в(16s)
Задайте ваш вопрос вот здесь https://electrotransport.ru/index.php?topic=46979.0
Dualtron 2 EX+ (весна 2017)

Board118

#15
Самокат Halten RS-03, протокол обмена от бортового компьютера к контроллеру мотор колеса практически идентичен описанному здесь.
Я нашел как задается скоростной режим. Аналоговый сигнал с курка действительно не меняется. Текущая скорость передается в байте 5 (считаю от 0). Но значение кодируется. Выяснил, что кодированная последовательность повторяется через каждые 128 пакетов (значение привязано к байту 2 - который инкрементируется каждый пакет).
        D[2]: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 ... 7E 7F
----------------------------------------------------------------------------------
1я скр. D[5]: 80 05 06 2B 34 29 2A 2F 28 2D 2E 53 7C 51 52 57 50 55 56 7B ... 82 07
2я скр. D[5]: 85 0A 0B 30 39 2E 2F 34 2D 32 33 58 81 56 57 5C ...
3я скр. D[5]: 8A 0F 10 35 3E 33 34 39 32 37 38 5D 86 5B 5C 61 ...

При 2-й скорости каждый элемент последовательности увеличивается на 5. При 3-й еще на 5.
Т.е. в  байте 5 будет D[5] = F(D[2]) + 5 * скорость.
Не могу понять алгоритм преобразования F(от D[2]). Кто могуч помогите. Чувствую это функция а не таблица.

procto87

Цитата: electro05 от 02 Фев. 2020 в 17:51Задайте ваш вопрос вот здесь
миниководов осталось человек пять . тема полу дохлая .
вопрос автору - почему зеленый курок не работает с "синим" контроллером . ?что там надо изменить ?
speedWay mini 4 48в / 2017 г.в.

Board118

#17
Причем здесь миниководы? Только здесь поднимался вопрос про то как задается скоростной режим.
Более полное раскрытие протоколов обмена открывает перспективы, в части создания собственного бортового компьютера или модернизации существующих. Тех же Halten-ов у людей немало думаю.
Сдох контроллер какой подойдет? Дык а протокол обмена какой?
Кстати, отпаял цифровой канал от Rx, только с аналоговым сигналом управления с курка колесо не вращается.
По вопросу скоростного режима, вот последовательность байта 5 в более удобном для анализа виде (скорость 1):
80 05 06 2B 34 29 2A 2F 28 2D 2E 53 7C 51 52 57
50 55 56 7B 84 79 7A 7F 78 7D 7E 63 0C 61 62 67
60 65 66 0B 14 09 0A 0F 08 0D 0E 33 5C 31 32 37
30 35 36 5B 64 59 5A 5F 58 5D 5E 43 6C 41 42 47
40 45 46 6B 74 69 6A 6F 68 6D 6E 13 3C 11 12 17
10 15 16 3B 44 39 3A 3F 38 3D 3E 23 4C 21 22 27
20 25 26 4B 54 49 4A 4F 48 4D 4E 73 1C 71 72 77
70 75 76 1B 24 19 1A 1F 18 1D 1E 83 2C 81 82 07

Тоже самое в десятичной кодировке:
128   5   6  43  52  41  42  47  40  45  46  83 124  81  82  87
80  85  86 123 132 121 122 127 120 125 126  99  12  97  98 103
96 101 102  11  20   9  10  15   8  13  14  51  92  49  50  55
48  53  54  91 100  89  90  95  88  93  94  67 108  65  66  71
64  69  70 107 116 105 106 111 104 109 110  19  60  17  18  23
16  21  22  59  68  57  58  63  56  61  62  35  76  33  34  39
32  37  38  75  84  73  74  79  72  77  78 115  28 113 114 119
112 117 118  27  36  25  26  31  24  29  30 131  44 129 130   7