Piring Putar Motor Stepper Terkontrol Serial dengan Arduino
Komponen dan Perlengkapan
Berikut adalah komponen yang dibutuhkan untuk proyek piring putar berbasis motor stepper:
Motor stepper 28BYJ48
1
Driver Motor Stepper X113647
1
Hub Mounting Aluminium Universal Pololu untuk Poros 5mm
1
Arduino UNO
1
Dasar kayu 15cm x 15cm
1
Penutup karet
4
Alat dan Mesin yang Diperlukan
Gergaji kerucut (fretsaw)
Bor dengan mata bor 6mm untuk kayu
Tentang Proyek Ini
Cerita lengkap tersedia di: https://www.cesarebrizio.it/Arduino/Turntable.html
Proyek ini adalah platform putar berbasis motor stepper.
Model stepper adalah 28BYJ48, dikontrol melalui driver motor stepper X113647 (berbasis IC ULN2003A) yang biasanya dibeli bersama stepper.
Platform dapat berputar ke kedua arah dan dikontrol melalui serial monitor atau Tera Term.
Perintah yang diimplementasikan:
R = Berputar searah jarum jam secara berkelanjutan (berarti: untuk beberapa putaran)
r = Berputar 360 derajat; searah jarum jam
L = Berputar berlawanan jarum jam secara berkelanjutan (berarti: untuk beberapa putaran)
l = Berputar 360 derajat; berlawanan jarum jam
S = Berhenti berputar
Dari segi mekanika, pemasangan sangat sederhana: cukup persegi plywood atau bahan serupa, sekitar 15cmx15cm, diperlukan untuk meja dasar.
Pusat meja akan ditemukan di persimpangan diagonal - lubang 6mm akan dibor tepat di titik tersebut.
Hub stepper berada di tengah-sisi: dengan menempelkan hub ke lubang 6mm, kontur stepper dapat digambar dengan pensil.
Selanjutnya, lubang bundar yang sempit mungkin di sekitar kontur stepper akan dipotong dengan gergaji kerucut, sehingga dua lubang pemasang stepper menempel kuat pada kayu meja, sehingga dapat digunakan untuk memasang stepper ke meja.
Penutup karet tinggian 10mm diperlukan untuk memberikan kelonggaran yang diperlukan (stepper akan sedikit menjorok di bawah meja).
Piring putar akan dipasang ke stepper berkat Pololu Universal Aluminum Mounting Hub untuk Poros 5mm.
Sumber informasi:
Kontrol stepper kecil: https://arduino-info.wikispaces.com/SmallSteppers
Sebenarnya saya menggunakan 4 pin yang berbeda, namun ilustrasi rangkaian di bawah ini secara akurat mereproduksi koneksi. Melihat foto di atas (Kabel merah dari Arduino menggantikan 'Pink'):
/* Piring putar berbasis stepper dikontrol oleh dialog serial
Rangkaian dan komentar: Lihat https://www.cesarebrizio.it/Arduino/Turntable.html
Rangkaian seperti yang diilustrasikan di sini: https://www.tdegypt.com/wp-content/uploads/2017/08/stepper-motor-wiring.png
kecuali bahwa skets ini menggunakan output digital 4 - 5 - 6 - 7 sementara diagram Fritzing dibuat 23 Des 2017
dimodifikasi oleh Cesare Brizio
Contoh kode ini berada di domain publik.
Skets ini mengontrol platform putar berbasis motor stepper.
Model stepper adalah 28BYJ48, dikontrol melalui Driver Motor Stepper X113647 (berbasis IC ULN2003A)
yang biasanya dibeli bersama stepper.
Platform dapat berputar ke kedua arah dan dikontrol melalui Serial Monitor atau Tera Term.
Perintah yang diimplementasikan:
R = Berputar searah jarum jam secara berkelanjutan (berarti: untuk beberapa putaran)
r = Berputar 360 derajat; searah jarum jam
L = Berputar berlawanan jarum jam secara berkelanjutan (berarti: untuk beberapa putaran)
l = Berputar 360 derajat; berlawanan jarum jam
S = Berhenti berputar
Sumber informasi:
Kontrol stepper kecil: https://arduino-info.wikispaces.com/SmallSteppers
*/
/*-----( Impor perpustakaan yang dibutuhkan )-----*/
#include <AccelStepper.h>
/*-----( Deklarasi Konstanta dan Nomor Pin )-----*/
/* JANGAN PERNAH MELETAKKAN ; SETELAH Pernyataan #define!!!! */
// pin motor
#define motorPin1 4 // Biru - pin 1 28BYJ-48
#define motorPin2 5 // Pink - pin 2 28BYJ-48
#define motorPin3 6 // Kuning - pin 3 28BYJ-48
#define motorPin4 7 // Oranye - pin 4 28BYJ-48
// Merah - pin 5 28BYJ-48 (VCC)
// Biru - pin GND 28BYJ-48
#define STEPS_PER_TURN 2048 // jumlah langkah dalam 360 derajat
int motorSpeed = 500; // Kecepatan tinggi (800 dan di atas) dapat menyebabkan perilaku tidak stabil pada 28BYJ-48
int motorAccel = 400; // Sebagai yang di atas: lebih baik menghindari percepatan ekstrim
int myPos = 0; // akan digunakan untuk menentukan titik awal untuk putaran 360 derajat
int LeftTurnUp = 0; // Pasang bendera untuk menentukan arah putaran
int RightTurnDown = 0; // Pasang bendera untuk menentukan arah putaran
int Continuous = 0; // digunakan di bawah untuk membedakan perintah putaran tunggal
int incomingByte = 0; // untuk data serial masuk
/*-----( Objek untuk kontrol stepper )-----*/
// Siapkan stepper sebagai 4 kabel bipolar pada pin 4,5,6,7
// CATATAN: Urutan 1-3-2-4 diperlukan untuk pemutaran yang benar dari 28BYJ48
AccelStepper stepper(4,motorPin1,motorPin3,motorPin2,motorPin4);
void setup() {
Serial.begin(9600);
stepper.setMinPulseWidth(20); // Pengaturan yang disarankan untuk menghindari pulsa dari Arduino terlalu cepat untuk didekode
stepper.setMaxSpeed(motorSpeed);
stepper.setSpeed(motorSpeed);
stepper.setAcceleration(motorAccel);
// dua baris berikut mereset "nol langkah" ke posisi saat ini
stepper.setCurrentPosition(stepper.currentPosition());
stepper.runToPosition();
Serial.println("Perintah yang tersedia:");
Serial.println("R = putaran searah jarum jam berkelanjutan");
Serial.println("r = putaran searah jarum jam 360 derajat");
Serial.println("L = putaran berlawanan jarum jam berkelanjutan");
Serial.println("l = putaran berlawanan jarum jam 360 derajat");
Serial.println("S = berhenti putaran");
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'R') {
Serial.println("terima «R» - mengaktifkan putaran searah jarum jam berkelanjutan");
stepper.stop();
stepper.runToPosition();
LeftTurnUp = 1;
RightTurnDown = 0;
Continuous = 1;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
}
if (incomingByte == 'L') {
Serial.println("terima «L» - mengaktifkan putaran berlawanan jarum jam berkelanjutan");
stepper.stop();
stepper.runToPosition();
RightTurnDown = 1;
LeftTurnUp = 0;
Continuous = 1;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
}
if (incomingByte == 'r') {
Serial.println("terima «r» - mengaktifkan putaran searah jarum jam tunggal");
stepper.stop();
stepper.runToPosition();
LeftTurnUp = 1;
RightTurnDown = 0;
Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
myPos = stepper.currentPosition();
}
if (incomingByte == 'l') {
Serial.println("terima «l» - mengaktifkan putaran berlawanan jarum jam tunggal");
stepper.stop();
stepper.runToPosition();
RightTurnDown = 1;
LeftTurnUp = 0;
Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
myPos = stepper.currentPosition();
}
if (incomingByte == 'S') {
Serial.println("terima «S» - berhenti putaran");
LeftTurnUp = 0;
RightTurnDown = 0;
stepper.stop();
stepper.runToPosition();
}
}
if (Continuous == 1) {
if (LeftTurnUp == 1) {
stepper.moveTo(10000);
}
if (RightTurnDown == 1) {
stepper.moveTo(-10000);
}
stepper.run();
}
if (Continuous == 0) {
if (LeftTurnUp == 1) {
stepper.moveTo(myPos + STEPS_PER_TURN);
}
if (RightTurnDown == 1) {
stepper.moveTo(myPos - STEPS_PER_TURN);
}
}
stepper.run();
}