Description
طقم ونظام الرادار والتتبع الذكي بالموجات فوق الصوتية SkyTech Smart Ultrasonic Radar & Tracking System المدمج بمحرك سيرفو وشاشة OLED (SkyTech Smart Radar & Servo Target Tracking Kit with HC-SR04, SG90 & 0.96" OLED Display)، المنظومة الهندسية المتكاملة لمسح المحيط واكتشاف الأجسام وتتبعها أوتوماتيكياً. تعتمد المنظومة على حساس المسافة HC-SR04 المثبت فوق محرك السيرفو SG90 الذي يقوم بالدوران والمسح الزاوي من 30 إلى 150 درجة. يتميز النظام ببرمجية تتبع ذكية (Smart Tracking Mechanism): فعند اكتشاف جسم على مسافة أقل من 30 سم، يتوقف السيرفو عن المسح الشامل ويلف حول الهدف بعمل مسح ميكروي محلي (±20 درجة) للقفز والتتبع المستمر لموقع الجسم المتحرك. تعرض الواجهة على شاشة OLED شبكة رادار كلاسيكية خضراء (Green Retro Radar Grid) مع خط مسح لحظي ونقطة حمراء تحدد موقع الهدف والمسافة بالمتر أو السنتيمتر. يعتبر هذا الطقم الخيار الهندسي الأول لطلاب كليات الهندسة، مشاريع التخرج، ومطوري الأنظمة الرادارية الذاتية.
__________________________________________________
SkyTech Smart Ultrasonic Radar and Target Tracking System Kit, an advanced robotics and radar telemetry platform built around the Arduino ecosystem. The system features an HC-SR04 ultrasonic distance sensor mounted onto a high-precision SG90 micro servo motor executing automated horizontal angular sweeps from 30° to 150°. Powered by smart target-tracking algorithms, when an object breaches the 30 cm threshold, the servo locks its orientation and performs localized micro-sweeps (±20°) to actively track the moving target. An integrated 0.96" I2C OLED display renders a classic green retro radar grid interface complete with a rotating sweep line, target blips, and exact distance measurements in centimeters. Supplied with pre-configured firmware and hardware mounts, this SkyTech radar tracking kit serves as a premier educational package for undergraduate engineering students, graduation project developers, and robotics prototypers.
__________________________________________________
المميزات الأساسية:
* اسم المنتج: طقم مشروع نظام الرادار والتتبع الذكي (SkyTech Smart Radar & Servo Tracking Kit)
* مستشعر المسافة: حساس الموجات فوق الصوتية HC-SR04 بقدرة قياس دقيقة وتردد 40kHz
* محرك التوجيه: محرك سيرفو SG90 ميكرو لمسح زوايا المحيط وتتبع الأهداف
* نظام التتبع الذكي: إيقاف المسح العام والتحول للمسح المحلي الدقيق (±20°) عند اقتراب الهدف (<30cm)
* شاشة العرض: شاشة 0.96 إنش OLED تعرض شبكة الرادار ورسم الأهداف لحظياً
* التطبيقات النموذجية: مشاريع التخرج الهندسية، أنظمة الرادار والروبوتات الاستكشافية، ومختبرات الأردوينو
الكود البرمجي
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int trigPin = 9;
const int echoPin = 10;
const int servoPin = 11;
const int buzzerPin = 8;
Servo myServo;
int pos = 90; // الزاوية الحالية
int dir = 1; // اتجاه حركة البحث الطبيعي (1 يمين، -1 يسار)
bool targetState = false; // حالة وجود الهدف الحالية (false = غير موجود، true = موجود)
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
noTone(buzzerPin);
myServo.attach(servoPin);
myServo.write(pos);
Wire.begin();
Wire.setClock(400000); // تسريع الشاشة
display.begin(0x3C, true);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(10, 25);
display.print(F("SMART TRACKING"));
display.display();
tone(buzzerPin, 1000, 100);
delay(1000);
}
void loop() {
// قراءة أولى وثانية متتاليتان للتحقق من الحالة
int dist1 = getDistance();
delay(10);
int dist2 = getDistance();
// فحص شرط القراءتين المتتاليتين (وجود الهدف إذا كانت القراءتان أقل من 30 سم)
bool read1_hasTarget = (dist1 > 0 && dist1 < 30);
bool read2_hasTarget = (dist2 > 0 && dist2 < 30);
// 1. حالة وجود الهدف في قراءتين متتاليتين
if (read1_hasTarget && read2_hasTarget) {
targetState = true;
tone(buzzerPin, 2500, 30); // تنبيه وجود الهدف
// تثبيت الاتجاه بدون حركة وعرض الهدف
display.clearDisplay();
drawRadarGrid();
drawSweepLine(pos);
drawTarget(pos, (dist1 + dist2) / 2);
display.display();
}
// 2. حالة الانتقال من وجود الهدف إلى عدم وجوده في قراءتين متتاليتين
else if (targetState && !read1_hasTarget && !read2_hasTarget) {
targetState = false; // إعادة ضبط الحالة إلى عدم وجود هدف
// الدخول في عملية البحث السريع
bool foundInQuickSearch = runQuickSearch();
// إذا لم يجد الهدف في البحث السريع، ينتقل فوراً للبحث الاعتيادي
if (!foundInQuickSearch) {
runNormalSearch();
}
}
// 3. حالة عدم وجود الهدف في قراءتين متتاليتين (الاستمرار بالبحث الطبيعي)
else if (!read1_hasTarget && !read2_hasTarget) {
targetState = false;
runNormalSearch();
}
}
// دالة البحث السريع عند فقدان الهدف
bool runQuickSearch() {
int targetPos;
// الخطوة الأولى: 20 درجة باتجاه عقارب الساعة
targetPos = constrain(pos + 20, 30, 150);
myServo.write(targetPos);
delay(150); // وقت قصير لاستقرار السيرفو
if (checkTargetTwice()) {
pos = targetPos;
return true; // تم إيجاد الهدف بالدوران الأول
}
// الخطوة الثانية: 40 درجة عكس عقارب الساعة (20 للرجوع + 20 للاتجاه الثاني)
targetPos = constrain(targetPos - 40, 30, 150);
myServo.write(targetPos);
delay(200);
if (checkTargetTwice()) {
pos = targetPos;
return true; // تم إيجاد الهدف بالدوران الثاني
}
// لم يجد الهدف في البحث السريع
pos = targetPos;
return false;
}
// دالة البحث الاعتيادي (المسح الطبيعي السريع)
void runNormalSearch() {
pos += dir * 5;
if (pos >= 150) dir = -1; // الحد الأيسر للزاوية المتفق عليها
if (pos <= 30) dir = 1; // الحد الأيمن للزاوية المتفق عليها
myServo.write(pos);
display.clearDisplay();
drawRadarGrid();
drawSweepLine(pos);
display.display();
}
// دالة مساعدة للتحقق من وجود الهدف بقراءتين متتاليتين
bool checkTargetTwice() {
int d1 = getDistance();
delay(10);
int d2 = getDistance();
return (d1 > 0 && d1 < 30 && d2 > 0 && d2 < 30);
}
// دالة قراءة المسافة بحساس الألتراسونيك
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 4000);
if (duration == 0) return 0;
return duration * 0.034 / 2;
}
// رسم شبكة الرادار
void drawRadarGrid() {
display.drawCircle(64, 63, 60, SH110X_WHITE);
display.drawCircle(64, 63, 40, SH110X_WHITE);
display.drawCircle(64, 63, 20, SH110X_WHITE);
display.drawLine(64, 63, 12, 33, SH110X_WHITE);
display.drawLine(64, 63, 116, 33, SH110X_WHITE);
}
// رسم خط المسح
void drawSweepLine(int angle) {
float rad = angle * (3.14159 / 180.0);
int x = 64 + (int)(60.0 * cos(rad));
int y = 63 - (int)(60.0 * sin(rad));
display.drawLine(64, 63, x, y, SH110X_WHITE);
}
// رسم نقطة الهدف عند تثبيت الحركة
void drawTarget(int angle, int distance) {
float rad = angle * (3.14159 / 180.0);
float distFactor = (float)distance / 30.0;
if (distFactor > 1.0) distFactor = 1.0;
int r = (int)(60.0 * distFactor);
int x = 64 + (int)(r * cos(rad));
int y = 63 - (int)(r * sin(rad));
display.fillCircle(x, y, 4, SH110X_WHITE);
}
رابط فديو الشرح
https://youtube.com/shorts/-5iDg6IZsOk?si=5fsknkLqNKI7bJqT