Я делаю проект, который требует отправки данных с одного микроконтроллера на другой через беспроводную сеть (я собираюсь использовать радиочастотные модули 433 МГц или 2,4 ГГц, еще не решил). В частности, я делаю джойстик, который управляет двигателями 4 постоянного тока. Поэтому мой вопрос: когда я пишу код, должен ли я поместить команду для ускорения двигателя «x» в микроконтроллер приемника (плата, управляющая двигателями) или в микроконтроллер передатчика (плата джойстика)? Например, если я положил джойстик влево, чтобы ускорить двигатель 3 и 4, где бы я написал этот код? Я делаю этот проект в arduino (ATmega328 с загрузчиком arduino).Передача данных с микроконтроллера на другой
ответ
Ну это наиболее определенно «прежде всего, мнение на основе» вопрос и может очень хорошо закрываются ... но ...
Это ваш дизайн, вы должны разработать его. В этом случае нет неправильного ответа, вы можете иметь панель джойстика, просто передающую состояние переключателя джойстика или аналоговое состояние в зависимости от того, какой вид они ... ИЛИ ... вы можете использовать джойстик с использованием времени и как долго джойстик удерживается в позиции и, возможно, вычисляет то, что, по вашему мнению, должно быть позицией устройств, и просто передайте это (вам нужно повернуть m шагов таким образом и n шагов таким образом). Или в зависимости от вашего общего дизайна системы могут возникнуть другие решения для балансировки нагрузки между микроконтроллерами. Я предполагаю, что вы действительно хотите здесь, просто «использовать» беспроводную связь и дополнительный mcu как способ не использовать джойстик. Если джойстик был подключен, и вы сделали это с одним mcu, и это джойстики, основанные на коммутаторе (не аналоговое сопротивление), тогда один mcu просто будет считывать состояние переключателя с некоторым интервалом, возможно, debouncing. Поэтому, когда вы добавляете беспроводную связь, вам нужно, чтобы беспроводное решение просто передавало одно и то же состояние коммутатора, а не в том же пространстве регистров, а не обязательно, то же самое положение бит в любых данных, а просто в состоянии переключения. По мере необходимости вы получаете дополнительное преимущество джойстика mcu, которое может отбросить. Также возможно только отправлять изменения состояния и не беспокоить двигатель mcu каждые N единиц времени.
Я пробовал модули, подобные этим недавно, и был очень разочарован, но я рассматриваю возможность их повторного использования или другого поставщика/сборки из них. Они должны «чувствовать», как провод, например, для последовательных данных с некоторой скоростью 4800 бод, 2400 бод и т. Д. Сначала я должен был делать такие вещи, как постоянно посылать шаблон, сказать тот же байт 0xAA, тогда каждый так часто имеет небольшую полезную нагрузку покажите там, поэтому найдите 0xAA, тогда, когда вы увидите что-то еще, подсчитайте так много байтов, которые являются полезной нагрузкой. Он пошел вниз, когда я использовал отдельные компьютеры/расходные материалы для отправки данных, как будто большая часть моего успеха, хотя маргинал, возможно, был вызван наземным шумом, фактически не беспроводным. Они продают тонны этих, и люди используют их, поэтому, без сомнения, это было то, что я сделал или купил мусорные модули, или, может быть, я не должен был покупать их с антеннами, и спаял их, и т. Д.
Я бы порекомендовал две вещи. Сначала запустите mcus и запустите приложение, используя проводное соединение, только некоторые провода перемычки. Возможно, вам придется вернуться к этому, поскольку вы, возможно, измените свой протокол или скорость передачи и т. Д., Если это необходимо. Возможно (скорее всего) вы хотите часто отправлять полезную нагрузку, даже если данные не изменились, если беспроводное соединение не является абсолютно надежным, позволяя обрабатывать случайный потерянный пакет данных на следующем. Второе обучение использованию беспроводного соединения - отдельный эксперимент, код с обеих сторон должен просто работать, что одна проблема, как я общаюсь по этому интерфейсу, никаких моторных драйверов без джойстиков, просто код для разговора от одного к другому.
Вероятно, хорошая идея, если вам не нужно постоянно передавать информацию, это создать собственный пакет. Идеально одна или несколько функций, шаблон синхронизации и длина или шаблон синхронизации и контрольная сумма или шаблон синхронизации, длина и контрольная сумма (а также полезная нагрузка). Так что, возможно, байт 0x7E в качестве шаблона синхронизации, возможно, вы всегда отправляете 32 бита или 4 байта полезной нагрузки, поэтому вам не нужна длина, а затем, возможно, контрольная сумма полезной нагрузки или контрольной суммы всего шаблона синхронизации и полезной нагрузки.ваш приемник затем берет байты от uart в круговой буфер в основном или даже не просто использует очень простой конечный автомат, если поиск синхронизации и байта не равен 0x7E, а затем отбрасывает, если 0x7e затем переходит в состояние полезной нагрузки с нулем , получают следующие четыре байта (полезная нагрузка), суммируя их в контрольную сумму по мере поступления каждого из них. после полезной нагрузки следующий байт является контрольной суммой, если он соответствует всему, хорошо передать полезную нагрузку в систему управления, чтобы обновить состояние переключателя и/или просто вставить его в глобальную переменную, наблюдаемую системой управления, как если бы она была прямое подключение к состоянию переключателя джойстика.
Вы можете получить такой же сложный или не такой, какой хотите, но я бы никогда в таком дизайне не предполагал, что обе стороны всегда синхронизированы, и каждый N байтов - это N байтов, отправленных в правильной позиции, даже если вы никогда не отбрасывайте байты, это путь связи по одному направлению, поэтому, если приемник появляется, когда передатчик является средней полезной нагрузкой, приемник появляется в середине полезной нагрузки/пакета и всегда отключается в интерпретации данных. Вы можете сделать slip/ppp вещь в зависимости от того, что это такое, и застраховать шаблон синхронизации никогда в данных, добавляя больше работы. Или нет, я сомневаюсь, что вам нужно быть таким сложным, поскольку я предполагаю, что вы, скорее всего, отправляете только один или несколько байтов фактических данных на обновление.
Почему я пробовал непрерывный поток так же, как в первый раз, когда я пробовал такие продукты, задолго до того, как они были из Китая на ebay, мы должны были застраховать «плотность перехода», вы не могли бы набрать больше, чем пару битовых ячеек какого-либо состояния в строке, не могли бы сказать больше двух нулей в строке или двух в строке, в основном должны были делать biphase-l (manchester II) в программном обеспечении, прежде чем вставлять байты в uart, а затем отменить это на другой стороне. Надеемся, что аппаратное обеспечение для вас и вам не нужно, но нажатие наступает, вы, возможно, должны принимать каждый байт, и только каждый бит в байте - это полезная нагрузка, другой бит рядом с ним - это наоборот, может потребоваться отправить байт 0x01 (00000001) как (0101010101010110) 0x55 0x56. Надеюсь, вам не нужно это делать, это не очень весело.
Ваш набор инструментов для разработки микроконтроллеров должен включать некоторые USB-решения для последовательных решений, можно получить их за доллар или два на ebay из Китая или из adafruit или sparkfun за 10-15 долларов. Иногда в Китае есть перемычка или переключатель на 5 или 3.3 вольт. Один из способов начать с этих модулей - подключить один к одному из этих usb к серийным выходам 5V или 3.3 по мере необходимости для этого модуля rx или tx. Для tx поместите uart out (tx) на вывод данных, для rx rx in на буфере данных. И затем запустите две копии миникомпьютера или любую ту же программу терминала, которую вы используете, установите как небольшую скорость, например, 1200baud, так и тип в одном и посмотрите, будет ли то, что вы вводите, другое. Удерживая символ, U является хорошим, так как с 8n1 он создает прямоугольную волну. это происходит через чистые? что, если вы замедляете обе стороны? что, если вы ускоряетесь. Из простых экспериментов вы можете начать разработку своего протокола. Если у вас есть область действия (с тем, что в наши дни проще, но все же может быть дорогостоящей, всего несколько сотен долларов, но доступ к ней очень важен), вы можете сделать это еще проще, сгенерировать сигнал либо с помощью микроконтроллера, либо с помощью usb на последовательный или любой другой то посмотрите на то, что появляется на другой стороне с масштабом, насколько он уродлив/чист? Можете ли вы сделать это лучше, изменив данные или забивая интерфейс непрерывными данными.
Я думаю, что вам нужен джойстик для управления двигателем. Перемещение джойстика => ускорение «x» на передатчике MCU => wireless => приемник MCU получает команду «ускорить X» => ускорить двигатель. Если это правильно - в чем вопрос? – i486
Должен ли я использовать команду для ускорения двигателя в MCU джойстика или MCU приемника? Микроконтроллер приемника получит только заказ и сразу направится к двигателю? Я знаю, что это огромный вопрос для объяснения, но я потерялся там, где я должен начать исследовать это. –
И да, что вы говорите, именно то, что я хочу сделать. –