Arduino UNO и MCP2515 CAN

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

Обратитесь

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

Добрый день.

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

кнопка без фиксации

Алгоритм такой. Подключили к шине, сразу отправляется canMsg1. Нажали кнопку – отправляем canMsg2. Отпустили кнопку – продолжает отправлятся canMsg2. Для того чтобы отправить canMsg1 нужно повторно нажать кнопку.

 Т.е. сразу отправляется canMsg1, нажали – canMsg2, отпустили, нажали – canMsg1.

// Алгоритм такой. Подключили к шине, сразу отправляется canMsg1
// Нажали кнопку – отправляем canMsg2, удерживаем кнопку – ничего не происходит (отправляется canMsg2). Отпустили кнопку – отправляется canMsg2.
// Для того чтобы отправить canMsg1 нужно повторно нажать кнопку.
// Т.е. сразу отправляется canMsg1, нажали – canMsg2, отпустили, нажали – canMsg1.

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

struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);

int flag=0;


void setup() {

  canMsg1.can_id  = 0x100;
  canMsg1.can_dlc = 1;
  canMsg1.data[0] = 0x10;

  
  canMsg2.can_id  = 0x100;
  canMsg2.can_dlc = 1;
  canMsg2.data[0] = 0x99;
  
  
  while (!Serial);
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("Example: Write to CAN");
}

void loop()

{ 
        
     if(digitalRead(5)==HIGH&&flag==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
       mcp2515.sendMessage(&canMsg2);    
       //digitalWrite(13,!digitalRead(13)); 
       flag=1; 
        
     } 
        
      if(digitalRead(5)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
  
        flag=0;//обнуляем переменную flag 
        mcp2515.sendMessage(&canMsg1); 
     } 
}  
//  mcp2515.sendMessage(&canMsg1);
//  mcp2515.sendMessage(&canMsg2);


 

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s - ваша проблема не в программировании, а в том что вы мысли формулировать не умеете. А когда задача нечетко сформулирована, запрограммировать ее трудно.

Почитайте себя сами - сначала пишете, что при нажатии отправляется canMsg2, потом - что canMsg1. Про удержание вообще написана какая-то чушь - "ничего не происходит, то есть отправляется canMsg2" -??? так ничего или все-таки отправляется?

Когда вы сами себя поймете - тогда и код получится.

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

согласен, некорректно написал.

просто кнопка без фиксации)

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s пишет:

 

просто кнопка без фиксации)

у такой кнопки только два состояния - нажата и отпущена. И два перехода между состояниями.

А теперь сядьте и подумайте - в какой момент какая мессадж отправляется

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

ну так, подключил ардуино к шине, сразу отправляется canMsg1. 

нажал/отпустил - вместо canMsg1 отправляется canMsg2 (и продолжает отправляться)

следующее нажал/отпустил - вместо canMsg2 отправляется canMsg1

как в этом примере со светодиодом

int flag=0; 

void setup()    
{ 
       
    pinMode(13, OUTPUT);         
      
        
} 

void loop() 

{ 
        
     if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
           
       digitalWrite(13,!digitalRead(13)); 
       flag=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        
     } 
        
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
           
        flag=0;//обнуляем переменную flag 
     } 
} 

 

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

Ардуина не обладает способностью определения момента подключения к шине. 

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

sadman41 пишет:

Ардуина не обладает способностью определения момента подключения к шине. 

это я знаю

при включении питания ардуино, сразу отправляется canMsg1

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s - увы, понятнее не стало. "Нажал/отпустил/ - это два события, в какой момент отправляем месседж? А если нажали и держим 5 минут подряд? - программист должен продумать все ситуации

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

a... теперь понял (наверно)

при включении питания ардуино, сразу отправляется canMsg1. нажали – НЕ отправляет, отпустили – отправляет canMsg2. Повторно нажали - Не отправляет, отпустили – отправляет canMsg1 

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

MaksVV пишет:
Обратитесь

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

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

Cho1s пишет:

a... теперь понял (наверно)

при включении питания ардуино, сразу отправляется canMsg1. нажали – НЕ отправляет, отпустили – отправляет canMsg2. Повторно нажали - Не отправляет, отпустили – отправляет canMsg1 


Изучить работу с библиотекой титановый велосипед и пример write из библиотеки CAN

Эльграндовод
Offline
Зарегистрирован: 24.11.2019

Как с Вами связаться  MaksVV ? Я только зарегистрировался. Требуется помощь по ардуино и штатному джойстику автомобиля. Посоветовали обратится к Вам

MaksVV
Offline
Зарегистрирован: 06.08.2015
Эльграндовод
Offline
Зарегистрирован: 24.11.2019

MaksVV пишет:

maks-vv@e1.ru

Написал в почту посмотрите

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV, привет.

Можно совсем глупый вопрос? Не могу понять, в китайском модуле на mcp2515

H- и L-CAN входы развязаны от питания и логики или нет?

Можно подключать H и L к машине, если КАН-модуль и ардуину питаешь от БП 220в?

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

 

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

Вход там идёт не на сам МСП, а на мелкий конвертер физ.среды.

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:
Вход там идёт не на сам МСП, а на мелкий конвертер физ.среды.

ну то есть можно ? - спасибо

А то я зачастую в железе нуб-нубом....

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

Такой вроде: https://static.chipdip.ru/lib/205/DOC000205042.pdf
Вообще - CAN предполагает питание модулей от разных источников (при расстоянии в сотню метров, например). По физике это как RS-485 - диффпара без обязательной земли.

От 220 мы такие не питали, но от разных БП - да. Один около трехфазного двигателя, второй в силовом щите... Не горели покашто. Но с машиной - это пусть Макс напишет, я тут нибэнимэ.

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

если БП норм качества, то можно. Но сейчас очень много в продаже говнеца. С таким БП я б лучше не стал к машине подключать. А что проблема от юсб компа запитать или от DC-DC (7805 например)?  В китайском can модуле CAN Трансивер стоит tja1050, можно почитать в даташите на что он способен, но гальваноразвязка врядли там присутствует. 

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:
Вообще - CAN предполагает питание модулей от разных источников (при расстоянии в сотню метров, например). От 220 мы такие не питали, но от разных БП - да. .

По логике развязка должна быть. От разных БП и я питал. Но там цена ошибки в крайнем случае была ардуина да модуль :) А ЭБУ в машине как-то неохота пожечь, это дорого.... :(

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

Норм - это, видимо, трансформаторный , а не импульсный ;)
На последних тут у каждого второго фейерверк при подключении к юсб.

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

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

Насчет БП понял. Но думаю,  от USB ноута, работающего от своей батарейки - должно быть безопасно?

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

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

ну какбэ это логично. В основном эти самодельные девайсы предназначены, чтобы ездить на борту машины, а там нет 220В, потому от бортсети и питаются, а если нужно стационарно CAN автомобиля потестить (в гараже например), то обычно компьютер при этом присутствует и питание от юсб берётся. 

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

b707 пишет:
Насчет БП понял. Но думаю,  от USB ноута, работающего от своей батарейки - должно быть безопасно?

да, конечно. Я много раз так делал, всё норм. 

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

UPD. Главное скорость правильную выбрать, (ну и помним что у китайского кварц 8MHz). Потому что если скорость выбрать неправильную и подключиться к шине, будет лёгкий испуг в виде новогодней елки на панели. Страшного ничего нет, но если ошибки потереть не чем, то пару чеков может и остаться, даже когда отключимся нашим мегадевайсом, гадящим в шину.  

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

UPD. Главное скорость правильную выбрать, (ну и помним что у китайского кварц 8MHz). Потому что если скорость выбрать неправильную и подключиться к шине, будет лёгкий испуг в виде новогодней елки на панели. Страшного ничего нет, но если ошибки потереть не чем, то пару чеков может и остаться, даже когда отключимся нашим мегадевайсом, гадящим в шину.  

я для начала "гадить в шину" ардуиной  :) не собираюсь. Хочу подключиться и просто послушать, что там летает. Если ничего не прочитается (читал, что в некоторых авто сообщения на диагностический разъем идут только по запросу) - то тогда попробовать "погадить" готовым OBD-2 сканером, а ардуиной почитать ответы...

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

по-моему я даже  как то все лампы зажёг, когда просто подключиться нажал CANхакером (та же ардуина+mcp+программа на ноуте), но вот только не помню был ли там выбран режим listen only ,  скорость при этом не угадал. 

А машина то какая? чаще всего моторный CAN 500кбит/с (контакты OBD 6 и 14). Низкоскоростной салонный CAN 125 кбит/с. (контакты OBD могут быть например 3 и 11, также салонный CAN иногда вообще в OBD не выводится)

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

Ну, вообще, MCP будет слать ACK на каждый принятый пакет (вернее - тот, который посчитает принятым). Так что в ответку может в шину бахнуть пару килобайт...

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

дак да, говорю ошибки будут, а вот listen only у меня чёто глючил (девайс не хотел ничего сниффить на этом режиме) и я его отключил. 

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

по-моему я даже  как то все лампы зажёг, когда просто подключиться нажал CANхакером (та же ардуина+mcp+программа на ноуте), но вот только не помню был ли там выбран режим listen only ,  скорость при этом не угадал. 

А машина то какая? 

пробовать буду на Аут ХЛ, а вообще задача читать параметры CVT на ASX-е. Инфа по PID-ам, адресу ЭБУ. расшифровке сообщений вся есть.

Хотел начать вообще без КанХакера, просто скетчем в ардуине...

MaksVV пишет:

чаще всего моторный CAN 500кбит/с (контакты OBD 6 и 14). Низкоскоростной салонный CAN 125 кбит/с

Салонная шина у Митсу 83.3, но меня она не интересует. Моторную думал пробовать 250. Но я не знал. что оно даже в режиме чтения будет гадить - тогда надо подготовится получше.

UPdate - нашел в сети, моторная 250

 

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

а не подскажите что нужно писать в программе canhacker в строке user def. чтобы подключиться к 33.333, или как считать ?

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

чаще всего это должно поддерживаться аппаратно адаптером. Например некоторые адаптеры убирают из функционала 10  и 20 кбит/с и ставят вместо них 33.3 и 83.3 . А в программе вы все также выбираете 10 и 20 соответственно. Ну и на user def вроде тоже может быть скорость аппаратно назначена какая либо. 

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

b707 пишет:
Моторную думал пробовать 250.

думаю моторная всё же 500 кбит/с. На паджеро точно могу сказать , именно такая. 

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s пишет:

а не подскажите что нужно писать в программе canhacker в строке user def. чтобы подключиться к 33.333, или как считать ?

так вроде 33.3 - это стандартная скорость для Кан-хакера, туи USER-DEF не нужен

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

у меня в списке 10 , 20, 50 , 100, 125, 250, 500 , 800, 1000

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

вот и у меня также, через мср могу подключится, а вот канхакером с sja1000, ни как не получается

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

b707 пишет:
тогда надо подготовится получше.

UPdate - нашел в сети, моторная 250

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

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

Cho1s пишет:

вот и у меня также, через мср могу подключится, а вот канхакером с sja1000, ни как не получается

на адаптерах от Артема из Новосиба

http://can.web-box.ru/work_with_can/gmlan-opel/  33.3 выбирать в программе как 10 кбит/с

https://www.youtube.com/watch?v=9LiGgevHuWs  83.3  выбирать в программе как 20 кбит/с

на адаптере SJA1000 возможно нужно выбрать usr def и в активном окне написать  33FE (для скорости 33,3), а для 83,3 соответственно 83FE

 

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

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

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s пишет:

вот и у меня также, через мср могу подключится, а вот канхакером с sja1000, ни как не получается

Параметр UserDef в кан-хакере - это значение регистров BTR0 и BTR1 для SJA1000. Там довольно замудрено считается, это подробно описано в разделе 6.5 даташита. Например, 83FE - это 83.3кбс для частоты контроллера 16 МГц

попробовал по даташиту прикинуть для 33,3кбс  - UserDef получается 89FE

 

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

вот ещё   скорее всего ваш адаптер 

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

на адаптере SJA1000 возможно нужно выбрать usr def и в активном окне написать  33FE (для скорости 33,3), а для 83,3 соответственно 83FE

Не Макс, там сильно сложнее. как считать - описано в разд 6,5 даташита на SJA1000

А то что "83FE" похоже на 83.3 - это чисто случайно:)

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

ага, уже понял. пост не могу поправить

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

ага, уже понял. пост не могу поправить

сорри, это потому что я цитировал :(

Для одной и той же частоты можно придумать несколько значений UserDef. Напримепр, для 33,3 в дополнение к 89FE можно еще попробовать 5D14 - это тоже должно давать 33,3

b707
Онлайн
Зарегистрирован: 26.05.2017

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

сорри за ламерские вопросы - я программу пока не видел

просто подумалось - то, что кан-хакер не работает со скоростью 83,3 на mcp2515 8MHz - может это связно с тем, что народ вводит параметр 83FE - а ведь для 8МГц тут значение будет другое

 

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

MaksVV пишет:

вот ещё   скорее всего ваш адаптер 

да, именно он. не работает ни 89FE, ни 5D14, спасибо за подсказки, завтра буду курить даташит. сам подсчитывать пробовал, но не смог разобраться как это делается....

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s пишет:

да, именно он. не работает ни 89FE, ни 5D14, спасибо за подсказки, завтра буду курить даташит. сам подсчитывать пробовал, но не смог разобраться как это делается....

это параметры для работы адаптера на 16 МГц, может у вас другая частота?

Вообще, если автор пишет, что 4В14 для 83,3 работает, то и 5D14 для 33.3 должно...

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

да нет, специально смотрел что кварц на 16мгц стоит, завтра на машине еще раз перепроверю

для скорости 95.2 ввожу С34Е

b707
Онлайн
Зарегистрирован: 26.05.2017

Cho1s пишет:

для скорости 95.2 ввожу С34Е

все так, С34Е = делитель частоты 8, длина фрейма одного бита 21

16 МГц / (21 * 8) =  95,23 КГц

не знаю, почему 89FE не работает... делитель 20, фрейм 24

16 МГц / (20*24) = 33,3 КГц

 

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

Для дробных и/или нестандартных скоростей действительно лучше кварц на 16 перепаять. А то библиотеки возможно криво для 8мгц скорость рассчитывают. Как было тут