Передача сигнала посредством MAX 232

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Всем добрый день! Я новенький на вашем форуме.
Постараюсь изложить свою проблему как можно тщательнее.
Задача стоит такая: требуется подавать сигналы на ардуино на расстоянии приблизительно 10м.
Итак, что имеем? На одном конце имеется Arduino UNO(1), с которой идет сигнал на микросхему MAX232. Сигнал конвертируется в RS-232 и по кабелю идет на другой конец, где приходит на аналогичную микросхему MAX 232, конвертируется обратно в TTL и поступает на Arduino UNO(2), на которую уже записана прошивка. Т.е. с первой ардуинки, мы будто жмем на кнопочки, а на второй уже выполняются команды. Так вот, схема работает, сигнал приходит и команды в ардуинке выполняются четко.
НО. Есть одно НО, которое мне вставляет палки в колеса.
Такая ситуация: на Arduino (2) питание включено. Когда подаем питание на Arduino(1), сразу же срабатывают команды на Arduino (2), как будто я сигнал уже посылаю. А т.к. используется две микросхемы MAX 232, идет 4 команды и они разом запускаются. После я могу их отключить. Но как избежать этого косяка при запуске? Может на 2-ой ардуинке к пинам надо фильтры какие сообразить? Подскажите пожалуйста, знающие люди. Из-за недостатка опыта я и предположить ничего не могу

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

Схема, исходник...

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Вот схема. Питаются естественно от разных источников. Все на один минус заведено

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Схема подключения MAX 232

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

USB-TTL на пины, к которым присоединена MAX232 #1 и послушать компом, что вылетает в сторону преобразователя на старте.

Если все 4 команды летят, значит алгоритм неверен.

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Спасибо за ответ. Но хочу внести одну поправку. На MAX 232, которая принимает, на выходах 9 и 12 присутствует напряжение порядка 2,5В. Присутствует до тех пор, пока не подано питание на питание на первую MAX232, которая отправляет команды. Может все дело в этом?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Продай MAX232, возьми JDY-40, а провод сдай на медь. 

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Да я бы с радостью))

Но сделать надо именно на ней. Я и порядок запуска думал другой сделать, т.е. сначала питание на первую подавать, а потом на вторую. Не помогло. Думал, может при запуске Arduino(1) на выводах появляется кратковременная единица, поставил реле с задержкой времени на питание max232 один фиг

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Значит, диплом или курсовая.  Делай. 

rkit
Offline
Зарегистрирован: 23.11.2016

Схема неверная. Проверяй направление сигнала

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Может дело все в том, что система команд должна быть более адекватной ?
Протоколы все же наверное не идиоты придумали.
Вот хрен поверю что в момент включения из ниоткуда может прилететь ,скажем 64бита нужной последовательности ещё и с правильным CRC.

А если в качестве исполняющего механизма висит реле , то оно при кривой схеме или коде может включатся и при включении и без всяких max232

Slavka_93
Offline
Зарегистрирован: 20.06.2021

rkit, можете подсказать где именно, что неправильно? Собирал согласно даташиту. С ардуино на контакты 10,11 мах232 приходит до 5в. С контактов 7,14 выходит уже конвертируемые +8В или -8В. На другой мах232 приходит на контакты 8, 13, конвертируются обратно и на ардуино с контактов 9,12 выходит около 3В.

Kakmyc, в каком плане адекватной? Здесь нет никакой последовательности на выполнение алгоритма. Здесь просто дублируются команды, подаваемые на ардуино (1)

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

Slavka_93 пишет:

Спасибо за ответ. Но хочу внести одну поправку. На MAX 232, которая принимает, на выходах 9 и 12 присутствует напряжение порядка 2,5В. Присутствует до тех пор, пока не подано питание на питание на первую MAX232, которая отправляет команды. Может все дело в этом?


Не надо гадать, надо локализацию бага проводить. Проверь без максов свою систему, тогда, скорее всего, будешь знать, куда копать.

svm
Offline
Зарегистрирован: 06.11.2016

Kakmyc пишет:
Может дело все в том, что система команд должна быть более адекватной ? Протоколы все же наверное не идиоты придумали. Вот хрен поверю что в момент включения из ниоткуда может прилететь ,скажем 64бита нужной последовательности ещё и с правильным CRC. А если в качестве исполняющего механизма висит реле , то оно при кривой схеме или коде может включатся и при включении и без всяких max232

А Вы уверены, что ТС использует какие-либо протоколы? Мне кажется от просто использует МАКС, как преобразователи уровня ТТЛ в RS232 и обратно. И просто дергает пины на одной стороне и читает на другой.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А нахрена там вообще тогда нужна max232 ?

rkit
Offline
Зарегистрирован: 23.11.2016

Slavka_93 пишет:

 С ардуино на контакты 10,11 мах232 приходит до 5в. С контактов 7,14 выходит уже конвертируемые +8В или -8В. На другой мах232 приходит на контакты 8, 13, конвертируются обратно и на ардуино с контактов 9,12 выходит около 3В.

И всё? Ничего не забыл? Так теперь rs232 работает? Только два сигнала и оба в одном направлении?

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Да да! Все верно! Дергаем пины на одной стороне. Обратного сигнала не надо.
Если я отключаю все максы, все работает стабильно, без каких-либо срабатываний при старте.

Мах здесь нужен для передачи сигнала на расстоянии, я так понимаю, сигнал с ардуинки в 10-метровом проводе может затеряться или из-за сопротивления провода вовсе не дойти. Повторюсь, это не моя хотелка, меня попросили осуществить.

rkit
Offline
Зарегистрирован: 23.11.2016

Ну как скажешь. Зачем вообще писать на форум, если такой умный?

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Я вас чем-то задел? Понимаю, что запутал народ способом подключения не по Rx Tx, а обычным конвертированием сигналов туда обратно. Если б был шибко умный, тут бы ничего не писал. Но столкнулся с проблемой, решил пойти на форум к знающим людям. Думал, а вдруг проблема сама по себе пустяковая...

Просто я не понимаю, почему при ситуации, когда на мах232, с которой отправляется сигнал не подается питание, 2-ая мах232 на контакты ардуино уже дает 3в. И при подаче питания, соответственно, на этих пинах появляется 0 В и пин ардуинки получает сигнал на выполнение

Green
Offline
Зарегистрирован: 01.10.2015

Как я понимаю, имеется случай паразитного питания. Я бы попробовал без МАКСов, через диоды TX -|<- RX и RX подтянул резистором 10к к +5в.

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

Slavka_93, постарайтесь как можно точнее сформулировать, что именно Вы понимаете под термином "сигнал".

Прежде, чем отвечать, внимательно перечитайте посты №10 и №13.

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

 

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

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Посты перечитал. В 13 посте svm преобразуем ТТЛ в RS-232 и обратно.

Скетч для Arduino (1), с которой подаются команды

bool _bounseInputD8S = 0;
bool _bounseInputD8O = 0;
unsigned long _bounseInputD8P = 0UL;
bool _bounseInputD7S = 0;
bool _bounseInputD7O = 0;
unsigned long _bounseInputD7P = 0UL;

void setup()
{
pinMode(7, INPUT_PULLUP); 
pinMode(8, INPUT_PULLUP); 
pinMode(3, OUTPUT); 
digitalWrite(3, 0); 
pinMode(4, OUTPUT); 
digitalWrite(4, 0); 


_bounseInputD8O =  digitalRead(8);
_bounseInputD7O =  digitalRead(7);

}
void loop()
{


bool  _bounceInputTmpD8 =  (digitalRead (8));

if (_bounseInputD8S) 
    {
     if (millis() &gt;= (_bounseInputD8P + 40)) 
         {_bounseInputD8O= _bounceInputTmpD8; _bounseInputD8S=0;}
     }
else
    {
     if (_bounceInputTmpD8 != _bounseInputD8O )
         {_bounseInputD8S=1; _bounseInputD8P = millis();} 
      } 
bool  _bounceInputTmpD7 =  (digitalRead (7));

if (_bounseInputD7S) 
    {
     if (millis() &gt;= (_bounseInputD7P + 40)) 
         {_bounseInputD7O= _bounceInputTmpD7; _bounseInputD7S=0;}
     }
else
    {
     if (_bounceInputTmpD7 != _bounseInputD7O )
         {_bounseInputD7S=1; _bounseInputD7P = millis();} 
      } 




//Плата:1
digitalWrite(3, !(_bounseInputD7O));
digitalWrite(4, !(_bounseInputD8O));</pre>
<p>&nbsp;</p>

Скет для Arduino (2), которая принимает команды

bool _bounseInputD8S = 0;
bool _bounseInputD8O = 0;
unsigned long _bounseInputD8P = 0UL;
bool _bounseInputD10S = 0;
bool _bounseInputD10O = 0;
unsigned long _bounseInputD10P = 0UL;

void setup()
{
pinMode(10, INPUT_PULLUP); 
pinMode(8, INPUT_PULLUP); 
pinMode(5, OUTPUT); 
digitalWrite(5, 0); 
pinMode(6, OUTPUT); 
digitalWrite(6, 0); 


_bounseInputD8O =  digitalRead(8);
_bounseInputD10O =  digitalRead(10);

}
void loop()
{


bool  _bounceInputTmpD8 =  (digitalRead (8));

if (_bounseInputD8S) 
    {
     if (millis() >= (_bounseInputD8P + 40)) 
         {_bounseInputD8O= _bounceInputTmpD8; _bounseInputD8S=0;}
     }
else
    {
     if (_bounceInputTmpD8 != _bounseInputD8O )
         {_bounseInputD8S=1; _bounseInputD8P = millis();} 
      } 
bool  _bounceInputTmpD10 =  (digitalRead (10));

if (_bounseInputD10S) 
    {
     if (millis() >= (_bounseInputD10P + 40)) 
         {_bounseInputD10O= _bounceInputTmpD10; _bounseInputD10S=0;}
     }
else
    {
     if (_bounceInputTmpD10 != _bounseInputD10O )
         {_bounseInputD10S=1; _bounseInputD10P = millis();} 
      } 




//Плата:1
digitalWrite(5, !(_bounseInputD10O));
digitalWrite(6, !(_bounseInputD8O));

 

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

Slavka_93, Вы уж определитесь с терминологией: где у Вас "сигнал", а где у вас "команда".

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

Ну, например, считать, что числу 86 соответствует установка пина в состояние HIGH, числу 193 - установка в состояние LOW, а все остальные числа следует трактовать как ошибки передачи и не реагировать на них.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ОФФТОП:

1. 93 - это год рождения? Тебе 28 в этом году, правильно я понял?

2. Есть ли у тебя высшее или среднее-специальное техническое образование?

3. Есть ли у тебя навыки программирования и какие?

4. Есть ли какой-то опыт в электронике? (резистор, конденсатор, мосфет - что-то значат эти слова для тебя?)

---------------------------

Информация поможет правильно оценить уровень трагедии.

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

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Извиняюсь, что как-то неправильно излагаю суть проблемы. Постараюсь описать проблему отбросив лишнее.

На мах232(1) на 11-ый пин поступает напряжение 5В, с 14-ой ножки снимаем отрицательное напряжение -8В, которое на мах232(2) конвертируется обратно в 5В.

Если на мах232(1) на 11-ый пин поступает 0В, то и с мах232(2) получаем 0В на контакте 12.

Допустим, ситуация, что перезагружаем питание на мах232(1), на контакте 14 сразу же появляется отрицательное напряжение в -8В, которое на мах232(2) конвертируется в 5В. Вот и требуется избавиться от отрицательного напряжения в -8В при потере питания

Slavka_93
Offline
Зарегистрирован: 20.06.2021

1. Да, мне 28

2. Образование неоконченное высшее, но по другой специальности.

3. Навыки программирования минимальные, В основном все получалось делать в программе FlProg.

4. Да, с большинством радиокомпонентов знаком.

Возможно, я несу ахинею и такое осуществить невозможно. А надо делать через порты Rx и Tx.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы

svm
Offline
Зарегистрирован: 06.11.2016

ua6em пишет:

ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы

МАКС232 для этого не лучший вариант. В момент включения он непредсказуем. Пока запустятся внутренние источники +/- 12В, информация будет недостоверной. Лучше использовать ее в штатном режиме. Да и в любом случае, даже если использовать вместо нее шинные формирователи, ардуинка в момент включения тоже выдаст недостоверную информацию.

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы

или  оптрон 817.

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

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

И как то я не заметил в программах приёма передачи настроек последовательных портов. Так и задумано? Или RS232 используются только как конверторы уровней? Тогда от помех вообще не избавиться и совсем не понятно зачем вообще МК. Весь смысл МК в интеллектуальной обработке. Использовать их как прокладки между человеком и RS232 верх глупости. Если бы такой проект принесли мне то он бы был послан далеко с формулировкой разбазаривание подотчётных средств.

Эх, с ходу видно отсутствие образования и опыта. А больше всего умиляет не правильная интерпретация мануала и собственные догадки, возведённые в ранг непреложной истины. Вот скажи ТС - откуда у тебя уверенности озвученная в #24 что сразу появляется -8 превращается в +5 вольт? Совсем не сразу. Нет, я конечно понимаю исходник такой мысли, но путь решения совершенно другой. Rkit c самого начала об этом говорит, к сожалению в своей манере не объяснять причины и следствия, но он прав. Да многие другие советы валидны.

Вот ещё. Если всё таки возникнет мысль переделать на нормальную систему с управлением МК. Для принимающей стороны в сетап сделать задержку на время прихода 232 в норму и после очистить буфер приёма перед передачей управления в луп. В мануале от TI даже нет параметра выхода на режим работы, а макс дает 1 секунду для емкостей 1 мкф и соответственно 100 мс для 0.1 мкф. Эта задержка очень полезно сказывается на привод реле. Кстати, писать значение порта нужно до (!) команды его переназначения на выход, чтобы на выходе не было прыжков уровней, а ногу МК подтягивать резистором к тому значению, которое будет на выходе по умолчанию, что бы при подаче питания или любых не штатных ситуациях реле вставало в положению по умолчанию.   

Для передающей стороны задержка тоже полезна, а вот шум на время подъема питания можно защитить стандартным протоколом. Например модбас. На заре компутеростроения применяли простой приём, передавая в линию два байта 0х55 0хАА а за ними уже байты команды. Обычно этого хватало что бы отстроиться от шума линии. Позже протоколы усложнили контрольными суммами.    

 

Slavka_93
Offline
Зарегистрирован: 20.06.2021

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

У МК есть своя программа для выполнения, я просто не стал выкладывать полный код, т.к. он собран в другом приложении и на замечания я бы не смог реагировать верно изменяя его. И вы правильно заметили, что RS-232  используется как конвертор уровней. Мне и нужно было только это. Избежать преждевременных включений, которые мне мешали, получилось с помощью китайского драйвера МХ-1508.

Спасибо, что откликнулись

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

MAX232 заменили на драйвер шаговика, или я что-то не так понял?

Slavka_93
Offline
Зарегистрирован: 20.06.2021

Нет)) MAX232 оставил, но чтобы при включении не срабатывало ненужных команд, на второй ардуинке добавил драйвер шаговика, чтобы он давал питание на некоторые элементы с небольшой задержкой, около 5 секунд. Может это неправильное применение, но в сети встретил такую схему и решил попробовать. Переделывал на UART, но попросили оставить как было, т.к. только и требовалась конвертация уровней

Гриша
Offline
Зарегистрирован: 27.04.2014

прочитал и мало чего понял (это я про ТС, "задача и метод решения") там вообще MAX232 не пришей рукав.... самый потолок  там нужен дифференциальный линейный драйвер и приемник ... нечто вроде пары  AM26LS31 и AM26LS32 .  По сути нужен кусов от энкодера по примеру:

но и эта толумера ничего не гарантирует... вроде звучало про "общий минус" так что в оптопаре смысла не особо, а вот диффка поможет нормально.

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