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

 

Хочешь стать куратором любимой темы?

* Комментарии к новостям

1. Самая Главная Тема (Анекдоты и флУДИЛКА) от serega376 (28.05.2022 в 10:37)2. Электросамокат и ПДД (Электросамокаты) от Ячъ (28.05.2022 в 10:03)3. Противопожарная безопасность для всех владельцев моноколес (Моноколеса (электроунициклы)) от Ячъ (28.05.2022 в 09:53)4. Марка алюминиевого сплава для передней вилки типа Monorim (Механика) от stels (28.05.2022 в 09:05)5. принцип работы ручки газа в разных режимах (момент/скорость) (Микроэлектроника) от bd66 (28.05.2022 в 08:46)6. BMS с контролем напряжений ячеек по bluetooth (Системы управления аккумуляторными батареями (BMS)) от Privodchik (28.05.2022 в 08:18)
7. Хвастаемся своими еБАЙКАМИ :) (ОБСУЖДЕНИЕ) (Электровелосипеды) от papergun (28.05.2022 в 07:59)8. Ремонт, профилактика, доработка кареточных моторов Bafang BBS02, BBS03(BBSHD) (Электровелосипеды с подвесным двигателем) от ZHYR (28.05.2022 в 07:02)9. Запуск мотора Nissan Leaf (Электромобили) от ds (28.05.2022 в 06:25)10. передел GAS-GASончика . (Электромотоциклы ) от Равиль (28.05.2022 в 05:05)11. City Coco и всё о них (Электроскутеры) от Lerikmlt (28.05.2022 в 04:52)12. Моноколесо KingSong KS-16S V1 V2 (Моноколёса KingSong) от Ripido (28.05.2022 в 01:57)
Не нравится реклама? Пройдите простую регистрацию на форуме и не будете видеть рекламу.

Прочитано 590 раз

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

04 Мар 2022 в 17:31
Прочитано 590 раз
Оффлайн

Dias2004

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

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

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


04 Мар 2022 в 19:06
Ответ #1
Оффлайн

13_chip_13

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


04 Мар 2022 в 21:14
Ответ #2
Оффлайн

Sonar

Санкт-Петербург, Приморский Сообщений: 1466
, тема по протоколам и созданию дисплейного модуля для S2/S3/F3 ссылка


20 Мар 2022 в 19:41
Ответ #3
Оффлайн

Dias2004

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


20 Мар 2022 в 22:16
Ответ #4
Оффлайн

Sonar

Санкт-Петербург, Приморский Сообщений: 1466
, было бы хорошо, если вы выложите логи отправляемых пакетов в контроллер мотор-колеса.


21 Мар 2022 в 22:44
Ответ #5
Оффлайн

Dias2004

Реутов - Московская область - Россия Сообщений: 4
Фрагменты кода и логов с пояснениями.

Собираем схему - аккумулятор, контроллер мотор-колеса (контроллер МК) и само МК, на вход данных контроллера (белый) присоединяем 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 в отправляемом пакете на контроллер МК никакого впечатления не производит. Я пробовал его считать и присваивать по правилам, пробовал произвольные значения - никакой разницы не заметил.

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


22 Мар 2022 в 00:06
Ответ #6
Оффлайн

Sonar

Санкт-Петербург, Приморский Сообщений: 1466
, когда вы пытаетесь изменить скорость вращения колеса - принимаемый бит, отвечающий за статус круиз-контроля (второй байт, который менялся у вас на 2), всё ещё равен 0? На сколько я помню, когда включается круиз контроль - контроллер просто игнорирует изменение уровня газа. Попробуйте не отключать питание контроллера, а сбрасывать газ и снова задавать новую скорость. Сброс газа сбрасывает и круиз.
И нет смысла сбрасывать питание контроллера мотор-колеса. В нём ничего не подвиснет, если вы подадите в него ошибочные данные.


22 Мар 2022 в 00:07
Ответ #7
Оффлайн

13_chip_13

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


22 Апр 2022 в 21:08
Ответ #8
Оффлайн

Dias2004

Реутов - Московская область - Россия Сообщений: 4
После долгого и ничего не давшего слепого перебора вариантов вновь прошу помощи, у тех, кто в теме.
Программа (полный текст ниже) работает на 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:


22 Апр 2022 в 23:49
Ответ #9
Оффлайн

edw123

ПодМосква Сообщений: 20825
После долгого и ничего не давшего слепого перебора вариантов вновь прошу помощи, у тех, кто в теме.
Прям так жалко 2000 на родной дисплей? На время постройки-отладки своего (а может и навсегда).


22 Апр 2022 в 23:52
Ответ #10
Оффлайн

Sonar

Санкт-Петербург, Приморский Сообщений: 1466
, что бы точно сказать, что у вас ломает протокол, рекомендую записать пакеты данных, идущих в контроллер мотор-колеса. Записать не то, что посылается в буфер для отправки по UART, а что реально идёт по шине. То есть взять отдельный UART>USB преобразователь, подцепить его к шине и записать.
Скорость передачи у вас настроена точно на 9600? Частота кварца взята верная?


23 Апр 2022 в 01:56
Ответ #11
Оффлайн

13_chip_13

Ростов на дону Сообщений: 487
Если задача не подолбать здесь мозг для того чтобы подолбать ,  а хотите научиться, то всю информацию вам уже дали. Из кода видно что у вас проблемы в первую очередь в построении алгоритмов.
Не смотрел даже какой конкретно вам нужен протокол обмена,  но видно что кадр данных формируется неправильно - нету расчёта CRC, вообще непонятно как это вообще работает, также нету инициализации порта,вся надежда на то что на этапе создания объекта ему присваивается нужные параметры. Разбивка по байтам 16 битного числа делается так:
uint16_t gazReadVal = analogRead(Apin) ;
//здесь нормирование, но не такое как у вас, у вас неправильное применительно к реальной ситуации
myData[8]=(gazReadVal>>8) & 0xff; // & 0xff необязательно, т.к. переменная myByte 8 битная
myData[9]=gazReadVal&0xff;

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