Как приостановить Arduino на 1 миллисекунду через MATLAB?


8

Я смог подключить 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.


Похоже, вам нужно что-то вроде GRBL . Это отдельная программа для платы Arduino, которая интерпретирует командный язык и производит скоординированные движения шагового двигателя. Он в основном предназначен для обработки с ЧПУ, но, вероятно, может делать то, что вам нужно.
Коннор Вольф

Ответы:


6

Увеличение наблюдаемой задержки связано со временем, которое требуется для отправки команды из MATLAB в Arduino, чтобы ее код выполнил запрошенную команду. В вашем случае a.digitalWrite. Таким образом, фактическое время между импульсами, использующими задержку MATLAB, составляет 0,001 паузы плюс время скорости передачи, умноженное на размер пакета и декодирование, а затем выполнение.

Я бы порекомендовал не использовать это решение MATLAB для дистанционного управления временем Step Motors. Поскольку эта скрытая связь будет разочаровывающим ограничением. Отмечая, что для шаговых двигателей время не может позволить себе такое скрытое исполнение. Следовательно, все 3D-принтеры и многие ЧПУ со Step Motors используют Arduino, которые получают G-код (команды перемещения двигателя с пунктами назначения), а встроенное ПО в реальном времени обрабатывает пошаговое выполнение в пределах допусков.

Я бы предложил использовать что-то вроде прошивки grbl с защитой шагового двигателя, а затем MATLAB отправить необходимый G-код. Там, где есть другие с гораздо большим количеством функций, но с учетом 3D-печати. GRBL проще и прямолинейнее движущихся двигателей.


0

Из вашего вопроса не ясно, пытаетесь ли вы выполнить в реальном времени без задержки или просто хотите отрегулировать время задержки двигателя с помощью MATLAB. Если последнее, хорошим способом является отправка данных о задержке (например, число, представляющее, сколько времени вы хотите между импульсами) через последовательный порт, который получит ваша программа Arduino, и при необходимости обновит задержку двигателя. Или, принимая во внимание ограничения ОЗУ, вы можете отправить целую последовательность задержек, которые могут запускаться одна за другой с точным временем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.