0

Drive Stepper Motor 28BYJ-48 Menggunakan Shift Register

Kali ini saya posting cara Drive Stepper Motor 28BYJ-48 Menggunakan Shift Register. Biar saya tebak, mungkin kalian kesini mempunyai masalah karena terbatasnya pin arduino pada saat kalian ingin mendrive beberapa motor stepper, atau mungkin kalian hanya coba-coba saja 😀

oke tanpa panjang lebar, kali ini kita akan mencoba mengatur putaran Stepper Motor 28BYJ-48 menggunakan IC ULN2803APG dan 74HC595N. Sebelum masuk ke rangkaian inti, kita akan bahas satu persatu dulu IC yang digunakan, pertama ULN280APG sendiri adalah jenis IC yang digunakan sebagai motor driver agar dapat membalikan arah putaran atau kecepatan motor Stepper. ULN2803APG teridiri dari array transistor Darlington, yang merupakan konfigurasi dari dua transistor (lihat gambar 1) yang memungkinkan untuk penguatan arus yang sangat tinggi. Ini berarti bahwa, dengan menarik hanya sejumlah kecil arus dari input (dalam hal ini, pin IO), perangkat dapat memberikan jumlah arus yang jauh lebih besar, yang diambil dari sumber tegangan eksternal, dan bukan dari IO pin. Dalam hal ULN2803A, setiap saluran dapat memberikan maksimum 500 mA.

Gambar 1 Darlington

Gambar 2 Pinout IC ULN2803APG

IC Shift Register 74HC595 merupakan IC dengan input serial dan output paralel 8 bit dengan menambahkan 8 bit Storage Register Type D. secara garis besar IC ini berisi kan serial in, kemudian  8 bit Shift Register yang disambungkan dengan 8 bit Storage Register. karena terdapat dua register yaitu shift dan storage maka pemberian clock pun menjadi terpisah antara clock untuk shift register dan clock untuk storage register. Input IC 74HC595 terdiri dari Output Enable (OE) merupakan buffer keluaran dari IC yang terhubung ke storage register, jika input ini diberikan logika High maka ouput akan menjadi High Impedance, jika diberi logika Low maka akan meneruskan output dari storage register. Untuk output terdiri dari keluaran buffer tri state yang terhubung dari keluaran storage register. output ini berjumlah 8 pin yaitu dari Q0 sampai Q7. dan terdapat pula Q7 aksen, yaitu keluaran dari shift register ke-8, yang bisa dihubungkan ke input IC 74HC595 kembali sebagai inputan. sehingga dapat dicascade dengan jumlah IC lebih dari satu buah.

Gambar 3 Pinout 74HC595N

Setelah kalian mendapat gambaran atas kedua IC yang akan di gunakan, lalu kita masuk ke rangkaian inti. Oh iya kalian harus siapkan alat dan bahan nya terlebih dahulu list nya dibawah ini:

  • Arduino (bebas jenis nya)
  • Kabel USB Arduino
  • IC ULN2803APG
  • IC SN74HC595N
  • Stepper Motor 28BYJ-48
  • Kabel Jumper (secukupnya)

Jika Sudah di siapkan kita lihat skematik di bawah Ini

Gambar 4 Skematik

Disini saya menggunakan arduino nano, kalian bisa menggantinya dengan jenis arduino yang lain, yang kalian punya. Susun rangkaian dan ikuti wiring seperti gambar di atas menggunakan kabel jumper. Pastikan wiring nya sudah terkoneksi dengan baik, tidak ada yang salah jumper. Jika sudah dirasa koneksi nya sudah benar semua, sekarang kita tinggal program arduino nya, dengan memasukkan source code di bawah ini

 

/*
 * Kontrol Stepper Menggunakan Shift Register
 * https://www.ngulik.id/2020/03/drive-stepper-motor-shift-register.html
 * 09/03/2020, 14:23, Bandung
 */

int SER_Pin = 11;   //pin 14 75HC595
int RCLK_Pin = 10;  //pin 12 75HC595
int SRCLK_Pin = 13; //pin 11 75HC595

#define number_of_74hc595s 1
#define numOfRegisterPins number_of_74hc595s * 8

boolean registers[numOfRegisterPins];

void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
     registers[i] = LOW;
  }
} 

void writeRegisters(){

  digitalWrite(RCLK_Pin, LOW);

  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);

    int val = registers[i];

    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
  }
  digitalWrite(RCLK_Pin, HIGH);
}

void setRegisterPin(int index, int value){
  registers[index] = value;
}

int motorPin1 = 0;  // Biru   - 28BYJ48 pin 1
int motorPin2 = 1;  // Pink   - 28BYJ48 pin 2
int motorPin3 = 2;  // Kuning - 28BYJ48 pin 3
int motorPin4 = 3;  // Orange - 28BYJ48 pin 4
                    // Merah    - 28BYJ48 pin 5 (VCC)

int motorSpeed = 0;     
const int potPin = 2;   //potentiometer Dihubungkan ke A2
int potValue = 0;  


void setup() {

  Serial.begin(9600);
  
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);

  clearRegisters();
  writeRegisters();
}


void loop(){

  potValue = analogRead(potPin);     
  Serial.println(potValue);          
  if (potValue < 535){               
    motorSpeed = (potValue/15 + 5);  
    clockwise();                     
  }
  else {                             
    motorSpeed = ((1024-potValue)/15 + 5); 
    counterclockwise(); 
  }
}


void counterclockwise (){
  // 1
  setRegisterPin(motorPin1, HIGH);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin4, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 2
  setRegisterPin(motorPin1, HIGH);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin4, LOW);
  writeRegisters(); 
  delay (motorSpeed);
  // 3
  setRegisterPin(motorPin1, LOW);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin4, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 4
  setRegisterPin(motorPin1, LOW);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin4, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 5
  setRegisterPin(motorPin1, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin4, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 6
  setRegisterPin(motorPin1, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin4, HIGH);
  writeRegisters(); 
  delay (motorSpeed);
  // 7
  setRegisterPin(motorPin1, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin4, HIGH);
  writeRegisters(); 
  delay(motorSpeed);
  // 8
  setRegisterPin(motorPin1, HIGH);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin4, HIGH);
  writeRegisters(); 
  delay(motorSpeed);
}

void clockwise(){
  // 1
  setRegisterPin(motorPin4, HIGH);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin1, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 2
  setRegisterPin(motorPin4, HIGH);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin1, LOW);
  writeRegisters(); 
  delay (motorSpeed);
  // 3
  setRegisterPin(motorPin4, LOW);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin1, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 4
  setRegisterPin(motorPin4, LOW);
  setRegisterPin(motorPin3, HIGH);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin1, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 5
  setRegisterPin(motorPin4, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin1, LOW);
  writeRegisters(); 
  delay(motorSpeed);
  // 6
  setRegisterPin(motorPin4, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin2, HIGH);
  setRegisterPin(motorPin1, HIGH);
  writeRegisters(); 
  delay (motorSpeed);
  // 7
  setRegisterPin(motorPin4, LOW);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin1, HIGH);
  writeRegisters(); 
  delay(motorSpeed);
  // 8
  setRegisterPin(motorPin4, HIGH);
  setRegisterPin(motorPin3, LOW);
  setRegisterPin(motorPin2, LOW);
  setRegisterPin(motorPin1, HIGH);
  writeRegisters(); 
  delay(motorSpeed);
}

Gimana Berhasil?? mudah bukan?? terimakasih telah mengunjungi web kami, semoga ilmu yang saya berikan bermanfaat buat kalian. Oh iya, ikuti kami di instagram @idngulik dan Youtube Ngulik ID.

rp.rusdiana

Leave a Reply

Your email address will not be published. Required fields are marked *