UNO периодически работает с сервоприводом (шаговиком) на большой скорости и поэтому в момент работы с серво не может общаться с МЕГА.
(В БАЗОВОМ варианте) Обмен данными должен быть односторонним МЕГА → UNO
Единственное это что UNO должно сообщать МЕГА - это свою готовности принимать данные, но это можно реализовать отдельным проводом* с отдельным цифровым входом/выходом. Но если строить концепцию на возможности обмена в обе стороны - то это в принципе ПЛЮС.
В моменты когда сервопривод отдыхает, UNO должна периодически (например раз в 0.5секунды) попросить скинуть обновленные значения 6-ти параметров (типа из МЕГА. А Мега соответственно должна ответить и выдать эти значения.
Также:
UNO (в случае поступления сигнала на свои собственные цифровые входы сообщающего о необходимости продолжить работу с сервоприводом) должно “забить” на чтение данных с МЕГИ (бросить диалог с МЕГА) и вернуться к работе с сервоприводом.
Вполне допустимо если UNO будет это делать с задержкой скажем до <10ms, но в целом чем меньше - тем лучше. Если 10мс - не достижимо, ну что же - сколько возможно.
МЕГА не должна “тупить”, и если ее перестали слушать, то тоже не должна подвисать. Упомянутый выше провод* (отмеченный звездочкой) может информировать МЕГУ, что UNO уже не до нее.
Альтернативный вариант:
(без синхронизации)
МЕГА может постоянно кричать “в пустоту” (на витую пару) значения этих 3-6 параметров, а UNO пытаться поймать их. Не беда если это случиться не в эту паузу отдыха сервопривода, а в следующую. Главное чтобы обмен (передача) данных не шла в ущерб работе с серво.
ВОПРОС:
каким протоколом лучше соединять I2C, UART RS485.
Киньте названия ключевых команд кода чтобы мне легче искалось (Я - новичок)
Какие входы/выходы (пины) лучше соединять между собой? .
Это в принципе ошибочный подход.
“Кричать в пустоту” - прямой путь к переполнению буфера и, соответственно, задержкам.
Правильный путь - никогда не допускать переполнения буфера.
Если придерживаться этого правила, проблем не будет. Помещение символа в буфер и извлечение его оттуда - достаточно быстрые операции, чтобы они ничему не мешали. Если у Вас это не так, значит, Вы что-то делаете неправильно.
И - да, 10 мс - это огромный промежуток времени, он достаточен для того, чтобы заведомо ничего не тормозило.
Вывод: либо Вы неправильно работаете с UART, либо Вы делаете много лишней работы. Например, работаете с данными с плавающей точкой или передаете числа текстом и т.п.
Я еще ни с чем не работаю, включая uart.
Значит правильный ответ uart
Какие пины? Те которы отмечены tx rx?
А не напишите синтаксис этой функции (извлечения из буфера)?
Вам одно слово - а мне проще гуглить.
Вообще буду благодарен за 3-5 ключевых слов из моего будущего кода
Напишите точнее, сколько будет сервоприводов и что такое “большая скорость” в цифрах.
А то есть стойкое ощущение, что две этих задачи не будут мешать друг другу и вы зря все усложняете.
если управлять мотором вручную, то понятно, почему у вас УАРТ заикается.
Только так не делают.
Для генерации меандра используется таймер. Настроили, запустили - и он генерит сигнал сам, а ваша программа в это время общается с Мегой по УАРТ