Uzaktan İki Servo Motorun Kontrolu

Merhaba arkadaşlar,  Bugün sizlere Kemal Yılmaz beyin projesini paylaşmak istiyorum. Projesinde MPU6050 6DOF sensör ile uzaktaki iki servo motorun kontolünü sağlamış.

Proje geliştirmeye açık olduğunu belirtmek isterim. Bu projede küçük değişiklikler ile inanılmaz projeler çıkarabilirsiniz. Mesela Tekerlekli sandalyeyi el hareketleriyle kontrol etmek gibi.

Kullanılan Malzemeler.

Verici için;

  1. Arduino Nano yada Pro gibi boyut olarak küçük herhangi bir arduino modeli,
  2. NRF24L01 2,4 GHz  RF alıcı verici modülü

Alıcı için ;

  1. Herhangi arduino modeli,
  2. NRF24L01 2,4 Ghz RF alıcı verici,
  3. 2 adet Servo Motor.

Projemizin çalışmasına gelince, projede iki adet arduino kullanılmış ilki MPU6050 yön sensörü ve NRF24l01 alıcı-verici modülü ile kullanılmıştır. İkinci arduinomuz ise 2 adet servo motoru ve NRF24l01 alıcı-verici modülü ile kullanılmıştır.

Projemizde verici ünitesinde MPU6050 sensöründen x,y,z düzlemindeki değişikliler aynı anda arduino tarafından işlenerek NRF24l01 sensöründen gönderilir . Alıcı ünitesinde ise NRF24l01 modülünden alınan değerler Arduino tarafından işlenerek servo motorları hareket ettirir.

ALICI için Programımız.

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
byte data[10];
RF24 nrf(9,10);// nrf pinleri
const uint64_t pipe = 0xE8E8F0F0E1LL;
Servo ServoX,ServoY;
void setup(void){
 Serial.begin(9600);
 ServoX.attach(7);// servo pinleri
 ServoY.attach(8);// servo pinleri
 nrf.begin();
 nrf.openReadingPipe(1,pipe);
 nrf.startListening();

 }

void loop(void){
 if (nrf.available())
 {
   bool done = false;    
   while (!done)
   {
     done = nrf.read(data, sizeof(data));

  Serial.print("Pitch: "); Serial.print(data[0]);
  Serial.print("\t");
  Serial.print("Roll: "); Serial.print(data[1]);
  Serial.print("\n");

  ServoX.write(data[0]);
 ServoY.write(data[1]);
     delay(10);
   }
 }
 }

Verici için Programımız

#include <SPI.h>
#include <Wire.h>
#include "nRF24L01.h"
#include "RF24.h"  


#define MPU 0x68
 byte data[10];
double AcX,AcY,AcZ;
int Pitch, Roll;
const uint64_t pipe = 0xE8E8F0F0E1LL; 
RF24 nrf(9,10);   
 
void setup(){
  Serial.begin(9600);
  init_MPU(); // Inizializzazione MPU6050
 nrf.begin();    
 nrf.openWritingPipe(pipe);
}
 
void loop()
{
  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.
    
  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);   //Calcolo angolo Roll
  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);  //Calcolo angolo Pitch
 
  int ServoRoll = map(Roll, -90, 90, 0, 179);
  int ServoPitch = map(Pitch, -90, 90, 179, 0);
 
 // ServoX.write(ServoRoll);
  //ServoY.write(ServoPitch);
  data[0] = ServoPitch; 
  data[1] = ServoRoll; 
 nrf.write(&data, sizeof(data));
 
  Serial.print("Pitch: "); Serial.print(ServoPitch);
  Serial.print("\t");
  Serial.print("Roll: "); Serial.print(ServoRoll);
  Serial.print("\n");
 
}
 
void init_MPU(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0); 
  Wire.endTransmission(true);
  delay(1000);
}
 

double FunctionsPitchRoll(double A, double B, double C){
  double DatoA, DatoB, Value;
  DatoA = A;
  DatoB = (B*B) + (C*C);
  DatoB = sqrt(DatoB);
  
  Value = atan2(DatoA, DatoB);
  Value = Value * 180/3.14;
  
  return (int)Value;
}
 
void FunctionsMPU(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}

GITHUB

Boş zamanlarda arduino ile uğraşan kendi halinde bir Öğretmen.

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.