Akıllı Telefon Kontrolü ile DIY Arduino Robot Kol Yapımı; Bu derste, özel olarak oluşturulmuş bir Android uygulaması kullanılarak kablosuz olarak kontrol edilip programlanabilen bir Arduino Robot Kolunun nasıl yapıldığını öğreneceğiz. Robot kollarını kontrol etmek için kendi Android uygulamamızı geliştirmeye, robot parçalarını tasarlamaya ve 3D yazdırmaya, elektronik bileşenleri birleştirmeye ve Arduino’yu programlamaya başlayarak, size tüm yapım sürecini göstereceğim.
Uygulamadaki sürgüleri kullanarak her servonun veya robot kolunun ekseninin hareketini manuel olarak kontrol edebiliriz. Ayrıca “Kaydet” düğmesini kullanarak her bir pozisyonu veya adımı kaydedebiliriz ve ardından robot kolu bu adımları otomatik olarak çalıştırabilir ve tekrarlayabilir. Aynı düğme ile otomatik işlemi duraklatabilir, tüm adımları sıfırlayabilir veya silebiliriz, böylece yenilerini kaydedebiliriz.
Arduino Robot Kol 3D Modeli
Başlangıçta, Robot Kolunu Solidworks 3D modelleme yazılımını kullanarak tasarladım. Kolun 5 serbestlik derecesi vardır.
İlk 3 eksen için, bel, omuz ve dirsek için MG996R servolarını ve diğer 2 eksen için bilek rulosunu ve bilek adımını ve kıskaç olarak daha küçük SG90 mikro servolarını kullandım.
Aşağıda ve 3D modelini indirebilirsiniz.
Solidworks:
Arduino Robot Arm 3D Model Solidworks Files
STEP file:
Arduino Robot Arm 3D Model STEP File
STL files for 3D Printing:
Arduino Robot Arm STL Files
Robot Kolunun 3B Baskısı
Arduino robot kolu için tüm parçaları 3D olarak bastırdım. Denemeden önce, makaralı tekerleklerin yeterince sıkı olup olmadıklarını kontrol etmeniz önerilir ve eğer değilse, eksantrik somunları bunları sıkmak için kullanabilirsiniz. Ve işte bu, 3B baskı yatağınızı seviyelttikten sonra, 3B yaratmalarınızı gerçeğe dönüştürmeye hazırsınız.
Robot Kolunun Montajı
Tamam, bulayın robot kolunu monte edilebilir hazırız. İlk servo motorunu pakete yerleştirmekte vidaları yerleştirerek yerleştirmekte tabanla başladım. Servonun çıkış milinde yuvarlak bir korna cevtası tespit ettim.
Üstüne üst kısmı yerleştirip iki vida kullanarak sabitledim.
Burada yine önce servoya, ardından yuvarlak kornayı bir sonraki kısma geçirir ve daha sonra çıkış milindeki cıvatayı kullanarak birbirlerine tutturulur.
Burada, omuz ekseninde bir çeşit yay içermenin iyi bir fikir olduğunu ya da benim durumumda servoya yardımcı olmak için bir lastik bant kullandığımı fark edebiliriz çünkü bu servo kolun geri kalanının bütün ağırlığını taşıyor yük olarak.
Benzer şekilde robot kolunun kalanını da birleştirmeye devam ettim. Kıskaç mekanizmasına gelince, montaj için bazı 4 milimetre cıvata ve somun kullandım.
Sonunda kıskaç mekanizmasını son servoya taktım ve Arduino robot kolu tamamlandı.
Arduino Robot Kol Devresi Şeması
Bir sonraki aşama elektroniği bağlamak. Bu projenin devre şeması aslında oldukça basittir. Akıllı telefonla iletişim kurmak için sadece bir Arduino panosuna ve bir HC-05 Bluetooth modülüne ihtiyacımız var. Altı servo motorun kontrol pinleri, Arduino kartının altı dijital pinine bağlanır.
Servoları çalıştırmak için 5V’a ihtiyacımız var, ancak bunun harici bir güç kaynağından gelmesi gerekiyor, çünkü Arduino, hepsinin çekebileceği akım miktarını idare edemiyor. Güç kaynağının en az 2 A akım alabilmesi gerekir. Böylece her şeyi bir araya getirdikten sonra Arduino’yu programlamaya geçebilir ve Android uygulamasını yapabiliriz.
Gereken bileşenleri aşağıdaki bağlantılar,
- MG996R Servo Motor
- SG90 Micro Servo Motor
- HC-05 Bluetooth Module
- Arduino Board
- 5V 2A DC Power Supply
Arduino Robot Kol Kodu
Kod biraz daha uzun olduğu için, daha iyi anlaşılması için, programın kaynak kodunu bölümlerin açıklamalarıyla birlikte bölümlere koyacağım. Ve bu yazının sonunda kaynak kodun tamamını göndereceğim.
Bu yüzden önce Bluetooth modülünün seri iletişimi için servo kütüphanesinin yanı sıra SoftwareSerial kütüphanesini de eklememiz gerekir. Bu kitaplıkların her ikisi de Arduino IDE’ye eklenmiştir, dolayısıyla bunları harici olarak yüklemeniz gerekmez. Daha sonra altı servoyu, HC-05 Bluetooth modülünü ve servoların mevcut ve önceki pozisyonlarını saklamak için bazı değişkenleri ve ayrıca pozisyonları veya otomatik mod için basamakları depolamak için bazı değişkenleri tanımlamamız gerekir.
#include <SoftwareSerial.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; String dataIn = "";
Kurulum bölümünde servoları ve Bluetooth modülünü başlatmalı ve robot kolunu ilk konumuna getirmeliyiz. Bunu, servoyu 0 ila 180 derece arasında herhangi bir konuma basitçe hareket ettiren write () işlevini kullanarak yapıyoruz.
void setup() { servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); // Robot arm initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 150; servo02.write(servo2PPos); servo3PPos = 35; servo03.write(servo3PPos); servo4PPos = 140; servo04.write(servo4PPos); servo5PPos = 85; servo05.write(servo5PPos); servo6PPos = 80; servo06.write(servo6PPos); }
Sonra, döngü bölümünde, Bluetooth.available () işlevini kullanarak, Smartphone’dan gelen herhangi bir veri olup olmadığını sürekli olarak kontrol ederiz. Değer doğruysa, readString () işlevini kullanarak verileri bir dizge olarak okuruz, bunları dataIn değişkenine depolar. Gelen verilere bağlı olarak robot koluna ne yapacağımızı söyleyeceğiz.
// Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); // Read the data as string
Arduino Robot Kol Kontrolü Android Uygulaması
Şimdi Android uygulamasına bakalım ve Arduino’ya ne tür veriler gönderdiğini görelim.
Uygulamayı MIT App Inventor çevrimiçi uygulamasını kullanarak yaptım ve işte nasıl çalıştığını. En üstte, akıllı telefonu HC-05 Bluetooth modülüne bağlamak için iki düğmemiz var. Sonra sol tarafta robot kolunun bir resmi var ve sağ tarafta da servoları kontrol etmek için altı kaydırıcı ve hız kontrolü için bir kaydırıcı var.
Her kaydırıcı, robot kol bağlantılarına uygun farklı başlangıç, minimum ve maksimum değerlere sahiptir. Uygulamanın altında, robot kolunu otomatik olarak çalışacak şekilde programlayabilmemiz için SAVE, RUN ve RESET adlı üç düğmemiz var. Ayrıca kaydettiğimiz adım sayısını gösteren bir etiket de var. Bununla birlikte, MIT App Inventor kullanarak bu gibi uygulamaların nasıl oluşturulacağı hakkında daha fazla ayrıntı için, bununla ilgili diğer ayrıntılı eğitimimi kontrol edebilirsiniz.
Tamam, şimdi programı veya uygulamanın arkasındaki blokları görelim. İlk önce, sol tarafta akıllı telefonu Bluetooth modülüne bağlamak için bloklar bulunuyor.
Ardından servo pozisyon kontrolü için sürgü bloklarına ve robot kolunu programlamak için düğmeler bloklarına sahibiz. Bu yüzden, kaydırıcının konumunu değiştirirsek, Bluetooth işlevini kullanarak .SendText, Arduino’ya bir metin göndeririz. Bu metin, kaydırıcının geçerli değerinin yanı sıra hangi kaydırıcının değiştirildiğini gösteren bir önekten oluşur.
İşte yukarıda belirtilen MIT App Inventor projesinin bir indirme dosyası ve akıllı telefonunuza kurulmaya hazır Android Uygulaması:
Arduino Robot Arm Control MIT App Inventor Project Dosyası
İNDİR
Arduino Robot Arm Control Android App Dosyası
İNDİR
Bu nedenle, Arduino’da, startWith () işlevini kullanarak her gelen verinin önekini kontrol ederiz ve böylece ne yapacağımızı biliriz. Örneğin, önek “s1” ise, bir numaralı servoyu taşımamız gerektiğini biliyoruz. Substring () işlevini kullanarak kalan metni alırız veya bu konum değeridir, onu tam sayıya dönüştürür ve değeri servoyu bu konuma taşımak için kullanırız.
// If "Waist" slider has changed value - Move Servo 1 to position if (dataIn.startsWith("s1")) { String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120" servo1Pos = dataInS.toInt(); // Convert the string into integer
Burada basitçe write () işlevini çağırabiliriz ve servo o konuma gidecektir, ancak bu şekilde servo robot kolu için çok fazla olan maksimum hızında çalışacaktır. Bunun yerine, servoların hızını kontrol etmemiz gerekiyor, bu yüzden her yineleme arasında bir gecikme süresi uygulayarak servoyu kademeli olarak önceki konumdan mevcut konuma taşımak için bazı FOR halkaları kullandım. Gecikme süresini değiştirerek servonun hızını değiştirebilirsiniz.
// We use for loops so we can control the speed of the servo // If previous position is bigger then current position if (servo1PPos > servo1Pos) { for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down servo01.write(j); delay(20); // defines the speed at which the servo rotates } } // If previous position is smaller then current position if (servo1PPos < servo1Pos) { for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up servo01.write(j); delay(20); } } servo1PPos = servo1Pos; // set current position as previous position }
Robot kolunun her bir eksenini sürmek için aynı yöntem kullanılır.
Altlarında KAYDET düğmesidir. KAYDET düğmesine basarsak, her servo motorun konumu bir dizide saklanır. Her basışta indeks artar, böylece dizi adım adım doldurulur.
// If button "SAVE" is pressed if (dataIn.startsWith("SAVE")) { servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index }
Ardından RUN butonuna basarsak kayıtlı adımları çalıştıran runervo () özel fonksiyonunu çağırırız. Bu fonksiyona bir göz atalım. İşte burada RESET butonuna basana kadar kaydedilen adımları tekrar tekrar çalıştırıyoruz. FOR döngüsünü kullanarak dizilerde depolanan tüm konumları gözden geçiririz ve aynı zamanda akıllı telefondan gelen veri olup olmadığını kontrol ederiz. Bu veriler robotu duraklatan ÇALIŞMA / DURAKLATMA butonu olabilir ve tekrar tıklandığında otomatik hareketlerle devam eder. Ayrıca, hız kaydırıcı konumunu değiştirirsek, bu değeri aşağıdaki FOR döngülerindeki her yineleme arasındaki gecikme süresini değiştirmek için kullanırız, bu da servo motorların hızını kontrol eder.
// Automatic mode custom function - run the saved steps void runservo() { while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.readString(); if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed while (dataIn != "RUN") { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); if ( dataIn == "RESET") { break; } } } } // If SPEED slider is changed if (dataIn.startsWith("ss")) { String dataInS = dataIn.substring(2, dataIn.length()); speedDelay = dataInS.toInt(); // Change servo speed (delay time) } } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } }
Bu IF ifadeleri ve FOR döngülerinde daha önce açıklandığı gibi, servoları bir sonraki pozisyonlarına taşırız. Son olarak RESET butonuna basarsak, dizilerdeki tüm verileri sıfıra indiririz ve ayrıca endeksi sıfıra ayarlarız, böylece robot kolunu yeni hareketlerle yeniden programlayabiliriz.
// If button "RESET" is pressed if ( dataIn == "RESET") { memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 }
İşte bu, şimdi robot kolla eğlenebilir ve biraz eğlenebiliriz.
İşte Arduino Robot Kolunun tam kodu:
/* DIY Arduino Robot Arm Smartphone Control by Dejan, www.HowToMechatronics.com */ #include <SoftwareSerial.h> #include <Servo.h> Servo servo01; Servo servo02; Servo servo03; Servo servo04; Servo servo05; Servo servo06; SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; String dataIn = ""; void setup() { servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); // Robot arm initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 150; servo02.write(servo2PPos); servo3PPos = 35; servo03.write(servo3PPos); servo4PPos = 140; servo04.write(servo4PPos); servo5PPos = 85; servo05.write(servo5PPos); servo6PPos = 80; servo06.write(servo6PPos); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); // Read the data as string // If "Waist" slider has changed value - Move Servo 1 to position if (dataIn.startsWith("s1")) { String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120" servo1Pos = dataInS.toInt(); // Convert the string into integer // We use for loops so we can control the speed of the servo // If previous position is bigger then current position if (servo1PPos > servo1Pos) { for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down servo01.write(j); delay(20); // defines the speed at which the servo rotates } } // If previous position is smaller then current position if (servo1PPos < servo1Pos) { for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up servo01.write(j); delay(20); } } servo1PPos = servo1Pos; // set current position as previous position } // Move Servo 2 if (dataIn.startsWith("s2")) { String dataInS = dataIn.substring(2, dataIn.length()); servo2Pos = dataInS.toInt(); if (servo2PPos > servo2Pos) { for ( int j = servo2PPos; j >= servo2Pos; j--) { servo02.write(j); delay(50); } } if (servo2PPos < servo2Pos) { for ( int j = servo2PPos; j <= servo2Pos; j++) { servo02.write(j); delay(50); } } servo2PPos = servo2Pos; } // Move Servo 3 if (dataIn.startsWith("s3")) { String dataInS = dataIn.substring(2, dataIn.length()); servo3Pos = dataInS.toInt(); if (servo3PPos > servo3Pos) { for ( int j = servo3PPos; j >= servo3Pos; j--) { servo03.write(j); delay(30); } } if (servo3PPos < servo3Pos) { for ( int j = servo3PPos; j <= servo3Pos; j++) { servo03.write(j); delay(30); } } servo3PPos = servo3Pos; } // Move Servo 4 if (dataIn.startsWith("s4")) { String dataInS = dataIn.substring(2, dataIn.length()); servo4Pos = dataInS.toInt(); if (servo4PPos > servo4Pos) { for ( int j = servo4PPos; j >= servo4Pos; j--) { servo04.write(j); delay(30); } } if (servo4PPos < servo4Pos) { for ( int j = servo4PPos; j <= servo4Pos; j++) { servo04.write(j); delay(30); } } servo4PPos = servo4Pos; } // Move Servo 5 if (dataIn.startsWith("s5")) { String dataInS = dataIn.substring(2, dataIn.length()); servo5Pos = dataInS.toInt(); if (servo5PPos > servo5Pos) { for ( int j = servo5PPos; j >= servo5Pos; j--) { servo05.write(j); delay(30); } } if (servo5PPos < servo5Pos) { for ( int j = servo5PPos; j <= servo5Pos; j++) { servo05.write(j); delay(30); } } servo5PPos = servo5Pos; } // Move Servo 6 if (dataIn.startsWith("s6")) { String dataInS = dataIn.substring(2, dataIn.length()); servo6Pos = dataInS.toInt(); if (servo6PPos > servo6Pos) { for ( int j = servo6PPos; j >= servo6Pos; j--) { servo06.write(j); delay(30); } } if (servo6PPos < servo6Pos) { for ( int j = servo6PPos; j <= servo6Pos; j++) { servo06.write(j); delay(30); } } servo6PPos = servo6Pos; } // If button "SAVE" is pressed if (dataIn.startsWith("SAVE")) { servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index } // If button "RUN" is pressed if (dataIn.startsWith("RUN")) { runservo(); // Automatic mode - run the saved steps } // If button "RESET" is pressed if ( dataIn == "RESET") { memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } } } // Automatic mode custom function - run the saved steps void runservo() { while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.readString(); if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed while (dataIn != "RUN") { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); if ( dataIn == "RESET") { break; } } } } // If speed slider is changed if (dataIn.startsWith("ss")) { String dataInS = dataIn.substring(2, dataIn.length()); speedDelay = dataInS.toInt(); // Change servo speed (delay time) } } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } } // Servo 2 if (servo02SP[i] == servo02SP[i + 1]) { } if (servo02SP[i] > servo02SP[i + 1]) { for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { servo02.write(j); delay(speedDelay); } } if (servo02SP[i] < servo02SP[i + 1]) { for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { servo02.write(j); delay(speedDelay); } } // Servo 3 if (servo03SP[i] == servo03SP[i + 1]) { } if (servo03SP[i] > servo03SP[i + 1]) { for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { servo03.write(j); delay(speedDelay); } } if (servo03SP[i] < servo03SP[i + 1]) { for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { servo03.write(j); delay(speedDelay); } } // Servo 4 if (servo04SP[i] == servo04SP[i + 1]) { } if (servo04SP[i] > servo04SP[i + 1]) { for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { servo04.write(j); delay(speedDelay); } } if (servo04SP[i] < servo04SP[i + 1]) { for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { servo04.write(j); delay(speedDelay); } } // Servo 5 if (servo05SP[i] == servo05SP[i + 1]) { } if (servo05SP[i] > servo05SP[i + 1]) { for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { servo05.write(j); delay(speedDelay); } } if (servo05SP[i] < servo05SP[i + 1]) { for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { servo05.write(j); delay(speedDelay); } } // Servo 6 if (servo06SP[i] == servo06SP[i + 1]) { } if (servo06SP[i] > servo06SP[i + 1]) { for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { servo06.write(j); delay(speedDelay); } } if (servo06SP[i] < servo06SP[i + 1]) { for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { servo06.write(j); delay(speedDelay); } } } } }
Umarım bu videoyu beğenmiş ve yeni bir şeyler öğrenmişsindir. Aşağıdaki yorumlar bölümünde herhangi bir soru sormaktan çekinmeyin ve Arduino Projeler Koleksiyonumu kontrol edin.
iz atölye iletişim
neden biz
atölye çalışmalarının önemi