Setelah mendalami dengan seksama datasheet ZD-8731, kini saatnya kita coba interfacing dengan mikrokontroler. Untuk tahap pertama, saya akan menggunakan Arduino Uno yang sangat mudah untuk digunakan sebagai rapid prototyping sebelum pada akhirnya berinteraksi dengan mikrokontroler telanjang.
Kita akan menggunakan sistem koneksi common katode (common ground). Karena tegangan output arduino adalah 5V, maka tidak diperlukan resistor limitting current. Pin Pulse / CP (-), Offline / Enable (-), dan DIR (-) dihubungkan menjadi satu dengan ground Arduino. Sedangkan masing-masing pin (+) dihubungkan ke digital pin yang berbeda pada Arduino.
Mengapa memerlukan koneksi ini? ZD-8731 sudah memiliki optocoupler untuk mengisolasi rangkaian DC (Arduino) bertegangan rendah dan rangkaian stepper motor bertegangan lebih tinggi dengan banyak harmonik yang mengotori tegangan (akibat motor).
Selanjutnya, motor yang akan digunakan adalah motor bipolar dengan empat buah kabel (2 pasang kabel). Untuk mencari kabel yang berpasangan pada motor stepper, kita dapat menggunakan bantuan LED. LED dihubungkan pada dua dari empat kabel. Kemudian motor stepper digerakan secara manual dengan memutar rotor. Apabila LED tersebut menyala, maka kedua kabel tersebut berpasangan. Cara lain adalah dapat menggunakan multimeter untuk menguji keterhubungan kabel.
Division yang akan digunakan adalah 16 sehingga kita dapat memanfaatkan ketelitian penuh dari motor driver ini. Motor stepper yang digunakan memiliki 200 step untuk satu kali putaran. Dengan menggunakan pembagi 16 pada motor driver, kita dapat memiliki 3200 step untuk satu kali putaran. Hal ini menambah ketelitian sistem dan memperhalus gerakan motor. Dari datasheet LV8731, output dari masing-masing kanal diberikan sebagai berikut. Dengan demikian, untuk menggerakan motor satu step, kita perlu memberikan pulse low pada CP(+) selama minimal 500ns. Dengan demikian motor akan bergerak satu step.
Current settings yang akan digunakan adalah 2A sesuai dengan spesifikasi motor stepper yang digunakan.
Fungsi ENABLE (OFFLINE) pada motor driver ini adalah menentukan ketersediaan arus yang diberikan pada motor stepper. Pada saat ENABLE diaktifkan (LOW pada Common Katode), maka motor akan dialiri arus untuk mempertahankan posisi motor (LOCKED). Kita tidak dapat memutar motor secara manual. Bila ENABLE dimatikan (HIGH pada Common Katode), maka motor tidak dialiri arus (UNLOCKED) sehingga kita bebas menggerakan motor secara manual.
Untuk mengatur arah gerak, cukup mengatur HIGH atau LOW pada pin DIR(+).
Berikut ini adalah kode Arduino yang digunakan. Pada kode ini juga dilakukan penghitungan step dan penghitungan putaran. Kita dapat memantau dari komunikasi serial.
int PulsePin = 8;
int PWMPin = 5;
int DirPin = 9;
int EnPin = 10;
int incomingByte;
int isPulseEnabled;
int idx=0;
int rev=0;
int totalstep=0;void setup()
{
pinMode(PulsePin, OUTPUT);
pinMode(DirPin, OUTPUT);
pinMode(EnPin, OUTPUT);
digitalWrite(PulsePin,HIGH);
digitalWrite(EnPin, LOW);
digitalWrite(DirPin, HIGH);
idx=0;
isPulseEnabled=0;
analogWrite(PWMPin,254);
Serial.begin(9600);
}void loop()
{
if(isPulseEnabled==1)
{
digitalWrite(PulsePin, LOW);
delay(1);
digitalWrite(PulsePin, HIGH);
delay(1);
idx=idx+1;
if(idx==3200)
{
idx=0;
rev=rev+1;
Serial.print(“Full Rotation Completed: Rotation:”);
Serial.println(rev,DEC);
Serial.print(“\n”);
}
if(rev==10)
{
Serial.print(“10 Rotation has been reached.\n”);
totalstep = rev*3200 + idx;
isPulseEnabled=0;
rev=0;
idx=0;
Serial.print(“Step Count:”);
Serial.println(totalstep,DEC);
Serial.print(“\n”);
}
}
if (Serial.available()>0)
{
incomingByte=Serial.parseInt();
if(incomingByte==1)
{
if(digitalRead(EnPin)==HIGH)
{
Serial.print(“Enabling Movement\n”);
digitalWrite(EnPin, LOW);
}
else
{
Serial.print(“Disabling Movement\n”);
digitalWrite(EnPin, HIGH);
}
}
else if (incomingByte==2)
{
if(digitalRead(DirPin)==HIGH)
{
Serial.print(“Direction Counter Clockwise\n”);
digitalWrite(DirPin, LOW);
}
else
{
Serial.print(“Direction Clockwise\n”);
digitalWrite(DirPin, HIGH);
}
}
else if (incomingByte==3)
{
if(isPulseEnabled==1)
{
Serial.print(“Pulse Disabled\n”);
totalstep = rev*3200 + idx;
isPulseEnabled=0;
rev=0;
idx=0;
Serial.print(“Step Count:”);
Serial.println(totalstep,DEC);
Serial.print(“\n”);
}
else
{
Serial.print(“Pulse Enabled\n”);
isPulseEnabled=1;
idx=0;
}
}
}
}
Selanjutnya, kita akan menguji apa yang telah kita lakukan. Kita akan mengamati lebih jauh menggunakan bantuan osiloskop.
Pengamatan menggunakan osiloskop pada Pin Pulse (+) yang diberikan oleh Arduino, Pin Motor Channel 1, dan Pin Motor Channel 2.
Enabled Dimatikan (HIGH), Tidak ada pulse yang diberikan. Kontrol motor tidak berfungsi.
Enabled Dinyalakan (HIGH), Tidak ada pulse yang diberikan. Kontrol motor berfungsi dengan memberi arus pada motor melalui kedua kanal output agar motor tetap dalam posisi (LOCKED).
Enabled Dinyalakan (HIGH), Pulse diberikan. Kontrol motor berfungsi dengan memberi arus pada motor melalui kedua kanal output sedemikian rupa sehingga motor bergerak satu step untuk satu pulse.
Daaannnn… motor stepper pun bergerak baik maju maupun mundur bergantung pada DIR(+) yang diberikan. Selanjutnya, kita akan menguji seberapa presisi satu step motor stepper tersebut untuk pergerakan linear. Kita membuat Arduino memberikan pulse sebanyak 32000 kali (10 putaran) lalu kita ukur dengan penggaris panjang jarak yang ditempuh. Hasil pengukuran diberikan sebagai berikut.
Jumlah Step: 32000
Jarak yang ditempuh: 0,04 m (4 cm)
Jarak yang ditempuh untuk 1 Step = 0,00000125 m (1,25 um)
Surprised heh? Resolusinya kecil sekali, jauh lebih kecil dari yang kami rencanakan yaitu 1 mm. Sangat luar biasa hebat. Mengingat sensor posisi yang akan digunakan dapat mencapai resolusi 488nm, seharusnya hal ini tidak akan menjadi masalah.
Satu hal yang perlu diperhatikan adalah masalah panas. Seiring motor kontroler dan stepper digunakan (ENABLED), arus tetap mengalir. Hal ini membuat keduanya panas. Oleh karena itu, manajemen arus diperlukan untuk mencegah overheating. Selain itu penambahan heatsink juga menjadi konsiderasi.
Recent Comments