Arduino DUE и MCP2515

son32
Offline
Зарегистрирован: 04.12.2017

Всем доброго времени суток!!! В общем расскажу с самого начала, строил свой проект на Arduino Mega2560 и двух Can модулях MCP2515. Суть в том что мне нужно что бы ардуино работала с двумя Can шинами отправляла пакеты и читала их, скорость одной шины 500KBPS, скорость второй 250KBPS(ну было желание прикрутить еще и третью шину 83K3BPS). Проект рос все вроде нормально, но так как Arduino Mega2560 работает только в один поток, начались проблемы с временем передачи пакетов от ардуино в Can шину. то есть один пакет в шину должен поступать каждые 100мс второй каждые 50мс, решилось все функциями таймера, но проект начал расти в итоге даже с таймером появились проблемы. И тут мне в интернете попалась Arduino DUE на ARM-процессоре. Прочитав Arduino DUE + библиотека Scheduler(Scheduler) то что нужно мне. В итоге купив Arduino DUE понял что попал на новые проблемы, которые ввиду отсутствия знаний в программировании самостоятельно не решу. Основная проблема сейчас такая, не могу заставить Arduino DUE работать с двумя MCP2515. То есть если в скетче в строке void setup() прописываю скорость для первой и второй кан шины то после загрузки в ардуино в кан шинах тишина. Но стоит в скетче убрать или закоментировать строчку со значениями скорости для одной из шин. то после загрузки скетча оставшаяся шина работает исправно, то есть ардуино по ней пакеты шлет исправно.

Использую: Arduino DUE + MCP2515(2шт подключены к SPI), библиотеки: Scheduler, Seeeduino CAN-BUS. для мониторинга использую устройство канхакер с двумя каналами кан и программы CarBUSAnalyze.

Вот сам код при котором в кан шинах тишина.

#include <mcp_can.h>
#include <mcp_can_dfs.h>
#include <Scheduler.h>
#include <SPI.h>

MCP_CAN CAN(10);
MCP_CAN CAN2(9);
 
void setup()
{
 CAN.begin(CAN_500KBPS);
 CAN2.begin(CAN_250KBPS);
   
 Scheduler.startLoop(loop2);
 Scheduler.startLoop(loop3);
}


unsigned char stmp[8] = {00, 87, 68, 68, 50, 48, 53, 48};
unsigned char stmp1[8] = {01, 52, 48, 49, 82, 50, 53, 51};
unsigned char stmp2[8] = {02, 57, 52, 56, 255, 255, 255, 255};
unsigned char stmp3[8] = {00, 192, 00, 00, 00, 00, 00, 00};
unsigned char stmp4[8] = {00, 8, 00, 00, 00, 00, 00, 00};

void loop()
{
  CAN.sendMsgBuf(0x071, 0, 8, stmp);
  delay(20);
  CAN.sendMsgBuf(0x071, 0, 8, stmp1);
  delay(20);
  CAN.sendMsgBuf(0x071, 0, 8, stmp2);
  delay(20);
}
void loop2()
{
  CAN2.sendMsgBuf(0x020, 0, 8, stmp3);
  delay(100);
}
void loop3()
{
  CAN.sendMsgBuf(0x353, 0, 8, stmp4);
  delay(100);
  yield();
}

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

В общем прошу помощи заставить работать Arduino DUE с двумя MCP2515!!!

Или может есть вариант подружить Arduino DUE с библиотекой arduino-mcp2515-master!!!

son32
Offline
Зарегистрирован: 04.12.2017

В общем все заработало. Решил вывести все в монитор ком порта, добавил в блок void setup() соответствующие строчки Serial.begin(115200); и на удивление обе кан шины заработали.

void setup()
{
  Serial.begin(115200);
  CAN.begin(CAN_500KBPS);
  CAN2.begin(CAN_250KBPS);
  
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}

почему так не понятно мне. возможно обусловлено библиотекой.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

son32 пишет:

В общем все заработало. Решил вывести все в монитор ком порта, добавил в блок void setup() соответствующие строчки Serial.begin(115200); и на удивление обе кан шины заработали.

void setup()
{
  Serial.begin(115200);
  CAN.begin(CAN_500KBPS);
  CAN2.begin(CAN_250KBPS);
  
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}

почему так не понятно мне. возможно обусловлено библиотекой.

скорее всего да

MaksVV
Offline
Зарегистрирован: 06.08.2015

у дуе есть свой встроенный кан контроллер. (т.е. для реализации CAN шины нужен только трансивер типа tja1050 или mcp 2551). можно для интереса с ним еще поиграться. это так, на будущее. Жалко, что аддон DUE на ардуино ИДЕ вроде CAN не поддерживает, т.е. из коробки не получится. 

son32
Offline
Зарегистрирован: 04.12.2017

Да я читал даташит и о том что в Cortex M3 есть встроенный CAN, причем два штуки, это удобно. на неделе куплю Can трансиверы, попробую с ними запустить свой проект. Но сейчас все прекрасно работает и на MCP2515. Особенно радует что DUE работает в несколько потоков, теперь исходящие пакеты идут стабильно каждый в свое время)))

НО вот вновь нужна ваша помощь MaksVV!!!

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

MaksVV, не могли бы вы еще раз выручить и помочь мне?

это скетч который вы ранее делали для меня

#include <SPI.h>
#include <mcp2515.h>
 
struct can_frame canMsg1;
MCP2515 mcp2515(10);
 
void setup()
{
  SPI.begin();
  canMsg1.can_id  = 0x123;
  canMsg1.can_dlc = 8;
  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS);
  mcp2515.setNormalMode();
}
 
void loop()
{
  if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK && canMsg1.can_id  == 0x123)
      {
         canMsg1.can_id  = 0x321;
         mcp2515.sendMessage(&canMsg1);
      }
}

вот скетч который сейчас работает с библиотекой "CAN-BUS Shield by Seeed Studio" для работы Can шины

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN(10);

unsigned long timing1;
unsigned long timing2;
unsigned long timing3;

void setup()
{
  Serial.begin(115200);
  CAN.begin(CAN_500KBPS);
}
unsigned char stmp1[8] = {0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // EZS
unsigned char stmp2[8] = {0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // KLA
unsigned char stmp3[8] = {0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x77, 0x00}; // djoy
void loop()
{
if (millis() - timing1 > 100) { // EZS
    timing1 = millis();
    CAN.sendMsgBuf(0x020, 0, 8, stmp1);
  }
  if (millis() - timing2 > 100) { // KLA
    timing2 = millis();
    CAN.sendMsgBuf(0x353, 0, 8, stmp2);
  }
  if (millis() - timing3 > 100) { // djoy
    timing3 = millis();
    CAN.sendMsgBuf(0x1F3, 0, 8, stmp3);
  }
}

вот в него бы добавить ваш пример)))

MaksVV
Offline
Зарегистрирован: 06.08.2015
#include <mcp_can.h>
#include <SPI.h>

#define CAN_INT 2            // Set INT(mcp2515) to pin 2
MCP_CAN CAN(10);

uint32_t curmillis = 0;

unsigned char stmp1[8] = {0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // EZS
unsigned char stmp2[8] = {0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // KLA
unsigned char stmp3[8] = {0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x77, 0x00}; // djoy

void setup()
{
  Serial.begin(115200);
  CAN.begin(CAN_500KBPS);
  //CAN.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ);
  pinMode(CAN_INT, INPUT); 
  //CAN.setMode(MCP_NORMAL);
}


void loop()
{
  curmillis = millis();
  writeCAN();
  readCAN();
}



void readCAN()
{
  if(!digitalRead(CAN_INT))  // если из CAN пришло сообщение                       
  { 
    uint32_t rxId;  byte  len = 0;  byte  rxBuf[8];
    CAN.readMsgBuf(&rxId, &len, rxBuf);  
    if (rxId == 0x123) CAN.sendMsgBuf(0x321, 0, len, rxBuf);
  }
}

void writeCAN()
{
  static bool sdvig2 = 0; static bool sdvig3 = 0; 
  static uint32_t timing1 = 0;
  static uint32_t timing2 = 0;
  static uint32_t timing3 = 0;

  if (curmillis >= 133 && !sdvig2) {sdvig2 = 1; timing2 = curmillis;}
  if (curmillis >= 167 && !sdvig3) {sdvig3 = 1; timing3 = curmillis;}
 
  if (curmillis - timing1 > 100) { // EZS
    timing1 = curmillis;
    CAN.sendMsgBuf(0x020, 0, 8, stmp1);
  }
  if (sdvig2 && curmillis - timing2 > 100) { // KLA
    timing2 = curmillis;
    CAN.sendMsgBuf(0x353, 0, 8, stmp2);
  }
  if (sdvig3 && curmillis - timing3 > 100) { // djoy
    timing3 = curmillis;
    CAN.sendMsgBuf(0x1F3, 0, 8, stmp3);
  }
}

 

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV огромное спасибо, не знаю даже как благодарит!!! Буду пробовать. Но посмотрев скетч понял как это все сложно для меня и что нужно все дела бросать и больше времени уделять изучению языка программирования)))

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

son32
Offline
Зарегистрирован: 04.12.2017

Так я понимаю что сложного то и нет ни чего))) только я в программировании не понимаю ни чего) только по примерам и то самым элементарным) в электронике худо бедно ещё могу что то) а в программирование нужно срочно учить матчасть!!! Вот только некогда этого делать, в основном по ночам пытаюсь читать, и в итоге все что прочитал все впустую))

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV, при компиляции скетча в строчке 37 ( 37| CAN.readMsgBuf(&rxId, &len, rxBuf); ) выдает ошибку

exit status 1

no matching function for call to 'MCP_CAN::readMsgBuf(uint32_t&, byte*, byte [8])'

я не понимаю что именно не нравиться IDE(((

sadman41
Offline
Зарегистрирован: 19.10.2016

А у вас с ним библиотеки разные.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Нужно открыть пример read из твоей библиотеки и посмотреть какой функцией шина читается

son32
Offline
Зарегистрирован: 04.12.2017

в примерах есть 

receive_check

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


#include <SPI.h>
#include "mcp_can.h"

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
  #define SERIAL SerialUSB
#else
  #define SERIAL Serial
#endif

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    SERIAL.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println(" Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}


void loop()
{
    unsigned char len = 0;
    unsigned char buf[8];

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();
        
        SERIAL.println("-----------------------------");
        SERIAL.print("Get data from ID: 0x");
        SERIAL.println(canId, HEX);

        for(int i = 0; i<len; i++)    // print the data
        {
            SERIAL.print(buf[i], HEX);
            SERIAL.print("\t");
        }
        SERIAL.println();
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

receive_Blink

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13

#include <SPI.h>
#include "mcp_can.h"

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
  #define SERIAL SerialUSB
#else
  #define SERIAL Serial
#endif

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 9;
const int LED        = 8;
boolean ledON        = 1;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    SERIAL.begin(115200);
    pinMode(LED,OUTPUT);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println("Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}


void loop()
{
    unsigned char len = 0;
    unsigned char buf[8];

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();

        SERIAL.println("-----------------------------");
        SERIAL.println("get data from ID: 0x");
        SERIAL.println(canId, HEX);

        for(int i = 0; i<len; i++)    // print the data
        {
            SERIAL.print(buf[i]);
            SERIAL.print("\t");
            if(ledON && i==0)
            {

                digitalWrite(LED, buf[i]);
                ledON = 0;
                delay(500);
            }
            else if((!(ledON)) && i==4)
            {

                digitalWrite(LED, buf[i]);
                ledON = 1;
            }
        }
        SERIAL.println();
    }
}

//END FILE

я так понимаю это и есть примеры read

MaksVV
Offline
Зарегистрирован: 06.08.2015
#include <mcp_can.h>
#include <SPI.h>

#define CAN_INT 2            // Set INT(mcp2515) to pin 2
MCP_CAN CAN(10);

uint32_t curmillis = 0;

unsigned char stmp1[8] = {0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // EZS
unsigned char stmp2[8] = {0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // KLA
unsigned char stmp3[8] = {0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x77, 0x00}; // djoy

void setup()
{
  Serial.begin(115200);
  CAN.begin(CAN_500KBPS);
}


void loop()
{
  curmillis = millis();
  writeCAN();
  readCAN();
}



void readCAN()
{
    if(CAN_MSGAVAIL == CAN.checkReceive())            // если из CAN пришло сообщение
    {
      uint32_t rxId;  byte  len = 0;  byte  rxBuf[8];
      CAN.readMsgBuf(&len, rxBuf); rxId = CAN.getCanId();
     
     if (rxId == 0x123) {CAN.sendMsgBuf(0x321, 0, len, rxBuf);}
    }
}


void writeCAN()
{
  static bool sdvig2 = 0; static bool sdvig3 = 0; 
  static uint32_t timing1 = 0;
  static uint32_t timing2 = 0;
  static uint32_t timing3 = 0;

  if (curmillis >= 133 && !sdvig2) {sdvig2 = 1; timing2 = curmillis;}
  if (curmillis >= 167 && !sdvig3) {sdvig3 = 1; timing3 = curmillis;}
 
  if (curmillis - timing1 > 100) { // EZS
    timing1 = curmillis;
    CAN.sendMsgBuf(0x020, 0, 8, stmp1);
  }
  if (sdvig2 && curmillis - timing2 > 100) { // KLA
    timing2 = curmillis;
    CAN.sendMsgBuf(0x353, 0, 8, stmp2);
  }
  if (sdvig3 && curmillis - timing3 > 100) { // djoy
    timing3 = curmillis;
    CAN.sendMsgBuf(0x1F3, 0, 8, stmp3);
  }
}

 

son32
Offline
Зарегистрирован: 04.12.2017

Спасибо!!! сейчас канхакер обновлю и буду пробовать)

Вчера в магазине нашел классную кнопочку под этот проект, с пиктограммой вкл на ней, а она оказалась с фиксацией, те коснулся она по сигнальному проводу подает все время high, второй раз коснулся все время low, а нужна была без фиксации((( придется ее разбирать и переделывать(((

son32
Offline
Зарегистрирован: 04.12.2017

son32 пишет:

Вчера в магазине нашел классную кнопочку под этот проект

забыл написать СЕНСОРНУЮ КНОПКУ)))

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV, в общем работает твой скетч как всегда просто супер!!! 

вопрос один остался по сдвигам таймеров. строка 48 и 49 там значения указаны 133 и 167. я правильно понял что это миллисекунды указаны? и если да, то их выставлять можно произвольно или как то рассчитывать? так как мне еще нужно будет добавлять таймеры.

MaksVV
Offline
Зарегистрирован: 06.08.2015

да это миллисекунды. по таймерам представь, если ты хочешь разделить отправку по времени, допустим у тебя три сообщения раз в 100мс. если ты сдвиг назначишь 200, то у тебя в итоге оно наложится на первое, которое без сдвига было.

если у тебя все будут раз в 100 мс, сдвиги делаешь разные между 110 и 190 включительно с шагом в 10 мс, (если меньше 10мс, то можно и вообще без сдвига тогда) 

son32
Offline
Зарегистрирован: 04.12.2017

Ок, понял. Таймеров всего будет пять не более.

euclid
Offline
Зарегистрирован: 25.11.2019

@son32 поделитесь схемой подключения и настройками библиотек )

Я совсем новичок в Arduino, 

Тоже взял DUE и MCP2515 и оно совсем не заводится :(

CAN.begin всегда с ошибкой

Вы кварцы на 16MHz ставили или так и работает с 8MHz?

Спасибо

 

 

son32
Offline
Зарегистрирован: 04.12.2017

Схема подключения следующая.

 MCP2515 <--> DUE

         INT <--> D2 

          CS <--> D10

Далее в центре DUE есть шести пиновый разъем SPI к нему подключаем три провода(смотрим распиновку DUE)

        SCK <--> SCK

(MOSI)SI <--> MOSI

(MISO)SO <--> MISO

ну и питание соответственно. В общем ни чем не отличается от подключения к MEGA2560.

У меня завелась только после установки библиотеки Seeeduino CAN-BUS.  при использовании других библиотек компиляция и загрузка проходила без проблем, но в Can шине была тишина.

Кварц я менял на 16MHz, но делал это еще до приобретении DUE, для работы со скоростью 83,3KBPS. со скоростями выше(к примеру 125, 250, 500) должно работать и с 8MHz.

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

 

       

euclid
Offline
Зарегистрирован: 25.11.2019

Нет, у меня с компиляцией всё в порядке было. Я просто не так всё понял в схеме подключения и насоединял бог весть что.

Ещё раз посмотрел pinout и всё завелось. ))) Правда пока на Mega, чуть позже попробую на Due

А как вы подключаете несколько шилдов одновременно? Все контакты паралельно и только CS меняется на D10, D9 и тп?

son32
Offline
Зарегистрирован: 04.12.2017

Да все верно все паралельно кроме CS, они подключаются к разным пинам и после мы их прописываем в скетче.

MaksVV
Offline
Зарегистрирован: 06.08.2015

son32 пишет:
Кварц я менял на 16MHz, но делал это еще до приобретении DUE, для работы со скоростью 83,3KBPS. со скоростями выше(к примеру 125, 250, 500) должно работать и с 8MHz.

С 8 МГц врядли заработает, что то не видно, где в библиотеке это настраивается

euclid
Offline
Зарегистрирован: 25.11.2019

Я взял форк библиотеки сделанный под 8MHz конечно.

Там в параметрах .begin есть частота кварца, помимо скорости. 

Есть смысл перепаивать кварц если и так всё работает? 16MHz кроме большего набора скоростей передачи, что-то даёт?

В моём проекте 100 и 500 кбит.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

если нашел библиотеку под 8 МГц , то конечно можно не перепаивать

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV пишет:

С 8 МГц врядли заработает, что то не видно, где в библиотеке это настраивается

Возможно я не прав, но вроде в строке CAN.begin(CAN_500KBPS); в скобках после указания скорости можно указать/дописать частоту кварца, наверное что то типо того CAN.begin(CAN_500KBPS, MCP_8MHZ); в файле mcp_can.cpp библиотеки вроде есть записи настроек скорость и частоты кварца.

euclid
Offline
Зарегистрирован: 25.11.2019

Вроде есть такой параметр теперь в и https://github.com/Seeed-Studio/CAN_BUS_Shield/blob/7d41ceb28a4f92b0b8b4...

 

son32
Offline
Зарегистрирован: 04.12.2017

Честно говоря я в этом не силен. Если из примеров делаю, то получается, за что и отдельное спасибо MaksVV, если сам то 50Х50 выходит))

Alex70
Offline
Зарегистрирован: 28.11.2019

MaksVV, son32   проблема с компиляцией в DUE ваших скретчей дляMCP2515. Ничего не помогает , хотя всякие блинки встают и не только.Ваши файлы ни в какую.Красным пишет ошибку.У вас может какие-то ответы есть ? Железо или я криворук ..

sadman41
Offline
Зарегистрирован: 19.10.2016

Разве железо виновато в том, что для Вас имеет смысл цвет ошибки, а не её текст?

son32
Offline
Зарегистрирован: 04.12.2017

Сложно судить по таким симптомам, здесь наверное все зависит от расположения звёзд))) шучу))) с железом секретов ни каких, скетч из 13 сообщения компилируется и работает на ура 100%. Скетч из 5го сообщения, да при компиляции даёт ошибку, почитайте внимательно все сообщения, и покажите скетч который вы пытаетесь скомпилировать.

Alex70
Offline
Зарегистрирован: 28.11.2019

Alex70
Offline
Зарегистрирован: 28.11.2019

Вот такая картина.

Alex70
Offline
Зарегистрирован: 28.11.2019

МСР 2515 не был установлен

Alex70
Offline
Зарегистрирован: 28.11.2019

son32  Это ответ программы на скетч из 13-го сообщения

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, понимаю... Я абсолютно не водитель, просто купил машину чтобы ездить. Почему меня штрафуют, когда я поперек дороги еду?

son32
Offline
Зарегистрирован: 04.12.2017

Alex70, у вас в низу программы IDE белым шрифтом по черному фону написана ваша проблема!!! Установите библиотеку, какую именно нужно написано в сообщениях данной темы!!!

Alex70
Offline
Зарегистрирован: 28.11.2019

 

 

son32
Offline
Зарегистрирован: 04.12.2017

Библиотеку нужно установить Seeeduino CAN-BUS!!! У вас теперь красным по черному написано no such file or directory (в переводе Данный файл или каталог отсутствует). Реально из серии почему меня кусает алабай!!!

son32
Offline
Зарегистрирован: 04.12.2017

Только сейчас задумался над вопросом. Alex70 вам сколько лет? (Ну так просто интересно).

Alex70
Offline
Зарегистрирован: 28.11.2019

70

son32
Offline
Зарегистрирован: 04.12.2017

Про возраст вопрос для того что бы понимать как дальше отвечать вам, и только))) а вдруг не 70 а 7?
Если вы только пять дней играете с ардуино, то начните с того что изучите мат часть. Что такое скетч, что такое библиотека, что такое IDE и как с ним работать, почитайте разделы для новичков. А так вы просто в ветке просите научите меня я ни чего не умею, тем самым мы с вами разводим просто флуд. И вообще у вас точно arduino DUE а не mega, и есть ли модуль MCP2515, и что именно вы собрались собирать, для чего вам этот скетч? Просто из ответа складывается впечатление что вы просто хотите скомпилировать скетч, и все на этом. Я тоже не спец в ардуино, точнее мне тяжело даётся написание программных кодов/скетчей.

son32
Offline
Зарегистрирован: 04.12.2017

Просто вам реально два раза было написано установить библиотеку, а вы игнорируете это. Как устанавливать библиотеки и новые платы? Гугл в помощь. Разъяснять здесь бессмысленно.

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV, нужно ваше мнение!!! В тот пример что вы для меня сделали я добавлю еще один MCP2515, то есть будет еще одна шина только на скорости 250KBPS, несколько кнопок, энокодеров, и джойстик. при использовании которых будет происходить изменение тех или иных байтов в передоваемых пакетах. так вот Arduino DUE по сути брал из-за библиотеки Scheduler, если я правильно понял при помощи этой библиотеки контроллер может работать в несколько потоков, то есть в скетче мы можем прописать несколько void loop которые будут работать параллельно друг от другу. Так вот вопрос такой. Имеет ли смысл использовать эту библиотеку Scheduler, или просто все сделать на таймерах со сдвигами?

sadman41
Offline
Зарегистрирован: 19.10.2016

Параллельно на одноядерном МК ничего не может работать в принципе.

son32
Offline
Зарегистрирован: 04.12.2017

ну согласно описания)

Платформы Arduino с ядром Cortex-M0+ и Cortex-M3 позволяют выполнять несколько задач одновременно — микрокотроллер просто переключается с одной задачи на другую. Для многопоточного программирования пригодится библиотека Scheduler, которая включает в себя функции управление между задачами.

Настроим несколько функций для одновременно выполнения с loop(). По итогу на выходе будет несколько независмых loop-функций, не требующих отдельного таймера.

b707
Offline
Зарегистрирован: 26.05.2017

son32 пишет:

Платформы Arduino с ядром Cortex-M0+ и Cortex-M3 позволяют выполнять несколько задач одновременно — микрокотроллер просто переключается с одной задачи на другую.

Так "переключаясь" или "одновременно" ? :)))

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Про кортекс ничего не знаю, кроме как то, что на нём у меня андроид в медиаплеере крутится. Действительно - там какая-то кооперативность есть.

MaksVV
Offline
Зарегистрирован: 06.08.2015

son32, покажите скетч на меге 2560, где у вас появились проблемы с задержками при работе с CAN. 

nik182
Offline
Зарегистрирован: 04.05.2015

А у ESP два ядра и если wifi не использовать  то можно честную параллельную работу устроить.