"Временный" контроллер Kugoo S3 на Arduino своими руками

Автор Ancharas, 25 Июль 2021 в 11:24

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

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

Sonar

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

Ancharas

[user]Sonar[/user], Тинкеркад - это для 3D-моделирования онлайн. Кажется, нашел. Это Fritzing. Но, пожалуй, лучше я на листочке нарисую. Не хотелось бы со всем этим разбираться)

vlad-2015

Kugoo S2 10S6P (12470 км)
У меня нет решения. Но я восхищен красотой проблемы.

Ancharas

#21
Проверил, наконец, контроллер: за 15 км. пробега каких-либо глюков не замечено.
Схема получилось такая:





В качестве стабилизатора использовал китайский понижающий DC-DC на базе LM2596. На Алиэкспресс пишут, что входное напряжение до 28 вольт, но по даташиту - до 45. Входной конденсатор там на 50 вольт, поэтому решил попробовать - вроде держится. Но в любом случае, всё делаете на свой страх и риск) Лучше, конечно, использовать что-то понадежнее в плане запаса по входному напряжению. Буду благодарен, если кто-то скинет сюда схемку.

Спасибо товарищу Metamorf за информацию: есть версия стабилизатора LM2596HVS, там входное напряжение будет с запасом.

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

Во вложение добавляю ту же программу, что выкладывал ранее, чтобы всё было под рукой.

PS: Подскажите пожалуйста, как поднять сообщение на первое место?

13_chip_13

#22
Цитата: Ancharas от 09 Авг. 2021 в 23:36
Проверил, наконец, контроллер: за 15 км. пробега каких-либо глюков не замечено.
Схема получилось такая:





В качестве стабилизатора использовал китайский понижающий DC-DC на базе LM2596. На Алиэкспресс пишут, что входное напряжение до 28 вольт, но по даташиту - до 45. Входной конденсатор там на 50 вольт, поэтому решил попробовать - вроде держится. Но в любом случае, всё делаете на свой страх и риск) Лучше, конечно, использовать что-то понадежнее в плане запаса по входному напряжению. Буду благодарен, если кто-то скинет сюда схемку.

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

Во вложение добавляю ту же программу, что выкладывал ранее, чтобы всё было под рукой.

PS: Подскажите пожалуйста, как поднять сообщение на первое место?

Чё-то интересно стало, кода мало, поэтому и посмотрел. Вот здесь
 
if (StatusByte == StatusStartByte || StatusIndex >= StatusCount) {
      StatusIndex = 0;
    }

логически неправильно нулить индекс по первому условию, потому что начало посылки по всего лишь одному байту не гарантирует что где то в кадре не будет такого же значения байта данных (ну если это конечно не сделано специально на другой передающей стороне, типо гарантированное исключение этих значений, ну это особо никто не исследовал как я понял). А начало посылки вы отлавливаете и так выше,  забавно то что это условие не будет работать без того ошибочно го выше  ;-D
   
if (StatusIndex == 0 && StatusByte != StatusStartByte){
      continue;
    }

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

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

Metamorf

Цитата: Ancharas от 09 Авг. 2021 в 23:36DC-DC на базе LM2596
Есть специально для высокого напряжения LM2596HVS
Я второй год использую 2 платы на xl7015. Ни одна не сгорела. Езжу на 54.6В.
Koogo S3 plus, полный привод, 8.5", 48В, 41км/ч. ODO-3800km
Мастер берет деньги не за перемычку, а за то, что понял, куда ее впаять.

Ancharas

[user]13_chip_13[/user], Полностью с вами согласен, порой пропуски будут. А по какому  условию мы в вашем случае будем обнулять StatusIndex?

Добавлено 10 Авг. 2021 в 21:30

Цитата: Metamorf от 10 Авг. 2021 в 21:08Есть специально для высокого напряжения LM2596HVS
Спасибо за информацию! Не знал про такое

13_chip_13

#25
Цитата: Ancharas от 10 Авг. 2021 в 21:29
[user]13_chip_13[/user], Полностью с вами согласен, порой пропуски будут. А по какому  условию мы в вашем случае будем обнулять StatusIndex?

Добавлено 10 Авг 2021 в 21:30
Спасибо за информацию! Не знал про такое
В моем случае, точнее я делаю не так, нужна очередь в которую пихаем приём, а потом когда накопили достаточно значений(ну как минимум длину фрейма смотрим где стартовый бит (в моём случае их три) и потом накладываем маску, если не сходиться crc то удаляем часть очереди до следующего совпадения стартовой последовательности. В качестве очереди кольцевой буфер с минимальным количеством значений в два раза большим длины фрейма минус 1.

Немного недосказал :-), еще второй вариант нашел у себя (видно делал в разное время и поэтому по другому немного) кольцевого буфера - его размер равен размеру кадра данных по UART, заполняется по обнаружению стартового байта, но если CRC не сходиться, то проверяется наличие стартового байта на других местах буфера и если обнаружено, то начало буфера удаляется до этого байта, а остаток забивается новыми данными и так по кругу. В принципе тоже что и выше написал, но памяти нужно меньше. Думаю очевидно что бы не копировать ячейки буфера сзаду-наперёд, это всё делается указателем. Таким образом данные никакие не теряются.

vlad-2015

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

#define BAUDRATE0       9600UL // Скорость UART0
void initUSART(void); // Инициализация USART
void UART_ReceiveData (uint8_t* pReceivedData, uint16_t nNumOfDataToReceive); // Прием данных
void UART_SendData (uint8_t* pSendData, uint16_t nNumOfDataToSend); // Передача данных




#include "usart.h"
#define BAUDREG(x)   ((unsigned int)(F_CPU / (16UL * x)) - 1) // Асинхронный нормальный (U2XN = 0)
#define RS_TRANSFER_RX (UCSR0B & (1 << RXCIE0)) // Прием данных USART
#define RS_TRANSFER_TX (UCSR0B & (1 << UDRIE0)) // Передача данных USART

uint8_t USART=0;
uint8_t* receivedData; // Указатель на массив для записи
uint8_t* receivedDataEnd; // Указатель на конец массива записи
uint8_t* sendData; // Указатель на передачу данных
uint8_t* sendDataEnd; // Указатель на конец передаваемых данных

void initUSART(void) // Инициализация USART
{
sei(); // Разрешить прерывания
DDRE|= 0x01; PORTE&=~0x01; // USART RX
DDRE&=~0x02; PORTE|= 0x02; // USART TX
UCSR0A = 0; // Выключаем режим двойной скорости
UCSR0B = 0; // Обнуляем прерывания и флаги
UCSR0C = (1 << UCSZ01)|(1 << UCSZ00); // Настройка фрейма: 8 бит, без четности, 1 стоп-бит
UBRR0H = BAUDREG(BAUDRATE0)/256; UBRR0L = BAUDREG(BAUDRATE0)%256; // Настраиваем битрейт
}

void UART_ReceiveData(uint8_t* pReceivedData, uint16_t nNumOfDataToReceive) // Прием данных
{
while (RS_TRANSFER_RX || RS_TRANSFER_TX) asm("nop"); // Ждем окончания приема данных
receivedData=pReceivedData; // Записываем куда складировать данные
receivedDataEnd=pReceivedData+nNumOfDataToReceive-1; // Конец массива
USART&=~0x01;
UCSR0B |= (1 << RXCIE0) | (1 << RXEN0); // Начинаем прием данных
}
void UART_SendData(uint8_t* pSendData, uint16_t nNumOfDataToSend) // Передача данных
{
while (RS_TRANSFER_RX || RS_TRANSFER_TX) asm("nop"); // Ждем окончания передачи данных
sendData=pSendData; // Записываем откуда читать данные
sendDataEnd=pSendData+nNumOfDataToSend-1; // Записываем конец массива
USART|=0x01;
UCSR0B |= (1 << UDRIE0) | (1 << TXEN0); // Начинаем передачу данных
}
ISR(USART0_RX_vect) // приема данных
{
    *receivedData = UDR0; // Записываем байт
if (receivedData==receivedDataEnd){
UCSR0B &= ~((1 << RXCIE0) | (1 << RXEN0)); // Останавливаем прием данных
} else {
    receivedData++; // Смещаем указатель
}
}
ISR(USART0_UDRE_vect) // передачи данных
{
    UDR0 = *sendData; // Записываем байт
if (sendData==sendDataEnd) {
UCSR0B &= ~((1 << UDRIE0) | (1 << TXEN0)); // Останавливаем передачу данных
} else {
sendData++;
}
}

Kugoo S2 10S6P (12470 км)
У меня нет решения. Но я восхищен красотой проблемы.

Ancharas

Цитата: 13_chip_13 от 10 Авг. 2021 в 22:25Немного недосказал :-), еще второй вариант нашел у себя (видно делал в разное время и поэтому по другому немного) кольцевого буфера - его размер равен размеру кадра данных по UART, заполняется по обнаружению стартового байта, но если CRC не сходиться, то проверяется наличие стартового байта на других местах буфера и если обнаружено, то начало буфера удаляется до этого байта, а остаток забивается новыми данными и так по кругу. В принципе тоже что и выше написал, но памяти нужно меньше. Думаю очевидно что бы не копировать ячейки буфера сзаду-наперёд, это всё делается указателем. Таким образом данные никакие не теряются.
Разумно. Если руки дойдут, попытаюсь сваять что-то такое.

Добавлено 16 Авг. 2021 в 22:33

Цитата: vlad-2015 от 11 Авг. 2021 в 09:05Делайте сразу без использования непонятных библиотек. По приему и передаче данных хотя бы так...
Да, я знаю, что эти библиотеки работают не очень быстро и памяти много просят. Но это не мой профиль, поэтому уж как получилось. Опять же, если руки дойдут, постараюсь сделать по уму.

vitalnsk

Друзья а где сама прошивка? На самокате gt350s будет работать?

Sonar

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

vitalnsk

Добрый день, у вас есть скетч для ардуино для этой схемы?



Хочу свой дисплей прицепить какой-нибудь, это вообще рабочее решение? Будет управлять контроллером?

Sonar

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

Night Fury

#32
Я скачивал отсюда файлы. Помню там буквально наброски были простейшего варианта скетча. Чтение аналогового входа, формирование и отправка байтов в порт  Вроде файлик txt был. Но вот так сразу не удалось на компе отыскать. А возможно на телефон скачивал. Телефон обновил с тех пор. Тому уже 6 лет и судя по всему nand память деградировала. Работает, но люто тормозит именно по памяти, работать с ним утомительно. Попробую ещё поискать позже.

Если кто делал подобное , быть может незатруднит набросать простейший вариант с формированием и посылкой пакетов. Мне тоже это было бы полезно. Я с ардуинами игрался десяток лет назад. Но много чего подзабыл. И поднимать это сейчас трудо- и время завтратно. От готовой базы было плясать несравненно легче.
Kugoo s3, 43 км/ч, 2 мотора 8.5',  18/22 ампера (перед/зад),   48 вольт 20 А•ч   (18650 LG MJ1 13s3p + Samsung INR21700-50S  13s2p) | пробег 16000+ км

vlad-2015

#33
Цитата: Night Fury от 09 Июль 2023 в 07:43быть может незатруднит набросать простейший вариант с формированием и посылкой пакетов.
Примерно так для atmega 1280...

#define BAUDREG(x)   ((unsigned int)(F_CPU / (16UL * x)) - 1) // Асинхронный нормальный (U2XN = 0)
#define RS0_TRANSFER_RX (UCSR0B & (1 << RXCIE0)) // Прием данных USART0
#define RS0_TRANSFER_TX (UCSR0B & (1 << UDRIE0)) // Передача данных USART0

DDRE|= 0x01; PORTE&=~0x01; // USART_0 RX
DDRE&=~0x02; PORTE|= 0x02; // USART_0 TX
UCSR0A = 0; // Выключаем режим двойной скорости
UCSR0B = 0; // Обнуляем прерывания и флаги
UCSR0C = (1 << UCSZ01)|(1 << UCSZ00); // Настройка фрейма: 8 бит, без четности, 1 стоп-бит
UBRR0H = BAUDREG(BAUDRATE0)/256; UBRR0L = BAUDREG(BAUDRATE0)%256; // Настраиваем битрейт

uint8_t* received0Data; // Указатель на массив для записи
uint8_t* received0DataEnd; // Указатель на конец массива записи
uint8_t* send0Data; // Указатель на передачу данных
uint8_t* send0DataEnd; // Указатель на конец передаваемых данных

void UART0_ReceiveData(uint8_t* pReceivedData, uint16_t nNumOfDataToReceive) // Прием данных
{
while (RS0_TRANSFER_RX || RS0_TRANSFER_TX) asm("nop"); // Ждем окончания приема данных
received0Data=pReceivedData; // Записываем куда складировать данные
received0DataEnd=pReceivedData+nNumOfDataToReceive-1; // Конец массива
USART&=~0x01;
UCSR0B |= (1 << RXCIE0) | (1 << RXEN0); // Начинаем прием данных
}
void UART0_SendData(uint8_t* pSendData, uint16_t nNumOfDataToSend) // Передача данных
{
while (RS0_TRANSFER_RX || RS0_TRANSFER_TX) asm("nop"); // Ждем окончания передачи данных
send0Data=pSendData; // Записываем откуда читать данные
send0DataEnd=pSendData+nNumOfDataToSend-1; // Записываем конец массива
USART|=0x01;
UCSR0B |= (1 << UDRIE0) | (1 << TXEN0); // Начинаем передачу данных
}
ISR(USART0_RX_vect) // Вектор приема данных
{
    *received0Data = UDR0; // Записываем байт
if (received0Data==received0DataEnd){
UCSR0B &= ~((1 << RXCIE0) | (1 << RXEN0)); // Останавливаем прием данных
} else {
    received0Data++; // Смещаем указатель
}
}
ISR(USART0_UDRE_vect) // Вектор передачи данных
{
    UDR0 = *send0Data; // Записываем байт
if (send0Data==send0DataEnd) {
UCSR0B &= ~((1 << UDRIE0) | (1 << TXEN0)); // Останавливаем передачу данных
} else {
send0Data++;
}
}

uint8_t USART_busy () { // Проверка занятосни интерфейса
if (RS0_TRANSFER_RX || RS0_TRANSFER_TX) return 1;
return 0;
}
Kugoo S2 10S6P (12470 км)
У меня нет решения. Но я восхищен красотой проблемы.

Ancharas

Кажется, кто-то очень везучий, и ему нужно срочно купить лотерейку. Я не знаю, как должны были сойтись звезды, чтобы я случайно нашел в закладках ссылку на эту тему, и решил глянуть, что тут происходит. Скетч во вложении.

Night Fury

Хех. А я искал на компе .txt и .ino вместо архива по примерной дате
Kugoo s3, 43 км/ч, 2 мотора 8.5',  18/22 ампера (перед/зад),   48 вольт 20 А•ч   (18650 LG MJ1 13s3p + Samsung INR21700-50S  13s2p) | пробег 16000+ км