Соединение двух Arduino так чтобы обмен данными не тормозил сервопривод

Есть UNO и MEGA 2560

UNO периодически работает с сервоприводом (шаговиком) на большой скорости и поэтому в момент работы с серво не может общаться с МЕГА.

(В БАЗОВОМ варианте) Обмен данными должен быть односторонним МЕГА → UNO
Единственное это что UNO должно сообщать МЕГА - это свою готовности принимать данные, но это можно реализовать отдельным проводом* с отдельным цифровым входом/выходом. Но если строить концепцию на возможности обмена в обе стороны - то это в принципе ПЛЮС.

В моменты когда сервопривод отдыхает, UNO должна периодически (например раз в 0.5секунды) попросить скинуть обновленные значения 6-ти параметров (типа из МЕГА. А Мега соответственно должна ответить и выдать эти значения.

Также:
UNO (в случае поступления сигнала на свои собственные цифровые входы сообщающего о необходимости продолжить работу с сервоприводом) должно “забить” на чтение данных с МЕГИ (бросить диалог с МЕГА) и вернуться к работе с сервоприводом.
Вполне допустимо если UNO будет это делать с задержкой скажем до <10ms, но в целом чем меньше - тем лучше. Если 10мс - не достижимо, ну что же - сколько возможно.

МЕГА не должна “тупить”, и если ее перестали слушать, то тоже не должна подвисать. Упомянутый выше провод* (отмеченный звездочкой) может информировать МЕГУ, что UNO уже не до нее.


Альтернативный вариант:
(без синхронизации)
МЕГА может постоянно кричать “в пустоту” (на витую пару) значения этих 3-6 параметров, а UNO пытаться поймать их. Не беда если это случиться не в эту паузу отдыха сервопривода, а в следующую. Главное чтобы обмен (передача) данных не шла в ущерб работе с серво.


ВОПРОС:
каким протоколом лучше соединять I2C, UART RS485.
Киньте названия ключевых команд кода чтобы мне легче искалось (Я - новичок)
Какие входы/выходы (пины) лучше соединять между собой? .

Сколько километров между платами?

Это в принципе ошибочный подход.
“Кричать в пустоту” - прямой путь к переполнению буфера и, соответственно, задержкам.
Правильный путь - никогда не допускать переполнения буфера.
Если придерживаться этого правила, проблем не будет. Помещение символа в буфер и извлечение его оттуда - достаточно быстрые операции, чтобы они ничему не мешали. Если у Вас это не так, значит, Вы что-то делаете неправильно.

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

Вывод: либо Вы неправильно работаете с UART, либо Вы делаете много лишней работы. Например, работаете с данными с плавающей точкой или передаете числа текстом и т.п.

20 сантиметров между платами

Я еще ни с чем не работаю, включая uart.
Значит правильный ответ uart

Какие пины? Те которы отмечены tx rx?
А не напишите синтаксис этой функции (извлечения из буфера)?
Вам одно слово - а мне проще гуглить.
Вообще буду благодарен за 3-5 ключевых слов из моего будущего кода

Извиняюсь.полный новичек.

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

Тогда откуда взялось утверждение:

1 сервопривод
Время переключения напряжения 30us

Интересно, что это означает?

Сигнал на шаговик представляет из себя меандр с периодом 2*30мкс

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

частота постоянная или должна меняться?

Вручную с цифровых выходов ардуины.
Частота должна меняться.
Указанная выше - потолок

Не вижу смысла городить rs485. UART подойдет.

Я пробовал rs485 но он вешает шаговик.
Uart не пробовал

Если uart, то это выходы rx и tx?

Заботиться об очистке буфера стоит?
Как мне выше пишут?
Какими командами?

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

  1. Эй ты?
  2. Слышишь меня?
  3. Вот так то!
  4. Ну погоди!
  5. Ладно, я сегодня добрый.
  6. Смотри чё принёс.?!
    Ну и так далее…

если управлять мотором вручную, то понятно, почему у вас УАРТ заикается.
Только так не делают.
Для генерации меандра используется таймер. Настроили, запустили - и он генерит сигнал сам, а ваша программа в это время общается с Мегой по УАРТ

Тот же самый вопро: можно синтаксис таймера пожалуйста?

Так чтобы по этому синтаксу я сразу нагуглил примеры.

По слову “таймер” я мало что нагуглю

Гуглите - таймер пожалуйса.

Надоел просто этот бред.

1 лайк