avatar_enek

Показометр для моноколеса и гироскутера на Arduino. Изучаю протоколы обмена.

Автор enek, 06 Апр. 2019 в 07:32

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

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

enek

Всем привет, пользуюсь GotWay mcm2s+. Не устраивает старое андроид приложение своей функциональностью, а именно общий пробег не показывает. Новые приложения не работают. Так в чем же проблема? Решил я разобраться...
С помощью приложения 232Analyzer и переходника usb-com сделал захват данных:
GotWay mcm2 выдает
Спойлер
Data received: // данные при включении
73,65,80,198,244,182,175,213,253,179,163,46,46,46,46,46,46,13,10,
179,245,202,188,187,175,205,234,179,201,46,46,198,244,182,175,180,206,202,253,58,49,180,206,13,10,
Data received: //периодически примерно 200мс выдает такое
85,170,24,193,0,0,0,0,0,0,255,246,255,27,0,1,255,248,0,24,90,90,90,90,85,170,0,140,166,79,0,0,0,0,0,0,0,0,0,0,0,0,4,24,90,90,90,90,
Data received: //ответ ок при изменении параметров (добавляется третий кусок пакета, там где в конце 3,24,90,90,90,90,)
85,170,13,50,0,0,0,0,0,0,255,255,8,144,0,1,255,248,0,24,90,90,90,90,85,170,0,140,166,79,0,0,0,0,0,0,0,0,0,0,0,0,4,24,90,90,90,90,85,170,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,24,90,90,90,90,
контроллер ACM16 выдает подобное:
Спойлер
Data received: 73,65,80,198,244,182,175,213,253,179,163,46,46,46,46,46,46,13,10,
Data received: 179,245,202,188,187,175,205,234,179,201,46,46,198,244,182,175,180,206,202,253,58,49,180,206,13,10,
Data received: 85,170,26,2,0,0,0,0,0,0,255,197,245,88,0,1,255,248,0,24,90,90,90,90,85,170,0,0,1,169,32,0,28,32,0,5,0,6,0,7,0,8,4,24,90,90,90,90,
Поковырявшись в исходниках https://github.com/palachzzz/WheelLogAndroid
нашел то что искал
Спойлер
            mTotalDistance = ((data[6]&0xFF) <<24) + ((data[7]&0xFF) << 16) + ((data[8] & 0xFF) <<8) + (data[9] & 0xFF);
if (mUseRatio) mTotalDistance = Math.round(mTotalDistance * RATIO_GW);
Потом поковырял приложения GotWay, там алгоритм похожий.
Есть команды настройки поднятия педалей
Спойлер
      if ((paramString.equals("W")) && (bool)) {}
      switch (paramInt)
      {
      default:
        break;
      case 3:
        setSpeed(new String[] { "Y", "0", "3", "b" });
        break;
      case 6:
        setSpeed(new String[] { "Y", "0", "6", "b" });
        break;
      case 9:
        setSpeed(new String[] { "Y", "0", "9", "b" });
        break;
      case 12:
        setSpeed(new String[] { "Y", "1", "2", "b" });
        break;
И после этого накидал простой показометр на Ардуино

Общий пробег колеса 8065км :dance:
Спойлер

Скетч во вложении с частично замененным шрифтом библиотеки

Еще добавлю что я купил контроллер ACM16 без bluetooth, у меня был адаптер типа HC-05/06. Удалось подружить его после изменения скорости обмена на 115200 командой AT+BAUD=115200, а командой AT+NAME<имя> поменял имя адаптера. Но приложение работало так же старое.
И куски кода из андроид приложений
Что не убивает мой вел, то делает его сильнее...

enek

Для тестирования и отладки можно взять блютус модуль типа HC-05/06 и спарить с модулем колеса. Опишу как это делается...
Для программирования я использовал среду Arduino IDE, поэтому для настройки HC-05 использовал встроенный монитор СОМ порта. Нужен usb-com адаптер, я использовал от программатора - ft232. На модуле замыкаем key - 3.3V, подаем питание 5V, соединяем rx-tx tx-rx. В мониторе порта baud 38400, оба NL & CR.
На моем примере имя модуля колеса GotWay_2966 адрес 00:14:17:72:76:DB (адрес взят из приложения в телефоне).
HC-05 выдает долгие мигания. Проверяем соединение командой AT, ответ OK.
AT+ROLE=1
AT+CMODE=0
AT+BIND=0014,17,7276DB
Проверяем командами
AT+ROLE?
AT+CMODE?
AT+BIND?
AT+BAUD?
Скорость обмена поменял в прошлом сообщении.

Снимаем перемычку KEY, передергиваем питаниеи включаем колесо. Модуль HC-05 при подключении должен периодически моргать по два коротких раза.
Данные с колеса идут :dance:
Спойлер
Дальше работаем с данными через ардуино. :wow:
Колесо выдает сигнал если ему отправить "b". Можно отправить команду смена режима (soft, comfort , madden) или поднятия педалей.
К данным о токе можно прикрутить стоп-сигнал когда при рекуперации ток ниже -5А
В скетче закомментировал строки для работы с датчиком ds18b20, его можно пристроить к обмотке двигателя/батареи/педалей, на ваше усмотрение.
Что не убивает мой вел, то делает его сильнее...

enek

Руки потер и добрался до гироскутера... :kidding:
Запустил я анализатор 232Analyzer на скорости 115200 и увидел такие повторяющиеся пакеты:
Спойлер
Data received: 170 241 099 000 015 187
Data received: 170 242 000 000 019 187
Data received: 170 243 000 163 014 187
Data received: 170 244 000 000 019 187
Data received: 170 245 000 042 015 187
Data received: 170 246 019 058 011 187
Data received: 170 247 000 000 017 187
Data received: 170 248 000 000 019 187
Data received: 170 249 020 030 012 187
Data received: 170 250 060 001 013 187
Покрутил настройки приложения и начал искать изменения. Решил подобные пакеты кидать через блютус модуль в приложение.

Красная стрелочка это tx платы гироскопа, оттуда идут данные.
Подключил питание 3.3В и данные пошли при выключенном гироскутере:
Спойлер
Data received: 170 241 000 000 019 187
Data received: 170 242 000 000 019 187
Data received: 170 243 000 000 018 187
Data received: 170 244 000 000 019 187
Data received: 170 245 000 000 018 187
Data received: 170 246 016 011 014 187
Data received: 170 247 000 000 017 187
Data received: 170 248 000 000 019 187
Data received: 170 249 020 030 012 187
Data received: 170 250 000 001 017 187
Оказалось что плата гироскопа выдает параметры скорости, жесткости, чувствительности, а также версию ПО и ТО. Пришлось резануть дорожку и подключиться к блютус модулю, т.к. приложение другой блютус модуль не видит. Я накидал скетч "эмулятора гироскутера" в  архиве gscooter_emulator.ino
Там в коде наглядно расписал что где.

пробег получился больше одометра :laugh:
Самое сложное было определить алгоритм контрольной цифры. Вот к примеру пакет начинается на 170, далее 241 (как бы индентификатор), 99 (%батареи), 155(/10 = скорость), волшебное число Х, и заканчивается 187. Так же происходит и при заливке параметров, без этой цифры не воспринимает. Долго я сидел циферки перебирал... %-)
Потом посмотрел на них в двоичной системе 241 99 155 = 11110001 1100011 10011011, оказалось что нужно подсчитать единички (14 шт) и вычесть их количество из 24. И аналогично от 16 отнять количество единичек при заливке параметров. Незнаю как этот алгоритм называется, в коде я его назвал magic3 и magic2
Следующий эксперимент, скетч gscooter_params_upload.ino
Кидаю уже меняющиеся параметры и смотрю в приложении как они меняются в самом контроллере гироскутера ;-D
видео на яндекс.диске
Для удобства можно подключить энкодер/кнопки чтобы менять параметры.
Ну и накидал сам показометр для гироскутера в скетче gscooter_meter.ino

по порядку батарея% скорость ток температура
вторая строка trip odometr лим скорости прочности чувствительность
параметры соответствуют тем что в приложении:
Спойлер
Ну на этом всё, поигрался. Кому надо думаю что без проблем любой другой дисплей прикрутит.
P.S. Не нужно воспринимать это как серьезный прибор, это просто разминка для мозгов и освоение программирования. :kidding:
На очереди инфинеон :-)
Что не убивает мой вел, то делает его сильнее...

Ghozt

Опираясь на данные [user]enek[/user], частично разобрал протокол передачи колес EYU.CO (продаются в теме с уценкой от ecodrift). К такому колесу ну ничего не желает цепляться, ни виллог, ни другая +- приличная прога.

Колесо при подключении шлет короткие пакеты:

Data received: 085 170 024 244 000 000 000 000 000 047 255 251 249 214 000 001 255 248 000 024 090 090 090 090

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

void setup()
{
Serial.begin(115200);
  // put your setup code here, to run once:

byte data[24] = {85, 170, 85, 170, 0, 0, 0, 0, 0, 47, 255, 251, 249, 214, 0, 1, 255, 248, 0, 24, 90, 90, 90, 90};

word vbat_int = data[2]<<8 | data[3];
float vbat = vbat_int/100.0;

int spd = data[4]<<8 | data[5];
float outs = spd*0.036;

unsigned long mDistance = (unsigned long)data[6]<<24
                        | (unsigned long)data[7]<<16
                        | (unsigned long)data[8]<<8
                        | (unsigned long)data[9];
float outd = mDistance*0.875;

int amp = data[10]<<8 | data[11];
float  outa = amp*1.85/100.0;

int temp = data[12]<<8 | data[13];
float    outt = temp/340.0;
outt = outt + 35;

Serial.print("SPEED = ");   
Serial.println(outs);

Serial.print("VOLTS = ");
Serial.println(vbat);

Serial.print("AMPS  = ");
Serial.println(outa);

Serial.print("TEMP = ");
Serial.println(outt);
                             
Serial.print("DISTANCE = ");
Serial.println(outd);

}

void loop()
{
                                                   
}


Опытным путем были установлены следующие данные:



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

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