arduino mega rs-485

hotfatboy
Offline
Зарегистрирован: 13.10.2021
Пытаюсь связать между собой ардуино нано и ардуино мега посредством модуля 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());
  }
  
  
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А какой смысл использовать на Меге SoftwareSerial?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

В дальнейшем таких нано на по rs485 будет больше,да и мне кажется программно реализовать легче,просто проблема не в softwareserial

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

Hotfatboy, пишете прочитали, что на меге можно использовать только определенные пины - а используете все равно какие попало?
И я так и не понял, нафига вам софтсериал при наличии 4х аппаратных? Скучно? Приключений хочется?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

«На платах 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 пин?

nik182
Offline
Зарегистрирован: 04.05.2015

Всё нормально. Должно работать при правильном подключении. И правильной инициализации. Надо 485 сказать что используется сериал 1. А вот софт сериал может использовать только один одномоментно. Поэтому много софт сериалов использовать не получится одновременно.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Я ещё предполагаю что в моем коде конфликтуют выводы serial и serial1. А по поводу подключения я и так и наоборот пробовал и результата не было,

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

hotfatboy пишет:

Я ещё предполагаю что в моем коде конфликтуют выводы serial и serial1


а зачем в этом коде Сериал1?
Он же вообще не используется?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Я пробовал разные варианты =)

я просто делал следующее : залил сей скетч, проверил есть ли какой-то сигнал на программном решении,там ничего нет,отключил питание воткнул в 18 и 19 пины включил питание проверил ,и там тоже пусто (даже местами менял ,интереса ради) результата все так же не было 

nik182
Offline
Зарегистрирован: 04.05.2015

Где говориться, какой сериал использует 485? К тому же по умолчанию 485 работает на приём и передать через него без переключения на передачу невозможно. Просто вывод в сериал работает всегда можно проинициировать все сериалы и убедиться что все работают.

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

nik182 пишет:
Где говориться, какой сериал использует 485? К тому же по умолчанию 485 работает на приём и передать через него без переключения на передачу невозможно. Просто вывод в сериал работает всегда можно проинициировать все сериалы и убедиться что все работают.

Да у него вообще не используется рс485
Тс , выложенный вами код - это прос о мост между двумя сериал. К 485 это не имеет ни малейшего отношения. Я не понимаю, как вы этим кодом собрались чи ать какие-то регистры? Будете набирать запросы вручную?
Изложите подробнее, что вы пытаетесь сделать и к чему тут этот код.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так он инициализирует 2 сериала. Соединить их и смотреть что куда бегает.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Я хочу связать между собой Мега и нано средствами преобразователя MAX485 RS-485 TTL , вот я и создаю (пытаюсь) с помощью softwareserial связать мегу и этот модуль ,потому что ставя вместо меги уно - так все работает 

nik182
Offline
Зарегистрирован: 04.05.2015

Не может такого быть. Что уно что мега один и тот же скетч для хард сериала должен работать одинаково. Для меги только Rx имеет ограничения на ноги для софт сериала , их уже перечислили. И нужно помнить какой из сериалов подключён к USB.

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

hotfatboy пишет:

Я хочу связать между собой Мега и нано средствами преобразователя MAX485 RS-485 TTL , вот я и создаю (пытаюсь) с помощью softwareserial связать мегу и этот модуль ,потому что ставя вместо меги уно - так все работает 

Похоже, вы где-то заблудились в трех соснах. Разберитесь, как работает Сериал. Никакой разницы между использованием Сериала на Уно и Меге нет.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Так вот затем чтоб разобраться и я написал сюда) я понимаю что принцип один и тот же но почему-то не получается ,затем я и написал( но стоит отметить но на нано и уно микроконтроллер один,а на меге - другой)

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

hotfatboy пишет:

Так вот затем чтоб разобраться и я написал сюда) я понимаю что принцип один и тот же но почему-то не получается ,затем я и написал( но стоит отметить но на нано и уно микроконтроллер один,а на меге - другой)

Давайте по порядку. Будем обсуждать код из заглавного сообщения или какой-то другой?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Тот что я выложил конечно 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.

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

Ок

Вот смотрите на строчки в ЛУП.

В строке 23 вы читаете все, что пришло с Софтового Сериал - и в стр 25  перебрасываете в консоль Ардуино. В строчках 27 29 вы точно так же все, что пришло с Сериал1 - опять же перебрасываете в консоль.  правильно?

Вы чего этим добиться то хотели? Что у вас на софтовом Сериале и что на Сериал1?

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

mykaida пишет:

Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.

да вся тема полный бред. Человек сам не знает, чего хочет.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

А я ещё раз отвечаю что просто хотел проверить работает ли хоть один из них ,у меня нет цели чтоб они друг с другом сообщались мне нужно просто взять данные с портов serial1 или с того что я указал в softwareserial и просто дальше с ними работать , я знаю что я хочу , если бы он мне в аппаратный serial1 что-то передал я бы вывел его на экран вот этой командой 

 

if (Serial1.available())
28   {
29     Serial.write(Serial1.read());
30   }

Но он же ничего не выдаёт 

nik182
Offline
Зарегистрирован: 04.05.2015

Этой командой на экран не вывести. 

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Извините, но тогда какой?

nik182
Offline
Зарегистрирован: 04.05.2015

А на какой экран? Если на монитор то сериал. Тот через который плата к компу подключена.

hotfatboy
Offline
Зарегистрирован: 13.10.2021
if (Serial1.available())
28   {
29     Serial.write(Serial1.read());
30

  }

этой командой я хочу вывести значение принимаемое с serial1 на монитор пк , я что-то сделал неправильно ?
 

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

Ну а с какой стати он станет что посылать вам? Для этого сначала надо правильный запрос послать. Но вы же ничего не отсылаете.
Вы написали код, который ничего не посылает, а только ждет посылок... А потом сидите и молчите ...втроем.

hotfatboy
Offline
Зарегистрирован: 13.10.2021
#include <Arduino.h>
#include <SoftwareSerial.h>
#define DIR 8
SoftwareSerial RS485 (7, 6); // (RX,TX)
//  ro - RX
//  di - TX

void setup() {
Serial.begin(9600);
RS485.begin(4800);
pinMode(DIR,OUTPUT);
digitalWrite(DIR,LOW);
}

void loop() {
  digitalWrite(DIR,HIGH);
 
  RS485.println(millis());
 
  digitalWrite(DIR,LOW);
  delay(2000);
}

данный код залит в нано , и мега уже должна принять данные и дальше с ними дела делать, вместо меги я ствил уно и все работало, на меге почему-то не получается

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

С одной стороны 4800, а с другой 9600?

nik182
Offline
Зарегистрирован: 04.05.2015

Здесь отправка по 485. Как это работает я не понимаю. Отправка занимает минимум 8 мс, а в программе отключение передачи происходит даже раньше конца первого символа. 

Ещё раз повторю. Для проверки меги не надо другой платы. Заинициализируйте два сериала - тот который связан с компом и тот который хотите проверить. На проверяемом соедините Rx-Tx. Отправьте из монитора что либо, в программе дождитесь прихода из сериала, отправьте в проверяемый сериал, дождитесь прихода символа в проверяемом и отправьте в связанный с компом. В монитор должно прийти то что было отправлено. Если получилось, то Rx Tx можно соединить с другой платой и на ней организовать петлю отправки символов. Если соединено правильно и петля работает, то в мониторе тоже должно быть то что отправляли. Потом можно вставить 485 платы, добавить управление направлением передачи и попробовать. Здесь возможно потребуется подобрать задержку переключения несколько мс перед переключением на приём, что бы всё работало штатно.

Проверять так можно и хардовые и софтверные сериальные порты.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

sadman41 пишет:
С одной стороны 4800, а с другой 9600?

да я знаю но почему-то это работает 

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

А я бы задумался на этом этапе - почему работает.

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

hotfatboy пишет:

sadman41 пишет:
С одной стороны 4800, а с другой 9600?

да я знаю но почему-то это работает 

идиотизмом то не занимайтесь. Поставьте с обоих сторон одинаковую скорость

nik182
Offline
Зарегистрирован: 04.05.2015

Сериалы независимы и не связаны. Скорость может быть любой, до тех пор пока буфер для более низкой скорости не переполняется от длинных посылок. А так вообще жизненная ситуация - разное оборудование с разными скоростями на разные порты одного МК.

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

nik182 вы неправильно поняли. В данном контексте скорость должна быть одна и та же. ТС уберите вообще Трансиверы 485 и соедините просто уарты тх и рх и проверьте будут ли показывать ваши сериалы. Если нет видимо в HBO челобитную писать придется

hotfatboy
Offline
Зарегистрирован: 13.10.2021

я сделал все как вы написали, установил перемычку между rx tx serial1 и использовал вот такой луп

 

void loop()
{
  // передаю serial-->serial1
  if (Serial.available())
  {
    Serial1.write(Serial.read());
  }
  // передаю serial1-->serial
  if (Serial1.available())
  {
    Serial.write(Serial1.read());
  }
 
 
}

все получилось ,далее я подключил модуль 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 (потому что мне нужен только прием с данного модуля и в ответ снова тишина ( скорости я выставил одинаковые).

 

nik182
Offline
Зарегистрирован: 04.05.2015

Если закомментировать первый if то откуда будет браться символ для передачи? Конечно будет молчёк. Путь символа РС -> Rx -> Tх1 -> 485 приём -> 485 передача -> RX1 -> Tx -> PC. При этом первый 485 настроен на приём, второй на передачу. Теперь если второй 485 подключить к нане к софтсериалу - но обязательно скорости наны и меги должны быть одинаковыми - и выдавать наной раз в секунду строку значения миллис, то в мониторе увидим значение миллис раз в секунду. Путь строки -> нана Tx -> 485 передача -> 485 приём -> Rx1 -> Tx -> PC. Будет только приём мегой.   

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

hotfatboy пишет:
потому что ставя вместо меги уно - так все работает

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

hotfatboy
Offline
Зарегистрирован: 13.10.2021

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

hotfatboy
Offline
Зарегистрирован: 13.10.2021

nik182 пишет:

Если закомментировать первый if то откуда будет браться символ для передачи?

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

 

nik182 пишет:
Путь символа РС -> Rx -> Tх1 -> 485 приём -> 485 передача -> RX1 -> Tx -> PC.

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

SAB
Offline
Зарегистрирован: 27.12.2016

MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги

nik182
Offline
Зарегистрирован: 04.05.2015

hotfatboy пишет:
я сделал все как вы написали, установил перемычку между rx tx serial1 и использовал вот такой луп ....

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

Этом описании нет ни слова про нану. Не надо было ничего коментить. Просто надо было к первой плате 485 вместо Tx1 подключить Tx вывод софт сериала наны Rx можно не трогать. Если до этого всё передавалось через Тх1 , то и при подключении наны должно передаваться. Для исключения всяких прочих непоняток входы управлением передачи должны намертво подключены к земле и питанию для 485 так, что бы обеспечить прохождение сигнала.     

hotfatboy
Offline
Зарегистрирован: 13.10.2021

nik182

а Вы можете это как-то схемой изобразить? Просто я совсем не могу понять что тут к чему

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

SAB пишет:

MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги

я ничего не подсчитывал. просто фото разместил. если на китайской правильно, значит на ори по вашему перепутано? на этих двух фото по разному подписан пин 18 и 19

nik182
Offline
Зарегистрирован: 04.05.2015

hotfatboy пишет:

nik182

а Вы можете это как-то схемой изобразить? Просто я совсем не могу понять что тут к чему

Может оно и не надо? Я ж всё разжевал. Если после всего этого нет понимания, то я вообще не представляю как донести. Рисовать я точно ничего не буду. Это Вам надо нарисовать по моим словам схему и представить её на обсуждение. На ней должны быть РС, мега, два 485 и нана. И только ноги, которые используются и все соединения - про управляющие 485 не забывать. И не плохо бы было нарисовать направление передачи символов. Для Вашего же понимания.   

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MaksVV пишет:

SAB пишет:

MaksVV не надо на китайцев гнать. Вы сами ошиблись с подсчетом выводов. На китайской правильно все подписаны ноги

я ничего не подсчитывал. просто фото разместил. если на китайской правильно, значит на ори по вашему перепутано? на этих двух фото по разному подписан пин 18 и 19

Это Вы запутали SAB тем, что на китайской плате обвели 19-ю дырку вместе с подписью к 18-й. Внимательнее надо быть, когда рисуете что-то от руки.

hotfatboy
Offline
Зарегистрирован: 13.10.2021

я внимательно прочел комментарий 41 и смог придумать только такую схему? не думаю что это то что Вы имели ввиду , так что надеюсь поправите

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

mykaida пишет:

Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.

Дико извиняюсь... Чем ограничено количество устройств ?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

brokly пишет:

mykaida пишет:

Я всё понимаю, но зачем нужно несколько RS485 - не понимаю. На одну 485 можно повесить 256 устройств. Вам мало? Используйте аппаратный сериал и майтесь дурью.

Дико извиняюсь... Чем ограничено количество устройств ?

смею предположить , что разрядностью системы, адрес каждого устройства представлен в виде восьмибитового значения, а значит количество уникальных комбинаций равно 256,только ,опять таки лишь предполагаю, тут ошибка не 256 а 255 адресов, нулевой еще , скорее всего

nik182
Offline
Зарегистрирован: 04.05.2015

485 должно быть 2 модуля. Где?

hotfatboy
Offline
Зарегистрирован: 13.10.2021

Вот у меня сейчас точно по этой картинке все и подключено ,с той лишь разницей что на нано к софтсериал портам подключил (d6,d7) а так все тоже самое, и ещё одно уточнение ,на меге у меня к 485 подключено в разъём re (режим передатчика) и установлено значение LOW,в принципе все правильно ?