Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Ubah Motor DC Apa Pun menjadi Servo 360° Kustom – Panduan Langkah demi Langkah

Dalam tutorial ini kita akan mempelajari cara mengubah motor DC apa pun menjadi motor servo kustom yang berdiri sendiri dengan banyak fitur. Tidak seperti servo biasa yang memiliki batasan gerak 180 atau 270 derajat, servo ini memiliki jangkauan 360 derajat yang tidak terbatas dan selain itu kami memiliki kemampuan untuk menyesuaikan rentang putaran ke nilai berapa pun yang kami perlukan.

Menurut saya, itu cukup berguna, dan yang terpenting, kita bahkan dapat menyesuaikan titik pusat servo. Jadi, kita bisa mengatur titik pusat dan rentang putarannya secara bersamaan.

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Fitur lainnya adalah kita dapat mengatur sensitivitas atau seberapa cepat servo akan merespon masukan kita. Berbicara tentang masukan, kita dapat memiliki tiga mode masukan yang berbeda.

Kita dapat mengontrol servo dengan input tegangan analog atau menggunakan potensiometer, kita dapat mengontrol servo dengan pemancar RC serta mengontrol servo melalui port serial dengan memasukkan nilai sudut melalui monitor serial di PC atau laptop kita.

Kita juga dapat melakukannya secara bersamaan, mengontrol servo dengan memasukkan nilai melalui monitor serial dan menggerakkan servo secara manual menggunakan pemancar RC. Motor servo akan mengetahui posisinya saat ini setiap saat dan dapat melihatnya di monitor serial. 

Di atas daftar fitur motor servo ini, adalah mode rotasi berkelanjutan. Itu benar. Kita dapat mengontrol dan melacak posisi motor servo bahkan dalam mode putaran terus menerus ini. Kita dapat mengatur poros motor servo untuk menuju ke posisi manapun dengan jumlah putaran yang tidak terbatas.  

Semua ini dimungkinkan berkat encoder 12-bit yang digunakan motor servo ini, sensor posisi putar magnetik AS5600, dan kontrol PID yang diterapkan untuk menggerakkan motor DC.

Saya membuat papan pengontrol motor servo khusus yang mencakup mikrokontrolernya sendiri dan yang lainnya untuk dengan mudah mengubah motor DC apa pun menjadi motor servo yang berdiri sendiri.

Kita hanya perlu menempatkan papan di tengah poros keluaran (termasuk magnet tertentu pada poros), menghubungkan motor DC ukuran apa pun dengan arus pengenal hingga 3,5A, memberi daya ke seluruh sistem dengan 12V dan hanya itu, kita mendapatkan motor servo dari motor DC normal dengan semua fitur ini.

Sekarang saya akan memandu Anda melalui seluruh proses pembuatan motor servo yang dibuat khusus ini sehingga Anda juga dapat membuatnya sendiri. Saya akan menjelaskan prinsip kerja motor servo, pengontrol loop tertutup, pengontrol PID, cara saya mendesain PCB khusus untuknya dan girboksnya, serta menjelaskan kode di baliknya.

Prinsip Kerja Motor Servo

Untuk menjelaskan prinsip kerja motor servo, mari kita bongkar motor servo RC pada umumnya dan lihat isinya.

Kita dapat melihat bahwa ia memiliki motor DC kecil, papan pengontrol, potensiometer dan sambungan tiga kabel, dua kabel untuk daya dan satu untuk sinyal input. Selain itu terdapat beberapa roda gigi untuk mengurangi kecepatan dan meningkatkan torsi motor DC. 

Ini adalah pengaturan umum untuk sebagian besar motor RC atau motor servo hobi. Potensiometer dipasang pada poros keluaran motor DC, dan berfungsi sebagai sensor posisi, yang memberitahu pengontrol posisi poros motor servo saat ini. Papan pengontrol mengontrol motor DC berdasarkan sinyal input (posisi yang diinginkan) dan posisi sebenarnya yang kita peroleh sebagai umpan balik dari potensiometer. Ini mewakili sistem kontrol loop tertutup.

Sinyal masukan atau posisi yang diinginkan dibandingkan dengan posisi motor sebenarnya yang kita peroleh dari sensor umpan balik posisi. Perbedaan yang terjadi disebut dengan error, kemudian diproses pada pengontrol yang memerintahkan motor untuk bergerak hingga mencapai posisi yang diinginkan.

Cara Membuat Motor Servo Custom

Jadi, jika kita ingin membuat motor servo kita sendiri dengan motor DC yang lebih besar daripada yang digunakan servo RC pada umumnya, kita dapat menerapkan sistem kontrol loop tertutup yang sama.

Kita hanya memerlukan sensor posisi yang dipasang pada poros keluaran dan mikrokontroler untuk menggerakkan motor DC.  

Sedangkan untuk sensor posisi, solusi paling sederhana adalah dengan menggunakan potensiometer sederhana seperti yang kita lihat di servo RC. Masalah dengan potensiometer jenis ini adalah rentang putarannya terbatas hanya 270 derajat, yang secara langsung membatasi rentang putaran motor servo. Ada juga jenis potensiometer lain yang dapat melakukan banyak putaran dan dapat memberikan jangkauan dan resolusi yang lebih baik, namun tetap saja rotasinya terbatas.

Jika kita membutuhkan motor servo yang memiliki jangkauan putaran tidak terbatas, maka kita perlu menggunakan encoder. Encoder adalah perangkat elektro-mekanis yang dapat melacak posisi sudut poros dengan putaran tak terbatas. Ada banyak jenis encoder seperti inkremental atau absolut, atau bergantung pada teknologi penginderaan optik, magnetik, atau kapasitif. Tentunya masing-masing mempunyai kelebihan dan kekurangan masing-masing.

Encoder AS5600 – Sensor Posisi Putar Magnetik

Saya memilih untuk menggunakan encoder magnetik, atau sensor posisi putar magnetik AS5600, karena encoder ini sangat kompak dan mudah diterapkan sehingga memberikan presisi atau resolusi tinggi. Lihat saja betapa kecilnya microchip ini.

Ia memiliki sensor Hall-Effect internal yang dapat mendeteksi perubahan arah medan magnet. Jadi, kita tinggal menempelkan magnet pada poros keluaran motor dan memposisikannya di dekat microchip dengan jarak 0,5 hingga 3mm.

Sekarang saat poros motor dan magnet berputar, sensor Hall-Effect akan menangkap perubahan arah medan magnet tersebut. Dengan bantuan konverter A/D 12-bit bawaan, sensor AS5600 dapat menghasilkan 4096 posisi per putaran atau rotasi 360 derajat.

Artinya, dapat mendeteksi perubahan posisi sudut sekecil 0,0878 derajat. Itu cukup mengesankan, dan karena harganya sangat terjangkau dan mudah didapat, ini adalah pilihan yang tepat untuk motor servo yang dibuat khusus. 

Baiklah, jadi apa lagi yang kita butuhkan, mikrokontroler dan driver motor DC. Saya memilih driver motor DC DRV8871 yang mampu menangani arus hingga 3,5 amp, dan mikrokontroler Atmega328.

Saya memilih versi pemasangan di permukaan, karena lebih ringkas daripada versi DIP, dan tujuan saya adalah membuat PCB khusus sekecil mungkin sehingga saya dapat memasukkan semuanya sehingga servo dapat berfungsi sebagai perangkat yang berdiri sendiri.

Diagram Sirkuit Motor Servo Khusus

Berikut diagram rangkaian lengkap motor servo yang dibuat khusus ini.

Anda bisa mendapatkan komponen yang dibutuhkan untuk proyek ini dari tautan di bawah ini:

Pengungkapan:Ini adalah tautan afiliasi. Sebagai Rekanan Amazon, saya memperoleh penghasilan dari pembelian yang memenuhi syarat.

Jadi, kami memiliki mikrokontroler Atmega328 bersama dengan rangkaian minimum yang direkomendasikan, yang mencakup osilator 16Mhz, beberapa kapasitor, dan sebuah resistor.

Untuk memberi daya pada mikrokontroler dan komponen lain yang memerlukan 5V, kami menggunakan pengatur tegangan AMS1117, yang akan menurunkan input daya 12V menjadi 5V.

Berikut sensor posisi AS5600 dengan rangkaian yang direkomendasikan yang mencakup dua kapasitor dan dua resistor pull-up untuk komunikasi IC2.

Driver motor DC DRV8871 hanya membutuhkan satu resistor untuk membatasi arus, dan dua kapasitor decoupling. Kemudian kita memiliki dua potensiometer yang dihubungkan ke input analog mikrokontroler, satu untuk mengatur rentang putaran dan yang lainnya untuk mengatur sensitivitas servo. Tombol tekan digunakan untuk mengatur titik tengah servo, dan sakelar celup dua arah untuk memilih mode kerja servo. Terdapat pin header untuk input servo, baik input tegangan analog atau input PWM digital dari penerima RC, bersama dengan 5V dan pin ground. Ada juga pin header untuk memprogram mikrokontroler melalui protokol SPI dan port serial. 

Berikut rekap sirkuit ini dan alur kerjanya. Input, atau posisi sudut yang diinginkan, diterima melalui dua pin ini dan dapat berupa tegangan analog yang berasal dari potensiometer atau sinyal PWM digital yang berasal dari penerima RC. Masukan tersebut masuk ke mikrokontroler untuk dibandingkan dengan posisi sudut sebenarnya yang terdeteksi oleh encoder, atau sensor posisi AS5600. Sensor ini berkomunikasi dengan mikrokontroler melalui protokol IC2.

Kemudian mikrokontroler melakukan perhitungan, menghitung kesalahan dan berdasarkan itu mengirimkan sinyal PWM ke driver DRV8871 yang menggerakkan motor DC hingga mencapai posisi yang diinginkan. 

Seluruh rangkaian ditenagai oleh 12V, dan pengatur tegangan AS1117 menyediakan 5V untuk mikrokontroler dan komponen lainnya dengan tepat.

Desain PCB

Menurut diagram sirkuit, saya mencoba mendesain PCB sekecil mungkin, dan hasilnya berukuran 40x40mm.

Saya memposisikan encoder di bagian bawah dan tepat di titik tengah PCB, sehingga dapat dengan mudah dipasang dan disejajarkan dengan poros keluaran servo.

Semua komponen lainnya ditempatkan di sisi lain sehingga tidak mengganggu encoder dan poros keluaran.

Saya memesan PCB dari PCBWay. Di sini kita cukup mengunggah file Gerber, memilih properti PCB kita, dan memesannya dengan harga yang wajar.

Saya mendesain PCB memiliki 4 lapisan, yang tengah untuk GND, yang sedikit menaikkan harga. Saya tidak mengubah properti default apa pun kecuali warna PCB yang saya pilih menjadi putih, dan saya centang bahwa saya menerima perubahan untuk Surface finish menjadi Immersion gold jika berlaku tanpa biaya tambahan.

Anda dapat menemukan dan mendownload Gerber dari komunitas berbagi proyek PCBWay, yang melaluinya Anda juga dapat memesan PCB secara langsung.

Namun demikian, setelah beberapa hari PCB tiba. Kualitas PCBnya bagus, semuanya sama seperti di desain, dan saya mendapatkannya dengan lapisan permukaan emas imersi.

Baiklah, sekarang kita lanjutkan menyolder komponennya. Saya mulai dengan komponen yang lebih kecil seperti LED indikator ini, serta kapasitor dan resistor.

Ini sebenarnya pertama kalinya saya menyolder komponen SMD kecil ini, dan saya benar-benar buruk dalam hal itu. 

Yang paling menantang adalah menyolder mikrokontroler Atmega328, karena pinnya sangat kecil dan sangat berdekatan satu sama lain, namun entah bagaimana saya berhasil melakukannya.

Microchip encoder AS5600 mudah disolder di sisi belakang PCB, serta komponen lubang tembus yang lebih besar, seperti sakelar celup, potensiometer, blok terminal, dan header pin.

Oiya, inilah tampilan akhir dari controller boardnya yang ternyata lumayan menurut saya.

Sekarang saatnya membuat gearbox yang cocok untuk motor DC dan papan pengontrol ini. 

Model 3D Servo Khusus

Saya merancang gearbox untuk motor servo khusus ini menggunakan Onshape. Desain gearbox tentunya tergantung pada motor DC. Seperti yang saya sebutkan, kita dapat menggunakan motor DC ukuran apa pun yang dikombinasikan dengan papan pengontrol yang baru saja kita buat.

Di sini saya menggunakan motor DC dengan diameter 37mm dan gearbox internal yang menghasilkan 50RPM. 50RPM adalah kecepatan yang bagus untuk motor servo, tapi saya ingin lebih rendah dari itu, untuk mendapatkan torsi yang lebih baik, jadi saya membuat gearbox dengan pengurangan 3 kali lipat. Saya menggunakan roda gigi herringbone untuk tujuan tersebut karena efisien dan mudah dibuat dengan printer 3D.

Tentunya disini kita bebas untuk membuat desain gearbox ini sesuai keinginan kita, karena tergantung dari motor DC yang ingin kita gunakan dan berapa kecepatan output yang ingin kita dapatkan. 

Saya menempatkan papan pengontrol di sisi belakang gearbox ini dan menyelaraskannya dengan sempurna di tengah poros keluaran.

Jika kita ingin menggunakan poros motor DC secara langsung sebagai output, kita cukup menggunakan gearset 1:1 agar posisi poros dapat dilacak dengan benar. Atau kita juga bisa menggunakan sistem sabuk dalam kasus seperti itu. Seperti saya katakan, kami memiliki kemungkinan tak terbatas untuk membuat gearbox. 

Unduh Model 3D dan File STL

Anda dapat melihat dan menjelajahi model 3D motor servo yang dibuat khusus ini langsung di browser web Anda dengan Onshape. (Anda memerlukan akun Onshape untuk itu, Anda dapat membuat akun gratis untuk digunakan di rumah)

Tentu saja, Anda juga mengunduh model 3D, serta file STL yang diperlukan untuk pencetakan 3D, bagian-bagiannya dari sini:

LANGKAH file:

File STL untuk Pencetakan 3D:

Merakit servo khusus

Berikut adalah bagian cetakan 3D untuk pembuatan ini sehingga kita dapat mulai merakit motor servo.

Bersamaan dengan itu kita memerlukan beberapa baut M3 dan sisipan berulir, serta beberapa bantalan. 

Pertama, saya kencangkan motor DC ke pelat dasar dengan beberapa baut M3 dengan panjang 8mm.

Kemudian kita bisa memasang kedua roda gigi tersebut pada tempatnya. Roda gigi yang lebih kecil langsung menuju poros motor DC, dan roda gigi yang lebih besar akan menjadi keluaran servo. Padahal, poros keluarannya terdiri dari dua bagian.

Saya memasang sisipan berulir di kedua sisi bagian poros keluaran ini, di satu sisi untuk menghubungkan roda gigi ke sana, dan di sisi lain untuk memasang sesuatu pada keluaran servo. 

Saya juga memasang sisipan berulir ke roda gigi yang lebih kecil yang akan digunakan untuk mengamankannya ke poros motor DC. Sekarang kita dapat menggeser roda gigi yang telah dikupas ke posisinya. Karena ini adalah roda gigi herringbone, kita harus menggeser keduanya pada tempatnya secara bersamaan, jika tidak, kita tidak dapat memasangkannya jika kita memasukkannya satu per satu.

Dengan menggunakan sekrup grub, saya mengencangkan roda gigi kecil ke poros motor DC. Saya menerapkan 12V ke motor DC untuk memeriksa apakah gearset akan berfungsi dengan baik. 

Perakitan gearbox dapat diselesaikan dengan memasukkan panel samping, bantalan bola untuk poros keluaran, dan penutup atas.

Saya memasang beberapa sisipan berulir M3 di pelat belakang sehingga kami dapat mengamankan seluruh rakitan dengan baut M3 sepanjang 20mm. Saya menguji gearboxnya lagi, berfungsi dengan baik. Kita dapat melihat bagaimana poros keluaran berputar di sisi belakang dan di sini kita perlu memasukkan magnet yang akan dilacak oleh encoder AS5600.

Kami mengencangkan papan pengontrol ke gearbox menggunakan beberapa baut dan mur M2. Sensor posisi AS5600 kini sejajar sempurna dengan magnet sehingga ketika poros keluaran berputar, perubahan medan magnet akan diukur dengan benar.

Perlu diperhatikan di sini bahwa arah magnetisasi magnet permanen sangat penting. Bergantung pada magnetnya secara aksial atau diametris, kita harus memposisikan magnet tegak lurus atau sejajar dengan IC AS5600 tersebut.

Saya akhirnya mengubah arah magnet saya, karena magnetisasinya tidak tepat sehingga encoder AS5600 dapat mengukurnya.

Selanjutnya, saya menyolder dua kabel ke motor DC dan menghubungkan motor ke pengontrol dengan blok terminal. Untuk dayanya, saya menyambungkan dua kabel ke blok terminal daya, yang di sisi lain terdapat konektor daya DC untuk menyambungkan catu daya 12V. Selesai, motor servo yang kami buat khusus telah selesai.

Memprogram Pengontrol

Yang perlu dilakukan sekarang adalah menghidupkan servo ini, atau memprogram pengontrolnya. Untuk itu pertama-tama kita perlu membakar bootloader ke mikrokontroler ATmega328p. Tanpa bootloader mikrokontroler tidak akan bisa memahami bahasa atau kode yang akan kita kirimkan. 

Pembakaran Bootloader

Untuk mem-burning bootloader ke ATmega328p kita memerlukan board Arduino, dalam kasus saya saya akan menggunakan board Arduino Nano.

Kita akan menggunakan komunikasi SPI, jadi kita perlu menghubungkan pin SPI yang sesuai di papan Arduino dan papan pengontrol kita.

Sekarang, dengan menggunakan Arduino IDE, kita perlu membuka sketsa contoh ArduinoISP dan mengunggahnya ke papan Arduino Nano. Dengan kode ini Arduino Nano kini mampu membakar bootloader ke mikrokontroler ATmega328. 

Selanjutnya dari menu Tools, sebagai Programmer kita perlu memilih Arduino sebagai ISP lalu klik Burn Bootloader.

Saat membakar bootloader, kita harus memperhatikan bahwa lampu Arduino NANO akan sering berkedip, dan itu akan mengakibatkan pembakaran bootloader berhasil. 

Unggah Kode

Setelah selesai, sekarang kita dapat memprogram atau mengunggah kode ke papan pengontrol dengan bantuan modul Antarmuka USB ke UART.

Papan pengontrol memiliki pin khusus untuk menghubungkannya dengan mudah seperti yang ditunjukkan pada diagram sirkuit ini. 

Sekarang kita dapat membuka kode untuk servo khusus yang saya buat dan mengunggahnya ke pengontrol. Namun sebelum kita melakukannya, pertama-tama kita harus menginstal pustaka untuk sensor AS5600 dan kontrol PID. Kita dapat dengan mudah melakukannya dari Arduino IDE Library Manager. Setelah kami menekan tombol unggah, kode akan ditulis ke pengontrol ATmega328 kami melalui modul Antarmuka USB ke UART.

Dan selesai, motor servo yang kami buat khusus telah selesai. Sekarang kita dapat menghubungkan potensiometer untuk mengujinya. Sekadar catatan bahwa input analog menuju ke pin “S” pada papan pengontrol, bukan ke pin “A”.

Saat mendesain PCB, saya salah menghubungkan kedua pin ini ke ATmega328. Kemudian kita dapat memilih mode input analog melalui sakelar DIP dan menyalakan servo.

Dan ini dia, kita bisa mengontrol posisi motor servo dengan bantuan input analog dari potensiometer. Kami telah berhasil mengubah motor DC kami menjadi motor servo.

Kode Sumber

Sekarang mari kita lihat kode motor servo yang dibuat khusus ini.

/*
 * Custom-built Servo Motor - Arduino Code
 * by Dejan, www.HowToMechatronics.com
 * 
 * Libraries:
 * AS5600 encoder: https://github.com/RobTillaart/AS5600
 * PID conroller: https://github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
 */
#include "AS5600.h"
#include "Wire.h"
#include <PID_v1.h>
AS5600 as5600; // use default Wire
double Pk1 = 2; //speed it gets there
double Ik1 = 0;
double Dk1 = 0.025;
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, Pk1, Ik1, Dk1, DIRECT);
#define motor_IN1 5
#define motor_IN2 6
#define ch1 2
#define centerSet 7
#define inputSwitch 3
#define modeSwitch 4
int ch1Value;
int encoderValue, inputValue, pwmValue;
String inString = ""; // string to hold input
int centerAngle = 2047; // 180 degrees
int angleDifference = 0;
int angleValue = 0;
int leftLimit = 30;
int rightLimit = 4067;
int rangeAdjustment = 0;
float sensitivityAdjustment = 0;
float angle = 0;
int quadrantNumber = 2;
int previousQuadrantNumber = 3;
int numberOfTurns = 0;
float totalAngle = 0;
int error = 0;
char incomingByte = 0;
int intInput = 0;
void setup() {
 Serial.begin(115200);
 Serial.println(__FILE__);
 Serial.print("AS5600_LIB_VERSION: ");
 Serial.println(AS5600_LIB_VERSION);
 Wire.begin();
 pinMode(motor_IN1, OUTPUT);
 pinMode(motor_IN2, OUTPUT);
 // Activate the Arduino internal pull-up resistors
 pinMode(centerSet, INPUT_PULLUP);
 pinMode(inputSwitch, INPUT_PULLUP);
 pinMode(4, INPUT_PULLUP);
 myPID.SetMode(AUTOMATIC); // PID Setup
 myPID.SetOutputLimits(-255, 255);
 myPID.SetSampleTime(20);
}
void loop() {
 // Read encoder value - current position
 encoderValue = as5600.readAngle();
 // Continuous rotation mode
 if (digitalRead(modeSwitch) == 0) {
 // Enter desired angle for the servo to go to through the serial monitor
 while (Serial.available() > 0) {
 int inChar = Serial.read();
 if (isDigit(inChar)) {
 // convert the incoming byte to a char and add it to the string:
 inString += (char)inChar;
 }
 // if you get a newline, print the string, then the string's value:
 if (inChar == '\n') {
 Setpoint = inString.toInt(); // Setpoint - desired angle
 // clear the string for new input:
 inString = "";
 }
 }
 if (digitalRead(inputSwitch) == 0) { // Potentiometer as input
 inputValue = analogRead(A0);
 if (inputValue < 400) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue < 300) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue < 200) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue > 600) {
 Setpoint = Setpoint + 0.3;
 }
 if (inputValue > 700) {
 Setpoint = Setpoint + 0.3;
 }
 if (inputValue > 800) {
 Setpoint = Setpoint + 0.3;
 }
 }
 else if (digitalRead(inputSwitch) == 1) {
 inputValue = pulseIn(ch1, HIGH, 30000); // RC receiver as input
 if (inputValue < 1450) {
 Setpoint--;
 }
 if (inputValue < 1350) {
 Setpoint--;
 }
 if (inputValue < 1250) {
 Setpoint--;
 }
 if (inputValue < 1150) {
 Setpoint--;
 }
 if (inputValue > 1550) {
 Setpoint++;
 }
 if (inputValue > 1650) {
 Setpoint++;
 }
 if (inputValue > 1750) {
 Setpoint++;
 }
 if (inputValue > 1850) {
 Setpoint++;
 }
 }
 // Convert encoder RAW values into angle value
 angle = encoderValue * 0.087890625;
 // Quadrant 1
 if (angle >= 0 && angle <= 90) {
 quadrantNumber = 1;
 }
 // Quadrant 2
 if (angle >= 90 && angle <= 180) {
 quadrantNumber = 2;
 }
 // Quadrant 3
 if (angle >= 180 && angle <= 270) {
 quadrantNumber = 3;
 }
 // Quadrant 4
 if (angle >= 270 && angle <= 360) {
 quadrantNumber = 4;
 }
 if (quadrantNumber != previousQuadrantNumber) {
 // Transition from 4th to 1st quadrant
 if (quadrantNumber == 1 && previousQuadrantNumber == 4) {
 numberOfTurns++;
 }
 // Transition from 1st to 4th quadrant
 if (quadrantNumber == 4 && previousQuadrantNumber == 1) {
 numberOfTurns--;
 }
 previousQuadrantNumber = quadrantNumber;
 }
 if (totalAngle >= 0) {
 totalAngle = (numberOfTurns * 360) + angle;
 }
 else {
 totalAngle = (numberOfTurns * 360) + angle;
 }
 // Establish Input value for PID
 Input = totalAngle;
 }
 // Limited Rotation Mode
 else if (digitalRead(modeSwitch) == 1) {
 rangeAdjustment = analogRead(A1);
 leftLimit = 0 + 30 + rangeAdjustment;
 rightLimit = 4097 - 30 - rangeAdjustment;
 if (digitalRead(inputSwitch) == 0) { // Analog input - Potentiometer
 // Get value from potentiometer
 inputValue = analogRead(A0);
 if (inputValue < 15) {
 inputValue = 15;
 }
 if (inputValue > 1008) {
 inputValue = 1008;
 }
 Setpoint = map(inputValue, 15, 1008, -255, 255);
 }
 else if (digitalRead(inputSwitch) == 1) { // Digital input - RC transmitter
 inputValue = pulseIn(ch1, HIGH, 30000); // Read RC receiver as input
 Setpoint = map(inputValue, 1000, 2000, -255, 255);
 }
 // Set center angle
 if (digitalRead(centerSet) == LOW) {
 centerAngle = encoderValue;
 angleDifference = 2047 - encoderValue;
 delay(1000);
 }
 // Adjust angle value according to the center point (angleDifference)
 if (centerAngle < 2047) {
 angleValue = encoderValue + angleDifference;
 if (encoderValue < 4097 && encoderValue > (4096 - angleDifference)) {
 angleValue = encoderValue - 4097 + angleDifference;
 }
 }
 if (centerAngle > 2047) {
 angleValue = encoderValue + angleDifference;
 if (encoderValue >= 0 && encoderValue < abs(angleDifference)) {
 angleValue = encoderValue + 4097 + angleDifference;
 }
 }
 else if (centerAngle == 2047) {
 angleValue = encoderValue;
 }
 // Establish Input value for PID
 Input = map(angleValue , leftLimit, rightLimit, -255, 255);
 }
 // Adjusting sensitivity
 Pk1 = analogRead(A2) * 0.002;
 myPID.SetTunings(Pk1, Ik1, Dk1);
 // Run PID process to get Output value
 myPID.Compute();
 // Move right
 if (Output > 1 ) {
 pwmValue = Output;
 if (pwmValue < 30 && pwmValue > 5) {
 pwmValue = pwmValue + 30;
 }
 if (pwmValue <= 5) {
 pwmValue = 0;
 }
 digitalWrite(motor_IN1, LOW);
 analogWrite(motor_IN2, pwmValue);
 }
 // Move left
 else if (Output < 1 ) {
 pwmValue = abs(Output);
 if (pwmValue < 30 && pwmValue > 5) {
 pwmValue = pwmValue + 30;
 }
 if (pwmValue <= 5) {
 pwmValue = 0;
 }
 analogWrite(motor_IN1, pwmValue);
 digitalWrite(motor_IN2, LOW);
 }
 // Do not move
 else if (Output > -1 && Output < 1) {
 pwmValue = 0;
 digitalWrite(motor_IN1, LOW);
 digitalWrite(motor_IN2, LOW);
 }
 //Serial.print(Setpoint);
 //Serial.print("\t");
 //Serial.println(totalAngle);
}Code language: PHP (php)

Ikhtisar Kode

Jadi, kita memulai perulangan dengan membaca nilai encoder atau posisi poros saat ini.

// Read encoder value - current position
 encoderValue = as5600.readAngle();Code language: JavaScript (javascript)

Kemudian jika kita berada dalam mode rotasi Kontinu, kita menerima nilai dari monitor serial dan menggunakannya sebagai setpoint atau sudut yang diinginkan untuk pengontrol PID.

// Enter desired angle for the servo to go to through the serial monitor
 while (Serial.available() > 0) {
 int inChar = Serial.read();
 if (isDigit(inChar)) {
 // convert the incoming byte to a char and add it to the string:
 inString += (char)inChar;
 }
 // if you get a newline, print the string, then the string's value:
 if (inChar == '\n') {
 Setpoint = inString.toInt(); // Setpoint - desired angle
 // clear the string for new input:
 inString = "";
 }
 }Code language: JavaScript (javascript)

Jika mode input diatur ke potensiometer, kita membaca input analognya, dan mengoreksi nilai setpoint tergantung seberapa jauh kita memutarnya.

if (digitalRead(inputSwitch) == 0) { // Potentiometer as input
 inputValue = analogRead(A0);
 if (inputValue < 400) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue < 300) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue < 200) {
 Setpoint = Setpoint - 0.3;
 }
 if (inputValue > 600) {
 Setpoint = Setpoint + 0.3;
 }
 if (inputValue > 700) {
 Setpoint = Setpoint + 0.3;
 }
 if (inputValue > 800) {
 Setpoint = Setpoint + 0.3;
 }
 }Code language: JavaScript (javascript)

Kami melakukan koreksi setpoint yang sama jika inputnya adalah penerima RC. 

Di sini kita mengonversi nilai encoder RAW menjadi nilai sudut, dan dengan pernyataan if ini kita melacak di kuadran mana posisi poros saat ini.

// Convert encoder RAW values into angle value
 angle = encoderValue * 0.087890625;
 // Quadrant 1
 if (angle >= 0 && angle <= 90) {
 quadrantNumber = 1;
 }
 // Quadrant 2
 if (angle >= 90 && angle <= 180) {
 quadrantNumber = 2;
 }
 // Quadrant 3
 if (angle >= 180 && angle <= 270) {
 quadrantNumber = 3;
 }
 // Quadrant 4
 if (angle >= 270 && angle <= 360) {
 quadrantNumber = 4;
 }Code language: HTML, XML (xml)

Dengan informasi ini, kita dapat mengetahui bagaimana poros berputar dan kapan akan berputar penuh. Sudut total adalah nilai Input untuk pengontrol PID.

if (quadrantNumber != previousQuadrantNumber) {
 // Transition from 4th to 1st quadrant
 if (quadrantNumber == 1 && previousQuadrantNumber == 4) {
 numberOfTurns++;
 }
 // Transition from 1st to 4th quadrant
 if (quadrantNumber == 4 && previousQuadrantNumber == 1) {
 numberOfTurns--;
 }
 previousQuadrantNumber = quadrantNumber;
 }
 if (totalAngle >= 0) {
 totalAngle = (numberOfTurns * 360) + angle;
 }
 else {
 totalAngle = (numberOfTurns * 360) + angle;
 }
 // Establish Input value for PID
 Input = totalAngle;Code language: JavaScript (javascript)

Sebaliknya jika kita berada dalam mode putaran terbatas, pertama-tama kita membaca nilai potensiometer yang digunakan untuk mengatur rentang putaran dan mengatur batas putaran kiri dan kanan.

rangeAdjustment = analogRead(A1);
 leftLimit = 0 + 30 + rangeAdjustment;
 rightLimit = 4097 - 30 - rangeAdjustment;

Jika mode masukannya adalah potensiometer, kami menggunakan nilainya sebagai nilai setpoint untuk pengontrol PID.

if (digitalRead(inputSwitch) == 0) { // Analog input - Potentiometer
 // Get value from potentiometer
 inputValue = analogRead(A0);
 if (inputValue < 15) {
 inputValue = 15;
 }
 if (inputValue > 1008) {
 inputValue = 1008;
 }
 Setpoint = map(inputValue, 15, 1008, -255, 255);
 }Code language: HTML, XML (xml)

Jika mode inputnya adalah penerima RC, kita membaca nilai PWM yang masuk dari penerima dan menggunakan nilai tersebut sebagai setpoint.

else if (digitalRead(inputSwitch) == 1) { // Digital input - RC transmitter
 inputValue = pulseIn(ch1, HIGH, 30000); // Read RC receiver as input
 Setpoint = map(inputValue, 1000, 2000, -255, 255);
 }Code language: JavaScript (javascript)

Untuk mengatur titik tengah yang berbeda, kita periksa apakah kita sudah menekan tombol tekan dan menangkap posisi tersebut sebagai titik tengah baru.

// Set center angle
 if (digitalRead(centerSet) == LOW) {
 centerAngle = encoderValue;
 angleDifference = 2047 - encoderValue;
 delay(1000);
 }Code language: JavaScript (javascript)

Berdasarkan hal tersebut, maka kita harus menyesuaikan pembacaan aktual dari encoder dan mengimbanginya dengan perbedaan sudut antara titik pusat baru dan lama. Kami menggunakan nilai tersebut sebagai nilai input untuk pengontrol PID.

if (centerAngle > 2047) {
 angleValue = encoderValue + angleDifference;
 if (encoderValue >= 0 && encoderValue < abs(angleDifference)) {
 angleValue = encoderValue + 4097 + angleDifference;
 }
 }
 else if (centerAngle == 2047) {
 angleValue = encoderValue;
 }
 // Establish Input value for PID
 Input = map(angleValue , leftLimit, rightLimit, -255, 255);Code language: HTML, XML (xml)

Dengan menggunakan input analog dari potensiometer lain, kami mengatur penguatan proporsional pengontrol PID, dan terakhir kami menjalankan proses PID untuk mendapatkan nilai output.

// Adjusting sensitivity
 Pk1 = analogRead(A2) * 0.002;
 myPID.SetTunings(Pk1, Ik1, Dk1);
 // Run PID process to get Output value
 myPID.Compute();Code language: JavaScript (javascript)

Nilai output tersebut kita gunakan untuk menggerakkan motor DC dengan sinyal PWM, kiri atau kanan, atau dalam posisi diam tergantung pada nilai output dari pengontrol PID, atau tergantung pada kesalahan antara posisi yang diinginkan dan posisi sebenarnya yang dibaca encoder.

// Move right
 if (Output > 1 ) {
 pwmValue = Output;
 if (pwmValue < 30 && pwmValue > 5) {
 pwmValue = pwmValue + 30;
 }
 if (pwmValue <= 5) {
 pwmValue = 0;
 }
 digitalWrite(motor_IN1, LOW);
 analogWrite(motor_IN2, pwmValue);
 }Code language: HTML, XML (xml)

Jadi itu saja untuk video ini. Harap dicatat bahwa kode ini tidak dioptimalkan dengan baik dan masih ada ruang untuk perbaikan.

Selain itu, jika Anda mencoba membuat ulang proyek ini, Anda harus bersiap untuk memecahkan masalah. Ada banyak hal yang bisa salah, terutama saat menyolder komponen SMD kecil tersebut.

Saya tidak membuat servo ini berfungsi sejak percobaan pertama. Awalnya, saya memiliki beberapa koneksi yang salah pada PCB, kemudian saya memesan PCB lagi dengan pembaruan baru, tetapi masih perlu beberapa kali percobaan lagi sampai saya dapat berfungsi. 

Bagian artikel ini masih dalam pengembangan, silakan periksa nanti….


Proses manufaktur

  1. Biji Bunga Matahari
  2. Penggunaan, Perbaikan, dan Pemeliharaan Alat Ukur Presisi yang Benar
  3. Semua Tentang Bagian Mesin CNC Stainless Steel
  4. Kecap
  5. Walabot Touchpad
  6. Apa itu Bantalan Bush?
  7. Fitur Utama Tungku Ledakan Berkapasitas Tinggi Modern
  8. MIA-1 Open Source Robot Humanoid Buatan Tangan Tingkat Lanjut!
  9. Tundish dan Perannya dalam Pengecoran Baja Berkelanjutan
  10. Laporkan 27.000 Pekerjaan Manufaktur Baru Ditambahkan pada November