Как заставить внешнюю программу изменять значения внутри кода Arduino C++?

Как я могу получить некоторые постоянно меняющиеся значения из отдельной программы C++, введенной и загруженной в Arduino?

Я замечаю, что когда я загружаю код на Arduino в IDE, ему требуется около секунды, чтобы начать двигаться. Это тоже проблема. Я бы хотел, чтобы после инструкций по замене двигателя не было задержек.
Моя цель - получить обученную модель нейронной сети из версии PyTorch C++ для управления вращением и скоростью двигателя. Я бы предположил, что IDE не позволяет импортировать PyTorch?

Я попытался поискать это на сайте Arduino, но похоже, что IDE-единственный вариант. Моим решением было бы то, что импортирует библиотеку Arduino в программу C++ точно так же, как я импортирую библиотеку PyTorch в свою программу C++.

Мой вымышленный код на C++. Просто написано, чтобы проиллюстрировать то, что я хотел бы, чтобы произошло.

import pytorch
import arduino

// если бы у меня был кодер на двигателе, дающий показания положения в качестве входных данных (я знаю, что это не так, как это делается в реальном коде)
sensors = arduino_encoder_sensors

// обученная модель
m = pytorch.load_torch_model('model')

// модель, принимающая датчики в качестве входных сигналов и выводящая желаемую скорость и расстояние
speed, dist = m(sensors)

Код Arduino:

const int stepPin = 8; 
const int dirPin = 9; 
 
void setup() {
  // Устанавливает два контакта в качестве выходов
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
}
  digitalWrite(dirPin,HIGH); // Позволяет двигателю двигаться в определенном направлении
  for(int x = 0; x < dist; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(speed); 
    digitalWrite(stepPin,LOW); 
  delay(1000); // Задержка в одну секунду
}

, 👍-2

Обсуждение

Скетч Arduino работает на Arduino, вы можете отправлять значения на Arduino через последовательный порт, @Juraj

Спасибо. Я ищу этот вариант. Есть примеры того, как выглядит код в последовательном порту? Это то, что я могу отправить из любой программы C++? Я не могу себе представить, как это работает. Не USB, а последовательный порт?, @Ant

ваш фиктивный код не имеет ввода-вывода на другое устройство ... он также имеет задержку в 1 секунду, в течение которой arduino ничего не делает ... см. Пример скетча blinkWithoutDelay, @jsotola

Это звучит как самоизменяющийся код, который не будет работать, это займет много времени. Почему бы не установить канал связи, чтобы они могли разговаривать друг с другом? Вы можете использовать CAN, Ethernet или что-то еще в зависимости от того, сколько данных и как быстро они должны быть переданы. RS485 будет работать с последовательным портом в Arduino. Помните, что если процессор имеет только один USART, который также должен использоваться для загрузки кода и т. Д. Данные могут быть сохранены в оперативной памяти. Вы можете использовать программное обеспечение serial или другой Arduino, который имеет более одного порта., @Gil

Трудно понять, о чем вы просите. Программа Arduino-это просто код на C++; если библиотека совместима, вы можете импортировать ее. Ардуино также могут быть очень ограничены ресурсами, поэтому важно знать тип Arduino. Можно использовать любой редактор/IDE с некоторой поддержкой Arduino (например, я использую Arduino IDE, VS Code и CLion)., @Dave Newton

Это ошибка копирования и вставки, что у вас нет функции loop ()? В настоящее время ваш код не поддается компиляции. И вам не хватает закрывающей скобки для цикла for? В настоящее время задержка находится внутри цикла for, но я думаю, что вы имеете в виду, что она находится снаружи., @chrisl

Какие ценности? В обе стороны? Из arduino -> Other Computer и из Other Computer -> Arduino?, @Dave X


1 ответ


2

Ваш вопрос кажется очень запутанным, поэтому я попытаюсь пролить свет на некоторые основные различия.

Как я могу получить некоторые постоянно меняющиеся значения из отдельной программы C++, введенной и загруженной в Arduino?

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

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

Как использовать последовательный порт в python, можно довольно легко погуглить. Для стороны Arduino есть много учебных пособий и примеров об этом в Интернете. Вам также нужно будет подумать о своем протоколе связи, который вы хотите наложить на поток последовательных байтов. Например, вы можете использовать текст в кодировке ASCII, каждое сообщение разделяется символом новой строки '\n', каждое сообщение содержит сначала команду, а затем необходимые параметры. Поскольку только вы знаете, что именно вы хотите отправить в Arduino, вам нужно спроектировать это самостоятельно.

Я замечаю, что когда я загружаю код на Arduino в IDE, ему требуется около секунды, чтобы начать двигаться. Это тоже проблема.

Это связано с загрузчиком. Когда вы загружаете программу, это делается через последовательный интерфейс. Обычно микроконтроллеры можно программировать только через специализированные интерфейсы (например, ISP). Но ардуино (и другие микроконтроллеры) можно запрограммировать с помощью загрузчика. Это программа, сидящая на микроконтроллере, которая запускается в любое время, когда вы включаете микроконтроллер при его сбросе. На ардуино он будет прослушивать последовательный порт на мгновение в случае, если вы хотите загрузить новый код. Если да, то он обрабатывает связь и записывает новый код во флэш-память ардуино. Если нет, то он выполнит любую программу, которая в данный момент сохранена во flash.

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

Я бы поспорил, действительно ли эта задержка является проблемой. Он появляется только при сбросе, например, когда вы загружаете новый код. И почему вы хотите сбросить Arduino или загрузить новые коды так быстро? Для выполнения вашего моторного движения вам не нужны новые программы на Arduino для каждого движения; вам нужен код, который будет двигаться в соответствии с данными, передаваемыми через последовательный интерфейс. И это не требует сброса настроек. И это работает быстро.

Тем не менее, с вашим текущим кодом (игнорируя очевидные синтаксические проблемы, скорее всего, из-за копирования и прошлых ошибок) у вас все равно будут задержки, даже когда вы реализуете последовательную связь. В общем случае вы не должны использовать вызовы long delay (). Вы используете delay(1000), что заставляет Arduino крутить большими пальцами в течение одной целой секунды каждую итерацию цикла. Вместо этого используйте неблокирующий стиль кодирования, показанный в примере BlinkWithoutDelay, который поставляется с Arduino IDE. Он использует функцию millis() в качестве часов, регулярно проверяя время, чтобы что-то сделать. В Интернете есть много учебных пособий по этому поводу.

Моя цель - получить обученную модель нейронной сети из версии PyTorch C++ для управления вращением и скоростью двигателя. Я бы предположил, что IDE не позволяет импортировать PyTorch?

Нет, это не так. Он основан на Java, а не на python. Как описано выше, вам нужно написать свою собственную программу python и использовать подходящий модуль python последовательного порта для связи по последовательному интерфейсу. В этой программе python вы можете импортировать PyTorch, выполнить обработку нейронной сети, а затем отправить полученные команды по последовательному каналу на Arduino.

Я попытался поискать это на сайте Arduino, но похоже, что IDE-единственный вариант. Моим решением было бы то, что импортирует библиотеку Arduino в программу C++ точно так же, как я импортирую библиотеку PyTorch в свою программу C++.

Не совсем понятно, что вы здесь имеете в виду. Для связи с Arduino по последовательному каналу вы можете использовать любую программу, которая может взаимодействовать с последовательным портом вашего ПК. Для этого существует множество программ. Поскольку вы хотите делать свои нейронные сети на python, просто используйте подходящий модуль python, который обрабатывает соединения с последовательным портом.

Если вы говорите о написании программ для ардуино и их загрузке: это можно сделать во многих других IDE, отличных от Arduino IDE. Дэйв Ньютон упомянул некоторые из них в своем комментарии: VS Code и CLion. Я также помню Atom IDE. Или вы можете написать свой код в любом текстовом редакторе по своему вкусу, а затем скомпилировать и загрузить код с помощью инструмента Arduino CLI (это то, что я делаю в основном).


Я надеюсь, что это немного прояснит путаницу, так что теперь вы можете работать над рабочим решением.

,

Я хочу импортировать PyTorch и сохраненную модель в Arduino IDE. Я не знал, возможно ли это, но сейчас работаю над тем, чтобы выяснить, возможно ли это. Если я не могу импортировать PyTorch и модель в IDE, мне нужна библиотека Arduino и возможность "загружать" код на устройство Arduino каким-то другим способом, о котором я еще не знаю. Вот о чем я спрашиваю. Я был бы признателен за поддержку моего вопроса. Я не вижу в этом никакой путаницы. Я не саркастичен, когда говорю это. Я НЕ собираюсь использовать Python. Если бы кто-то просто предложил метод, отличный от IDE, я бы дал им gr, @Ant

@Ant Но если вы не хотите использовать python, почему вы хотите импортировать PyTorch, который является библиотекой python? И вы определенно **не можете** импортировать PyTorch в Arduino IDE или программу Arduino. Просто совершенно разные фреймворки. Возможно, существуют библиотеки C++ для нейронных сетей, совместимых с Arduino, но тогда Uno, скорее всего, плохой выбор, так как у него так мало оперативной памяти и вычислительной мощности. Помещается ли модель в 2 КБ оперативной памяти? Я думаю, что есть платы микроконтроллеров, предназначенные для искусственного интеллекта, с гораздо большим количеством оперативной памяти и вычислительной мощности (скорее всего, не напрямую от Arduino, но совместимые с Arduino)., @chrisl

PyTorch доступен в версии C++. Я использую PyTorch в C++, @Ant

А, ладно, должно быть, я это перечитал. Конечно, вы можете включить в свой код любые библиотеки C++, которые вам нравятся. Вам нужно будет поместить эти библиотеки либо в папку библиотеки, либо в ту же папку, что и скетч, чтобы Arduino IDE нашел их. Хотя я не знаю, совместимы ли они или могут быть использованы с ардуино. Вы можете попробовать. Я бы предположил, что вы столкнулись с проблемами памяти на Uno. Также обратите внимание на динамическое распределение памяти, которое часто очень плохо работает на микроконтроллерах из-за фрагментации памяти. Завтра я изменю свой ответ, чтобы он лучше подходил, @chrisl

Дэйв Ньютон ответил, что я могу импортировать любую библиотеку C++. Я не понимал, что IDE достаточно гибка для этого. С тех пор как он это сказал, я пытаюсь установить версию PyTorch на C++. Мне требуется несколько часов, чтобы установить его с правильной версией CUDA и получить Pytorch "built" после установки. Ответ на мой вопрос - запустить Arduino в env с установленным Libtorch и поместить #include <torch/torch.h> в IDE. Я думаю. Мне здесь сказали, что это должно сработать., @Ant

Сегодня утром я думал о памяти. Да, мне может понадобиться пользовательское обновление!, @Ant