Как запустить контроллер мотор-колеса (Kugoo s2) от Arduino

Автор Dias2004, 04 Март 2022 в 17:31

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

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

Dias2004

Пару лет назад снял, к сожалению, небрежно, обмен между дисплеем (жёлтая плата) и контроллером (вероятно, Kugoo s2). С тех пор остался лишь контроллер с мотор-колесом.

Сейчас собрал аккумулятор на 36В и вернулся к задаче управления этим контроллером со "своего" дисплея (научить любой подходящий дисплей управлять этим контроллером).
Поскольку обмен был снят небрежно, сейчас получается лишь включать контроллер и нестабильно (увы) запускать мотор-колесо на 1-ой, 2-ой или 3-ей скорости, в режиме "с места" или "с ходу". И всё.
Регулировка скорости или других параметров не получается (да и контроллер, скорее всего, выдаёт сообщение "нет связи" - протокол я вижу, но не понимаю).

Кто заинтересован в развитии темы, или у кого есть информация по теме? Может, сам протокол хорошо известен и не засекречен? Где посмотреть?
К кому можно обратиться, чтобы присоединить к моему "хозяйству" жёлтый дисплей от Kugoo, попытаться запустить МК и не торопясь, тщательно снять весь обмен между девайсами?
Конечная ближайшая цель - собрать свой дисплейный контроллер для управления имеющимся.

13_chip_13

Зайдите в соответствующую тему по s серии там давно уже это разжовано и дисплеи свои предлагают.

Sonar

[user]Dias2004[/user], тема по протоколам и созданию дисплейного модуля для S2/S3/F3 https://electrotransport.ru/index.php?topic=55186.0
Kugoo S2 blue, 36v, 20,8A/h, 2WD, 1,9kW max, Prog disp v3.8, Prog drive v1.9, odo: 30434km.
Все материалы по альтернативным контроллерам для Kugoo S2/S3: http://213.21.12.200/kugoo_project/
Тема на форуме по этим контроллерам https://electrotransport.ru/index.php?topic=61126.0

Dias2004

Спасибо, помогло снять часть вопросов, но много ещё осталось...
Главный - при отправке на контроллер МК пакета тот включается, и начинает крутить МК с заданными оборотами. Однако любые изменения в пакете игнорируется - чтобы изменить обороты МК мне приходится выключить контроллер МК, затем снова его включить. Нормальное управление не получается. Такое ощущение, что какую-то процедуру обмена между источником управляющих пакетов (у меня это Arduino) и приёмником - контроллером МК, я упустил, хотя обмена вроде бы и не должно быть...
Что нужно учесть, в какую сторону порыться, что можете посоветовать?

Sonar

[user]Dias2004[/user], было бы хорошо, если вы выложите логи отправляемых пакетов в контроллер мотор-колеса.
Kugoo S2 blue, 36v, 20,8A/h, 2WD, 1,9kW max, Prog disp v3.8, Prog drive v1.9, odo: 30434km.
Все материалы по альтернативным контроллерам для Kugoo S2/S3: http://213.21.12.200/kugoo_project/
Тема на форуме по этим контроллерам https://electrotransport.ru/index.php?topic=61126.0

Dias2004

Фрагменты кода и логов с пояснениями.

Собираем схему - аккумулятор, контроллер мотор-колеса (контроллер МК) и само МК, на вход данных контроллера (белый) присоединяем UART (используем Arduino), выход данных от контроллера (зелёный) подсоединяем к другому UART Arduino; синий и красный провода соединяем кнопкой - при нажатии кнопки на синий провод идёт напряжение питания дисплея.

Включаем Arduino, каждые 120 мс в контроллер МК отправляется (9600, 8N1) пакет из 15 байт.
Ниже - ключевые моменты кода:

const uint8_t bytes=15;                                //количество байт в пакете

byte myData[bytes];                                    //буфер - массив из 15 байт
//                                                     к-во                     0-03E8     0-03E8                                         диап.
//                                                    магн. Uпит.___| Тормоз__| Газ_____| Uпит.___|           Vогр. 1..3  CRC
byte myData[] = {0x2F,0x01,0x00,0x1E,0x01,0x36,0x00,0x00,0x03,0xE8,0x01,0x36,0x00,0x19,0x01,0x78};    // исходное значение пакета
...
mySerial.write(myData,bytes);

Если при этом нажать кнопку (подать на синий провод напряжение с красного) то МК начнёт вращаться со скоростью, определяемой  значением "газа" (байты 8 и 9) и  "передачи (байт 14)".
Но может и не начать. Контроллер МК в любом случае, после подачи сигнала включения на синий провод, начинает выдавать пакеты (ловим другим UART'ом на том же Arduino), примерно каждые 20мс, вида:
28 00 00 00 01 01 99 B1
28 00 00 00 04 01 9E B3
28 00 00 00 06 01 D4 FB
и примерно через 9 секунд второй байт меняется на 02:

21:24:56.099 -> 28 | 0 | 0 | 0 | A | 2 | 37 | 17 |
21:24:56.708 -> 28 | 2 | 0 | 0 | 9 | 2 | 31 | 10 | (код 02 появился через 9с постоянной скорости с нагрузкой)

При отпускании кнопки МК немедленно останавливается, контроллер МК выдаёт 16 нулевых байтов
22:06:48.843 -> 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
и прекращает передачу.

Если менять в посылаемом пакете значения 8-9 и|или 14 байтов ("газ" и "передача"), контроллер меняет частоту вращения. Но только после перезапуска, т.е. нужно отпустить кнопку (контроллер МК - стоп), и снова нажать (контроллер МК - пуск). Если менять посылаемые данные, не отпуская кнопки (не выключая контроллер МК), частота вращения не меняется.

16-й байт пакета должен быть CRC, но если волшебное число bytes=15 увеличить или уменьшить, контроллер МК перестаёт включаться.
Я пока не знаю, как в среде Arduino IDE считаются байты в пакете - с нуля, или с единицы, поэтому не уверен, какая именно часть пакета myData отправляется в контроллер (и перехватить свою же передачу пока не смог), но значение CRC в отправляемом пакете на контроллер МК никакого впечатления не производит. Я пробовал его считать и присваивать по правилам, пробовал произвольные значения - никакой разницы не заметил.

Такие вот бледные результаты.
Что-то не так, я пока не угадал, как управлять контроллером мотор колеса... Оно, конечно, уже крутится, но ездить на нём всерьёз ещё никак невозможно...

Sonar

[user]Dias2004[/user], когда вы пытаетесь изменить скорость вращения колеса - принимаемый бит, отвечающий за статус круиз-контроля (второй байт, который менялся у вас на 2), всё ещё равен 0? На сколько я помню, когда включается круиз контроль - контроллер просто игнорирует изменение уровня газа. Попробуйте не отключать питание контроллера, а сбрасывать газ и снова задавать новую скорость. Сброс газа сбрасывает и круиз.
И нет смысла сбрасывать питание контроллера мотор-колеса. В нём ничего не подвиснет, если вы подадите в него ошибочные данные.
Kugoo S2 blue, 36v, 20,8A/h, 2WD, 1,9kW max, Prog disp v3.8, Prog drive v1.9, odo: 30434km.
Все материалы по альтернативным контроллерам для Kugoo S2/S3: http://213.21.12.200/kugoo_project/
Тема на форуме по этим контроллерам https://electrotransport.ru/index.php?topic=61126.0

13_chip_13

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

Dias2004

После долгого и ничего не давшего слепого перебора вариантов вновь прошу помощи, у тех, кто в теме.
Программа (полный текст ниже) работает на Arduino Uno.
Вращение резистора, подающего 0-5В на вход A1, изменяет значение Uacc - задание "газа" - от 0 до 3E8h,
для передачи в КМК значение разбивается на два байта.
Контроллер мотор-колеса (КМК) включается замыканием "красного и синего провода".


#define RX    8
#define TX    9
#define Apin  A1

const uint8_t bytes=15;

byte myData[bytes];
//                                  к-во                 0-03E8     0-03E8                            диап.
//                                  магн.   Uпит.___|  Тормоз__|   Газ_____|   Uпит.___|      Vогр.   1..3   CRC
byte myData[] = { 0x2F, 0x01, 0x00, 0x1E, 0x01, 0x36, 0x00, 0x00, 0x03, 0xE8, 0x01, 0x36, 0x00, 0x19, 0x01, 0x78};

uint16_t  Uacc;     // задание с курка газа
uint16_t  U1acc;    // задание с курка газа -  9-й байт
uint16_t  U2acc;    // задание с курка газа - 10-й байт
uint16_t  CRC;      // контрольная сумма

uint32_t TxTime, RxTime, comTime;
uint32_t T, Tacc;

SoftwareSerial mySerial(RX, TX);  // создаём объект программного UART

void setup() {
  T=120;      // период сеансов передачи в КМК
  Tacc=1000;  // период чтения задания "газа"
  CRC = 0;
}

void loop() {
  if (millis()>comTime+Tacc){
    comTime = millis();
    Uacc = analogRead( Apin );
    Uacc = map( Uacc, 0, 1023, 0, 1000 );
    if (Uacc < 0xFF)  {
      U1acc = 0;
      U2acc = Uacc;
    } else {
      U1acc = Uacc / 0xFF;
      U2acc = Uacc - ( U1acc * 0xFF ) - U1acc;
    }
    myData[8] = U1acc;
    myData[9] = U2acc;
  }
 
  if (millis() > TxTime + T) {
    TxTime = millis();
    int bytesSent = mySerial.write( myData, bytes );
  }
}


Где-то я нарушаю протокол, потому что:
1. Пуск происходит при замыкании "красного и синего", но не всегда, закономерность я не смог понять.
2. При успешном пуске скорость берётся в соответствии со значением Uacc на момент пуска, но далее изменение этого значения не влияет на вращение.

Для ясности понимания программы я убрал из неё все "Serial.print()", потому что всё что можно вывести в монитор - я выводил. Ясности это не прибавило, увы.
Есть гуру, которые наставят на путь истинный?

Нужно уверенно запускать и управлять скоростью в полном диапазоне... :ah:

edw123

Цитата: Dias2004 от 22 Апр. 2022 в 21:08
После долгого и ничего не давшего слепого перебора вариантов вновь прошу помощи, у тех, кто в теме.
Прям так жалко 2000 на родной дисплей? На время постройки-отладки своего (а может и навсегда).

Sonar

[user]Dias2004[/user], что бы точно сказать, что у вас ломает протокол, рекомендую записать пакеты данных, идущих в контроллер мотор-колеса. Записать не то, что посылается в буфер для отправки по UART, а что реально идёт по шине. То есть взять отдельный UART>USB преобразователь, подцепить его к шине и записать.
Скорость передачи у вас настроена точно на 9600? Частота кварца взята верная?
Kugoo S2 blue, 36v, 20,8A/h, 2WD, 1,9kW max, Prog disp v3.8, Prog drive v1.9, odo: 30434km.
Все материалы по альтернативным контроллерам для Kugoo S2/S3: http://213.21.12.200/kugoo_project/
Тема на форуме по этим контроллерам https://electrotransport.ru/index.php?topic=61126.0

13_chip_13

Если задача не подолбать здесь мозг для того чтобы подолбать ,  а хотите научиться, то всю информацию вам уже дали. Из кода видно что у вас проблемы в первую очередь в построении алгоритмов.
Не смотрел даже какой конкретно вам нужен протокол обмена,  но видно что кадр данных формируется неправильно - нету расчёта CRC, вообще непонятно как это вообще работает, также нету инициализации порта,вся надежда на то что на этапе создания объекта ему присваивается нужные параметры. Разбивка по байтам 16 битного числа делается так:

uint16_t gazReadVal = analogRead(Apin) ;
//здесь нормирование, но не такое как у вас, у вас неправильное применительно к реальной ситуации
myData[8]=(gazReadVal>>8) & 0xff; // & 0xff необязательно, т.к. переменная myByte 8 битная
myData[9]=gazReadVal&0xff;

Не нужна куча лишних строк как у вас. Код оформите нормально,  ещё раз повторюсь.