Как остановить Arduino на 1 миллисекунду с помощью MATLAB?
Мне удалось подключить MATLAB к моему Uno с помощью этой строки кода: a = arduino('COM4');
через этот пакет: Пакет поддержки Matlab для Arduino.
Сейчас MATLAB — мой основной скрипт, который будет синхронизировать все компоненты [например, Arduino].
Я могу посылать импульсы на свой шаговый двигатель, просто используя:
void loop() {
digitalWrite(2, HIGH);
delay(1);
digitalWrite(2, LOW);
delay(1);
}
Это работает отлично и заставит двигатель двигаться примерно каждые 2 миллисекунды. Моя проблема в том, что я не могу найти способ создать такую же задержку через интерфейс MATLAB. Я знаю, что в MATLAB есть функция pause()
, но когда я настраиваю цикл в MATLAB следующим образом:
a = arduino('COM4');
for m = 1:400
a.digitalWrite(2, 1);
pause(0.001);
a.digitalWrite(2, 0);
pause(0.001);
end
Каждый шаг занимает НАМНОГО больше времени — около 200 миллисекунд каждый.
Каковы другие варианты создания паузы между цифровыми High / Low, отправляемыми на Arduino? Было бы неплохо, если бы я мог контролировать результат из Matlab через Arduino.
2 ответа
Лучший ответ:
Увеличение наблюдаемой задержки связано со временем, которое требуется для отправки команды из MATLAB в Arduino, чтобы ее код выполнил запрошенную команду. В вашем случае это a.digitalWrite. Таким образом, фактическое время между импульсами с использованием задержки MATLAB составляет 0,001 паузы плюс время скорости передачи, умноженное на размер пакета и декодирование, а затем выполнение.
Я бы рекомендовал не использовать это решение MATLAB, управляющее синхронизацией шаговых двигателей удаленно. Поскольку эта скрытая связь будет досадным ограничением. Отмечая, что для шаговых двигателей синхронизация не может позволить себе такое скрытое выполнение. Поэтому все 3D-принтеры и многие ЧПУ с шаговыми двигателями используют Arduino, которые получают G-код (команды перемещения двигателя с пунктами назначения), а прошивка в реальном времени обрабатывает шаг в пределах допусков.
Я бы предложил использовать что-то вроде прошивки grbl с шилдом шагового двигателя, а затем заставить MATLAB отправить необходимый G-код. В то время как есть другие с гораздо большими возможностями, но адаптированные для 3D-печати. grbl проще и напрямую подходит к движущимся двигателям.
Из вашего вопроса не ясно, пытаетесь ли вы получить выполнение в реальном времени без задержек или просто хотите настроить время задержки двигателя из MATLAB. Если последнее, то хорошим способом будет отправка данных задержки (например, числа, представляющего желаемую вами длительность между импульсами) через последовательный порт, который ваша программа Arduino получит и обновит задержку двигателя по желанию. Или, учитывая ограничения ОЗУ, вы можете отправить целую последовательность задержек, которые могут выполняться одна за другой с точной синхронизацией.
- Отправка синусоиды из MATLAB и чтение на Arduino Uno
- Что мне не хватает? Отправка данных из Matlab в Arduino на Micro SD
- Arduino и MatLab с OWI Robotic Arm Edge - Проблема с I2C
- про получение float на матлабе от ATmega32 Avr
- Получение данных от сети 120В 50/60Гц
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
Похоже, вам нужно что-то вроде [GRBL](https://github.com/grbl/grbl). Это автономная программа для платы arduino, которая интерпретирует командный язык и производит скоординированные движения шагового двигателя. Она в основном предназначена для обработки на станках с ЧПУ, но, вероятно, может делать то, что вам нужно., @Connor Wolf