Başa dön
Arduino Mecanum Tekerlek ile Telefon Kontrollü 4WD Robot Yapımı

Arduino Mecanum Tekerlek ile Telefon Kontrollü 4WD Robot Yapımı

Merhaba arkadaşlar bu makalemizde, herhangi bir yönde hareket edebilen bir Arduino ve Mecanum Tekerlek ile 4WD Telefon Kontrollü Robot Yapımı nasıl hazırlanır birlikte öğreneceğiz.

 

Not: Projeyi yaparken mutlaka video’dan yararlanın.

Konu ile ilgili hiç bilgi sahibi olmayanlar için videolar fotoğraflardan çok daha fazla yardımcı olur, çok fazla detayı gösterebilir.

Videoyu mutlaka izlemeyi unutmayın.

Telefon kontrollü robot projesi için gerekli bileşenleri aşağıdaki bağlantılardan satın alabilirsiniz:

Telefon Kontrollü Robot – Genel Bakış

Telefon kontrollü robot projemizin en eşsiz özelliği hiç şüphesiz ki mecanum tekelerler ile kazandığı hareketliliğidir; Mecanum Wheels adı verilen özel tip jantlar kullanılarak elde edilir. Aslında bu jantları tasarladım ve 3D yazdırdım çünkü satın almak biraz pahalı olabilir. Oldukça iyi çalışıyorlar ve bu robotu sürmenin çok eğlenceli olduğunu söylemeliyim. NRF24L01 radyo alıcı-verici modüllerini kullanarak robotu kablosuz olarak kontrol edebiliriz.

 

Bluetooth iletişimi yoluyla bir akıllı telefon kullanılarak kontrol edilmesini de mümkün kıldım. Mecanum tekerlek robotunu herhangi bir yönde hareket ettirmek için kontrol edebileceğimiz özel bir Android uygulaması yaptım. Ayrıca, uygulamadaki kaydırıcıyı kullanarak hareket hızını kontrol edebiliriz.

Bu robot platformunun beyni, her tekerleği ayrı ayrı kontrol eden bir Arduino Mega kartıdır. Her tekerlek bir NEMA 17 step motoruna takılmıştır ve step motorların tam olarak kontrol edilebildiğini bilerek, uygulamaya robotu otomatik olarak hareket edecek şekilde programlayabileceğimiz bir harika özellik daha ekledim. Kaydet düğmesini kullanarak her konumu veya adımı kaydedebiliriz ve ardından robot bu adımları otomatik olarak çalıştırabilir ve tekrarlayabilir. Aynı düğme ile otomatik işlemi duraklatabilir, yenilerini depolayabilmemiz için tüm adımları sıfırlayabilir veya silebiliriz.

Mecanum Tekerlek 3D Modeli

Başlangıç olarak robotu 3D modelleme yazılımı kullanarak tasarladım. Bu robotun taban platformunu, 8mm MDF ile basit bir kutu şeklinde yapacağım.

Dört kademeli motor bu platforma ve Mecanum jantları motorun şaftlarına takılmıştır.

3D baskı için gereken 3D modeli ve STL dosyalarını aşağıdan indirebilirsiniz.

STEP Dosyası

Mecanum Tekerlek 3D Model STEP Dosyası  STEP Dosyası İNDİR

STL Dosyası

Mecanum Tekerlek STL Dosyası  STL Dosyası İNDİR

 

Ayrıca Bakınız

3D Yazıcı Nedir? 3D Printer Ne İşe Yarar? Neler Yapılır?

 

Creality Ender 3 Pro 3D Yazıcı Satın Al

 

Mecanum Tekerlekleri Nasıl Çalışır?

Bir Mecanum tekerleği, çevresine bağlı silindirlerden oluşan tekerlek sistemidir. Bu silindirler, tekerleğin dönüş eksenine çapraz veya 45 derecelik bir açıyla yerleştirilir. Bu eğim, geriye doğru giderken tekerleğe çapraz yönde kuvvet uygular.

Böylece, tekerlekleri belirli bir desende döndürerek, bu çapraz kuvvetleri kullanırız ve robot herhangi bir yönde hareket edebilir.

Burada ayrıca, sol ve sağ elle kullanılan Mecanum jantlar olarak adlandırılan iki tip Mecanum tekerleğine ihtiyacımız olduğunu da belirtmeliyiz. Aralarındaki fark, silindirlerin yönlendirilmesidir ve robot üzerinde doğru konumlara takılması gerekir. Her tekerleğin üst silindirinin dönme ekseni robotun merkezini göstermelidir.

 

Dört tekerleğin tamamı ileri doğru hareket ederse, robotun ortaya çıkan hareketi ileri doğru olur ve tam tersi tüm tekerlekler geriye doğru hareket ederse robot geriye doğru hareket eder. Sağa hareket etmek için, sağ tekerleklerin robotun içine doğru dönmesi gerekirken, sol tekerleklerin robotun dışına doğru dönmesi gerekir. Çapraz olarak yerleştirilmiş silindirler nedeniyle ortaya çıkan kuvvet, robotun sağa hareket etmesini sağlayacaktır. Sola gitmek için tersi kuvvet uygulanmalıdır. Bu tekerlekler ile sadece iki tekerleği döndürerek çapraz yönde de hareket edebiliriz.

Telefon Kontrollü Mecanum Tekerlekli Robot Yapımı

Şimdi size bu robot platformunu nasıl oluşturduğumu göstereyim. Bahsettiğim gibi, platformun tabanını yapmak için 8mm MDF tahtaları kullanıyorum. Bir ahşap testeresi kullanarak, önce tüm parçaları 3D model boyutlarına göre kestim.

Sonra, 3 mm’lik bir matkap ve 25 mm’lik bir Forstner ucu kullanarak, step motorları takmak için yan panellerde açıklıklar yaptım. Parçaları hazır hale getirdikten sonra onları birleştirmeye devam ettim. Onları sabitlemek için tahta tutkalı ve bazı vidalar kullandım.

Buradaki en önemli şey; tüm tekerleklerin yüzeye tam temas etmesi için motorların açıklıklarının hassas bir şekilde yapılmasıdır.

Tabii ki, MDF ile yapmak yerine bu temel platformu 3D olarak da yazdırabilirsiniz, bu yüzden web sitesi makalesine bunun bir 3D dosyasını ekleyeceğim.

Sonunda, tabanı spreyle boyadım ve beyaz renkle kaplandı.

Sırada Mecanum jantları var. Daha önce de söylediğim gibi, bu tekerlekleri satın almak biraz pahalı olabilir, bu yüzden kendi jantlarımı tasarlamaya ve 3D yazdırmaya karar verdim. Tekerlekler, dış ve iç tarafı bazı M4 cıvataları ve somunları ile sabitlenmiş iki parçadan oluşur. Her biri 10 silindir ve bir NEMA 17 step motora uyacak şekilde özel olarak tasarlanmış bir mil kuplörüne sahiptir.

Mecanum jantlarının tüm parçalarını Creality CR-10 3D yazıcımı kullanarak 3D yazdırdım.

Satın almak isterseniz Creality 3D Printer yazıcı çeşitlerine göz atabilirsiniz.

3D baskılı parçaları hazırladıktan sonra, silindirler için şaftlar yapmaya devam ettim. Bu amaçla 3 mm kalınlığında çelik tel kullandım. Şaftların uzunluğu 40 mm civarında olmalıdır, bu yüzden spiral kullanarak teli bu uzunlukta kesiyorum. Pense gibi bir şeyle de kesebilirsiniz.

İki tarafı ve mil kuplörünü dört M4 cıvata ve somun kullanarak sabitleyerek Mecanum tekerleğini monte etmeye başladım. Cıvataların uzunluğu 45 mm olmalıdır.

Silindirleri takmak için, önce mili iç tarafın çevresinde bulunan deliklerden hafifçe sokmamız gerekir.

Sonra küçük bir M3 rondelası yerleştirebilir, silindiri ve mili tekerleğin dış tarafındaki yuvaya sonuna kadar itebiliriz. Tek bir rondela kullandım çünkü diğer tarafa ikinci bir rondela yerleştirmek için yeterli alanım yoktu.

Bu işlemi 10 silindir için de tekrarladım. Burada önemli olan, silindirlerin serbestçe hareket edebilmeleri gerektiğidir.

Sonunda, şaftların gevşememesini sağlamak için iç deliklerin her birine birkaç damla japon yapıştırıcısı kullandım.

Tekerlekler hazır olduğunda tüm robotu monte etmeye devam edebiliriz. İlk olarak, step motorları taban platformuna takmamız gerekiyor. Bunları yerine sabitlemek için 12 mm uzunluğunda M3 cıvataları kullandım.

Ardından, tekerlekleri motor şaftlarına takmamız gerekiyor. Yaptığım mil kuplörünün içinde bir M3 somunu ve bir M3 cıvatanın geçebileceği bir yuva var ve böylece tekerleği mile sabitleyebiliyoruz.

 

Sonra, üst kapağı tabana sabitlemek için, tabanın iki köşesine dişli çubuklar taktım. Kapakta aynı konumda delikler açtım ve böylece kapağı tabana kolayca yerleştirip sabitleyebildim.

 

Tabanın arka tarafında, daha sonra bir güç anahtarını takmak için 20mm delik ve bir LED takmak için 5mm delik açtım.

Devre şeması

Şimdi elektronikle devam edebiliriz. İşte bu projenin tüm devre şeması.

4 adet DRV8825 step sürücüsü kullanarak dört NEMA 17 step motorunu kontrol edeceğiz veya A4988 step sürücülerini de kullanabiliriz. Step motorlara ve tüm robota güç vermek için 12V güç kaynağı kullanacağım. Telsiz haberleşmesi NRF24L01 modülünü ve Bluetooth iletişimi için HC-05 Bluetooth modülünü kullanıyorum. Ayrıca, akü voltajını izlemek için kullanılacak basit bir voltaj bölücü ve akü voltajının ne zaman 11V’un altına düşeceğini gösteren bir LED bağlantısı da dahil ettim.

Ayrıca yaklaşık 3A akım sağlayabilen özel bir 5V voltaj regülatörü de dahil ettim ve bu isteğe bağlıdır.

 

PCB Tasarımı

Bununla birlikte, elektronik bileşenleri düzenli tutmak ve kablo karmaşasından kurtulmak için, EasyEDA ücretsiz çevrimiçi devre tasarım yazılımını kullanarak özel bir PCB tasarladım. Bu PCB aslında bir Arduino MEGA shield olarak işlev görecektir çünkü doğrudan Arduino Mega kartının üstüne bağlayabileceğiz. Bağlantıları çalıştırmak için hem üst hem de alt katmanı kullandım. Kullanmadığım Arduno pinleri için, pin başlığı bağlantılarını ekledim, böylece ileride bir şey için kullanmak istediğimizde kullanılabilirler. Ayrıca 12V, 5V ve GND bağlantı pimlerinin yanı sıra sürücülerin adım çözünürlüğünü seçmek için pimler de dahil ettim.

PCB tasarımının proje dosyalarına online ulaşabilirsiniz. Tasarımı bitirdikten sonra PCB’yi üretmek için gereken Gerber dosyasını oluşturdum.

Gerber Dosyası

Arduino Mega Shield PCB Kart Tasarım Dosyası  PCB Gerber Dosyası İNDİR

Sonra da JLCPCB’den sipariş ettim.

Burada Gerber dosyasını sürükleyip bırakabiliriz ve yüklendikten sonra PCB’yi Gerber görüntüleyicide inceleyebiliriz. Her şey yolundaysa, PCB’imiz için istediğimiz özellikleri seçebiliriz. Bu kez PCB rengini Arduino rengiyle eşleştirmek için mavi olarak seçtim. Ve bu kadar, şimdi PCB’yi makul bir fiyata sipariş edebiliriz. JLCPCB’den ilk siparişinizse, sadece 2 $ karşılığında 10 PCB alabileceğinizi unutmayın.

Birkaç gün sonra PCB’ler geldi. PCB’lerin kalitesi harika ve her şey tasarımdakiyle aynı.

PCB Montajı

Tamam şimdi PCB’ye geçebilir ve monte edebiliriz. Önce küçük bileşenleri, dirençleri ve kapasitörleri lehimlemeye başladım. Daha sonra erkek pin başlıklarını PCB’ye taktım ve lehimledim, bu da Arduino kartına bağlamak için kullanılacak.

Sonra, tüm dişi pim başlıklarını yerine yerleştirdim ve lehimledim. Step motor bağlantılarında ve step çözünürlüğünü seçmek için pinlerde erkek pin başlıkları kullandım. Bu şekilde motorları doğrudan PCB’ye bağlayabilir ve adım çözünürlüğünü seçmek için jumperları kullanabiliriz. Sonra klemensleri, düzelticiyi ve voltaj regülatörünü lehimledim.

İşte bu kadar, PCB artık hazır ve sürücüleri yerleştirerek ve motorları bağlayarak devam edebiliriz. İlk olarak, jumperları yerleştirdim. Sürücülerin MS3 pinlerini 5V’ye bağlayarak 16. step çözünürlüğünü seçtim.

Daha sonra DRV8825 sürücülerini yerleştirdim, ayrıca NRF24L01 modülünü ve HC-05 Bluetooth modülünü bağladım. Şimdi PCB’yi Arduno kartına basit bir şekilde bağlayabiliriz.

Ardından, pili uygun terminal bloğuna bağladım ve taban platformuna yerleştirdim.

Burada güç anahtarını yerine taktım ve diğer terminal bloğuna bağladım. Güç anahtarının hemen üstüne de pil gösterge LED’ini taktım.

Şimdi sırada motorları PCB’ye bağlamak kaldı. Burada, zıt motorları bağlarken, konnektörlerini de zıt olarak bağlamamız gerektiğini not etmeliyiz. Bu, daha sonra robot programlanırken gereklidir. Ne işe yarar diye soracak olursanız, örneğin; ileri komut, her iki motoru da aynı yönde hareket ettirir, ancak bunlar aslında biri saat yönünde ve diğeri saat yönünün tersine dönüş yapar şekilde çevrilir.

En son kapağı üste basit bir şekilde yerleştirdim ve bitti.

Mecanum Tekerlekli Telefon Kontrollü Robot Arduino Kodu

2 ayrı Arduino kodu vardır. ilki robotu NRF24L01 modülleri kullanarak kontrol etmek için, diğeri ise bir akıllı telefon kullanarak robotu kontrol etmek içindir.

NRF24L01 modüllerini kullanarak robotu kontrol etmek için Arduino kodu:

/*
   === Arduino Mecanum Wheels Robot ===
     Radio control with NRF24L01 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <AccelStepper.h>
RF24 radio(48, 49);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4
int wheelSpeed = 1500;
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
 byte j1PotX;
 byte j1PotY;
 byte j1Button;
 byte j2PotX;
 byte j2PotY;
 byte j2Button;
 byte pot1;
 byte pot2;
 byte tSwitch1;
 byte tSwitch2;
 byte button1;
 byte button2;
 byte button3;
 byte button4;
};
Data_Package data; //Create a variable with the above structure
void setup() {
 // Set initial seed values for the steppers
 LeftFrontWheel.setMaxSpeed(3000);
 LeftBackWheel.setMaxSpeed(3000);
 RightFrontWheel.setMaxSpeed(3000);
 RightBackWheel.setMaxSpeed(3000);
 radio.begin();
 radio.openReadingPipe(0, address);
 radio.setAutoAck(false);
 radio.setDataRate(RF24_250KBPS);
 radio.setPALevel(RF24_PA_LOW);
 radio.startListening(); //  Set the module as receiver
 Serial.begin(115200);
}
void loop() {
 // Check whether we keep receving data, or we have a connection between the two modules
 currentTime = millis();
 if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
   resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
 }
 // Check whether there is data to be received
 if (radio.available()) {
   radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
   lastReceiveTime = millis(); // At this moment we have received the data
 }
 // Set speed - left potentiometer
 wheelSpeed = map(data.pot1, 0, 255, 100, 3000);
 
 if (data.j1PotX > 150) {
   moveSidewaysLeft();
 }
 else if (data.j1PotX < 100) {
   moveSidewaysRight();
 }
 else if (data.j1PotY > 160) {
   moveForward();
 }
 else if (data.j1PotY < 100) {
   moveBackward();
 }
 else if (data.j2PotX < 100 & data.j2PotY > 160) {
   moveRightForward();
 }
 else if (data.j2PotX > 160 & data.j2PotY > 160) {
   moveLeftForward();
 }
 else if (data.j2PotX < 100 & data.j2PotY < 100) {
   moveRightBackward();
 }
 else if (data.j2PotX > 160 & data.j2PotY < 100) {
   moveLeftBackward();
 }
 else if (data.j2PotX < 100) {
   rotateRight();
 }
 else if (data.j2PotX > 150) {
   rotateLeft();
 }
 else {
   stopMoving();
 }
 // Execute the steps
 LeftFrontWheel.runSpeed();
 LeftBackWheel.runSpeed();
 RightFrontWheel.runSpeed();
 RightBackWheel.runSpeed();
 
 // Monitor the battery voltage
 int sensorValue = analogRead(A0);
 float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
 // If voltage is below 11V turn on the LED
 if (voltage < 11) {
   digitalWrite(led, HIGH);
 }
 else {
   digitalWrite(led, LOW);
 }
}
void moveForward() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveBackward() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void moveSidewaysRight() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveSidewaysLeft() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void rotateLeft() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void rotateRight() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void moveRightForward() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveRightBackward() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(0);
}
void moveLeftForward() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(0);
}
void moveLeftBackward() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void stopMoving() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(0);
}
void resetData() {
 // Reset the values when there is no radio connection - Set initial default values
 data.j1PotX = 127;
 data.j1PotY = 127;
 data.j2PotX = 127;
 data.j2PotY = 127;
 data.j1Button = 1;
 data.j2Button = 1;
 data.pot1 = 1;
 data.pot2 = 1;
 data.tSwitch1 = 1;
 data.tSwitch2 = 1;
 data.button1 = 1;
 data.button2 = 1;
 data.button3 = 1;
 data.button4 = 1;
}

 

Tanım: Burada, radyo iletişimi için RF24 kütüphanesini ve step motorları kontrol etmek için AccelStepper kütüphanesini kullanıyoruz. Öncelikle hepsinin bağlı olduğu pinleri tanımlamamız, aşağıdaki program için gerekli bazı değişkenleri tanımlamamız ve kurulum bölümünde step motorların maksimum hızını ayarlamamız ve radyo iletişimine başlamamız gerekiyor.
Döngü bölümünde, RC vericisinden gelen verileri okuyarak başlıyoruz.

Alınan verilere bağlı olarak, örneğin, sol Joystick ileri doğru hareket ettirilirse, değeri 160’tan büyük olur ve böyle bir durumda moveForward () özel işlevini çağırır. Bu işleve bir göz atarsak, yaptığı tek şey motorların hızını pozitif olarak ayarlamaktır. Geri gitmek için hız negatif olarak ayarlanır. Bu nedenle, diğer tüm yönlerde hareket etmek için, tekerleklerin dönüşlerini başlangıçta açıklandığı gibi ayarlamamız yeterlidir.

Bu komutları yürütmek için döngü bölümünde tüm step motorlar için runSpeed ​​() işlevlerini çağırmamız gerekir. Döngü bölümünde aküden gelen voltaj bölücüden gelen analog girişi de okuyoruz ve bu değere göre akü voltajının ne zaman 11V altına düşeceğini biliyoruz, böylece gösterge LED’ini aktif edebiliyoruz.

 

Akıllı Telefon Kontrollü Robot için Arduino Kodu:

/*
   === Arduino Mecanum Wheels Robot ===
     Smartphone control via Bluetooth 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html
*/
#include <SoftwareSerial.h>
#include <AccelStepper.h>
SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)
// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4
#define led 14
int wheelSpeed = 1500;
int dataIn, m;
int lbw[50], lfw[50], rbw[50], rfw[50]; // for storing positions/steps
int index = 0;
void setup() {
 // Set initial seed values for the steppers
 LeftFrontWheel.setMaxSpeed(3000);
 LeftBackWheel.setMaxSpeed(3000);
 RightFrontWheel.setMaxSpeed(3000);
 RightBackWheel.setMaxSpeed(3000);
 Serial.begin(38400);
 Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
 Bluetooth.setTimeout(1);
 delay(20);
 pinMode(led, OUTPUT);
}
void loop() {
 // Check for incoming data
 if (Bluetooth.available() > 0) {
   dataIn = Bluetooth.read();  // Read the data
   if (dataIn == 0) {
     m = 0;
   }
   if (dataIn == 1) {
     m = 1;
   }
   if (dataIn == 2) {
     m = 2;
   }
   if (dataIn == 3) {
     m = 3;
   }
   if (dataIn == 4) {
     m = 4;
   }
   if (dataIn == 5) {
     m = 5;
   }
   if (dataIn == 6) {
     m = 6;
   }
   if (dataIn == 7) {
     m = 7;
   }
   if (dataIn == 8) {
     m = 8;
   }
   if (dataIn == 9) {
     m = 9;
   }
   if (dataIn == 10) {
     m = 10;
   }
   if (dataIn == 11) {
     m = 11;
   }
   if (dataIn == 12) {
     m = 12;
   }
   if (dataIn == 14) {
     m = 14;
   }
   // Set speed
   if (dataIn >= 16) {
     wheelSpeed = dataIn * 10;
     Serial.println(wheelSpeed);
   }
 }
 if (m == 4) {
   moveSidewaysLeft();
 }
 if (m == 5) {
   moveSidewaysRight();
 }
 if (m == 2) {
   moveForward();
 }
 if (m == 7) {
   moveBackward();
 }
 if (m == 3) {
   moveRightForward();
 }
 if (m == 1) {
   moveLeftForward();
 }
 if (m == 8) {
   moveRightBackward();
 }
 if (m == 6) {
   moveLeftBackward();
 }
 if (m == 9) {
   rotateLeft();
 }
 if (m == 10) {
   rotateRight();
 }
 if (m == 0) {
   stopMoving();
 }
 //Serial.println(dataIn);
 // If button "SAVE" is pressed
 if (m == 12) {
   if (index == 0) {
     LeftBackWheel.setCurrentPosition(0);
     LeftFrontWheel.setCurrentPosition(0);
     RightBackWheel.setCurrentPosition(0);
     RightFrontWheel.setCurrentPosition(0);
   }
   lbw[index] = LeftBackWheel.currentPosition();  // save position into the array
   lfw[index] = LeftFrontWheel.currentPosition();
   rbw[index] = RightBackWheel.currentPosition();
   rfw[index] = RightFrontWheel.currentPosition();
   index++;                        // Increase the array index
   m = 0;
 }
 if (m == 14) {
   runSteps();
   if (dataIn != 14) {
     stopMoving();
     memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0
     memset(lfw, 0, sizeof(lfw));
     memset(rbw, 0, sizeof(rbw));
     memset(rfw, 0, sizeof(rfw));
     index = 0;  // Index to 0
   }
 }
 LeftFrontWheel.runSpeed();
 LeftBackWheel.runSpeed();
 RightFrontWheel.runSpeed();
 RightBackWheel.runSpeed();
 // Monitor the battery voltage
 int sensorValue = analogRead(A0);
 float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
 //Serial.println(voltage);
 // If voltage is below 11V turn on the LED
 if (voltage < 11) {
   digitalWrite(led, HIGH);
 }
 else {
   digitalWrite(led, LOW);
 }
}
void runSteps() {
 for (int i = index - 1; i >= 0; i--) { // Run through all steps(index)
   LeftFrontWheel.moveTo(lfw[i]);
   LeftFrontWheel.setSpeed(wheelSpeed);
   LeftBackWheel.moveTo(lbw[i]);
   LeftBackWheel.setSpeed(wheelSpeed);
   RightFrontWheel.moveTo(rfw[i]);
   RightFrontWheel.setSpeed(wheelSpeed);
   RightBackWheel.moveTo(rbw[i]);
   RightBackWheel.setSpeed(wheelSpeed);
   while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) {
     LeftFrontWheel.runSpeedToPosition();
     LeftBackWheel.runSpeedToPosition();
     RightFrontWheel.runSpeedToPosition();
     RightBackWheel.runSpeedToPosition();
     if (Bluetooth.available() > 0) {      // Check for incomding data
       dataIn = Bluetooth.read();
       if ( dataIn == 15) {           // If button "PAUSE" is pressed
         while (dataIn != 14) {         // Wait until "RUN" is pressed again
           if (Bluetooth.available() > 0) {
             dataIn = Bluetooth.read();
             if ( dataIn == 13) {
               stopMoving();
               break;
             }
           }
         }
       }
       if (dataIn >= 16) {
         wheelSpeed = dataIn * 10;
         dataIn = 14;
       }
       if ( dataIn == 13) {
         break;
       }
     }
   }
 }
 // Go back through steps
 for (int i = 1; i <= index - 1; i++) { // Run through all steps(index)
   LeftFrontWheel.moveTo(lfw[i]);
   LeftFrontWheel.setSpeed(wheelSpeed);
   LeftBackWheel.moveTo(lbw[i]);
   LeftBackWheel.setSpeed(wheelSpeed);
   RightFrontWheel.moveTo(rfw[i]);
   RightFrontWheel.setSpeed(wheelSpeed);
   RightBackWheel.moveTo(rbw[i]);
   RightBackWheel.setSpeed(wheelSpeed);
   while (LeftBackWheel.currentPosition() != lbw[i]& LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) {
     LeftFrontWheel.runSpeedToPosition();
     LeftBackWheel.runSpeedToPosition();
     RightFrontWheel.runSpeedToPosition();
     RightBackWheel.runSpeedToPosition();
     //Serial.print("  current: ");
     //Serial.println(LeftBackWheel.currentPosition());
     if (Bluetooth.available() > 0) {      // Check for incomding data
       dataIn = Bluetooth.read();
       if ( dataIn == 15) {           // If button "PAUSE" is pressed
         while (dataIn != 14) {         // Wait until "RUN" is pressed again
           if (Bluetooth.available() > 0) {
             dataIn = Bluetooth.read();
             if ( dataIn == 13) {
               stopMoving();
               break;
             }
           }
         }
       }
       if (dataIn >= 16) {
         wheelSpeed = dataIn * 10;
         dataIn = 14;
       }
       if ( dataIn == 13) {
         //Serial.println("DEKI");
         break;
       }
     }
   }
 }
}
void moveForward() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveBackward() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void moveSidewaysRight() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveSidewaysLeft() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void rotateLeft() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(wheelSpeed);
}
void rotateRight() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void moveRightForward() {
 LeftFrontWheel.setSpeed(wheelSpeed);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(wheelSpeed);
}
void moveRightBackward() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(-wheelSpeed);
 RightFrontWheel.setSpeed(-wheelSpeed);
 RightBackWheel.setSpeed(0);
}
void moveLeftForward() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(wheelSpeed);
 RightFrontWheel.setSpeed(wheelSpeed);
 RightBackWheel.setSpeed(0);
}
void moveLeftBackward() {
 LeftFrontWheel.setSpeed(-wheelSpeed);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(-wheelSpeed);
}
void stopMoving() {
 LeftFrontWheel.setSpeed(0);
 LeftBackWheel.setSpeed(0);
 RightFrontWheel.setSpeed(0);
 RightBackWheel.setSpeed(0);
}

Açıklama: Android uygulamasını kullanarak robotu kontrol etmek için oluşturduğumuz kod, diğer koda çok benzer ve aynı şekilde çalışır. Burada radyo modülü yerine Bluetooth modülünü tanımlamamız ve iletişimini kurulum bölümünde başlatmamız gerekiyor. Yine, önce gelen verileri akıllı telefondan veya Android uygulamasından okuyoruz ve ona göre, robota hangi yönde hareket edeceğini söyleyoruz.

Android uygulamasına göz atarsak, düğmelere basıldığında Bluetooth’tan 0 ila 15 arasındaki sayıları gönderdiğini görebiliriz.

Uygulama MIT App Inventor çevrimiçi uygulaması kullanılarak yapılır ve bunun için özel öğretici makalemizi okuyarak daha fazla ayrıntı bulabilirsiniz.

Burada akıllı telefon kontrollü robot proje dosyalarını indirebilirsiniz:

APK Dosyası

Akıllı Telefon Uygulama Kurulum Dosyası  APK Dosyası İNDİR

AIA Proje Dosyası

AIA Proje Dosyası  Aia Proje Dosyası İNDİR

Bu uygulama ile otomatik robot hareketini programlamak için “SAVE” düğmesine bastığımızda, step motorların mevcut konumlarını dizilere kaydediyoruz. Daha sonra “RUN” düğmesine bastığımızda, kaydedilen veriler ile tüm adımları for ve while döngülerini kullanarak, runSteps () özel işlevini çağırarak harekete geçirebiliriz.

 

Hepsi bu kadar. Umarım Arduino Mecanum Tekerlek ile Telefon Kontrollü 4WD Robot Yapımı makalemizi beğenmiş ve yeni bir şeyler öğrenmişsinizdir.

Memnun kaldıysanız aşağıda bulunan “yukarı ok“a tıklayarak +1 puan verebilirsiniz.

Diğer Güncel Arduino Projeleri için BURAYA TIKLAYABİLİRSİNİZ.

Sizde Robotlara ve Maker’lığa Meraklıysanız Robotik Marketimiz ROBOCOMBO‘yu Ziyaret Edebilirsiniz.

 

Robot El Yapımı – İlginç Arduino Projeleri

Videodaki Robot El Ürünümüzü Satın Almak İsterseniz Bağlantıya Göz Atabilirsiniz.

Okuduğunuz İçin Teşekkürler.

 
Kaynak:  howtomechatronics.com/projects/arduino-mecanum-wheels-robot/