Arduino DUE и MCP2515

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

MaksVV пишет:

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

Наверное этого скетча уже нет(( так как туда уже сохранил скетч на DUE. но попробую его воспроизвести.

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

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

#include <SPI.h>
#include <mcp2515.h>

int sensorPin = A0;    // ось джойстика
int sensorPin2 = A1;   // ось джойстика
const int butPin = 5;  // кнопка джойстика
const int pin_A = 3;   // энкодер 1L
const int pin_B = 4;   // энкодер 1L
const int butPin2 = 6;  // кнопка энкодера 1L
const int pin_C = 7;   // энкодер 2R
const int pin_D = 8;   // энкодер 2R
const int butPin3 = 9;  // кнопка энкодера 2R
MCP2515 mcp2515(10);   // инициализация Can модуля

unsigned long currentTime;
unsigned long loopTime;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev=0;

unsigned long timing1; 
unsigned long timing2;
unsigned long timing3;
unsigned long timing4;
unsigned long timing5;

struct can_frame canMsg1;  //frame
struct can_frame canMsg2;  //OK
struct can_frame canMsg3;  //Up
struct can_frame canMsg4;  //Dw
struct can_frame canMsg5;  //L
struct can_frame canMsg6;  //R
struct can_frame canMsg7;  //Sound -
struct can_frame canMsg8;  //Sound +
struct can_frame canMsg9;  //Back
struct can_frame canMsg10;  //Lo
struct can_frame canMsg11; //Ro

void setup() {
  canMsg1.can_id  = 0x1F3;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x00;
  canMsg1.data[1] = 0x00;
  canMsg1.data[2] = 0x00;
  canMsg1.data[3] = 0x86;
  canMsg1.data[4] = 0x00;
  canMsg1.data[5] = 0x00;
  canMsg1.data[6] = 0x77;
  canMsg1.data[7] = 0x00;

  canMsg2.can_id  = 0x1F3;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x00;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x01;
  canMsg2.data[3] = 0x86;
  canMsg2.data[4] = 0x00;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x77;
  canMsg2.data[7] = 0x00;
 
  canMsg3.can_id  = 0x1F3;
  canMsg3.can_dlc = 8;
  canMsg3.data[0] = 0x00;
  canMsg3.data[1] = 0x00;
  canMsg3.data[2] = 0x02;
  canMsg3.data[3] = 0x86;
  canMsg3.data[4] = 0x00;
  canMsg3.data[5] = 0x00;
  canMsg3.data[6] = 0x77;
  canMsg3.data[7] = 0x00;
    
  canMsg4.can_id  = 0x1F3;
  canMsg4.can_dlc = 8;
  canMsg4.data[0] = 0x00;
  canMsg4.data[1] = 0x00;
  canMsg4.data[2] = 0x20;
  canMsg4.data[3] = 0x86;
  canMsg4.data[4] = 0x00;
  canMsg4.data[5] = 0x00;
  canMsg4.data[6] = 0x77;
  canMsg4.data[7] = 0x00;

  canMsg5.can_id  = 0x1F3;
  canMsg5.can_dlc = 8;
  canMsg5.data[0] = 0x00;
  canMsg5.data[1] = 0x00;
  canMsg5.data[2] = 0x80;
  canMsg5.data[3] = 0x86;
  canMsg5.data[4] = 0x00;
  canMsg5.data[5] = 0x00;
  canMsg5.data[6] = 0x77;
  canMsg5.data[7] = 0x00;

  canMsg6.can_id  = 0x1F3;
  canMsg6.can_dlc = 8;
  canMsg6.data[0] = 0x00;
  canMsg6.data[1] = 0x00;
  canMsg6.data[2] = 0x08;
  canMsg6.data[3] = 0x86;
  canMsg6.data[4] = 0x00;
  canMsg6.data[5] = 0x00;
  canMsg6.data[6] = 0x77;
  canMsg6.data[7] = 0x00;

  canMsg7.can_id  = 0x1F3;
  canMsg7.can_dlc = 8;
  canMsg7.data[0] = 0x00;
  canMsg7.data[1] = 0x00;
  canMsg7.data[2] = 0x00;
  canMsg7.data[3] = 0x84;
  canMsg7.data[4] = 0x00;
  canMsg7.data[5] = 0x00;
  canMsg7.data[6] = 0x77;
  canMsg7.data[7] = 0x00;
    
  canMsg8.can_id  = 0x1F3;
  canMsg8.can_dlc = 8;
  canMsg8.data[0] = 0x00;
  canMsg8.data[1] = 0x00;
  canMsg8.data[2] = 0x00;
  canMsg8.data[3] = 0x88;
  canMsg8.data[4] = 0x00;
  canMsg8.data[5] = 0x00;
  canMsg8.data[6] = 0x77;
  canMsg8.data[7] = 0x00;
 
  canMsg9.can_id  = 0x1F3;
  canMsg9.can_dlc = 8;
  canMsg9.data[0] = 0x80;
  canMsg9.data[1] = 0x00;
  canMsg9.data[2] = 0x00;
  canMsg9.data[3] = 0x86;
  canMsg9.data[4] = 0x00;
  canMsg9.data[5] = 0x00;
  canMsg9.data[6] = 0x77;
  canMsg9.data[7] = 0x00;
    
  canMsg10.can_id  = 0x1F3;
  canMsg10.can_dlc = 8;
  canMsg10.data[0] = 0x00;
  canMsg10.data[1] = 0x00;
  canMsg10.data[2] = 0x00;
  canMsg10.data[3] = 0x86;
  canMsg10.data[4] = 0x00;
  canMsg10.data[5] = 0x00;
  canMsg10.data[6] = 0x77;
  canMsg10.data[7] = 0x00;

  canMsg11.can_id  = 0x1F3;
  canMsg11.can_dlc = 8;
  canMsg11.data[0] = 0x00;
  canMsg11.data[1] = 0x00;
  canMsg11.data[2] = 0x00;
  canMsg11.data[3] = 0x86;
  canMsg11.data[4] = 0x00;
  canMsg11.data[5] = 0x00;
  canMsg11.data[6] = 0x77;
  canMsg11.data[7] = 0x00;
  
  pinMode(butPin,INPUT_PULLUP);    // кнопка джойстика
  pinMode(butPin2,INPUT_PULLUP);   // кнопка энкодера
  pinMode(pin_A, INPUT);           // энкодер
  pinMode(pin_B, INPUT);           // энкодер
  currentTime = millis();          // энкодер
  loopTime = currentTime;          // энкодер
  mcp2515.reset();                 // Can модуль
  mcp2515.setBitrate(CAN_250KBPS); // скорость Can модуля
  mcp2515.setNormalMode();         // Can модуль
  Serial.begin(9600);
}

void loop() {
  if (millis() - timing1 > 100){ // фрейм джойстика
  timing1 = millis(); 
  mcp2515.sendMessage(&canMsg1);
  }
  currentTime = millis();
  if(currentTime >= (loopTime + 3)){       // проверка состояния
    encoder_A = digitalRead(pin_A);        // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);        // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){  // если состояние изменилось с положительного к нулю
      if(encoder_B) {
      if (millis() - timing2 > 150){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg7);
       }
      }   
      else {
      if (millis() - timing2 > 150){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg8);
      }
     }
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла
    loopTime = currentTime;
  }
  
  if (digitalRead(butPin) == LOW) { // Ok
     if (millis() - timing2 > 500){
     timing2 = millis();
     mcp2515.sendMessage(&canMsg2);
     }
  }
  if (digitalRead(butPin2) == LOW) { // Back
     if (millis() - timing2 > 500){
     timing2 = millis();
     mcp2515.sendMessage(&canMsg9);
     }
  }
   int sensorValue = analogRead(sensorPin); // Left
   if (sensorValue > 900 && sensorValue < 1020) {
      if (millis() - timing2 > 500){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg5);
      }
  }
   int sensorValue2 = analogRead(sensorPin); // Right
   if (sensorValue2 > 1 && sensorValue2 < 100) {
      if (millis() - timing2 > 500){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg6);
      }
  }
   int sensorValue3 = analogRead(sensorPin2); // Up
   if (sensorValue3 > 1 && sensorValue3 < 100) {
      if (millis() - timing2 > 500){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg3);
      }
  }
   int sensorValue4 = analogRead(sensorPin2); // Down
   if (sensorValue4 > 900 && sensorValue4 < 1020) {
      if (millis() - timing2 > 500){
      timing2 = millis();
      mcp2515.sendMessage(&canMsg4);
      }
  }
}

 

понятно конечно что я неправильно работу таймера организовал

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

MaksVV, С наступившим новым годом!!! Так же с наступившим новым годом всех участников форума!!!

MaksVV, как обычно нужна ваша помощь, сам что то ни как на могу справиться))) задача следующая, как и в прошлом примере есть пакет данных скажем так же с ID 123 [8] 55 55 55 55 55 55 55 55 ардуино этот пакет принимает и как есть передает обратно в шину только с ID 111 [8] 55 55 55 55 55 55 55 55, но здесь есть еще энкодер, пр повороте энкодера допустим в право ардуино в переправляемом пакете должна сделать изменение допустим в первом байте на одно значение вверх, а при вращении влево в этом же первом байте изменяет значение вниз. допустим в право ID 111 [8] 56 55 55 55 55 55 55 55, ID 111 [8] 57 55 55 55 55 55 55 55. влево ID 111 [8] 54 55 55 55 55 55 55 55, ID 111 [8] 53 55 55 55 55 55 55 55.

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

//#define CAN_INT 2
//MCP_CAN CAN(10);
MCP_CAN CAN2(11);

const int pin_C = 7;      // энкодер 2R
const int pin_D = 8;      // энкодер 2R
const int butPin3 = 9;    //кнопка энкодера 2 //Back

unsigned long currentTime;
unsigned long loopTime;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev = 0;

uint32_t curmillis = 0;
unsigned long timing5;

void setup()
{
  Serial.begin(115200);
  //  CAN.begin(CAN_500KBPS);
  CAN2.begin(CAN_250KBPS);

  pinMode(pin_C, INPUT);           // энкодер
  pinMode(pin_D, INPUT);           // энкодер
  currentTime = millis();          // энкодер
  loopTime = currentTime;          // энкодер

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

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

    if (rxId == 0x3FB) {
      CAN2.sendMsgBuf(0x30B, 0, len, rxBuf);
    }
    if (rxId == 0x123) {
      CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
    }
  }
  currentTime = millis();
  if (currentTime >= (loopTime + 3)) {     // проверка состояния
    encoder_C = digitalRead(pin_C);        // считываем состояние выхода А энкодера
    encoder_D = digitalRead(pin_D);        // считываем состояние выхода B энкодера
    if ((!encoder_C) && (encoder_C_prev)) { // если состояние изменилось с положительного к нулю
      if (encoder_D) {
        if (millis() - timing5 > 150) {
          timing5 = millis();
          if (CAN_MSGAVAIL == CAN2.checkReceive());
          uint32_t rxId;  byte  len = 0;  byte  rxBuf[8];
          CAN2.readMsgBuf(&len, rxBuf); rxId = CAN2.getCanId();
          CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
          if (rxBuf[1] = + 1);
        }
      }
      else {
        if (millis() - timing5 > 150) {
          timing5 = millis();
          if (CAN_MSGAVAIL == CAN2.checkReceive());
          uint32_t rxId;  byte  len = 0;  byte  rxBuf[8];
          CAN2.readMsgBuf(&len, rxBuf); rxId = CAN2.getCanId();
          if (rxId == 0x123) {
            CAN2.sendMsgBuf(0x111, 0, len, rxBuf);
          }
          if (rxBuf[1] = - 1);
        }
      }
    }
    encoder_C_prev = encoder_C;     // сохраняем значение А для следующего цикла
    loopTime = currentTime;
  }
}

 

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

MaksVV, понимаю что у вас своих дел много. но всё-таки поможете с доработкой скетча?

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

son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...  

А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?

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

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

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

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

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

b707 пишет:

son32 - а у вас самого с программированием вообще по нулям? я помню ваш предыдущий вопрос, где вы не могли ID в сообщении поменять...  

А тут... Что за бред у вас написан в строке 66 и 78? Зачем тут if ? И посмотрите в справочнике, как делается инкремент и декремент. Что, неужели не стыдно спрашивать, как прибавить к числу единицу?

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

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

Alex70 пишет:

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


А вы товарищ вновь в ветке решили флудить? Или таким образом решили отыграться за прошлые сообщения?

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

son32][quote=b707 пишет:

Если считаете что это элементарно, то покажите пример за место того что бы мораль читать!!!

давайте я вам просто ваши ошибки перечислю, чтоб вы осознали наконец, насколько бестолковый код вы пишете. Может тогда придет понимание, что надо СНАЧАЛА набрать хотя бы минимальный уровень понимания, а потом садиться код писать

Значит так

строка 62 - условие без действия, не сработает
строка 66 - сразу три ошибки в одной строке. Во-первых, опять условие без действия, во-вторых - присваивание вместо инкремента, в третьих первый элемент массива имеет индекс 0, а не 1.

строка 72 - то же, что строка 62
строка 78 - то же как 66

Кроме синтаксических ошибок в программе полно логических. Насколько я понял, вам нужно при приеме пакета от определенного ID прибавить к первому элементу массива единицу и отослать обратно? - но на самом деле вы СНАЧАЛА отсылаете, а потом уже прибавляете. А в строчках 62-66 еще и проверку входящего ID потеряли...

Итого - 9 ошибок в 16 строчках, не считая трех логических. Код такого качества - только в помойку.

 

 

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

b707. Спасибо, я конечно попробую осмыслить то на что вы указали, хотя для меня это сложно. Смысл вообще в том что бы прочитать пакет данных от определенного ID и если энкодер не поворачивается то как есть его отправить обратно под другим ID(как в прошлом примере), но если мы поворачиваем энкодер то прибавить или отнять значение в определенном байте.
Да я согласен что для того что бы писать скетчи нужны знания, но просто честно мне очень сложно даётся теория, проще в практике что то сделать. Вот такой я поршивый человек))) но буду пробовать, так как пока что весь проект стоит из за этого момента(((

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

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

это понятно

son32 пишет:
весь проект стоит из за этого момента

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

 

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

Само собой, так и будет. Но в моем понимании для этого мы на форумах и общаемся. Мне к примеру тяжело даётся программирование, а кому то в жизни что то другое даётся тяжело. Просто я ведь не прошу написать всю логику работы моего проекта, мне только пример нужен в небольшом куске, а далее я его уже переделаю как мне нужно. Неужто нужно все бросить и не делать если не силен в программировании?

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

Может быть сначала поучиться? Потом браться за сложные проекты. Если есть желание, то всё преодолимо. Только надо не наскоками, а потратить какое то время на учебник программирования последовательно, от теме к теме , с самостоятельным решением задач в конце каждого параграфа. Не пропускать что то не понятное с мыслью, что потом не пригодиться. Есть примеры , как в таком режиме скил программирования поднимался до приемлимого уровня за пол года. Иначе ни как.

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

Согласен на все сто что нужно поучиться. Честное слово пробую и стараюсь.