PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   Arduino+CANBus Shield - непонятка (http://pccar.ru/showthread.php?t=22854)

Jiraffa 20.02.2015 21:01

Arduino+CANBus Shield - непонятка
 
Добрый вечер

Имеем arduino mega 2560+CANBus shield (sparkfun) и мерседес
Пробовал разные скетчи и библиотеки. По сути они ничем не отличаются.
Ситуация следующая: подключаем шилд к машине (на колодку магнитолы, там есть CAN и я знаю его скорость), на компе смотрим терминалом. Запускаем шилд, смотрим в терминале, что всё запустилось нормально без ошибок. Вставляю ключ зажигания, приходят две посылки и ..... всё. После этого, чтобы ещё что-то получить необходимо сбросить питание с ардуины и шилда и вытащить ключ. Тогда опять придут те же две посылки, если вставить ключ. А если не вставить ключ после переключения питания, а, например, нажать на кнопку снятия с охраны или постановку на охрану на родном ключе, то придут 6 посылок, но .... дальше опять тишина.
Т. е. после подключения шилда приходят N первых посылок, после чего не приходит ничего пока не передёрнешь питание.
Добавил моргание светодиода по переполнению таймера 2, он моргает исправно всё время.
Пробовал изменять скорость - или тишина, или приходит одна посылка из 3х байт, а на нужной скорости посылки по 8 байт.
Сделал ещё вот что. Подключил к одному компу VAGCOM с Васей диагностом (это кабель и программа для машин концерна VAG, кабель рабочий) а к другому шилд, соединил их между собой, и на Васе попробовал обращаться к разным блокам. Шилд всё отлично принимал. Причём без всяких переключений питания принимал столько пакетов, сколько отправлялось. По крайней мере, Вася пытался три раза достучаться к какому нибудь блоку, и шилд принимал три раза много всяких посылок. Потом я выбирал другой блок - и шилд опять всё принимал.

Пробовал и к пассату подключить шилд, аналогичная ситуация.

Может кто сталкивался с подобным или знает рецепт, как его готовить?

Dmitry8 20.02.2015 23:28

Какой тип шины используется в мерсе? (HS-CAN? FT-CAN? ) какая скорость?

Jiraffa 20.02.2015 23:34

За тип не скажу, а скорость в данном месте (это CAN-B) - 83.333kbps

Я нашёл на забугорном форуме, что подключали mcp2551+mcp2515 к мерсу, вот только тема старая, не отзывается никто

Dmitry8 20.02.2015 23:47

Когда я подключился в своей машине с шилдом на mcp2551 (HS-CAN) , а шина FT-CAN, сеть вообще умерла , все приборы потухли. Пришлось переделывать шилд под FT-CAN на TJA-1054. Короче, может в мерсе тоже Fault-tolerant CAN? Подробнее можешь почитать в соседней теме: Blaupunkt...

Jiraffa 20.02.2015 23:52

Допустим, но в пассате ситуация аналогичная. А для подключения к нему родной провод (VAGCOM) использует как раз микрочиповские элементы

И потом, у меня всё продолжает работать, ничего не отваливается. Просто приём пакетов прекращается после получения первой порции

Dmitry8 21.02.2015 00:14

В машине может быть несколько сетей can: диагностическая, мультимедийная, кузова и т.д. VAGCOM - это диагностический прибор? Если да - то он подключается, как раз, к диагностической can, которая HS-CAN. А по поводу отваливается... у некоторых получается считать данные в FT-CAN прибором HS-CAN, оно может работать, но как-то криво. Попробуй узнать какая у тебя шина, может поискать в тех. документации на авто? Может есть принципиальная схема майфуна? А может вскрой магнитолу и посмотри какая микросхема подключена к can.

Jiraffa 21.02.2015 00:27

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

cherkasoff 21.02.2015 14:11

Попробуйте не с мегой, а с уно или леонардо.

У меня такой шилд без проблем в шкоде работает и с тем, и с другим. С Мегой могут быть проблемы.

Jiraffa 21.02.2015 16:39

А что может быть не так с мегой? Там используется только SPI да UART по большому счёту.
Просто есть только мега.

Хотя есть какие то просто авээрки старые ...

cherkasoff 21.02.2015 22:40

Цитата:

Сообщение от Jiraffa (Сообщение 321340)
А что может быть не так с мегой? Там используется только SPI да UART по большому счёту.
Просто есть только мега.

Хотя есть какие то просто авээрки старые ...

Боюсь наврать, но вроде бы я где-то видел пост о глюках меги и кан-шилда. Поэтому предложил попробовать на уно или леонардо.

Farman 21.02.2015 22:52

У меня все это нормально работает. Срежте дорожку которая терминирует резистор на 120 ом. Гже он есть на вики у сиидсьудио.

Jiraffa 21.02.2015 23:21

На этом шилде (sparkfun, а не seedstudio, я указал в первом сообщении) нет этого резистора в принципе. Эти два шилда не совсем идентичны

Вроде нано ещё где-то валялась ... И сама Мега32 ... Не покупать же ещё одну плату.
Попробую наваять из меги32
Хотя не верю, что причина в этом

Farman 21.02.2015 23:43

Тогда сорри, у меня от сиидстудио

Jiraffa 21.02.2015 23:48

А работает с мегой?

cherkasoff 22.02.2015 12:58

Цитата:

Сообщение от Farman (Сообщение 321357)
У меня все это нормально работает. Срежте дорожку которая терминирует резистор на 120 ом. Гже он есть на вики у сиидсьудио.

У меня с терминирующим резистором вообще ничего не работало, а тут сначала работает, а потом нет.

Farman 22.02.2015 21:39

Цитата:

Сообщение от Jiraffa (Сообщение 321366)
А работает с мегой?

С мегой и нано нормально работает. Но я щас перешел на элдуино. Там и лин есть, правда поеа не достучались до него.

Glouck 23.02.2015 07:05

Цитата:

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

Т.е. шина продолжает работать (периферия в машине, которая сидит на этой шине), но шилд не видит данные? Или вся шина ложится после этого?
Осциллографом смотрел?

Jiraffa 23.02.2015 09:23

Шина продолжает работать, шилд не видит данные. Чтобы увидел, нужно его обесточить и вытащить ключ зажигания. Потом включить шилд и вставить ключ. Если сначала вставить ключ, а потом включить шилд - ничего не примет. Можно ещё вместо ключа нажать на кнопки ключа, тогда шилд тоже принимает пакеты (6 штук). Причём для кнопок открытия и закрытия - разные

Осцилом (USB) посмотрел, как смог. Данные бегают

Glouck 23.02.2015 23:33

А можно взглянуть на код прошивки?

Jiraffa 24.02.2015 11:45

Вложений: 2
Библиотека почти стандартная - я добавил только скорость 83.333 для мерса (там несколько таких скоростей - экспериментировал, на 3м варианте приём стабильный)
Скетч содержит элементы для вывода информации на I2C дисплей и использование джойстика, но я их почти сразу заремил и оставил только консоль.

Попробовал сейчас на столе ещё с elm327 его скрестить. От elm'a пакеты приходят. Но тоже только один раз. т.е. запускаю elm на автоопределение протокола и шилд принимает пару пакетов (на соот-ей текущей выбранной скорости). elm ничего не находит, что и понятно, и отключается. Запускаю сканирование ещё раз - и шилд уже ничего не принимает. Помогает reset.

Код скетча (он же есть и в архиве)
Код:

// demo: CAN-BUS Shield, receive data
#include "mcp_can.h"
#include
#include
//#include
//#include

#define INT8U unsigned char

/*"Joystick" Init*/
#define UP    A1    /*Analog Pin 1*/
#define DOWN  A3    /*Analog Pin 3*/
#define LEFT  A5    /*Analog Pin 5*/
#define RIGHT  A2    /*Analog Pin 2*/
#define CLICK  A4    /*Analog Pin 4*/
#define JSP    0  /*Joystick Pressed*/
#define JSNP  1  /*Joystick Not Pressed*/

/*Status LED's*/
#ifndef LED_2
int LED_2 = 8;
#endif
#ifndef LED_3
int LED_3 = 7;
#endif

//LiquidCrystal_I2C lcd(0x27,20,4);  // set address of lcd to 0x27 and count of char to 20, of rows to 4 (20х4)

INT8U Flag_Recv = 0;
INT8U len = 0;
INT8U buf[16];
char str[20];
INT8U speedCAN;
int speedCANtext;
int countPckg = 0;
//char speedInput;

//Timer 2 - blinking LED
unsigned int toggle = 0;  //used to keep the state of the LED
unsigned int count = 0;  //used to keep count of how many interrupts were fired

//Timer2 Overflow Interrupt Vector, called every 1ms
ISR(TIMER2_OVF_vect) {
  count++;              //Increments the interrupt counter
  if(count > 999){
    toggle = !toggle;    //toggles the LED state
    count = 0;          //Resets the interrupt counter
  }
  digitalWrite(LED_3,toggle);
  TCNT2 = 130;          //Reset Timer to 130 out of 255
  TIFR2 = 0x00;          //Timer2 INT Flag Reg: Clear Timer Overflow Flag
}; 

/*
void init_LCD (void)
{
  lcd.init();                    // инициализация LCD
  lcd.backlight();                // включаем подсветку
  lcd.clear();                    // очистка дисплея
  lcd.setCursor(0, 0);
}
*/
void init_JoyStick(void)
{
  pinMode(UP,INPUT);
  pinMode(DOWN,INPUT);
  pinMode(LEFT,INPUT);
  pinMode(RIGHT,INPUT);
  pinMode(CLICK,INPUT);
  digitalWrite(UP, HIGH);  //enabled input pull-up resistor
  digitalWrite(DOWN, HIGH);  //enabled input pull-up resistor
  digitalWrite(LEFT, HIGH);  //enabled input pull-up resistor
  digitalWrite(RIGHT, HIGH);  //enabled input pull-up resistor
  digitalWrite(CLICK, HIGH);  //enabled input pull-up resistor
}

void init_Status_LED(void)
{
  pinMode(LED_2, OUTPUT);//communication LED
  pinMode(LED_3, OUTPUT); //Status LED
  digitalWrite(LED_2,LOW);
  digitalWrite(LED_3,LOW);
}

void init_CAN(void)
{
  if (CAN.begin(speedCAN) == 0)                // init can bus at baudrate
  {
/*    lcd.clear();
    lcd.print ("CAN init on ");
    lcd.print (speedCANtext);
    lcd.print ("KBPS");
*/    Serial.print("CAN init on ");
    Serial.print(speedCANtext);
    Serial.println("KBPS");
  } else
  {
/*    lcd.clear();
    lcd.print ("CAN init FAIL");
*/    Serial.println("CAN init FAIL");
  }
}

void select_CAN_speed(void)
{
      int speedInput = Serial.read ();
      switch (speedInput)
      {
        case '1':   
          speedCAN = CAN_83_1KBPS;
          speedCANtext = 831;
          break;
        case '2':   
          speedCAN = CAN_83_2KBPS;
          speedCANtext = 832;
          break;
        case '3':   
          speedCAN = CAN_83_3KBPS;
          speedCANtext = 833;
          break;
        case '4':   
          speedCAN = CAN_83_4KBPS;
          speedCANtext = 834;
          break;
        case '5':   
          speedCAN = CAN_83_5KBPS;
          speedCANtext = 835;
          break;
        case '6':   
          speedCAN = CAN_500KBPS;
          speedCANtext = 500;
          break;
        case '7':   
          speedCAN = CAN_100KBPS;
          speedCANtext = 100;
          break;
        case '8':   
          speedCAN = CAN_125KBPS;
          speedCANtext = 125;
          break;
        default:
          Serial.println ("Speed error");
          speedCANtext = -1;
      }
}

void setup()
{
  Serial.begin(115200);
//  init_LCD();
//  init_JoyStick();
  init_Status_LED();

  //Setup Timer2 to fire every 1ms
  TCCR2B = 0x00;        //Disbale Timer2 while we set it up
  TCNT2  = 130;        //Reset Timer Count to 130 out of 255
  TIFR2  = 0x00;        //Timer2 INT Flag Reg: Clear Timer Overflow Flag
  TIMSK2 = 0x01;        //Timer2 INT Reg: Timer2 Overflow Interrupt Enable
  TCCR2A = 0x00;        //Timer2 Control Reg A: Normal port operation, Wave Gen Mode normal
  TCCR2B = 0x05;        //Timer2 Control Reg B: Timer Prescaler set to 128

//for use with mega2560
  pinMode(10, OUTPUT);   
  digitalWrite(10, HIGH);
  pinMode(11, INPUT);   
  digitalWrite(11, LOW);
  pinMode(12, INPUT);   
  digitalWrite(12, LOW);
  pinMode(13, INPUT);   
  digitalWrite(13, LOW);

//  lcd.print ("Press Joy to start");
//  Serial.println("Press Joy to start...");

  Serial.println("Enter CAN-BUS speed:");
  Serial.println("1 - 83.333 (1)");
  Serial.println("2 - 83.333 (2)");
  Serial.println("3 - 83.333 (3)");
  Serial.println("4 - 83.333 (4)");
  Serial.println("5 - 83.333 (5)");
  Serial.println("6 - 500");
  Serial.println("7 - 100");
  Serial.println("8 - 125");
  speedCANtext = -1;
  while (speedCANtext < 0)
  {
    if (Serial.available() > 0)
    {
      select_CAN_speed();
    }
  }

/* 
//  while (digitalRead(CLICK));
  while (1)
  {
    if(!digitalRead(DOWN))
    {
      speedCAN = CAN_83_1KBPS;
      speedCANtext = 831;
      break;
    }  else if(!digitalRead(UP))
    {
      speedCAN = CAN_83_2KBPS;
      speedCANtext = 832;
      break;
    } else if(!digitalRead(LEFT))
    {
      speedCAN = CAN_500KBPS;
      speedCANtext = 500;
      break;
    } else if(!digitalRead(RIGHT))
    {
      speedCAN = CAN_100KBPS;
      speedCANtext = 100;
      break;
    }
   
  }
*/ 
  init_CAN ();
  attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt
}

void MCP2515_ISR()
{
    Flag_Recv = 1;
      digitalWrite(LED_2,HIGH);
}

void loop()
{
//    digitalWrite(LED_3,HIGH);
    if(Flag_Recv)                  // check if get data
    {
      Flag_Recv = 0;                // clear flag
      ++countPckg;                  // count of packages
      CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
      Serial.print(countPckg);
//      Serial.println(": CAN_BUS GET DATA!");
/*      lcd.setCursor(0, 1);
      lcd.print (countPckg);
      lcd.print (": CANBUS GET DATA");
*/      Serial.print(": data len = ");
      Serial.print(len, HEX);
      Serial.print("\t");
      for(int i = 0; i       {
        Serial.print(buf[i], HEX);
        Serial.print("\t");
      }
      Serial.println();
      digitalWrite(LED_2,LOW);
    }

}


Jiraffa 24.02.2015 12:42

В магнитоле стоит TJA1054AT - Fault-tolerant CAN transceiver
Так что с мерсом вроде понятно, почему не пашет.

Но почему такая же петрушка и на пассате b6?

Glouck 27.02.2015 00:15

Вложений: 1
Посмотрел твой код.
Есть одно замечание: все переменные, которые используешь в прерываниях (Flag_Recv, toggle, count) нужно объявлять 'volatile', возможно в этом проблема.

И мне, в свое время, чем-то не понравилась эта библиотека от seeedstudio, я использовал другую. В архиве приложил.
Есть еще программка для вычисления регистров скорости для mcp2515 - MBTime, мне очень помогла.

Jiraffa 27.02.2015 12:40

Про MBTime, конечно же, знаю. Без неё скорость посчитать трудно. Но и в ней можно задавать различные параметры. Поэтому у меня и было несколько вариантов для скорости 83.333

Библиотеку попробую, спасибо.
Да и про volatile был не в курсе. Нужно возвращаться на обычные avr'ки.


Часовой пояс GMT +4, время: 23:45.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot