Как изменить переменную/скетч с помощью графического интерфейса

В течение последних нескольких месяцев я работал над носимой компьютерной мышью, используя Arduino и датчик 9-dof. Большая часть скетча завершена и работает, как и ожидалось.

Недавно я начал исследовать, как дать возможность нетехническому пользователю регулировать чувствительность устройства. В настоящее время я делаю это, изменяя пару переменных в скетче. Моя цель состоит в том, чтобы иметь возможность создать базовый графический интерфейс с некоторыми кнопками (возможно, неудивительно) для достижения той же цели.

Требования:

  • возможность настройки чувствительности (пара переменных внутри скетча) устройства arduino с помощью графического интерфейса
  • не замедляет работу sketch (я читал, что вы можете использовать последовательный, но не будет ли постоянная проверка на наличие последовательного замедлять работу микроконтроллера?)
  • может быть сохранен в виде исполняемого файла (легко настраивается для непрограммиста)

Решение может загрузить новый скетч на микроконтроллер или изменить переменные в EEPROM. Все, что вы предложите, будет лучше всего. Я столкнулся с этими несколькими другими подобными темами, но из-за моей неопытности не смог судить, является ли это лучшим способом продвижения вперед.

Конечно, я не ищу полного решения. Скорее, я был бы очень признателен за любые указания о том, какой должна быть базовая "структура" решения. Тогда я смогу определить, какие части я могу сделать сам, а в каких мне нужно будет обратиться за помощью.

Большое вам спасибо, что посмотрели на это.

, 👍1

Обсуждение

Поскольку это носимая мышь, как она взаимодействует с ПК? Какой Arduino вы используете?, @chrisl

Есть 2 устройства. Изготовленная на заказ портативная печатная плата с датчиком, микропроцессором ATSAMD21, модулем nrf24. Это отправляет информацию через радиомодуль на USB-ключ. Ключ имеет тот же модуль и использует ATMEGA32U4. В него загружен загрузчик arduino leonardo., @Zhelyazko Grudov

Я предполагаю, что ваш ключ настроен как скрытое устройство для ПК., @chrisl

Я не думаю, что этот вопрос следует закрывать. Он достаточно сфокусирован в моих глазах. У ОП уже есть некоторые базовые подходы, и нам просто нужно объяснить очевидные недоразумения. Я уже собирался написать ответ, когда вопрос был закрыт, @chrisl

хорошо @chrisl, я все еще думаю, что это слишком широко, но если вы можете написать ответ, я снова открыл, @Juraj


1 ответ


Лучший ответ:

1

Перепрошивка (и с этой перекомпиляцией) скетча для каждого изменения переменной очень сложна.

Поскольку вы уже хотите написать свою собственную программу для ПК, я бы предложил использовать Serial. Это будет проще всего реализовать. Это будет работать следующим образом:

  • На Arduino: Вы регулярно проверяете, есть ли данные в последовательном буфере, читаете, если в этом случае. Вы читаете до символа новой строки \n, который действует как разделитель сообщений (чтобы отличать одно сообщение от другого). Если было получено полное сообщение (имеется в виду: вы читаете символ новой строки), вы обрабатываете сообщение и записываете новые значения в EEPROM (для их постоянного сохранения).

  • В приложении для ПК: Позвольте пользователю определить каждое значение. Вы открываете COM-порт ардуино (пользователь должен будет выбрать правильный) для связи по последовательному каналу. Затем вы отправляете каждое значение, которое хотите записать в Arduino, в определенном формате. Например <value_name>:<value>. И не забудьте символ новой строки в конце. Затем вы можете закрыть COM-порт и выйти из приложения.

Для этого пользователю необходимо выбрать соответствующий COM-порт. Используя пользовательский профиль USB (я думаю, что пользовательский профиль HID также должен иметь возможность получать данные), вы могли бы устранить это, но это большой шаг в сложности для вас при программировании.

Я читал, что вы можете использовать последовательный, но разве постоянная проверка на наличие последовательного не замедлит работу микроконтроллера?

Нет, не совсем так. Фактический прием данных осуществляется с помощью USB-оборудования. По мере загрузки обработки у вас есть только размещение данных в буфере (происходит внутри ISR), что выполняется только при получении фактических данных, и проверка наличия данных в буфере. Для этого также требуется очень короткое время. Это не должно влиять на частоту дискретизации. Датчик 9-DoF, скорее всего, работает намного медленнее. Фактическая обработка данных также выполняется только тогда, когда вы действительно отправляете данные. Здесь дольше всего будет сохраняться информация в EEPROM.

Таким образом, в целом вы практически не влияете на производительность.

,

Привет, Крис, Большое вам спасибо за то, что нашли время ответить. Это то, что я искал; дает мне довольно хорошее представление о следующих шагах исследования, которые необходимо предпринять. Итак, для кода arduino я бы написал код, который проверяет наличие последовательных данных в ISR? Я не совсем понимаю, что вы имеете в виду под: "По мере загрузки обработки у вас есть только размещение данных в буфере (происходит внутри ISR), что выполняется только при получении фактических данных"., @Zhelyazko Grudov

Вы знаете, что такое прерывания и ISR? Если нет, я могу включить краткое объяснение по этому поводу, @chrisl

@Желязкогрудов: Re “ _ должен ли я писать код, который проверяет наличие последовательных данных в ISR?_”: Нет. Этот ISR предоставляется основной библиотекой Arduino. Вам просто нужно будет проверить наличие "Serial.available ()" в вашем " цикле ()"., @Edgar Bonet

Нет, спасибо, Крис, я не хочу тратить твое время впустую; сначала проведу кое-какие исследования. Уже знаком с прерываниями, просто нужно проверить ISR. Я думаю, что моя главная проблема, возможно, необоснованная, как вы упомянули, заключается в том, что проверка серийного номера с использованием библиотеки serialUSB для пользовательских печатных плат теперь замедлит работу устройства. @Эдгар Бонет, спасибо тебе, Эдгар. Итак, serial.available () - это ISR? Немного сбивает с толку, веб-сайт arduino предполагает, что ISR ничего не должны возвращать, но это так. https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/, @Zhelyazko Grudov

Я не уверен, помните ли вы меня оба, но это, должно быть, уже пятый мой вопрос, на который вы ответили. Я действительно ценю это :), @Zhelyazko Grudov

Об ISR: Фактический прием данных осуществляется с помощью ISR в фоновом режиме. Вам не нужно ничего с ними делать (так как все это скрыто в объекте "Серийный"). Вы используете только Serial.available(), который проверяет, есть ли у вас новые данные в буфере. И как описано выше: это работает так быстро, что на самом деле не изменит вашу производительность. Это займет всего несколько тактов. Ваш датчик 9-DoF будет работать намного медленнее., @chrisl

Также: Если это окажет влияние, то у вас возникнут проблемы и в других местах. В таком случае лучше всего было бы использовать более быстрый микроконтроллер. Но у вас уже есть быстрый микроконтроллер (в зависимости от того, как вы настраиваете его на печатной плате до 48 МГц). Проверка серийного номера не является проблемой для Uno, частота которого составляет всего 16 МГц. Тебе стоит попробовать., @chrisl

Спасибо тебе, Крис! Имеет смысл., @Zhelyazko Grudov

Привет, Крис. На всякий случай, если это всплывет в качестве уведомления, я начал реализовывать это., @Zhelyazko Grudov