Интеграция Arduino с выпуском VESC

Я пытаюсь интегрировать vesc с arduino и запускаю простой код для вывода напряжения и других данных на последовательный монитор. Ниже приведен код для справки. Когда я проверяю вывод, кажется, что он неправильно анализирует данные. Я вижу результат как @⸮ @⸮ @⸮ @⸮ Я использую код с этой страницы github:VESC-UART-Arduino

/*
Связь Arduino UART с VESC. Это программное обеспечение считывает данные телеметрии VESC
и отображает их на OLED-дисплее. Этот код находится в стадии разработки для
улучшенного дистанционного управления ppm.

Она написана Сашей Эдерером (roboshack.wordpress.com), на основе кода
Дженки (pedelecforum.de), Андреас Чайтидис ([email protected])
и Бенджамин Веддер (www.vedder.se).
Авторское право (C) 2016

Эта программа является свободным программным обеспечением; вы можете распространять ее и/или изменять
в соответствии с условиями Общей публичной лицензии GNU, опубликованной Фондом
свободного программного обеспечения; либо версия 3 Лицензии, либо
(по вашему выбору) любая более поздняя версия.

Эта программа распространяется в надежде, что она будет полезна,
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии ТОВАРНОЙ
ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.  См
. Общую публичную лицензию GNU для получения более подробной информации.

Вы должны были получить копию Общей публичной лицензии GNU
вместе с этой программой; если нет, напишите в Фонд свободного программного обеспечения,
Inc., 51 Франклин-стрит, Пятый этаж, Бостон, Массачусетс 02110-1301
*/
#include "config.h"
//#include "printf.h"
#include "datatypes.h"
#include "vesc_uart.h"
#include <SPI.h>

//Library for the OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

mc_values VescMeasuredValues;

float current = 0.0;           //измеренный ток батареи
float motor_current = 0.0;     //измеренный ток двигателя
float voltage = 0.0;           //измеренное напряжение батареи
float c_speed = 0.0;           //измеренные обороты в минуту * Pi * диаметр колеса [км] * 60 [минуты]
float c_dist = 0.00;           //измеренный одометрический тахометр [оборотов] * Pi * диаметр колеса [км] 
double power = 0.0;            //расчетная мощность

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

//Setup---------------------------------------------------------------------------------------------------------------------
void setup()
{
    
        SERIALIO.begin(115200);
        
     /*   // инициализировать с помощью I2C addr 0x3C
        display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    
        display.clearDisplay();
    
    // установить цвет текста
    display.setTextColor(WHITE);
    // установить размер текста
    display.setTextSize(1);
    // установить отображение положения курсора
    display.setCursor(1,0);
    // показать текст
    display.println("Запуск системы");
    display.display();
        delay(1000);
    display.clearDisplay();*/
}

void loop()
{
    if (vesc_get_values(VescMeasuredValues)) {
      
        // расчет нескольких значений, которые будут показаны позже
        voltage = VescMeasuredValues.v_in;
        current = VescMeasuredValues.current_in;
        motor_current = VescMeasuredValues.current_motor;
        power = current*voltage;
        c_speed = (VescMeasuredValues.rpm/38)*3.14159265359*0.000083*60;
        c_dist = (VescMeasuredValues.tachometer/38)*3.14159265359*0.000083;
        
Serial.println(voltage);
//Serial.println(current);
/*Serial.println(motor_current);Serial.println(power);
Serial.println(c_speed);
Serial.println(c_dist);*/

    }
    else
    {
        Serial.println(" ");
}
}

Кто-нибудь знает, что может вызвать эту проблему?

, 👍1

Обсуждение

Вы установили правильную скорость передачи в последовательном мониторе?, @Python Schlange

запустите простой код "hello world", чтобы подтвердить, что последовательная связь работает должным образом, @jsotola

Я попробовал код hello world, и, похоже, он работает., @Dave

Да, я установил скорость передачи данных 115200 в последовательном мониторе. но в инструменте vesc я попробовал 100 К и 125 К, так как нет возможности выбрать 115200 (используя опцию ADC и UART из dorpdown), @Dave

Вы должны выбрать боду, которая понравится им обоим, или это не сработает. Вы также утверждаете, что, похоже, это работает, что это мне говорит?, @Gil

Я попробовал код hello world, который, похоже, распечатывается на последовательном мониторе arduino. Чтобы проверить и посмотреть, меняется ли скорость передачи данных в коде arduino, я установил скорость передачи данных в бодах на 100 кб в коде arduino, а также в vesc, но даже тогда, похоже, он не распечатывал никаких данных, @Dave

@Дейв, пара мыслей, 1) вы печатаете адрес указателя, а не значение (не очень хорошо знакомы с библиотекой), 2) это байтовое представление значения?, @J Collins


1 ответ


0

Код библиотеки, который я опубликовал выше, предназначался для более старой версии VESC. Я использовал код от Emil/Solidgeek, и это сработало для меня.

,