Передача нескольких значений в arduino и их интерпретация с минимальной задержкой
Я создаю подводного робота, который может двигаться вверх/Вниз, Вперед/назад, управляя джойстиком.
Ситуация выглядит следующим образом :
USB-джойстик подключен к ПК, ПК подключен к Arduino через тросовый кабель (Ethernet), а двигатели робота подключены к arduino.
У джойстика, который я использую, 2 палки, и я решил использовать 1 палку для управления движением ВВЕРХ-ВНИЗ (на самом деле я использую для этого только 1 ось этой палки.) и 2-ю палку для управления движением ВЛЕВО-ВПРАВО.
Мой вопрос в том, что всякий раз, когда пользователь манипулирует обеими палочками одновременно (например, для достижения диагонального движения), джойстик будет посылать 2 сигнала, один за другим, по одному для каждой палочки. Принимая во внимание ограниченный размер буфера приемника arduino, как мне запрограммировать arduino таким образом, чтобы он мог понять разницу между сигналом линейного движения и сигналом диагонального движения?
Я очень мотивирован, чтобы программировать это самостоятельно. Мне просто нужна Интуиция для этого.
Мне пришла в голову мысль использовать следующую стратегию:
Для моего значения джойстика Вверх-вниз я добавляю символ, такой как "U"
, за которым следует целочисленное значение джойстика. Например, я посылаю "U4"
для увеличения скорости 4
. С некоторым подергиванием я даже могу послать сигнал с тем же предыдущим символом U.
Аналогично, для прямого/обратного хода я посылаю "F3"
, чтобы перейти на fwd/bkwd со скоростью 3
. А для диагонали я посылаю что-то вроде "T5"
, чтобы двигаться по диагонали со скоростью 5.
Меня беспокоит то, что я передам 2 символа с ПК на Arduino. Сможет ли arduino прочитать такие 2 символа, интерпретировать их и действовать соответственно, без заметного запаздывания? Или есть какой-нибудь другой лучший способ?
Это также заставляет меня задуматься, как коммерческие роботы (такие как коммерческие беспилотные летательные аппараты) справляются с такими ситуациями?
Движения, которые будет совершать робот, должны быть быстрыми. Не должно быть "видимой" задержки, то есть пользователь не должен чувствовать, что робот отвечает через пару секунд.
@Steve Hansleman, 👍0
Обсуждение1 ответ
Я не знаю о коммерческих дронах, однако ваш "протокол" кажется довольно эффективным, так как он использует 4 байта для отправки 2 значений (например, U3F5) со скоростью 3 и вперед со скоростью 5.
Давайте примем значения от 0 до 7. Затем вы можете отправить их оба в 8 битах/один байт:
Х Х Х Х В В В В
Где H-горизонтальная скорость (от -8 (000) до +7 (111), всего 16 возможных значений. Для вертикальной скорости вы можете сделать то же самое.
Таким образом, в пределах одного байта вы отправляете обе скорости (что также означает отсутствие задержки). В случае, если вам нужна большая точность, чем отправка двух байтов: один байт с горизонтальной и один байт с вертикальной скоростью. В зависимости от скорости отправки/приема я сомневаюсь, что есть какая-либо задержка.
Даже с вашим протоколом я сомневаюсь, что есть задержка, но вышеописанное более эффективно.
Я уверен, что можно создать еще более эффективные алгоритмы, возможно, используя разницу с предыдущим значением (например, отправляя дельта-значения).
Еще один алгоритм, который можно создать, предполагая, что существует большая вероятность изменения только одного из двух направлений (горизонтального или вертикального) и имеющий высокую точность
D V V V V V V V
Где D-направление (0 = горизонтальное, 1 = вертикальное), а V-значение/скорость (от -64 до +63, 7 оставшихся битов).
Значения дельты могут вызвать проблемы, если пропадет байт, но в остальном это очень хорошая идея!, @Nick Gammon
@NickGammon Спасибо ... Также можно зарезервировать еще один бит для значения «изменение» или «следующее значение является абсолютным» ... но это уменьшит количество бит для дельты., @Michel Keijzers
- связь между двумя arduino с помощью ENC28J60?
- Как заставить Arduino взаимодействовать с тремя другими Ардуино?
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Отправка значения с одного Arduino на другой
- Связь Arduino master/slave с использованием RS485
- Клиент MQTT на Arduino + SIM900
- Ошибка инициализации GPS DFRobot [Arduino Uno, SIM808]
- Реализовать связь Visible Light с помощью Arduino
Как именно вы передаете данные между ПК и Arduino? Как я понял, вы используете ethernet. Но как вы отправляете и получаете сами данные? Простые пакеты? Веб-сокеты? Это может объяснить самое большое отставание в системе, @chrisl
Взгляните на CAN, у большинства контроллеров CAN есть буфер(ы) для хранения входящих пакетов. Каждый пакет может иметь 8 байт, и вы можете работать со скоростью миллион бит в секунду. Есть некоторые, которые будут работать еще быстрее, но они будут хороши для модулей Arduino, таких как MPC2515, и они не дорогие., @Gil