Arduino UNO и MCP2515 CAN

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

с победой! Теперь канхакер без глюков, надеюсь. Буду всех на этот скетч теперь отправлять. 

77777_777
Offline
Зарегистрирован: 22.02.2019

Ой ёйёй, опять проблема, на столе всё огонь, подключаю к авто-тишина!? А прога которая в сериал всё видит....

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

скорость точно правильная? 

77777_777
Offline
Зарегистрирован: 22.02.2019

Побега по всем скоростях, короче все варианты, перепроштвки и тд. А срессивером в порт, на том же железе всё ок!

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

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

77777_777
Offline
Зарегистрирован: 22.02.2019

Тогда бы и в порт неработало-бы

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

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

77777_777
Offline
Зарегистрирован: 22.02.2019

Эх ёлки ёлки(ситроены) всегда с ними одни проблемы... Попробую сам чё нить изобразить с выходом в с. порт. Если будет какая нить инфа, поделитесь.

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

может убрать резистор когда к авто подключаетесь. 

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

машина какая? 

77777_777
Offline
Зарегистрирован: 22.02.2019

Да пробовал. Пежо 4007 10-ти летнее салонная шина на 100к работает

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

ну это скорее митсу аутлендер. там только шильдик пежо. может тут конечно чтонибудь найдёте.

По поводу управляющих сигналов можно с кан модуля сигнализации узнать как рулить тем или иным. 

Что из шины хотите взять? 

77777_777
Offline
Зарегистрирован: 22.02.2019

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

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

ну если буду кому в ближайшее время сигу ставить, заснифлю от сигнлаки лог команд закрытия с кофмортом (поднятие стекол и складывание зеркал) и закрытия без комфорта. 

UPDATE:  сигналкой не заявляено управление комфортом. Видимо информации  и команд о складывании зеркал в CAN шине нет. 

Возможно это просто настройка в блоке бортовой электроники (ETACS). и если она активна, то при команде "закрыть замки" ETACS складывает зеркала, а "открыть замки" - раскладывает. Не факт, что при этом в CANe есть команды отдельно на зеркала. Так что вы можете их там и не найти. 

настройки зеркал делаются с дилерского МУТ

UPDATE:UPDATE: посмотрел на outlander XL  - заявлено с сигналки закрытие зеркал. Может вам все таки и повезёт и там есть что-то в CANе про зеркала. 

77777_777
Offline
Зарегистрирован: 22.02.2019

Учтём! А с дилерского неполучилось включить. Я тут сейчас библиот. Can h. Заменил на mcp can h. И вс[ё прошилось и даже работает. Завтра попробую к машине подкл.

vitaliynik69
vitaliynik69 аватар
Offline
Зарегистрирован: 02.03.2019

Подскажите Скеч пост #7 работает ок ! но хочу чтобы при получении пакета 0f6 был запуск ,и при пропадании его оставалась отправка в шину данных

 

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

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

Запуск на Луну? 

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

MaksVV пишет:

UPDATE:UPDATE: посмотрел на outlander XL  - заявлено с сигналки закрытие зеркал. Может вам все таки и повезёт и там есть что-то в CANе про зеркала. 

не знаю, через КАН или еще как - но у меня на Ауте ХЛ зеркала с сигналки складываются, если на брелке кнопку  закрытия придержать

77777_777
Offline
Зарегистрирован: 22.02.2019

Зеркала стали складываться,после подключения программатора LEXSI и однаго умного человека.2 нажатия складываются,а если 3- наж.то ещё и стёкла закр. А кан-хак. на пежо так и не заработал.Подключил его ещё к Солярису,заработал,но с торможениями.

к мерену Е213 там шина А на 250к .Выводит несколько сообщений и умерает.

 

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

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

vitaliynik69
vitaliynik69 аватар
Offline
Зарегистрирован: 02.03.2019

Я наверно не правильно обосновал проблемму Скеч переделан с использования в  других целях Хотелось-бы  чтобы адресом 280 запускалась передача шины и опять-же при пропадания этого адреса посылки шли неизменно   Спасибо

#include <SPI.h>
#include <mcp2515.h>
 
struct can_frame canMsg; 
struct can_frame canMsg1;
 
MCP2515 mcp2515(10);
 
void setup() {  
  SPI.begin(); 
  mcp2515.reset();
  mcp2515.setBitrate(CAN_1000KBPS);
  mcp2515.setNormalMode();
}
 
void loop() {
  
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) 
  { 
      if (canMsg.can_id==0x280 )
      {
          canMsg1.can_id  = 0x420;
          canMsg1.can_dlc = 8;
          canMsg1.data[0] = 0x59;
          canMsg1.data[1] = 0xEF;
          canMsg1.data[2] = 0x00;
          canMsg1.data[3] = 0x5E;
          canMsg1.data[4] = 0x42;
          canMsg1.data[5] = 0x10;
          canMsg1.data[6] = 0x03;
          canMsg1.data[7] = 0x32;
 
 
          
 
          
          mcp2515.sendMessage(&canMsg1);
      }
  }
}
MaksVV
Offline
Зарегистрирован: 06.08.2015

объясните мне бестолковому что значит "передача шины" и "посылки шли неизменно"? Откуда и куда шли? Неужели это так трудно, подробно написать что вам нужно. и прочитайте головную тему песочницы.

MaksVV
Offline
Зарегистрирован: 06.08.2015
 
смею предположить, что вам нужно при получении из шины пакета с ID 0x280 отправить ваш созданный пакет с ID 0x420. 
  
в стеапе настройки шины у вас 1000 Мбит/с что очень врядли. Редкая это скорость. Скорее всего 500кБит/с. И модуль наверняка у вас скварцем 8 Мгц. Поэтому нужно так 
 mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);

и вы не написали что конкретно не получается. Как вы проверяете в итоге заработала ли ваша хотелка? 

 
 
 
vitaliynik69
vitaliynik69 аватар
Offline
Зарегистрирован: 02.03.2019

да дейсвительно  в скече  стоит  1000    с кан хакера посылаю на скорости 500 все работает  если  в скече  500 то работает на 250  

 

vitaliynik69
vitaliynik69 аватар
Offline
Зарегистрирован: 02.03.2019

Это Вы правильно сказали  

смею предположить, что вам нужно при получении из шины пакета с ID 0x280 отправить ваш созданный пакет с ID 0x420. 

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

vitaliynik69 пишет:
да дейсвительно  в скече  стоит  1000    с кан хакера посылаю на скорости 500 все работает  если  в скече  500 то работает на 250 

то, о чём я и говорил: 

MaksVV пишет:
И модуль наверняка у вас скварцем 8 Мгц. Поэтому нужно так 

 mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);

а как же это? : 

MaksVV пишет:
и вы не написали что конкретно не получается. Как вы проверяете в итоге заработала ли ваша хотелка?

 

vitaliynik69
vitaliynik69 аватар
Offline
Зарегистрирован: 02.03.2019

mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);

ок заработало как надо

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

Столкнулся с эффектом "китайского MCP2515", немного поисследовал проблему, рассказываю.

Так, как ардуинщики сами библиотеки не только не пишут самостоятельно, но и, часто, не читают, то берут первую попавшуюся. Или несколько. 

А библиотеки (драйверы) встречаются самые разнообразные: авторы одних считают, что после реинициализации контроллера маски/фильтры сбрасывать не нужно и этим должен заниматься программист, авторы других придерживаются противоположного мнения и в процедуру реинициализации добавляют функционал обнуления фильтров/масок. Нередко в драйверах встречается и специальный метод(функция) установки фильтра или маски. 

И те и другие авторы делятся на максималистов - тех, кто уверен в необходимости использования Extended ID (29 bit) и минималистов, которым достаточно Standart ID (11 bit). Обе разновидности авторов могут быть очень заботливыми и скрывать от пользователя ненужное знание, не демонстрируя способы установки фильтра/маски в примерах и/или используя внутри какой-либо тип ID, наиболее сильно им понравившийся. 

Это приводит к ситуации, когда где-то внутри драйвера что-то как-то устанавливается с неким типом ID (установленным или сброшенным битом EXIDE). Писатели скетчей так же добавляют неопределённости, то используя сброс масок/фильтров, то не используя его. 

Итак, что делает среднестатистический ардуинщик? Он идет по результатам поиска в гугле/яндексе/etc, скачивает кучу сретчей и библиотек. Устанавливает и начинает запускать подряд все экзамплы и сретчи, немедленно оказываясь в ловушке: библиотека/пример/скетч сбрасывает фильтры/маски, например, одновременно устанавливая бит EXIDE (активация Extended ID). Но пользователю что-то не нравится, он зашивает второй скетч и... он оказывается рассчитанным под Standart ID и фильтры/маски не чистит. EXIDE сбросить некому. Таким образом MCP переходит в режим глухаря и "не работает" даже в Loopback Mode. Потом следует ещё одна прошивка, другой скетч, третий, восьмой, под столом валяется уже опустошённая бутылка водки, пальцы сбиты в кровь на форумах, в глазах тоска, в руке молоток...

Эта вакханалия продолжается до тех пор, пока случайным образом не будет найден и зашит скетч, который сбросит наконец тиранию EXIDE (или напротив - установит). Либо пользователь, устав, обесточит всё и забудется тревожным сном. А на следующий день включит свою ардуинку с MCP и она, естественно, начнёт работать - ведь сброс питания обнуляет фильтры/маски и не устанавливает автоматически в них бит EXIDE. Внутренний голос сразу подсказывает: "Проклятые китайцы, подсунули, бл..". А они, вобщем-то, и не подсовывали.

Отсюда мораль - ходите в библиотеки. Или ищите в них способ сразу же сбросить фильтр/маску с расчётом на тот тип ID, который требуется в дальнейшей работе.

Напоминаю, что данная операция производится в специальном режиме "Configuration Mode", который, к слову, доступен сразу после реинициализации модуля (инструкция RESET), о чём написано в datasheet. Там ж указано, что "The mask essentially determines which bits to apply the acceptance filters to. If any mask bit is set to a zero, that bit will automatically be accepted, regardless of the filter bit."

Хорошего вам психического здоровья и берегите печень от расстройств.

77777_777
Offline
Зарегистрирован: 22.02.2019

Кан хакер собственного написания через сериал порт. Команды отправляются в порт. После загрузки порта на монитор выводятся все сообщения, гуляющие в шине в данный момент.  С левой стороны – присвоенный порядковый номер сообщения, крайний с правой стороны – контрольная сумма байт даты сообщения.  При  желании посмотреть отдельные сообщения в режиме он-лайн, посылаем команду N(порядковый номер сообщения можно вводить без нулей), в монитор выводится данное сообщение (следим за контрольной суммой, чтобы понять меняются значения байт или нет).  После ввода команды Rвыводятся все сообщения.  Можем отфильтровать их по следующим данным:

1. ID-адресу.  Для этого отсылаем команду   I(номер сообщения в десятичном виде)

2. Количеству байт даты. Для этого вводим команду L(количество байт 1-8)

Лучше использовать Ардуинку Мега, т.к.  ее оперативная память в четыре раза больше, чем у всех остальных. С Мегой параметр  MEM_Xможет быть 500 и более (максимальное число сообщений, которое может запомнить кан хакер). MEM_X  200 – это максимальное значение для UNONANOMICRO. Не забываем про частоту кварца в MCP 2515, скорость шины и порта.

ПРОГА по колхозному написана,но РАБОЧАЯ – 100%!!!

 
#include <mcp_can.h>
#include <SPI.h>
 
#define MEM_X      200      // КОЛ-ВО ЯЧЕЕК ПАМЯТИ ДЛЯ СООБЩЕНИЙ 
#define SPID      CAN_100KBPS  // СКОРОСТЬ КАН-ШИНЫ
#define SER_S     115200    //скорость порта
 
 
int SUM= 0;
long unsigned int x;
long unsigned int rec[MEM_X];
long unsigned int rxId;
byte len = 0;
unsigned char rxBuf[8];
char msgString [50];                        
 
byte a;
byte b;
byte y;
byte c;
byte e;
int  n;
MCP_CAN CAN0(10);                               
 
 
void setup()
{
  Serial.begin(SER_S);
  
  a=1;
  b=1;
  y=8;
  if(CAN0.begin(MCP_ANY, SPID, MCP_8MHZ) == CAN_OK)
  {}
  CAN0.setMode(MCP_NORMAL);
  Serial.print("                                    ");
  Serial.println("------------- CAN Read ---------------");
 
  for(int i = 0; i<MEM_X ; i++)
    {
      
     rec[i]=0; 
      
      }    
}
 
void loop()
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
    
    if(rxId)
    {
    rxId=rxId & 0x1FFFFFFF; 
    if((rxId==x||a==1)&&(len==y||b==1))    //фильтра   
    {
  //--------------------------------------------------------------------------------------------------------------------    
    if(e==0)
   {
      
   for(int i = 1; i<MEM_X ; i++)
   {
    if(rxId==rec[i])
    {
     break;
      }
      if(rec[i]==0)
    {
     rec[i]=rxId;
      n=n+1;
     can_list();
     break; 
    }
    }
//---------------------------------------------------------------------------------------------------------------
    }
    else
    {
    can_list(); 
      }
    }
    
    }
  komand();
}
 
void can_list()
{
 
        sprintf(msgString, "%.3d        ID: 0x%.8lX      DLC: %1d  Data:",n, rxId , len);// 
       Serial.print(msgString  );                                          
                                                                                                                  
      SUM= 0;
      for(byte l = 0; l<len; l++){
       SUM=SUM+rxBuf[l]; 
     sprintf(msgString, " 0x%.2X", rxBuf[l]);//
      Serial.print(msgString  );   
         Serial.print("    ");
        
      }  
      Serial.print("    ");
       Serial.print("SUM=");
       Serial.print(SUM);                                              
        Serial.println();
        }
        //---------------------------------------------------------------------------------------
 void komand()
 {
   
 if(Serial.available()) 
  {    
     String val = ""; 
    val = Serial.readString();
       
  //===================================       
    if (val.indexOf("R") > -1)
    {
     a=1;
     b=1;
     
     e=1;
      } 
  //=====================================
    if (val.indexOf("L") > -1)
    {
      b=0;
      val =val.substring(1,4);
      y = val.toInt();
      Serial.print("LEN:");
     Serial.println(y);
      
      }
    //===================================  
     if (val.indexOf("I") > -1)
     {
       val =val.substring(1,17);
 x = val.toInt();
    if (x>0)
    {
     a=0; 
      }
    Serial.print("ID:"); 
    Serial.println(x);
     }
 //-------------------------------------------------------------------    
    if (val.indexOf("N") > -1)
     {
 val =val.substring(1,10);
 x = val.toInt();
 n=x;
 Serial.println(n);
 x=  rec[x]; 
 a=0;
 e=1;
     }
 
     
}  
}
Cho1s
Offline
Зарегистрирован: 26.07.2017

Добрый день.
Подскажите пожалуйста, мне нужно чтобы при получении сообщения ID 206 data 01 91 00 загорался светодиод на пине 13, а при получении ID 206 DATA 01 92 00 загорался светодиод на пине 12.
Хочу с кнопками на руле побаловаться, есть полноценный канхакер на атмеге162, ардуино уно и can-bus shield v1.1 с 16мгц кварцем, библиотека из 201 поста. Нужно ли использовать фильтр у MCP ?
Спасибо.

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

Cho1s пишет:
Добрый день. Подскажите пожалуйста, мне нужно чтобы при получении сообщения ID 206 data 01 91 00 загорался светодиод на пине 13, а при получении ID 206 DATA 01 92 00 загорался светодиод на пине 12.

и в чем проблема? Вон выше в ветке в сообщении #171 есть готовый пример чтения сообщения и проверки ID. Остается только считать данные... с чтением пары байтов и сверки их с константами сами попробуйте разобраться.

 

Cho1s
Offline
Зарегистрирован: 26.07.2017

Не могу фильтр по Id настоить срабатывает на любые сообщения

Скетч такой писал MaksVV за что ему низкий поклон

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

Cho1s пишет:

Не могу фильтр по Id настоить срабатывает на любые сообщения

Скетч такой писал MaksVV за что ему низкий поклон

ерунду какую-то пишете

В том скетче, что по вашей ссылке - строка 33

  if (canMsg.can_id==0x3E8) {

четко фильтрует по ID. какой еще фильтр вам нужен?

Или может вы код от Макса переработали по своему? - тогда выложите именно свой код

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

Он, поди, начитался про фильтры в чипе и хочет на него переложить работу обдурины.

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

sadman41 пишет:

Он, поди, начитался про фильтры в чипе и хочет на него переложить работу обдурины.

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

Тогда я бы посоветовался не выпендриваться с фильтрами и для начала сделать как проще.

Cho1s
Offline
Зарегистрирован: 26.07.2017

sadman41 пишет:

Он, поди, начитался про фильтры в чипе и хочет на него переложить работу обдурины.

я в первом сообщении как раз и спрашивал, нужно ли использовать фильтр.

 

b707 пишет:

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

Тогда я бы посоветовался не выпендриваться с фильтрами и для начала сделать как проще.

Вы правы, не в полне знаю как обращатся, поэтому и спрашиваю.. просто заливаю этот скетч, в мониторе порта пишет Enter setting mode success set rate success!! Enter Normal Mode Success!! CAN BUS Shield init ok! Begin to set Filter!! set Filter success!!, канхакером отправляю ID 206 data 00 00 00 00 (наобум), в мониторе порта  Get Data From id: 518   0x0 0x0 0x0 0x0 и на ардуине моргает светодиод. А почему он моргает сообщение ведь не подходит ?

скетч почти не переделывал

// demo: CAN-BUS Shield, receive data with interrupt mode, and set mask and filter
//
// when in interrupt mode, the data coming can't be too fast, must >20ms, or else you can use check mode
// loovee, 2014-7-8

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

// 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 = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin


unsigned char flagRecv = 0;
unsigned char len = 0;
unsigned char buf[8];


#define ledPin_4H 12
#define ledPin_4L 6
#define ledPin_4WD_CHECK 7


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

    START_INIT:

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

    attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt

    CAN.init_Filt(0, 0, 0x3E8);// аппаратный фильтр контроллера CAN, будет поступать только сообщение с ID 0x3E8

 pinMode(ledPin_4H,OUTPUT);        digitalWrite (ledPin_4H, LOW);
 pinMode(ledPin_4L,OUTPUT);        digitalWrite (ledPin_4L, LOW);
 pinMode(ledPin_4WD_CHECK,OUTPUT); digitalWrite (ledPin_4WD_CHECK, LOW);

}

void MCP2515_ISR()
{
    flagRecv = 1;
}

void loop()
{
    if(flagRecv)                   // если сообщение из CAN поступило на прерывание
    {

        flagRecv = 0;                // clear flag
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
        Serial.println("\r\n------------------------------------------------------------------");
        Serial.print("Get Data From id: ");
        Serial.println(CAN.getCanId());  // напечатаем ID CAN сообщения 

         for(int i = 0; i<len; i++)    //напечатаем все байты поля данных CAN сообщения 
        {
            Serial.print("0x");
            Serial.print(buf[i], HEX);
            Serial.print("\t");
        }
        Serial.println();

 

if (CAN.getCanId()==0x3E8) { // если поступило CAN сообщение с ID 0x3E8
        
         //все выходы ардино не активны, если байт 0х00
         if (buf[0]==0x00) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
         }
         
         //включаем ledPin_4H, если байт 0х01
         if (buf[0]==0x01) {
                  digitalWrite(ledPin_4H,HIGH);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
         }

         //включаем ledPin_4L, если байт 0х02
         if (buf[0]==0x02) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,HIGH);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
         }

         //включаем ledPin_4WD_CHECK, если байт 0х04
         if (buf[0]==0x04) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,HIGH);
         }
                           }

               

    }
}

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

 

 

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

Cho1s пишет:

скетч почти не переделывал

выложите, плиз, свой "почти не переделанный" код, а не этот скетч. В этом скетче при ID = 518 светодиоды мигать не будут, Вы что-то напутали.

Cho1s
Offline
Зарегистрирован: 26.07.2017

b707 пишет:

выложите, плиз, свой "почти не переделанный" код, а не этот скетч. В этом скетче при ID = 518 светодиоды мигать не будут, Вы что-то напутали.

Вы правы! Просто поменял пин светодиода (проверял одним, подключенным к 12 пину) и все заработало, видно UNO глючит. Потом долго мучился со скоростью (в канхакере нужно выставить вручную С34Е, а как ее выставить для ардуино и мср не знал).

Сейчас проблемма следующая, у кнопки вверх  ID 206 data 01 91 00, у кнопки вниз  ID 206 data 01 92 00, когда они отпущены  ID 206 data 00 91 00. Т.е. 1-й бит значит нажата кнопка или нет, 2-й какая кнопка была нажата, 3-й время удержания. В отпущеном состоянии сохраняется какая кнопка была нажата.

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

Спасибо!

 

// demo: CAN-BUS Shield, receive data with interrupt mode, and set mask and filter
//
// when in interrupt mode, the data coming can't be too fast, must >20ms, or else you can use check mode
// loovee, 2014-7-8

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

// 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 = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin


unsigned char flagRecv = 0;
unsigned char len = 0;
unsigned char buf[8];


#define ledPin_4H 3
#define ledPin_4L 5
#define ledPin_4WD_CHECK 8


void setup()
{
//    Serial.begin(115200);

//    START_INIT:

    if(CAN_OK == CAN.begin(CAN_95KBPS))                   // init can bus : baudrate = 500k
//    {
//        Serial.println("CAN BUS Shield init ok!");
//    }
//    else
//    {
//        Serial.println("CAN BUS Shield init fail");
//        Serial.println("Init CAN BUS Shield again");
//        delay(100);
//        goto START_INIT;
//    }

    attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt

    CAN.init_Filt(0, 0, 0x206);// аппаратный фильтр контроллера CAN, будет поступать только сообщение с ID 0x206

 pinMode(ledPin_4H,OUTPUT);        digitalWrite (ledPin_4H, LOW);
 pinMode(ledPin_4L,OUTPUT);        digitalWrite (ledPin_4L, LOW);
 pinMode(ledPin_4WD_CHECK,OUTPUT); digitalWrite (ledPin_4WD_CHECK, LOW);

}

void MCP2515_ISR()
{
    flagRecv = 1;
}

void loop()
{
   // if(flagRecv)                   // если сообщение из CAN поступило на прерывание
   // {

        flagRecv = 0;                // clear flag
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
     //   Serial.println("\r\n------------------------------------------------------------------");
     //   Serial.print("Get Data From id: ");
     //   Serial.println(CAN.getCanId(), HEX);  // напечатаем ID CAN сообщения 

     //    for(int i = 0; i<len; i++)    //напечатаем все байты поля данных CAN сообщения 
       // {
         //   Serial.print("0x");
         //   Serial.print(buf[i], HEX);
         //   Serial.print("\t");
       // }
      //  Serial.println();

 

if (CAN.getCanId()==0x206) { // если поступило CAN сообщение с ID 0x206
        
         //все выходы ардино не активны, если байт 0х00
         if (buf[0]==0x00) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
        }
         
         //включаем ledPin_4H, если байт 0х01
         if (buf[0]==0x02) {
                  digitalWrite(ledPin_4H,HIGH);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
         }

         //включаем ledPin_4L, если байт 0х02
         if (buf[0]==0x03) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,HIGH);
                  digitalWrite(ledPin_4WD_CHECK,LOW);
         }

         //включаем ledPin_4WD_CHECK, если байт 0х01
         if (buf[0]==0x01, buf[1]==0x91) {
                  digitalWrite(ledPin_4H,LOW);
                  digitalWrite(ledPin_4L,LOW);
                  digitalWrite(ledPin_4WD_CHECK,HIGH);
         }
      }

               

    }
// }

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

 

77777_777
Offline
Зарегистрирован: 22.02.2019

КАН МОДУЛЬ

#include <mcp_can.h>
#include <SPI.h>
//                                                 ПРИЁМ
//=====================================================================================================================
//                                   приём 1.
#define x 255    //ID
#define y 4      //LEN
#define z 2      //N DATA
#define f 100    //DATA
//-------------------------------------------------------------------------------------------------------------------
//                                  приём 2.
#define x1 255    //ID
#define y1 4      //LEN
#define z1 2      //N DATA
#define f1 101    //DATA
//----------------------------------------------------------------------------------------------------------------
//                                 приём 3.
#define x2 255    //ID
#define y2 4      //LEN
#define z2 2      //N DATA
#define f2 101    //DATA
//----------------------------------------------------------------------------------------------------------------
//                                приём 4.
#define x3 255    //ID
#define y3 4      //LEN
#define z3 8      //N DATA
#define f3 100    //DATA
//----------------------------------------------------------------------------------------------------------------
//                               приём 5.
#define x4 255    //ID
#define y4 4      //LEN
#define z4 8      //N DATA
#define f4 100    //DATA
//----------------------------------------------------------------------------------------------------------------
#define x5 255    //ID
#define y5 4      //LEN
#define z5 8      //N DATA
#define f5 100    //DATA
//----------------------------------------------------------------------------------------------------------------
#define x6 255    //ID
#define y6 4      //LEN
#define z6 8      //N DATA
#define f6 100    //DATA


//                                               ПЕРЕДАЧА
//=====================================================================================================================

                                            // КОМАНДА ПО 14 ВХОДУ
#define ID 255
#define FB 0 
#define LEN 8
byte sen[8]={1,2,3,4,5,6,7,8};
//-------------------------------------------------------------------------------------------------------------------
                                            // КОМАНДА ПО 15 ВХОДУ
#define ID1 1234
#define FB1 0 
#define LEN1 8
byte sen1[8]={10,28,34,47,58,66,75,80};
//-------------------------------------------------------------------------------------------------------------------
                                            // КОМАНДА ПО 16 ВХОДУ
#define ID2 255
#define FB2 0 
#define LEN2 4
byte sen2[8]={1,2,3,4,5,6,7,8};
//====================================================================================================================

#define SPID      CAN_100KBPS  // СКОРОСТЬ КАН-ШИНЫ

MCP_CAN CAN0(10);                               
long unsigned   rxId;
byte len = 0;
byte rxBuf[8];
//===================================================================================================================
int k5=5;
int k6=6;
int k7=7;
int k8=8;
int k9=9;
//
int k14=14;
int k15=15;
int k16=16;
//==================================================================================================================

void setup()
{
pinMode(k5, OUTPUT);
pinMode(k6, OUTPUT);
pinMode(k7, OUTPUT);
pinMode(k8, OUTPUT);
pinMode(k9, OUTPUT);
//
pinMode(k14, INPUT_PULLUP);
pinMode(k15, INPUT_PULLUP);
pinMode(k16, INPUT_PULLUP);



  
  Serial.begin(9600);
  
  if(CAN0.begin(MCP_ANY, SPID, MCP_8MHZ) == CAN_OK)
  {}
  CAN0.setMode(MCP_NORMAL);
  
}

void loop()
{ 
 CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
 if(rxId)
    {
    rxId=rxId & 0x1FFFFFFF;
 //==============================================================================================
       
  if((rxId==x)&&(len==y)&&(rxBuf[z-1]==f))
  {    
   // код выполняемый при появлении в шине сообщения приём 1. 
    }
  //-------------------------------------------------------------------------------------------
  else if (rxId==x1&&len==y1&&rxBuf[z1-1]==f1)
    {
     // код выполняемый при появлении в шине сообщения приём 2.
      }
   //------------------------------------------------------------------------------
    else if (rxId==x2&&len==y2&&rxBuf[z2-1]==f2) 
    {
     // код выполняемый при появлении в шине сообщения приём 3. 
      }   
  //-------------------------------------------------------------------------------------------
  else if (rxId==x3&&len==y3&&rxBuf[z3-1]==f3)
  {
   // код выполняемый при появлении в шине сообщения приём 4. 
    }
  //-------------------------------------------------------------------------------------------
  else if (rxId==x4&&len==y4&&rxBuf[z4-1]==f4)
  {
   // код выполняемый при появлении в шине сообщения приём 5. 
    }
  //-------------------------------------------------------------------------------------------
  else if (rxId==x5&&len==y5&&rxBuf[z5-1]==f5)
  {}


  //--------------------------------------------------------------------------------------------
  else if (rxId==x6&&len==y6&&rxBuf[z6-1]==f6)
  {
    
    }
     
    rxId=0;
    per();
}
}
//=============================================================================================================
void per()
{
  // КОМАНДА ПРИ АКТИВАЦИИ 14 ВХОДА   
  if (digitalRead(k14) == LOW)
  {
  delay(100);
  if (digitalRead(k14) == LOW)
{
 CAN0.sendMsgBuf(ID, FB,LEN, sen);
 }
 }
 //------------------------------------------------------------------------------------------
 //  КОМАНДА ПРИ АКТИВАЦИИ 15 ВХОДА
  else if (digitalRead(k15) == LOW)
  {
  delay(100);
  if (digitalRead(k15) == LOW)
{
 CAN0.sendMsgBuf(ID1, FB1,LEN1, sen1);
 }
 }
 //----------------------------------------------------------------------------------
 //    КОМАНДА ПРИ АКТИВАЦИИ 16 ВХОДА
  else if (digitalRead(k16) == LOW)
  {
  delay(100);
  if (digitalRead(k16) == LOW)
{
 CAN0.sendMsgBuf(ID2, FB2,LEN2, sen2);
 }
 }   
}

 

Fayton
Offline
Зарегистрирован: 10.12.2018

https://youtu.be/m-LZRsB-0pA

Вот накидал на днях... Если тема интересна могу выложить прошивку..



http://www.fayton.com.ua/img/htm3.html

offline морда

Fayton
Offline
Зарегистрирован: 10.12.2018
Cho1s
Offline
Зарегистрирован: 26.07.2017

Fayton пишет:

https://youtu.be/AZFR1FNyuGQ

 

Спасибо, уже смотрю..

П.с. со своими вопросами разобрался

Cho1s
Offline
Зарегистрирован: 26.07.2017

Fayton пишет:

https://youtu.be/AZFR1FNyuGQ

 

Спасибо, уже смотрю..

П.с. со своими вопросами разобрался

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

Fayton - а можете в двух словах пояснить - что это? А то я как-то по видео не привык учиться. мне бы лучше книжку какую

Fayton
Offline
Зарегистрирован: 10.12.2018
Fayton
Offline
Зарегистрирован: 10.12.2018

Принимаю пожелания по добавлению функционала пока в процессе разработки.

sotyi
Offline
Зарегистрирован: 05.01.2017

Fayton пишет:

Принимаю пожелания по добавлению функционала пока в процессе разработки.

Спасибо. Хорошая штука. Думаю, проблем не будет, если собрать на ESP-12 + NANO? Ну и соответственно MCP2515.

Fayton
Offline
Зарегистрирован: 10.12.2018

НОВАЯ версия CANSAN-V3

Реализован полноценный канхакер(LAWICEL) в режиме работы по USB! Только скорость сана и битность выставятся через морду..

Работает одновременно с мордой.

Добавлен вывод байт бомбера в статус.

Увеличил скорость работы.

https://drive.google.com/file/d/1UN0KiB_6-9-9GEQ0Yp_sWoz5zRxkxVSS/view?usp=sharing

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

Закажу ка и я себе ноду, раз такое дело. А по юсб с программой canhacker работает?

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

b707 пишет:

Fayton - а можете в двух словах пояснить - что это? А то я как-то по видео не привык учиться. мне бы лучше книжку какую

Я так понимаю это анализатор кан шины, аля инструмент для реверса, подобный этому , но на открытой аппаратной платформе.