Bagaimana cara menjeda Arduino selama 1 milidetik melalui MATLAB?

8

Saya telah dapat menghubungkan MATLAB ke Uno saya dengan baris kode ini: a = arduino('COM4');melalui paket ini: paket dukungan Matlab untuk Arduino .

Saat ini, MATLAB adalah skrip utama saya yang akan menyinkronkan semua komponen [seperti Arduino].

Saya dapat mengirim pulsa ke motor langkah saya hanya dengan menggunakan:

void loop() {
    digitalWrite(2, HIGH);
    delay(1);
    digitalWrite(2, LOW);
    delay(1);
}

Ini berfungsi dengan baik, dan akan membuat motor bergerak setiap 2 milidetik. Masalah saya adalah bahwa saya tidak dapat menemukan cara untuk menghasilkan penundaan yang sama melalui antarmuka MATLAB. Saya tahu bahwa MATLAB memiliki pause()fungsi, tetapi ketika saya mengatur loop di MATLAB seperti ini:

a = arduino('COM4');
for m = 1:400
    a.digitalWrite(2, 1);
    pause(0.001);
    a.digitalWrite(2, 0);
    pause(0.001);
end

Setiap langkah membutuhkan WAY lebih lama - masing-masing sekitar 200 milidetik.

Apa pilihan lain untuk membuat jeda antara digital Tinggi / Rendah yang dikirim ke Arduino? Akan lebih baik jika saya bisa mengendalikan hasilnya dari Matlab, melalui Arduino.

Filsuf yang salah
sumber
Sepertinya Anda memerlukan sesuatu seperti GRBL . Ini adalah program yang berdiri sendiri untuk arduino board yang mengartikan bahasa perintah, dan menghasilkan gerakan motor stepper yang terkoordinasi. Ini sebagian besar ditujukan untuk permesinan CNC, tetapi mungkin dapat melakukan apa yang Anda butuhkan.
Connor Wolf

Jawaban:

6

Peningkatan keterlambatan yang diamati adalah karena waktu yang diperlukan untuk mengirim perintah dari MATLAB ke Arduino memiliki kode yang menjalankan perintah yang diminta. Dalam kasus Anda a.digitalWrite. Jadi waktu aktual antara pulsa menggunakan penundaan MATLAB adalah 0,001 jeda ditambah waktu baud rate dikalikan ukuran paket dan decoding kemudian eksekusi.

Saya akan merekomendasikan tidak mengejar solusi ini dari MATLAB mengendalikan pengaturan Step Motors, dari jarak jauh. Karena sambungan laten ini akan menjadi batasan yang membuat frustrasi. Memperhatikan bahwa untuk motor langkah, waktu tidak dapat melakukan eksekusi laten tersebut. Karenanya semua printer 3D dan banyak CNC dengan Step Motors menggunakan Arduino yang mendapatkan G-Code (perintah pemindahan motor dengan tujuan) dan firmware Real-time menangani loncatan, dengan toleransi.

Saya akan menyarankan menggunakan sesuatu seperti grbl firmware dengan step motor shield dan kemudian minta MATLAB mengirim kode-G yang diperlukan. Di mana ada yang lain dengan lebih banyak fitur tetapi disesuaikan dengan Pencetakan 3d. grbl lebih sederhana dan langsung ke titik motor bergerak.

mpflaga
sumber
0

Tidak jelas dari pertanyaan Anda apakah Anda mencoba untuk mendapatkan eksekusi real-time tanpa latensi atau hanya ingin menyesuaikan waktu tunda motor dari MATLAB. Jika yang terakhir, cara yang baik adalah mengirim data keterlambatan (mis. Angka yang menunjukkan berapa lama Anda ingin antar pulsa) melalui serial, yang akan diterima oleh program Arduino Anda dan memperbarui penundaan motor sesuai keinginan. Atau, mengingat keterbatasan RAM, Anda dapat mengirim seluruh rangkaian penundaan yang dapat dijalankan satu demi satu dengan pengaturan waktu yang tepat.

MichaelT
sumber