Графический интерфейс с микроконтроллером для управления устройством через SPI

Я пытаюсь разработать графический интерфейс для управления устройством, подключенным к Arduino. Arduino связывается с устройством через SPI. Я разработал графический интерфейс на MATLAB для визуализации чтения Arduino. Для этого я заставил Arduino записывать данные из линии MISO в последовательный порт, а MATLAB читал из того же порта и творил чудеса. Однако я пытаюсь придумать способ записи в строку MOSI с помощью графического интерфейса.

Сейчас я подумываю о том, чтобы заставить Arduino прослушивать определенный код (например, символ) на последовательном порту, и как только он его увидит, он будет искать x количество последовательных байтов. Байты будут отформатированы определенным образом, чтобы Arduino могла затем проанализировать их и записать в соответствующие регистры.

Есть ли лучший способ сделать это? Общий вопрос: как лучше писать на устройство, подключенное к микроконтроллеру, используя I2C или SPI через графический интерфейс?

, 👍3

Обсуждение

графический интерфейс должен быть отделен от коммуникации. сначала разработайте коммуникационную часть. как только это сработает, добавьте код графического интерфейса., @jsotola

Вы можете полностью обойти Arduino, если хотите сделать это более эффективным. https://www.adafruit.com/product/2264 РЕДАКТИРОВАНИЕ: я только что понял, сколько ему лет. Каковы шансы, что ОП это больше понадобится?, @Tri

@Tri Спасибо за недавний ответ. Я решил заставить графический интерфейс записывать файл конфигурации в последовательный порт и анализировать через него код Arduino перед связью с устройством по SPI. Спасибо за ссылку на FT232. Это будет полезно в будущем, @Mathews John

Возможно, нам нужно разъяснение/определение «GUI» в исходном постере, поэтому перестаньте смешивать «графический интерфейс пользователя» с «интерфейсом устройства»., @Jan Hus


4 ответа


0

SPI — это синхронизированный интерфейс, у него есть ведущий и подчиненный. Либо вам нужно переключаться между подчиненным и ведущим, либо вам нужно предоставить возможность Arduino начать «чтение» с другого конца, поскольку тот, кто инициирует связь по SPI или I2C, является ведущим, в вашем случае Arduino, Я полагаю. Самый простой способ сделать это — предоставить другую линию через gpio. Что касается общего вопроса: для правильной двусторонней связи вам, вероятно, захочется выбрать асинхронный протокол, например UART.

,

Означает ли это, что устройства на I2C или SPI не могут использовать графический интерфейс; графический интерфейс не работает на микроконтроллере?, @Mathews John


0

У меня было аналогичное требование, и я придумал Wirekite. Это комплексное решение, основанное на плате Teensy, некотором коде для нее и библиотеках для Mac или ПК.

С помощью Wirekite вы можете подключить цифровые и аналоговые входы и выходы, устройства I2C и устройства SPI (очень скоро) к плате Teensy и подключить плату Teensy через USB к вашему Mac или ПК. Затем вы сможете управлять шинами ввода-вывода, I2C и SPI с вашего Mac или ПК. Вам не нужно адаптировать код Teensy.

Wirekite использует специальный протокол для связи. Но вам не нужно об этом беспокоиться, потому что вы можете просто использовать гораздо более удобный API, предоставляемый библиотеками Wirekite (.NET для Windows, Objective-C/Swift для MacOS).

,

Да, я думаю, это один из способов сделать это. MATLAB уже может это сделать. Есть аппаратный пакет, который я могу использовать для того же. Я считаю, что это хорошая альтернатива. Рассмотрю это., @Mathews John


0

Если вы хотите обмениваться данными с компьютера на Arduino, используйте USART. В Arduino это уже запрограммировано, а также имеется собственный графический интерфейс.

,

1

Некоторое время я задавался тем же вопросом. Вот как я решил эту проблему.

1- Найдите подходящий формат и протокол обмена

Здесь вам нужно решить, что в общении самое важное. Это скорость? Это обнаружение ошибок? Это объем памяти? Например , для моего проекта я решил, что мне нужно, чтобы мое общение было максимально безошибочным, с минимальным объемом памяти (до 64 байтов), и меня не особо волнует скорость, поэтому я предпочитаю обмен сообщениями в формате JSON. протокол, в котором настольное приложение отправляет короткое (до 64 символов) сообщение JSON и получает короткий ответ. Это решило МОЮ проблему, ваши требования могут быть другими. Например, если вам нужна скорость и вы не заботитесь о памяти, вы можете использовать двоичный протокол с заголовком, определяющим размер, сообщение и нижний колонтитул CRC для проверки достоверности. Или вы можете использовать BSON и взять эту библиотеку, чтобы избежать хлопот.

2- Определите цикл последовательного опроса Как прошивка Arduino узнает, что пришло время отправлять или получать сообщения? Оно всегда разговаривает? Всегда готовы принять? Он просматривает буфер последовательного порта каждые несколько микросекунд, чтобы узнать, есть ли входящее сообщение? Как это обрабатывается вашим устройством? Если вам просто нужно выводить данные, не беспокоясь о том, слушает ли кто-то или нет, например, устройство GPS, просто время от времени бросайте Serial.print, но если вам нужно дождаться данных, вы будете придется разделить процесс внутри FSM или использовать какой-то планировщик. Если вы не используете планировщик, я рекомендую этот.

3- Определите цикл общения Здесь вы берете данные из последовательного порта и сохраняете их в буфере для дальнейшего использования. Хитрость здесь в том, 1- Проверьте последовательный FIFO на наличие входящих данных. Serial.available() уже делает это. 2- Если есть входящие данные, скопируйте их в следующее доступное место в буфере. 3- Проверьте, есть ли еще входящие данные через несколько миллисекунд. 4- Если входящих данных нет, пометьте буфер как готовый к использованию и проанализируйте его.

Для простоты следующий код не запланирован, и я рекомендую вам заменить вызовы sleep() на правильное планирование, если вы не хотите, чтобы Arduino перестал отвечать. Он также ожидает текстовые данные, поэтому вам придется внести изменения, если вы ожидаете двоичные данные.

  char buffer[64];
  memset(buffer, 0, 64);

  while (!Serial.available())
    delay(50);

  while (Serial.available()){
    Serial.readBytes(buffer + strlen(buffer), Serial.available());
    delay(50);
  }
  parseBuffer(buffer);
,