Arduino DUE и MCP2515
- Войдите на сайт для отправки комментариев
Всем доброго времени суток!!! В общем расскажу с самого начала, строил свой проект на 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!!!
В общем все заработало. Решил вывести все в монитор ком порта, добавил в блок void setup() соответствующие строчки Serial.begin(115200); и на удивление обе кан шины заработали.
почему так не понятно мне. возможно обусловлено библиотекой.
В общем все заработало. Решил вывести все в монитор ком порта, добавил в блок void setup() соответствующие строчки Serial.begin(115200); и на удивление обе кан шины заработали.
почему так не понятно мне. возможно обусловлено библиотекой.
скорее всего да
у дуе есть свой встроенный кан контроллер. (т.е. для реализации CAN шины нужен только трансивер типа tja1050 или mcp 2551). можно для интереса с ним еще поиграться. это так, на будущее. Жалко, что аддон DUE на ардуино ИДЕ вроде CAN не поддерживает, т.е. из коробки не получится.
Да я читал даташит и о том что в Cortex M3 есть встроенный CAN, причем два штуки, это удобно. на неделе куплю Can трансиверы, попробую с ними запустить свой проект. Но сейчас все прекрасно работает и на MCP2515. Особенно радует что DUE работает в несколько потоков, теперь исходящие пакеты идут стабильно каждый в свое время)))
НО вот вновь нужна ваша помощь MaksVV!!!
Так как сменил платформу и библиотеки, соответственно мне пришлось менять весь скетч, в основных моментах кнопки энкодеры итд и сами посылки сообщений в Can я смог разобраться и переделать. но вот тот пример который вы для меня делали в другой ветке про UNO, я ни как переделать не могу, и из примеров новой библиотеки тоже ни чего не выходит(((
MaksVV, не могли бы вы еще раз выручить и помочь мне?
это скетч который вы ранее делали для меня
вот скетч который сейчас работает с библиотекой "CAN-BUS Shield by Seeed Studio" для работы Can шины
вот в него бы добавить ваш пример)))
MaksVV огромное спасибо, не знаю даже как благодарит!!! Буду пробовать. Но посмотрев скетч понял как это все сложно для меня и что нужно все дела бросать и больше времени уделять изучению языка программирования)))
че там сложного то? я в твой скетч добавил сдвиг на твои таймеры, чтобы раз в 100мс в разное время происходило, а то как ты сделал, можно было и один таймер задать и все три сообщения сразу в шину слать, все равно они почти в одно время у тебя выполнялись. Ну и добавил чтение шины.
Так я понимаю что сложного то и нет ни чего))) только я в программировании не понимаю ни чего) только по примерам и то самым элементарным) в электронике худо бедно ещё могу что то) а в программирование нужно срочно учить матчасть!!! Вот только некогда этого делать, в основном по ночам пытаюсь читать, и в итоге все что прочитал все впустую))
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(((
А у вас с ним библиотеки разные.
Нужно открыть пример read из твоей библиотеки и посмотреть какой функцией шина читается
в примерах есть
receive_check
receive_Blink
я так понимаю это и есть примеры read
Спасибо!!! сейчас канхакер обновлю и буду пробовать)
Вчера в магазине нашел классную кнопочку под этот проект, с пиктограммой вкл на ней, а она оказалась с фиксацией, те коснулся она по сигнальному проводу подает все время high, второй раз коснулся все время low, а нужна была без фиксации((( придется ее разбирать и переделывать(((
Вчера в магазине нашел классную кнопочку под этот проект
забыл написать СЕНСОРНУЮ КНОПКУ)))
MaksVV, в общем работает твой скетч как всегда просто супер!!!
вопрос один остался по сдвигам таймеров. строка 48 и 49 там значения указаны 133 и 167. я правильно понял что это миллисекунды указаны? и если да, то их выставлять можно произвольно или как то рассчитывать? так как мне еще нужно будет добавлять таймеры.
да это миллисекунды. по таймерам представь, если ты хочешь разделить отправку по времени, допустим у тебя три сообщения раз в 100мс. если ты сдвиг назначишь 200, то у тебя в итоге оно наложится на первое, которое без сдвига было.
если у тебя все будут раз в 100 мс, сдвиги делаешь разные между 110 и 190 включительно с шагом в 10 мс, (если меньше 10мс, то можно и вообще без сдвига тогда)
Ок, понял. Таймеров всего будет пять не более.
@son32 поделитесь схемой подключения и настройками библиотек )
Я совсем новичок в Arduino,
Тоже взял DUE и MCP2515 и оно совсем не заводится :(
CAN.begin всегда с ошибкой
Вы кварцы на 16MHz ставили или так и работает с 8MHz?
Спасибо
Схема подключения следующая.
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.
Я так понимаю у вас при компиляции ошибка выходит, если так то кварц и подключение модуля ни как на это не влияет, так как в Ардуино можно рабочий скетч загрузить без подключенного модуля. что бы понимать что не так покажите свой скетч в сообщении.
Нет, у меня с компиляцией всё в порядке было. Я просто не так всё понял в схеме подключения и насоединял бог весть что.
Ещё раз посмотрел pinout и всё завелось. ))) Правда пока на Mega, чуть позже попробую на Due
А как вы подключаете несколько шилдов одновременно? Все контакты паралельно и только CS меняется на D10, D9 и тп?
Да все верно все паралельно кроме CS, они подключаются к разным пинам и после мы их прописываем в скетче.
С 8 МГц врядли заработает, что то не видно, где в библиотеке это настраивается
Я взял форк библиотеки сделанный под 8MHz конечно.
Там в параметрах .begin есть частота кварца, помимо скорости.
Есть смысл перепаивать кварц если и так всё работает? 16MHz кроме большего набора скоростей передачи, что-то даёт?
В моём проекте 100 и 500 кбит.
если нашел библиотеку под 8 МГц , то конечно можно не перепаивать
С 8 МГц врядли заработает, что то не видно, где в библиотеке это настраивается
Возможно я не прав, но вроде в строке CAN.begin(CAN_500KBPS); в скобках после указания скорости можно указать/дописать частоту кварца, наверное что то типо того CAN.begin(CAN_500KBPS, MCP_8MHZ); в файле mcp_can.cpp библиотеки вроде есть записи настроек скорость и частоты кварца.
Вроде есть такой параметр теперь в и https://github.com/Seeed-Studio/CAN_BUS_Shield/blob/7d41ceb28a4f92b0b8b4...
Честно говоря я в этом не силен. Если из примеров делаю, то получается, за что и отдельное спасибо MaksVV, если сам то 50Х50 выходит))
MaksVV, son32 проблема с компиляцией в DUE ваших скретчей дляMCP2515. Ничего не помогает , хотя всякие блинки встают и не только.Ваши файлы ни в какую.Красным пишет ошибку.У вас может какие-то ответы есть ? Железо или я криворук ..
Разве железо виновато в том, что для Вас имеет смысл цвет ошибки, а не её текст?
Сложно судить по таким симптомам, здесь наверное все зависит от расположения звёзд))) шучу))) с железом секретов ни каких, скетч из 13 сообщения компилируется и работает на ура 100%. Скетч из 5го сообщения, да при компиляции даёт ошибку, почитайте внимательно все сообщения, и покажите скетч который вы пытаетесь скомпилировать.
Вот такая картина.
МСР 2515 не был установлен
son32 Это ответ программы на скетч из 13-го сообщения
Да, понимаю... Я абсолютно не водитель, просто купил машину чтобы ездить. Почему меня штрафуют, когда я поперек дороги еду?
Alex70, у вас в низу программы IDE белым шрифтом по черному фону написана ваша проблема!!! Установите библиотеку, какую именно нужно написано в сообщениях данной темы!!!
Библиотеку нужно установить Seeeduino CAN-BUS!!! У вас теперь красным по черному написано no such file or directory (в переводе Данный файл или каталог отсутствует). Реально из серии почему меня кусает алабай!!!
Только сейчас задумался над вопросом. Alex70 вам сколько лет? (Ну так просто интересно).
70
Про возраст вопрос для того что бы понимать как дальше отвечать вам, и только))) а вдруг не 70 а 7?
Если вы только пять дней играете с ардуино, то начните с того что изучите мат часть. Что такое скетч, что такое библиотека, что такое IDE и как с ним работать, почитайте разделы для новичков. А так вы просто в ветке просите научите меня я ни чего не умею, тем самым мы с вами разводим просто флуд. И вообще у вас точно arduino DUE а не mega, и есть ли модуль MCP2515, и что именно вы собрались собирать, для чего вам этот скетч? Просто из ответа складывается впечатление что вы просто хотите скомпилировать скетч, и все на этом. Я тоже не спец в ардуино, точнее мне тяжело даётся написание программных кодов/скетчей.
Просто вам реально два раза было написано установить библиотеку, а вы игнорируете это. Как устанавливать библиотеки и новые платы? Гугл в помощь. Разъяснять здесь бессмысленно.
MaksVV, нужно ваше мнение!!! В тот пример что вы для меня сделали я добавлю еще один MCP2515, то есть будет еще одна шина только на скорости 250KBPS, несколько кнопок, энокодеров, и джойстик. при использовании которых будет происходить изменение тех или иных байтов в передоваемых пакетах. так вот Arduino DUE по сути брал из-за библиотеки Scheduler, если я правильно понял при помощи этой библиотеки контроллер может работать в несколько потоков, то есть в скетче мы можем прописать несколько void loop которые будут работать параллельно друг от другу. Так вот вопрос такой. Имеет ли смысл использовать эту библиотеку Scheduler, или просто все сделать на таймерах со сдвигами?
Параллельно на одноядерном МК ничего не может работать в принципе.
ну согласно описания)
Платформы Arduino с ядром Cortex-M0+ и Cortex-M3 позволяют выполнять несколько задач одновременно — микрокотроллер просто переключается с одной задачи на другую. Для многопоточного программирования пригодится библиотека Scheduler, которая включает в себя функции управление между задачами.
Настроим несколько функций для одновременно выполнения с loop(). По итогу на выходе будет несколько независмых loop-функций, не требующих отдельного таймера.
Платформы Arduino с ядром Cortex-M0+ и Cortex-M3 позволяют выполнять несколько задач одновременно — микрокотроллер просто переключается с одной задачи на другую.
Так "переключаясь" или "одновременно" ? :)))
Выполнять несколько задач, переключаясь между ними - можно на любом контроллере без всяких шедулеров.
Про кортекс ничего не знаю, кроме как то, что на нём у меня андроид в медиаплеере крутится. Действительно - там какая-то кооперативность есть.
son32, покажите скетч на меге 2560, где у вас появились проблемы с задержками при работе с CAN.
А у ESP два ядра и если wifi не использовать то можно честную параллельную работу устроить.