Передача сигнала посредством MAX 232
- Войдите на сайт для отправки комментариев
Всем добрый день! Я новенький на вашем форуме.
Постараюсь изложить свою проблему как можно тщательнее.
Задача стоит такая: требуется подавать сигналы на ардуино на расстоянии приблизительно 10м.
Итак, что имеем? На одном конце имеется Arduino UNO(1), с которой идет сигнал на микросхему MAX232. Сигнал конвертируется в RS-232 и по кабелю идет на другой конец, где приходит на аналогичную микросхему MAX 232, конвертируется обратно в TTL и поступает на Arduino UNO(2), на которую уже записана прошивка. Т.е. с первой ардуинки, мы будто жмем на кнопочки, а на второй уже выполняются команды. Так вот, схема работает, сигнал приходит и команды в ардуинке выполняются четко.
НО. Есть одно НО, которое мне вставляет палки в колеса.
Такая ситуация: на Arduino (2) питание включено. Когда подаем питание на Arduino(1), сразу же срабатывают команды на Arduino (2), как будто я сигнал уже посылаю. А т.к. используется две микросхемы MAX 232, идет 4 команды и они разом запускаются. После я могу их отключить. Но как избежать этого косяка при запуске? Может на 2-ой ардуинке к пинам надо фильтры какие сообразить? Подскажите пожалуйста, знающие люди. Из-за недостатка опыта я и предположить ничего не могу
Схема, исходник...
Вот схема. Питаются естественно от разных источников. Все на один минус заведено
Схема подключения MAX 232
USB-TTL на пины, к которым присоединена MAX232 #1 и послушать компом, что вылетает в сторону преобразователя на старте.
Если все 4 команды летят, значит алгоритм неверен.
Спасибо за ответ. Но хочу внести одну поправку. На MAX 232, которая принимает, на выходах 9 и 12 присутствует напряжение порядка 2,5В. Присутствует до тех пор, пока не подано питание на питание на первую MAX232, которая отправляет команды. Может все дело в этом?
Продай MAX232, возьми JDY-40, а провод сдай на медь.
Да я бы с радостью))
Но сделать надо именно на ней. Я и порядок запуска думал другой сделать, т.е. сначала питание на первую подавать, а потом на вторую. Не помогло. Думал, может при запуске Arduino(1) на выводах появляется кратковременная единица, поставил реле с задержкой времени на питание max232 один фиг
Значит, диплом или курсовая. Делай.
Схема неверная. Проверяй направление сигнала
Может дело все в том, что система команд должна быть более адекватной ?
Протоколы все же наверное не идиоты придумали.
Вот хрен поверю что в момент включения из ниоткуда может прилететь ,скажем 64бита нужной последовательности ещё и с правильным CRC.
А если в качестве исполняющего механизма висит реле , то оно при кривой схеме или коде может включатся и при включении и без всяких max232
rkit, можете подсказать где именно, что неправильно? Собирал согласно даташиту. С ардуино на контакты 10,11 мах232 приходит до 5в. С контактов 7,14 выходит уже конвертируемые +8В или -8В. На другой мах232 приходит на контакты 8, 13, конвертируются обратно и на ардуино с контактов 9,12 выходит около 3В.
Kakmyc, в каком плане адекватной? Здесь нет никакой последовательности на выполнение алгоритма. Здесь просто дублируются команды, подаваемые на ардуино (1)
Спасибо за ответ. Но хочу внести одну поправку. На MAX 232, которая принимает, на выходах 9 и 12 присутствует напряжение порядка 2,5В. Присутствует до тех пор, пока не подано питание на питание на первую MAX232, которая отправляет команды. Может все дело в этом?
Не надо гадать, надо локализацию бага проводить. Проверь без максов свою систему, тогда, скорее всего, будешь знать, куда копать.
А Вы уверены, что ТС использует какие-либо протоколы? Мне кажется от просто использует МАКС, как преобразователи уровня ТТЛ в RS232 и обратно. И просто дергает пины на одной стороне и читает на другой.
А нахрена там вообще тогда нужна max232 ?
С ардуино на контакты 10,11 мах232 приходит до 5в. С контактов 7,14 выходит уже конвертируемые +8В или -8В. На другой мах232 приходит на контакты 8, 13, конвертируются обратно и на ардуино с контактов 9,12 выходит около 3В.
И всё? Ничего не забыл? Так теперь rs232 работает? Только два сигнала и оба в одном направлении?
Да да! Все верно! Дергаем пины на одной стороне. Обратного сигнала не надо.
Если я отключаю все максы, все работает стабильно, без каких-либо срабатываний при старте.
Мах здесь нужен для передачи сигнала на расстоянии, я так понимаю, сигнал с ардуинки в 10-метровом проводе может затеряться или из-за сопротивления провода вовсе не дойти. Повторюсь, это не моя хотелка, меня попросили осуществить.
Ну как скажешь. Зачем вообще писать на форум, если такой умный?
Я вас чем-то задел? Понимаю, что запутал народ способом подключения не по Rx Tx, а обычным конвертированием сигналов туда обратно. Если б был шибко умный, тут бы ничего не писал. Но столкнулся с проблемой, решил пойти на форум к знающим людям. Думал, а вдруг проблема сама по себе пустяковая...
Просто я не понимаю, почему при ситуации, когда на мах232, с которой отправляется сигнал не подается питание, 2-ая мах232 на контакты ардуино уже дает 3в. И при подаче питания, соответственно, на этих пинах появляется 0 В и пин ардуинки получает сигнал на выполнение
Как я понимаю, имеется случай паразитного питания. Я бы попробовал без МАКСов, через диоды TX -|<- RX и RX подтянул резистором 10к к +5в.
Slavka_93, постарайтесь как можно точнее сформулировать, что именно Вы понимаете под термином "сигнал".
Прежде, чем отвечать, внимательно перечитайте посты №10 и №13.
Случайные изменения напряжения на контактах в момент включения не должны распознаваться как сигнал, а должны интерпретироваться как ошибка.
Собственно, если бы Вы потрудились разместить не только схему, но и скетч (как этого требуют правила форума), Вам бы уже давно указали на ошибку.
Посты перечитал. В 13 посте svm преобразуем ТТЛ в RS-232 и обратно.
Скетч для Arduino (1), с которой подаются команды
Скет для Arduino (2), которая принимает команды
Slavka_93, Вы уж определитесь с терминологией: где у Вас "сигнал", а где у вас "команда".
В целом можно сказать, что установка вывода в то или иное состояние - это не команда. В Вашем случае команда должна состоять из одного или нескольких байт, которые и следует передавать через интерфейс 232. А на другом конце - принимать эти байты и декодировать - определять, является ли принятая последовательность байтов валидной командой и следует ли ее выполнять.
Ну, например, считать, что числу 86 соответствует установка пина в состояние HIGH, числу 193 - установка в состояние LOW, а все остальные числа следует трактовать как ошибки передачи и не реагировать на них.
ОФФТОП:
1. 93 - это год рождения? Тебе 28 в этом году, правильно я понял?
2. Есть ли у тебя высшее или среднее-специальное техническое образование?
3. Есть ли у тебя навыки программирования и какие?
4. Есть ли какой-то опыт в электронике? (резистор, конденсатор, мосфет - что-то значат эти слова для тебя?)
---------------------------
Информация поможет правильно оценить уровень трагедии.
Решение правильное уже указано: смонтировать грамотно линии, с подтяжками, чтобы при отключенном конце линия не превращалась в антенну, придумать элементарный протокол передачи команд с защитой от помех. Использовать сериал или софт-сериал, если нет свободного сериала.
Извиняюсь, что как-то неправильно излагаю суть проблемы. Постараюсь описать проблему отбросив лишнее.
На мах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В при потере питания
1. Да, мне 28
2. Образование неоконченное высшее, но по другой специальности.
3. Навыки программирования минимальные, В основном все получалось делать в программе FlProg.
4. Да, с большинством радиокомпонентов знаком.
Возможно, я несу ахинею и такое осуществить невозможно. А надо делать через порты Rx и Tx.
Спасибо, что даете обратную связь, мне кажется я понял, что я делаю не так. Надо использовать UART. Позже напишу, что получится.
ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы
ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы
МАКС232 для этого не лучший вариант. В момент включения он непредсказуем. Пока запустятся внутренние источники +/- 12В, информация будет недостоверной. Лучше использовать ее в штатном режиме. Да и в любом случае, даже если использовать вместо нее шинные формирователи, ардуинка в момент включения тоже выдаст недостоверную информацию.
ТСу надо прокинуть логические уровни на расстояние 10 метров? для этого есть буферные элементы
ну и программу переписать, естественно.
И как то я не заметил в программах приёма передачи настроек последовательных портов. Так и задумано? Или RS232 используются только как конверторы уровней? Тогда от помех вообще не избавиться и совсем не понятно зачем вообще МК. Весь смысл МК в интеллектуальной обработке. Использовать их как прокладки между человеком и RS232 верх глупости. Если бы такой проект принесли мне то он бы был послан далеко с формулировкой разбазаривание подотчётных средств.
Эх, с ходу видно отсутствие образования и опыта. А больше всего умиляет не правильная интерпретация мануала и собственные догадки, возведённые в ранг непреложной истины. Вот скажи ТС - откуда у тебя уверенности озвученная в #24 что сразу появляется -8 превращается в +5 вольт? Совсем не сразу. Нет, я конечно понимаю исходник такой мысли, но путь решения совершенно другой. Rkit c самого начала об этом говорит, к сожалению в своей манере не объяснять причины и следствия, но он прав. Да многие другие советы валидны.
Вот ещё. Если всё таки возникнет мысль переделать на нормальную систему с управлением МК. Для принимающей стороны в сетап сделать задержку на время прихода 232 в норму и после очистить буфер приёма перед передачей управления в луп. В мануале от TI даже нет параметра выхода на режим работы, а макс дает 1 секунду для емкостей 1 мкф и соответственно 100 мс для 0.1 мкф. Эта задержка очень полезно сказывается на привод реле. Кстати, писать значение порта нужно до (!) команды его переназначения на выход, чтобы на выходе не было прыжков уровней, а ногу МК подтягивать резистором к тому значению, которое будет на выходе по умолчанию, что бы при подаче питания или любых не штатных ситуациях реле вставало в положению по умолчанию.
Для передающей стороны задержка тоже полезна, а вот шум на время подъема питания можно защитить стандартным протоколом. Например модбас. На заре компутеростроения применяли простой приём, передавая в линию два байта 0х55 0хАА а за ними уже байты команды. Обычно этого хватало что бы отстроиться от шума линии. Позже протоколы усложнили контрольными суммами.
nik182, не буду спорить, что у меня катастрофически не хватает знаний, но в программировании и электронике - самоучка, поэтому пытаюсь найти решение по мере возникновения проблемы. Возможно, выражаюсь как-то глупо.
У МК есть своя программа для выполнения, я просто не стал выкладывать полный код, т.к. он собран в другом приложении и на замечания я бы не смог реагировать верно изменяя его. И вы правильно заметили, что RS-232 используется как конвертор уровней. Мне и нужно было только это. Избежать преждевременных включений, которые мне мешали, получилось с помощью китайского драйвера МХ-1508.
Спасибо, что откликнулись
MAX232 заменили на драйвер шаговика, или я что-то не так понял?
Нет)) MAX232 оставил, но чтобы при включении не срабатывало ненужных команд, на второй ардуинке добавил драйвер шаговика, чтобы он давал питание на некоторые элементы с небольшой задержкой, около 5 секунд. Может это неправильное применение, но в сети встретил такую схему и решил попробовать. Переделывал на UART, но попросили оставить как было, т.к. только и требовалась конвертация уровней
прочитал и мало чего понял (это я про ТС, "задача и метод решения") там вообще MAX232 не пришей рукав.... самый потолок там нужен дифференциальный линейный драйвер и приемник ... нечто вроде пары AM26LS31 и AM26LS32 . По сути нужен кусов от энкодера по примеру:
но и эта толумера ничего не гарантирует... вроде звучало про "общий минус" так что в оптопаре смысла не особо, а вот диффка поможет нормально.
за алгоритм обработки и достоверности принятого сигнала вроде все сказали, смысла растекаться за собой не вижу.