arduino mega rs-485
- Войдите на сайт для отправки комментариев
Ср, 13/10/2021 - 22:47
Пытаюсь связать между собой ардуино нано и ардуино мега посредством модуля rs845 ,начал с того что использовал вместо меги нано и все работало отлично,использовал
softwareSerial.h, на уно все получается, вычитал что на меге только определенные могу использоваться под RX вывод , все сделал как надо но все равно не получается , даже с аппаратного вывода пытаюсь получить значения но результата тоже ноль
#include <Arduino.h> #include <SoftwareSerial.h> #define DIR 8 SoftwareSerial RS485(50,51); void setup() { Serial.begin(9600); Serial1.begin(9600); RS485.begin(9600); pinMode(DIR,OUTPUT); digitalWrite(DIR,LOW); } void loop() { if (RS485.available()) { Serial.write(RS485.read()); } if (Serial1.available()) { Serial.write(Serial1.read()); } }
А какой смысл использовать на Меге SoftwareSerial?
В дальнейшем таких нано на по rs485 будет больше,да и мне кажется программно реализовать легче,просто проблема не в softwareserial
Hotfatboy, пишете прочитали, что на меге можно использовать только определенные пины - а используете все равно какие попало?
И я так и не понял, нафига вам софтсериал при наличии 4х аппаратных? Скучно? Приключений хочется?
«На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).» отсюда я сделал вывод что 50 и 51 пин можно использовать под rx tx (это по поводу того что использовал какие попало) ок,ладно , допустим нельзя использовать софтсериал на меге,что я тогда сделал неправильно в данном случае инициализируя serial1 и используя 18 и 19 пин?
Всё нормально. Должно работать при правильном подключении. И правильной инициализации. Надо 485 сказать что используется сериал 1. А вот софт сериал может использовать только один одномоментно. Поэтому много софт сериалов использовать не получится одновременно.
Я ещё предполагаю что в моем коде конфликтуют выводы serial и serial1. А по поводу подключения я и так и наоборот пробовал и результата не было,
Я ещё предполагаю что в моем коде конфликтуют выводы serial и serial1
а зачем в этом коде Сериал1?
Он же вообще не используется?
Я пробовал разные варианты =)
я просто делал следующее : залил сей скетч, проверил есть ли какой-то сигнал на программном решении,там ничего нет,отключил питание воткнул в 18 и 19 пины включил питание проверил ,и там тоже пусто (даже местами менял ,интереса ради) результата все так же не было
Где говориться, какой сериал использует 485? К тому же по умолчанию 485 работает на приём и передать через него без переключения на передачу невозможно. Просто вывод в сериал работает всегда можно проинициировать все сериалы и убедиться что все работают.
Да у него вообще не используется рс485
Тс , выложенный вами код - это прос о мост между двумя сериал. К 485 это не имеет ни малейшего отношения. Я не понимаю, как вы этим кодом собрались чи ать какие-то регистры? Будете набирать запросы вручную?
Изложите подробнее, что вы пытаетесь сделать и к чему тут этот код.
Ну так он инициализирует 2 сериала. Соединить их и смотреть что куда бегает.
Я хочу связать между собой Мега и нано средствами преобразователя MAX485 RS-485 TTL , вот я и создаю (пытаюсь) с помощью softwareserial связать мегу и этот модуль ,потому что ставя вместо меги уно - так все работает
Не может такого быть. Что уно что мега один и тот же скетч для хард сериала должен работать одинаково. Для меги только Rx имеет ограничения на ноги для софт сериала , их уже перечислили. И нужно помнить какой из сериалов подключён к USB.
Я хочу связать между собой Мега и нано средствами преобразователя MAX485 RS-485 TTL , вот я и создаю (пытаюсь) с помощью softwareserial связать мегу и этот модуль ,потому что ставя вместо меги уно - так все работает
Похоже, вы где-то заблудились в трех соснах. Разберитесь, как работает Сериал. Никакой разницы между использованием Сериала на Уно и Меге нет.
Так вот затем чтоб разобраться и я написал сюда) я понимаю что принцип один и тот же но почему-то не получается ,затем я и написал( но стоит отметить но на нано и уно микроконтроллер один,а на меге - другой)
Так вот затем чтоб разобраться и я написал сюда) я понимаю что принцип один и тот же но почему-то не получается ,затем я и написал( но стоит отметить но на нано и уно микроконтроллер один,а на меге - другой)
Давайте по порядку. Будем обсуждать код из заглавного сообщения или какой-то другой?
Тот что я выложил конечно
Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.
Ок
Вот смотрите на строчки в ЛУП.
В строке 23 вы читаете все, что пришло с Софтового Сериал - и в стр 25 перебрасываете в консоль Ардуино. В строчках 27 29 вы точно так же все, что пришло с Сериал1 - опять же перебрасываете в консоль. правильно?
Вы чего этим добиться то хотели? Что у вас на софтовом Сериале и что на Сериал1?
Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.
да вся тема полный бред. Человек сам не знает, чего хочет.
А я ещё раз отвечаю что просто хотел проверить работает ли хоть один из них ,у меня нет цели чтоб они друг с другом сообщались мне нужно просто взять данные с портов serial1 или с того что я указал в softwareserial и просто дальше с ними работать , я знаю что я хочу , если бы он мне в аппаратный serial1 что-то передал я бы вывел его на экран вот этой командой
if
(Serial1.available())
28
{
29
Serial
.write(Serial1.read());
30
}
Но он же ничего не выдаёт
Этой командой на экран не вывести.
Извините, но тогда какой?
А на какой экран? Если на монитор то сериал. Тот через который плата к компу подключена.
if
(Serial1.available())
28
{
29
Serial
.write(Serial1.read());
30
}
этой командой я хочу вывести значение принимаемое с serial1 на монитор пк , я что-то сделал неправильно ?
Ну а с какой стати он станет что посылать вам? Для этого сначала надо правильный запрос послать. Но вы же ничего не отсылаете.
Вы написали код, который ничего не посылает, а только ждет посылок... А потом сидите и молчите ...втроем.
данный код залит в нано , и мега уже должна принять данные и дальше с ними дела делать, вместо меги я ствил уно и все работало, на меге почему-то не получается
С одной стороны 4800, а с другой 9600?
Здесь отправка по 485. Как это работает я не понимаю. Отправка занимает минимум 8 мс, а в программе отключение передачи происходит даже раньше конца первого символа.
Ещё раз повторю. Для проверки меги не надо другой платы. Заинициализируйте два сериала - тот который связан с компом и тот который хотите проверить. На проверяемом соедините Rx-Tx. Отправьте из монитора что либо, в программе дождитесь прихода из сериала, отправьте в проверяемый сериал, дождитесь прихода символа в проверяемом и отправьте в связанный с компом. В монитор должно прийти то что было отправлено. Если получилось, то Rx Tx можно соединить с другой платой и на ней организовать петлю отправки символов. Если соединено правильно и петля работает, то в мониторе тоже должно быть то что отправляли. Потом можно вставить 485 платы, добавить управление направлением передачи и попробовать. Здесь возможно потребуется подобрать задержку переключения несколько мс перед переключением на приём, что бы всё работало штатно.
Проверять так можно и хардовые и софтверные сериальные порты.
да я знаю но почему-то это работает
А я бы задумался на этом этапе - почему работает.
да я знаю но почему-то это работает
идиотизмом то не занимайтесь. Поставьте с обоих сторон одинаковую скорость
Сериалы независимы и не связаны. Скорость может быть любой, до тех пор пока буфер для более низкой скорости не переполняется от длинных посылок. А так вообще жизненная ситуация - разное оборудование с разными скоростями на разные порты одного МК.
nik182 вы неправильно поняли. В данном контексте скорость должна быть одна и та же. ТС уберите вообще Трансиверы 485 и соедините просто уарты тх и рх и проверьте будут ли показывать ваши сериалы. Если нет видимо в HBO челобитную писать придется
я сделал все как вы написали, установил перемычку между rx tx serial1 и использовал вот такой луп
все получилось ,далее я подключил модуль rs485 (вот такой если что https://market.yandex.ru/product--modul-ttl-uart-v-rs485-max485/1401541489?clid=1603&utm_source=google&utm_medium=search&utm_campaign=gp_offer_smart_shgb_nca_search_rus&utm_term=17418380%7C101392757882&utm_content=cid%3A12698263901%7Cgid%3A129096406948%7Caid%3A512774273892%7Cph%3Apla-1264653350544%7Cpt%3A%7Cpn%3A%7Csrc%3A%7Cst%3Au&sku=101392757882&cpa=1 ) и все так же хорошо получалось, потом я соответственно закоментил первый if (потому что мне нужен только прием с данного модуля и в ответ снова тишина ( скорости я выставил одинаковые).
Если закомментировать первый if то откуда будет браться символ для передачи? Конечно будет молчёк. Путь символа РС -> Rx -> Tх1 -> 485 приём -> 485 передача -> RX1 -> Tx -> PC. При этом первый 485 настроен на приём, второй на передачу. Теперь если второй 485 подключить к нане к софтсериалу - но обязательно скорости наны и меги должны быть одинаковыми - и выдавать наной раз в секунду строку значения миллис, то в мониторе увидим значение миллис раз в секунду. Путь строки -> нана Tx -> 485 передача -> 485 приём -> Rx1 -> Tx -> PC. Будет только приём мегой.
не знаю почему софт на меге не работал, а вот кстати хард сериал1 мог не работать , из за того что китайцы иногда на плате шелкографию путают, а может и дорожки . вот две фото для размышления
спасибо за версию, но я уже выше уже проверил данный порт ,с ним все в порядке
Если закомментировать первый if то откуда будет браться символ для передачи?
так нано посылает значение millis() и делает это с задержкой каждую секунду, а мега находится в непрерывном состоянии приемника
Вы имеете ввиду, что можно в этой цепи просто не подключать нано а использовать ее для кольцевания сигнала ,как бы?
MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги
и все так же хорошо получалось, потом я соответственно закоментил первый if (потому что мне нужен только прием с данного модуля и в ответ снова тишина ( скорости я выставил одинаковые).
Этом описании нет ни слова про нану. Не надо было ничего коментить. Просто надо было к первой плате 485 вместо Tx1 подключить Tx вывод софт сериала наны Rx можно не трогать. Если до этого всё передавалось через Тх1 , то и при подключении наны должно передаваться. Для исключения всяких прочих непоняток входы управлением передачи должны намертво подключены к земле и питанию для 485 так, что бы обеспечить прохождение сигнала.
nik182
а Вы можете это как-то схемой изобразить? Просто я совсем не могу понять что тут к чему
MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги
я ничего не подсчитывал. просто фото разместил. если на китайской правильно, значит на ори по вашему перепутано? на этих двух фото по разному подписан пин 18 и 19
nik182
а Вы можете это как-то схемой изобразить? Просто я совсем не могу понять что тут к чему
Может оно и не надо? Я ж всё разжевал. Если после всего этого нет понимания, то я вообще не представляю как донести. Рисовать я точно ничего не буду. Это Вам надо нарисовать по моим словам схему и представить её на обсуждение. На ней должны быть РС, мега, два 485 и нана. И только ноги, которые используются и все соединения - про управляющие 485 не забывать. И не плохо бы было нарисовать направление передачи символов. Для Вашего же понимания.
MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги
я ничего не подсчитывал. просто фото разместил. если на китайской правильно, значит на ори по вашему перепутано? на этих двух фото по разному подписан пин 18 и 19
Это Вы запутали SAB тем, что на китайской плате обвели 19-ю дырку вместе с подписью к 18-й. Внимательнее надо быть, когда рисуете что-то от руки.
я внимательно прочел комментарий 41 и смог придумать только такую схему? не думаю что это то что Вы имели ввиду , так что надеюсь поправите
Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.
Дико извиняюсь... Чем ограничено количество устройств ?
Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.
Дико извиняюсь... Чем ограничено количество устройств ?
смею предположить , что разрядностью системы, адрес каждого устройства представлен в виде восьмибитового значения, а значит количество уникальных комбинаций равно 256,только ,опять таки лишь предполагаю, тут ошибка не 256 а 255 адресов, нулевой еще , скорее всего
485 должно быть 2 модуля. Где?
Вот у меня сейчас точно по этой картинке все и подключено ,с той лишь разницей что на нано к софтсериал портам подключил (d6,d7) а так все тоже самое, и ещё одно уточнение ,на меге у меня к 485 подключено в разъём re (режим передатчика) и установлено значение LOW,в принципе все правильно ?