FPV modelleriniz için Baş Takip Sistemi.
Devre üç ana parçadan oluşur: bir verici, bir alıcı ve alıcıdan gelen sinyalleri servolar kullanarak harekete dönüştüren mekanik yapı.
Mekanik yapının iki ekseni vardır: yukarı-aşağı ve sol-sağ. Bu hareketler iki servo ile sağlanır. Videoda gerçekleştirdiğim testlerde uygun fiyatlı mikro servolar kullandım. Yüksek kaliteli servolarla daha akıcı hareketler elde edebilirsiniz.
FPV Modelleriniz İçin Baş Takip Sistemi.
Devre üç ana parçadan oluşur: bir verici, bir alıcı ve alıcıdan gelen sinyalleri servolar kullanarak harekete dönüştüren mekanik yapı.
Mekanik yapının iki ekseni vardır: yukarı-aşağı ve sol-sağ. Bu hareketler iki servo ile sağlanır. Videoda gerçekleştirdiğim testlerde uygun fiyatlı mikro servolar kullandım. Yüksek kaliteli servolarla daha akıcı hareketler elde edebilirsiniz.
Verici, MPU6050 jiroskop modülü tarafından sağlanan konum bilgisini Arduino Pro Micro aracılığıyla okur. Verileri işler ve NRF24 modülü aracılığıyla alıcıya gönderir.
Maksimum menzile ulaşmak için iletişim modülü olarak E01-2G4M27D’yi seçtim. Bu modül 500 mW çıkış gücüne sahiptir.
Teorik olarak 5 km menzil sağlar. Gerçek hayatta ise bazı voltaj kısıtlamaları ve varsayılan anten nedeniyle maksimum menzil yaklaşık 2.5-3 km’dir.
Maksimum menzil için 5 dBi’lik bir anten kullanılmalı ve anten yüzeyden en az 250 cm yüksekliğinde olmalıdır (açık arazide ve ideal hava koşullarında).
Tasarladığım verici ve alıcı devreleri için PCB’lere ihtiyacım vardı. PCB üretimi için JLCPCB’yi seçtim.
Siparişimi verdikten sonra PCB’lerim 24 saat içinde hazırlanıp kargoya verildi. PCB’ler 5-6 gün sonra elime ulaştı.
PCB’ler gerçekten yüksek kalitede ve elime kısa bir sürede ulaştı.
Yüksek kaliteli ve hızlı hizmetlerinden dolayı JLCPCB’ye teşekkür ederim.
Aşağıdaki bağlantıdan JLCPB’ye ulaşabilirsiniz.
Discover Easy, Affordable, and Reliable PCB manufacturing with JLCPCB!Register to get $70 New customer coupons: https://jlcpcb.com/?from=KendinYap
Verici Devresi İçin Gerekli Malzemeler:
* NRF24L01 PA LNA (E01-2G4M27D): https://s.click.aliexpress.com/e/_oDdE40B
VEYA https://s.click.aliexpress.com/e/_onkamdt
* LM350T : https://s.click.aliexpress.com/e/_olO9HRt
* Kondansatör 100uF (1 pcs): https://s.click.aliexpress.com/e/_oCXjoHZ
* Kondansatör 100nF 104 (1 pcs): https://s.click.aliexpress.com/e/_omwl5j1
* Dirençler(270R , 470R): https://s.click.aliexpress.com/e/_ooezndl
* JST 2-Pin Soket ve Kablo: https://s.click.aliexpress.com/e/_ooekDr1
VERİCİ KODU:
// FPV HEAD TRACKING TRANSMITTER CODE | VERİCİ KODU
// BY KendinYap
#include
#include "MPU6050_6Axis_MotionApps20.h"
#include
#include
#include
#include
/* --- NRF24L01 Setup --- */
RF24 radio(8, 10);
const byte address[6] = "00001";
struct Data_Package {
byte pitch;
byte yaw;
bool calibrationDone;
};
Data_Package data;
/* --- MPU6050 Setup --- */
MPU6050 mpu;
#define INTERRUPT_PIN 2
bool dmpReady = false;
uint8_t mpuIntStatus;
uint16_t packetSize;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];
volatile bool mpuInterrupt = false;
/* --- Servo Setup --- */
Servo pitchServo;
Servo yawServo;
#define PITCH_SERVO_PIN 3
#define YAW_SERVO_PIN 4
void dmpDataReady() {
mpuInterrupt = true;
}
void resetData() {
data.pitch = 127;
data.yaw = 127;
data.calibrationDone = false;
}
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000);
Serial.println(F("Initializing MPU6050..."));
mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);
if (!mpu.testConnection()) {
Serial.println(F("MPU6050 connection failed"));
while (true);
}
Serial.println(F("MPU6050 connection successful"));
uint8_t devStatus = mpu.dmpInitialize();
if (devStatus == 0) {
Serial.println(F("Calibrating MPU6050..."));
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
mpu.setDMPEnabled(true);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
data.calibrationDone = true;
for (int i = 0; i < 5; i++) {
if (radio.write(&data, sizeof(Data_Package))) {
Serial.println(F("Calibration done signal sent!"));
break;
}
delay(200);
}
delay(1000);
data.calibrationDone = false;
pitchServo.attach(PITCH_SERVO_PIN);
yawServo.attach(YAW_SERVO_PIN);
pitchServo.write(90 + 60);
delay(500);
yawServo.write(90 + 60);
delay(500);
pitchServo.write(90);
delay(500);
yawServo.write(90);
} else {
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
radio.begin();
radio.openWritingPipe(address);
radio.setChannel(120);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.stopListening();
resetData();
}
void loop() {
if (!dmpReady) return;
if (mpuInterrupt || mpu.getFIFOCount() >= packetSize) {
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
if ((mpuIntStatus & 0x10) || mpu.getFIFOCount() == 1024) {
mpu.resetFIFO();
Serial.println("FIFO overflow!");
return;
}
if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) {
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
data.yaw = constrain(map(ypr[0] * 180 / M_PI, 90, -90, 0, 255), 0, 255);
data.pitch = constrain(map(ypr[2] * 180 / M_PI, 90, -90, 0, 255), 0, 255);
Serial.print("Yaw: ");
Serial.print(data.yaw);
Serial.print(" Pitch: ");
Serial.println(data.pitch);
for (int i = 0; i < 3; i++) {
if (radio.write(&data, sizeof(Data_Package))) {
Serial.println("Data sent successfully");
break;
}
delay(100);
}
}
}
}
ALICI DEVRESİ İÇİN GEREKLİ MALZEMELER:
* GT-24 Mini NRF24L01+PA+LNA (With Antenna): https://s.click.aliexpress.com/e/_oC5zVIr
* GT-24 NRF24L01+PA+LNA: https://s.click.aliexpress.com/e/_oC5zVIr
* LM1117 3.3V: https://s.click.aliexpress.com/e/_o2c26KT
* Kondansatör 10uF (2 pcs), 100uF (2 pcs): https://s.click.aliexpress.com/e/_oCXjoHZ
* Kondansatör 100nF 104 (4 pcs): https://s.click.aliexpress.com/e/_omwl5j1
* Y-Type & Extension Cables: https://s.click.aliexpress.com/e/_oDqhTNN
ALICI KODU:
Her iki alıcı devresi için de aynı alıcı kodu yüklenir.
FPV Head Tracking Transmitter and Receiver codes:
// FPV HEAD TRACKING RECEIVER CODE | ALICI KODU
// BY KendinYap
#include
#include
#include
#include
// Servo tanımlamaları
Servo yawServo;
Servo pitchServo;
// NRF24L01 tanımlamaları
RF24 radio(8, 10); // CE: D8, CSN: D10
const byte address[6] = "00001"; // Verici ile aynı adres
// Veri yapısı (verici ile aynı olmalı)
struct Data_Package {
byte pitch;
byte yaw;
bool calibrationDone; // Kalibrasyon tamamlandı bilgisi
};
Data_Package data;
// Son sinyal alma zamanı
unsigned long lastSignalTime = 0;
const unsigned long signalTimeout = 1000; // 1 saniye sinyal kaybolma süresi
void setup() {
Serial.begin(115200);
// Servo pinleri ayarla
yawServo.attach(5); // Yaw servo, D5 pinine bağlı
pitchServo.attach(3); // Pitch servo, D3 pinine bağlı
// Servoları başlangıçta merkez konumuna getir
yawServo.write(90);
pitchServo.write(90);
// NRF24L01 başlatma
radio.begin();
radio.openReadingPipe(1, address);
radio.setChannel(120);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.startListening();
Serial.println("Alıcı hazır!");
}
void loop() {
// Veri alındı mı?
if (radio.available()) {
radio.read(&data, sizeof(Data_Package));
lastSignalTime = millis(); // Son sinyal alma zamanını güncelle
// Normal veri işleme
int yawAngle = map(data.yaw, 0, 255, 0, 180); // 0-255 aralığını 0-180 dereceye dönüştür
int pitchAngle = map(data.pitch, 0, 255, 0, 180); // 0-255 aralığını 0-180 dereceye dönüştür
// Servolara açı değerlerini gönder
yawServo.write(yawAngle);
pitchServo.write(pitchAngle);
// Seri monitörde değerleri yazdır
Serial.print("Yaw: ");
Serial.print(yawAngle);
Serial.print(" Pitch: ");
Serial.println(pitchAngle);
}
// Sinyal kaybolursa servoları merkeze getir
if (millis() - lastSignalTime > signalTimeout) {
yawServo.write(90);
pitchServo.write(90);
Serial.println("Sinyal kayboldu! Servolar merkeze döndü.");
}
}
Verici ve Alıc Devrelari için GERBER Dosyaları: https://drive.google.com/file/d/1pipgWy4IaRNKNiouVv8tgym6T9o798ma/view?usp=sharing
FPV Gimbal STL Dosyaları: https://www.printables.com/model/1412107-fpv-head-tracking-gimbal
Verici ve Alıcı için Arduino Kodları: https://drive.google.com/file/d/19KlOU7fJQ2BRffhEfjN3Cqx6cPSWRBzh/view?usp=sharing
GENEL BİLGİLER:
Kodları Arduino’ya yüklemeden önce, gerekli kütüphane dosyalarını bilgisayarınıza indirmeniz gerekmektedir. Kütüphane dosyası yoksa, kurulum gerçekleşmeyecek ve hata oluşacaktır.
Gerekli Kütüphane Dosyaları:
SPI.h
nRF24L01.h
RF24.h
Servo.h
NRF24 Modül için kütüphane dosyaları indirme linki …..:
NRF24 Modül Kütüphane Dosyaları (Github page): https://github.com/nRF24/RF24
NRF24 Modül Kütüphane Dosyaları (zip) : https://github.com/nRF24/RF24/archive/master.zip
