404

الصفحه التي تبحث عنها غير موجوده

تصميم روبوت متتبع للخط طافئ للحرائق

0

 بسم الله الرحمن الرحيم

بعد ان قمنا بتصميم روبوت الغرض منه اطفاء الحرائق وتصميم روبوت متتبع للخط يمكن الإطلاع عليه من هنا:
سنقوم اليوم بدمج هذه المشاريع مع بعضها البعض حيث سنحصل علي روبوت يقوم بتتبع الخط وعندما يتحسس وجود اي حرائق يقوم باطفاء الحريق


اولا الأدوات:

flame sensor
3x tracking sensor
Arduino
2x dc motors
h-bridge
battery 9v

 line sensor

يعتبر من الحساسات المهمة مع الأردوينو حيث انه يتحسس من اللون الأسود والأبيض
فيعطى واحد عند استشعاره للون الأسود يعطى صفر وعند استشعاره للون الأبيض يعطى واحد
سنستخدم منه ثلاثة للسماح للروبوت بمعرفه اتجاه الخط فإذا كان الخط يسير بإتجاه مستقيم 
فإن الحساس الأوسط سيعطى صفر
وإذا واتجه الخط ناحية اليمين يقرء الحساس الأيمن صفر
وإذا اتجه الخط ناحية اليسار يقرأ الحساس الأيسر صفر

dc motor

هذا نوع من المواتير وهو المستخدم غالبا فى الروبوتات الخاصة بالأردوينو 
سنستخدم فى هذا المشروع هذا النوع من المواتير


h-bridge 

تعتبر هذه الشريحة التى تتحكم بالمواتير 
يمنع منعا باتا توصيل الأردوينو بطريقة مباشرة مع المواتير 
والا سيتم حرق الأردوينو
تأخذ هذه الشريحة مصدر طاقة خارجى وغالبا ما يكون بطارية 9 فولت
تأخذ الإشارة من الأردوينو لبدء عمل اي موتور مع تحديد اتجاه دورانه

Arduino

المتحكم المستخدم للقيام بمعالجة البيانات

flame sensor

حساس اللهب وهو مفيد في معرفة اذا كان هناك حرائق ام لا

ثانيا التوصيلات:


يتكون متتبع الخط من 3 منافذ منفذ الطاقة  5 فولت ومنفذ السالب الي السالب ومنفذ الإشارة حيث يتم توصيل منفذ الإشارة الخاص بالحساس الأيمن الي منفذ رقم 8 الرقمي وتوصيل الحساس الأوسط منفذ الإشارة الي منفذ رقم 9 وتوصيل منفذ الإشارة الخاص بالحساس الأيسر الي منفذ رقم 7 
ويتم توصيل حساس اللهب كالاتي منفذ الطاقة الي 5 فولت ومنفذ السالب الي السالب ومنفذ الإشارة الي 6 الرقمي
يتم توصيل المضخة الخاصة بضخ المياه عن طريق ترانزيستور npn فحيث يتم توصيل emiter الي السالب الخاص بالمضخة وتوصيل collector الي السالب الخاص ببطارية 9 فولت وتوحيد الطرف السالب مع توصيل سالب اﻷردوينو معهم و توصيل base الخاص بالترانزيستور الي منفذ 5 الرقمي
وتوصيل المواتير dc الي h-bridge وتوصيل منافذ الإشارة الخاصة ب h-bridge الي المنافذ رقم A0,A1,A2,A3,A4

مجسم الروبوت 

المجسم الذى سنستخدمه اليوم سيكون بهذا الشكل
نقوم بلصق المواتير بهذا الشكل


بعد ذلك قوموا بوضع باقى المكونات على حسب مهارتكم

يجب وضع حساس الخط فى مقدمة الروبوت وجعل مسافة 1 سم بين الحساس والأرض
ويجب وضع حساس فى اقصي يمين مقدمة الروبوت 
ووضع اخر فى اقصى يسار مقدمة الروبوت
ووضع الأخير فى وسط مقدمة الروبوت
فى الجزء المواجه الى الأرض

ثالثا الكود : 

const int LeftMotorForward =A0;
const int LeftMotorBackward =A1;
const int RightMotorForward =A2;
const int RightMotorBackward =A3;
const int EnableAB =A4;

const int sensor_right = 8;
const int sensor_middle = 9;
const int sensor_left = 7;

const int flamese = 6;
const int pump = 5;

void mforward()
  //to make robot move forward
  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);
  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);
  Serial.println("go forward!");
}
void mleft()
{
  //to move robot left
  digitalWrite(RightMotorForward, HIGH);
  digitalWrite(LeftMotorForward, LOW);
  Serial.println("go left!");
}
void mright()
{
  //to move robot right
  digitalWrite(LeftMotorForward, HIGH);
   digitalWrite(RightMotorForward, LOW);
}
void mstop()
{
 //to stop the robot
  digitalWrite(RightMotorForward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(LeftMotorBackward, LOW);
  Serial.println("Stop!");
}
void setup()
{   
  pinMode(RightMotorForward, OUTPUT);
  pinMode(LeftMotorForward, OUTPUT);
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);
  pinMode(EnableAB,OUTPUT);
  digitalWrite(EnableAB,1);
  delay(100);
}
void loop()
{
  int right_state = digitalRead(sensor_right);
  int left_state = digitalRead(sensor_left);
  int middle_state = digitalRead(sensor_middle);
  if(right_state == 0 && left_state == 1 &&       middle_state == 1)
  {
    mright();}
  if(right_state == 1 && left_state == 0 && middle_state == 1)
  {
    mleft();}
    if(right_state == 1 && left_state == 1 && middle_state == 0)
  {
  mforward(); }
  if(right_state == 1 && left_state == 1 && middle_state == 1)
  {
  mstop();}}
void fire_fight(){
  int x = digitalRead(flamese);
  if(x==1){
    digitalWrite(pump,1);
  }else{
    digitalWrite(pump,0);}}
في البداية يجب تعريف المتغيرات الأساسية مثل منافذ المواتير والحساسات ومنفذ المضخة وتعريف المدخلات والمخرجات
ثم القيام بعمليات مقارنة هل الخط يتجه لليمين تحرك الروبوت لليمين هل الخط متجه للأمام حرك الروبوت للامام هل الخط يتجه لليسار تحرك الروبوت ناحية اليسار و اذا كانت هناك اي اشارة من حساس اللهب قم بتشغيل المضخة علي الفور 

لتحميل الكود اضغط هنا 

تصميم وبرمجة : بلال حسان سعدي

روبوت ذراع باستخدام الأردوينو #2

0

 بسم الله الرحمن الرحيم

بعد ان قمنا سابقا بتصميم مثل هذا الروبوت ولكن كانت الية التحكم باستخدام المقاومات المتغيرة سنقوم اليوم باستخدام البلوتوث بالتحكم بهذا الروبوت 
 للإطلاع علي المشروع السابق من هنا

 اولا الأدوات  

4x servo motor
arduino uno 
hc-05 bluetooth module

موتور سيرفو  

احد انواع المواتير التي يمكن استعمالها الأردوينو والتي يمكنها الدوران بزاوية معينة 
 

arduino uno

المتحكم الذي سنستخدمه في اخراج الإشارات الي المواتير واستلام الإشارات من شريحة البلوتوث


 
 

 hc-05 bluetooth module 

شريحة البلوتوث التي سنتعامل معها ونرسل لها البيانات من التطبيق الي الأردوينو فهي الوسيط 
 



ثانيا التوصيلات : 

 يحتوي الموتور السيرفو علي 3 منافذ منفذ الطاقة يتم توصيله الي 5 فولت
 ومنفذ السالب يتم توصيله الي سالب الأردوينو 
ومنفذ الإشارة يتم توصيله الي منفذ من منافذ الرقمية 
وهكذا مع باقي المواتير السيرفو 
وتحتوي شريحة البلوتوث علي 4 منافذ
منفذ الطاقة يتم توصيله الي 5 فولت 
ومنفذ السالب يتم توصيله الي السالب
ومنفذ tx يتم توصيله الى 4
ومنفذ rx يتم توصيله الي 3

ثالثا الكود :

 #include<Servo.h>
#include<SoftwareSerial.h>
Servo serv1;
Servo serv2;
Servo serv3;
Servo serv4;
SoftwareSerial bt(4,3);

char da1 ;
char da2 ;
char da3 ;
char da4 ;

char data ;
void setup() {
serv1.attach(3);
serv2.attach(5);
serv3.attach(6);
serv4.attach(10);
bt.begin(9600);
}

void loop() {
while(bt.available()<0){}
data = bt.read();
if(data == 'f'){
  da1= bt.read();
  da1 = map(da1,0,180,0,255);
  da1 = constrain(da1,0,180);
  serv1.write(da1);
}
if(data == 's'){
  da2= bt.read();
  da2 = map(da2,0,180,0,255);
  da2 = constrain(da2,0,180);
  serv2.write(da2);
}
if(data == 't'){
  da3= bt.read();
  da3 = map(da3,0,180,0,255);
  da3 = constrain(da3,0,180);
  serv3.write(da3);
}
if(data == 'b'){
  da4= bt.read();
  da4 = map(da4,0,180,0,255);
  da4 = constrain(da4,0,180);
  serv4.write(da4);
}
data = 0;
  }


في البداية يجب تعريف بعض المكتبات الأساسية للتعامل مكتبتي 
servo و SoftwareSerial
 #include<Servo.h>
#include<SoftwareSerial.h>
 وبعد ذلك تعريف المواتير داخل المكتبة عن طريق
Servo serv1;
Servo serv2;
Servo serv3;
Servo serv4;
من ثم تعريف منافذ البلوتوث 
SoftwareSerial bt(4,3);
من ثم تعريف بعض المتغيرات من نوع char لكي نستقبل بها بيانات التطبيق
 char da1 ;
char da2 ;
char da3 ;
char da4 ;
char data ;
من ثم تعريف منافذ المواتير 
serv1.attach(3);
serv2.attach(5);
serv3.attach(6);
serv4.attach(10);
ومن ثم تحديد سرعة شريحة البلوتوث في استلام البيانات 
bt.begin(9600);
من ثم التاكد من حالة عمل شريحة البلوتوث 
while(bt.available()<0){}
ونقوم بوضع المتغير data لكي يحتوي علي البيانات المرسلة 
data = bt.read();
من ثم القيام ببعض الشروط اذا كانت data تساوي f
قم بقراءة زاوية التي قمت بتعيينها في التطبيق واخرجها علي الموتور السيرفو 
وهكذا مع باقي الكود حتي النهاية 
if(data == 'f'){
  da1= bt.read();
  da1 = map(da1,0,180,0,255);
  da1 = constrain(da1,0,180);
  serv1.write(da1);
}


لتحميل الكود و التطبيق من هنا
 
 
تصميم وبرمجة : بلال حسان سعدي
 

تصميم نموذج لروبوت cozmo #1

0

 بسم الله الرحمن الرحيم 

يعد روبوت cozmo من احد الروبوت الحديثة التى تباع حاليا حيث يعد هذا الروبوت مزود بذكاء صناعى ولديه العديد من الأمكانيات الرائعه والحركات المميزة التي لديه فسنحاول بتصميم نموذج له مبسط باستخدام الأردوينو 

الموضوع الأول الشاشة 
يتميز cozmo بشاشته التى تتميز بان لها العديد من الأشكال فسنقوم بتصميم مثل هذه الشاشة فى هذا المقال 


مثل الصورة التى فى الأعلى سنقوم ببرمجة الشاشة على عرض هذه الأشكال التى فى الأعلى 

اولا الأدوات 

Arduino uno 
oled 128x64

Arduino uno 

المتحكم الذي سنستخدمه فى عرض الحركات السابقه على الشاشة 

oled 128x64

الشاشة التى سنستخدمها فى عرض الحركات عليها 

ثانيا التوصيلات : 


تعتمد شاشة  oled على التوصيل على بروتوكول i2c
حيث يتم توصيل منفذ sck على منفذ a5 
وتوصيل منفذ sda على منفذ a4

ثالثا الكود :

في البداية من اجل التعامل مع حساس يجب ان نحصل على عنوان الذي حصل عليه الحساس لكي نستطيع التعامل معه 

#include <Wire.h>
void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);
  Serial.println("\nI2C Scanner");
}
void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);
}

فهذا الكود فى الأعلى يقوم الأردوينو بقراءة كل العناوين المتاحة للوصول الى العنوان الموجود عليه الشاشة

كل ما عليك الذهاب الى serial monitor لتجد عنوان الشاشة التى تعمل عليها 

ثم ننتقل الى كود المشروع 

#include <Adafruit_SSD1306.h>

#define OLED_ADDR   0xZZ

Adafruit_SSD1306 display(-1);

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);

  display.clearDisplay();

  display.display();

  delay(10000);

}

void loop() {

  happy(); delay (random (500, 1000));

  cierra();delay (150);

  enfado();delay (random (1000, 3000));

  cierra();delay (150);

  entorna();delay (random (1000, 3000));

  cierra();delay (150);

  enfado1(); delay (random (1000, 3000));

  cierra();delay (150);

  triste();delay (random (1000, 3000));

  cierra();delay (150);

  abre();delay (random (500, 3000));

  cierra(); delay (150);

  happy();delay (random (500, 1000));

}

void abre() {

  display.clearDisplay();

  display.fillCircle (50, 15, 12, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 20, 7, WHITE); //ojo derecho pequeño

  display.display();

}

void cierra() {

  display.clearDisplay();

  display.drawFastHLine(40, 15, 20, WHITE);

  display.drawFastHLine(72, 20, 15, WHITE);

  display.display();

}

void entorna() {

  display.clearDisplay();

  display.fillCircle (42, 10, 20, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 10, 15, WHITE); //ojo derecho pequeño

  display.fillRect (0, 0, 128, 15, BLACK); //ceja superior

  display.fillRect (0, 40, 128, 15, BLACK); //ceja inferior

  display.display();

}

void triste() {

  display.clearDisplay();

  display.fillCircle (42, 10, 17, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 10, 17, WHITE); //ojo derecho pequeño

  display.fillTriangle (0, 0, 0, 35, 78, 0, BLACK); //ceja superior

  display.fillTriangle (50, 0, 128, 35, 128, 0, BLACK); //ceja superior

  display.display();

}

void happy() {

  display.clearDisplay();

  display.fillCircle (42, 25, 15, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 25, 15, WHITE); //ojo derecho pequeño

  display.fillCircle (42, 33, 20, BLACK); //ojo izquierdo grande

  display.fillCircle (82, 33, 20, BLACK); //ojo derecho pequeño

  display.display();

}

void enfado() {

  display.clearDisplay();

  display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeño

  display.fillTriangle (0, 0, 54, 26, 118, 0, BLACK); //ceja superior

  display.display();

}

void enfado1() {

  display.clearDisplay();

  display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande

  display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeño

  display.fillTriangle (0, 0, 65, 15, 120, 0, BLACK); //ceja superior

  display.display();

}

في البداية يجب تعريف المكتبة الأساسية للتعامل مع شاشة oled 

#include <Adafruit_SSD1306.h>

ثم تعريف الشاشة وعنوانها 
#define OLED_ADDR   0xZZ
Adafruit_SSD1306 display(-1);

يتم استبدال zz بالعنوان الذي حصلنا عليه من الكود السابق 

ثم نقوم بتيئة الشاشة للعمل والبدء فى العرض 

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);

  display.clearDisplay();

  display.display();

ثم نقوم بتعريف دالة لكل شكل من الأشكال التى يرسمها روبوت كوزمو على شاشته وعمل استدعاء لكل هذه الدالات 

في نهاية المشروع يعد هذا بداية ليس ترقبونا 


لتحميل الأكود اضغط هنا 

تصميم وبرمجة : بلال حسان سعدي 

روبوت عنكبوت spider robot باستخدام الأردوينو

0

 بسم الله الرحمن الرحيم 

نبدء اليوم سلسلة جديده ومع تطبيق جديد من احد اروع تطبيقات الأردوينو او المتحكمات الدقيقة عموما وهو روبوت عنكبوت بأربعه ارجل وكيفية التحكم به والذي له العديد من الأدوات والتطبيقات المستخدمه  وننتقل الأن الى صلب الموضوع 


اولا الأدوات 

12x motor servo
arduino nano
hc-05 bt module
battery 


motor servo

موتور سيرفو والذي استخدمناه فى التحكم بارجل الروبوت والذي يعد موتور مناسب فى هذا التطبيق و تصميم الروبوت باربعه ارجل حيث تحتوى كل رجل على 3 مواتير سيرفو 


arduino nano

المتحكم الذي استخدمناه فى التحكم فى المواتير السيرفو ويجوز استخدام اي نوع اخر ولكننا استخدمنا نانو بسبب صغر حجمها عن اي نوع اخر 

hc-05 bt module

شريحة البلوتوث التي سنستخدمها فى التحكم فى المواتير الخاصه بالروبوت 


battery 

بطارية التى استخدمناها كمصدر طاقه 

ملحوظة : يجب استخدام بطارية اكبر من 2 امبير لكي يعمل الروبوت 

ثانيا المجسم :

المجسم يعد من اهم الأشياء عند تصميم روبوت ما فيجب ان يتم اتخاذ قياسات معينه لكي نضمن اتزان الروبوت 
المجسم من تصميم MEGA DAS








وقمت برفع الملفات الخاصه بكل جزء لكي تقوم بطبعها باستخدام 3dprint لتصميم المشروع 


للحصول على الملفات اضغط هنا 


ثالثا التوصيلات :






بالنسبة للتوصيلات يحتوى الموتور السيرفو على 3 منافذ منفذ للطاقه 5 فولت ومنفذ للسالب ومنفذ للإشارة حيث يتم توصيل المواتير على الترتيب 2 الى 13 منفذ رقمى
وشريحة البلوتوث تعتمد على توصيلها على بروتوكول uart الذي يتكون من rx و tx يجب توصيل rx الخاص بالبلوتوث الى tx الخاص بالأردوينو 
وتوصيل tx الخاص بالبلوتوث الى rx الخاص بالأردوينو 
وتوصيل البطارية الى vin داخل الاردوينو وتوصيل سالب الباطرية الى سالب الأردوينو تحت مبدأ توحيد السالب للدائرة 

رابعا الكود : 

 لكي نتعامل مع هذا الكود يجب اضافة مكتبيتين
مكتبة FlexiTimer2 من هنا
ومكتبة Adafruit_GFX ويمكن اضافتها عن طريق
tools << library << manage library


لن نقوم بشرح الكود بسبب كبر حجمه ولكن هذا الكود
باختصار يقوم بتعريف 12 موتور
ويقوم بتعريف شريحة البلوتوث وتعريف متغيرات خاصه
بالية الحركة ودالات المسئولة عن تشغيل المواتير بمجرد
الضغط على الزر فى التطبيق

تطبيق الهاتف
التطبيق كما موضح فى الصورة الأتيه
فعند الضغط على زر forward يتحرك الروبوت الى
الأمام
الضغط على زر back يعود الروبوت الى الخلف
عند الضغط على right يدور الروبوت الى اليمين
عند الضغط على left يدور الروبوت لليسار
عند الضغط على stop تحدث مفاجاة اترك لكم تجربتها








وفى نهاية هذا المشروع يمكنكم تحميل ملحقاته من هنا 
ولأى استفسار فى التعليقات 

تصميم : بلال حسان سعدى 



تصميم روبوت طافئ للنار fire fighter

0

بسم الله الرحمن الرحيم 

بعد اخر مشروع صممناه وهو التحكم بسيارة باستخدام ir remote

ويمكن الإطلاع عليه من هنا  



سنقوم اليوم بتصميم احد التطبيقات المهمه لروبوت السيارة وهو طافئ الحريق حيث سنقوم بتصميم روبوت سيارة يتنقل فى المكان ويتعقب اماكن النيران الى ان يصل اليها ثم يضخ المياه لإطفاءها


اولا الأدوات :

3x flame sensor

Arduino uno

2x motor dc

h-bridge

transistor pnp

pump 9v

battery 9v

flame sensor 

او حساس اللهب ولهذا الحساس القدرة على تعقب اماكن النيران

ويحتوى على 4 منافذ سبق لنا وقمنا بشرحه فى الدروس المتوسطه


arduino uno

المتحكم الذي سنستخدمه لقيام بمعالجه البيانات



motor dc

المواتير التى سنستخدمها لكى يستطيع الروبوت الحركة


water pump

مضخة المياه التى سنستخدمها لإطفاء اللهب

h-bridge

شريحة من اهم الشرائح التى سنستخدمها والتى منها سيتم التحكم بالمواتير و عملها واتجاه دورانها 


ثانيا التوصيلات :




تحتوى حساسات flame على 4 منافذ نحن سنستخدم 3 فقط

منفذ الطاقة ومنفذ السالب ومنفذ الخرج التماثلى يتم توصيل منفذ الطاقة الى 5 فولت وتوصيل منفذ السالب الى السالب وتوصيل منفذ الخرج التماثلي الى الأردوينو 

من ثم توصيل المواتير الى h-bridge كما هو موضح فى الأعلى

من ثم توصيل منافذ الداتا الى الأردوينو منافذ in الخاصه H-bridge

من ثم توصيل شريحة h-bridge بالطاقة من بطارية 9 فولت 

من ثم توصيل المضخه الى emiter الخاص بالترانزيستور وتوصيل collecotr الى البطارية 9 فولت +

وتوصيل الطرف السالب من المضخة الى -

وفى النهاية توصيل base الى الأردوينو

ثالثا المجسم :

ونتجه الأن الى تركيب جسم الروبوت 
اولا نحضر مثل هذا المجسم لا تهم المادة المصنعة لكن المهم هو ان تكون المادة وزنها خفيف 

ونقوم بتوصيل المواتير بالعجلات كما هو موضح بالصورة
ونقوم بلصق المواتير كما هو موضح فى الصورة


فينتج لدينا هذا الشكل 
كل ما عليكم وضع باقى التوصيلات على هذا المجسم وهذا الأمر يقف على حسب مهارتكم


رابعا الكود :-


#define IN1 6

#define IN2 5

#define IN3 4

#define IN4 3

#define EN1 7


const int pump = 8;

const int sensor_right = A2;

const int sensor_middle = A0;

const int sensor_left = A1;


void forward()

{

  digitalWrite(IN1, HIGH);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH);

  digitalWrite(IN4, LOW);

}


void reverse()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, HIGH);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, HIGH);

}


void left()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH);

  digitalWrite(IN4, LOW);

}


void right()

{

  digitalWrite(IN1, HIGH);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, LOW);

}


void stoprobot()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, LOW);

}

void setup()

  

  pinMode(IN1, OUTPUT);

  pinMode(IN2, OUTPUT);

  pinMode(IN3, OUTPUT);

  pinMode(IN4, OUTPUT);

  pinMode(EN1,OUTPUT);

  pinMode(pump,OUTPUT);

  digitalWrite(EN1,1);

  delay(100);

}

void loop()

{

  int right_state = analogRead(sensor_right);

  int left_state = analogRead(sensor_left);

  int middle_state = analogRead(sensor_middle);


  if(right_state > left_state && right_state > middle_state)

  {

    right();

  }

  if(left_state > right_state && left_state > middle_state)

  {

    left();

  }

   if(middle_state < 800)

  {

   forward(); 

  }

  if(middle_state > 800)

  {

  digitalWrite(pump,1);

  }

  else{

    digitalWrite(pump,0);

    stoprobot();

  }

}

خامسا شرح الكود :-

الكود كما هو موضح فى الأعلى يؤدى الغرض الأتي : 

في البداية تعريف المنافذ الخاصه بالموتور 

#define IN1 6

#define IN2 5

#define IN3 4

#define IN4 3

#define EN1 7


من ثم تعريف منافذ الحساسات والمضخه 

const int pump = 8;

const int sensor_right = A2;

const int sensor_middle = A0;

const int sensor_left = A1;

من ثم انشاء الدالات المسئولة عن تحريك الموتور

void forward()

{

  digitalWrite(IN1, HIGH);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH);

  digitalWrite(IN4, LOW);

}


void reverse()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, HIGH);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, HIGH);

}


void left()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH);

  digitalWrite(IN4, LOW);

}


void right()

{

  digitalWrite(IN1, HIGH);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, LOW);

}


void stoprobot()

{

  digitalWrite(IN1, LOW);

  digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW);

  digitalWrite(IN4, LOW);

}

ومن بعد ذلك القيام بتعريف جميع المنافذ السابقة كخرج ماعدا منافذ الحساسات التى لا يجب تعريفها لان المنافذ التماثليلة تمكون معرفة مسبقا كدخل

  pinMode(IN1, OUTPUT);

  pinMode(IN2, OUTPUT);

  pinMode(IN3, OUTPUT);

  pinMode(IN4, OUTPUT);

  pinMode(EN1,OUTPUT);

  pinMode(pump,OUTPUT);


من ثم انشاء ثلاثة متغيرات والقراءة من ثلاث حساسات وجعل القيمة كل حساس فى احد المتغيرات الثلاثة 

int right_state = analogRead(sensor_right);

 int left_state = analogRead(sensor_left);

 int middle_state=analogRead(sensor_middle);


بعد ذلك القيام بالشروط :

فإذا كانت قراءة الحساس الأيمن هى الأكبر قم بدوران ناحية اليمين

اذا كانت قراءة الحساس الأيسر هى الأكبر قم بدوران ناحية اليسار

اذا كانت قراءة الحساس الأوسط اقل من 800 قم بالتقدم الى الأمام

اذا كانت قراءة الحساس الأوسط اكبر من 800 قم بتشغيل المضخة واطفاء الروبوت 


لتحميل الكود اضغط هنا 

تصميم وبرمجة : بلال حسان سعدى

تصميم روبوت التحكم عن طريق ir remote

0

 بسم الله الرحمن الرحيم  

بعد ان قمنا بتصميم العديد من المشاريع التى لها علاقة بسيارة الروبوت  :- 

روبوت متتبع الخط line follower

روبوت التحكم عن طريق البلوتوث 

تصميم روبوت التحكم به عن طريق الصوت

تصميم روبوت التحكم به بالصوت عن طريق البلوتوث 


ولكن اليوم سنقوم ببعض التطويرات على هذا المشروع حيث سنتحكم بهذا الروبوت باستخدام ريموت كنترول 

اولا الأدوات 

ir remote reciever and sender

arduino uno

2 motor dc

l239d driver 

battery

ir remote reciever and sender

وسيلة التواصل التى سنستعملها فى هذا المشروع 

arduino uno

المتحكم الذي سنستخدمه الذي سيقوم بمعالجة البيانات و اتختذ القرار


l239d driver 

هذه الشريحة تشبه شريحة h-bridge فهى تقوم بالتحكم فى محركات dc ويجب استخدام هذه الشريحة 

وان تم توصيل المواتير مباشرة الى الأردوينو سيتم حرق الأردوينو 





ثانيا المجسم :

ونتجه الأن الى تركيب جسم الروبوت 
اولا نحضر مثل هذا المجسم لا تهم المادة المصنعة لكن المهم هو ان تكون المادة وزنها خفيف 

ونقوم بتوصيل المواتير بالعجلات كما هو موضح بالصورة
ونقوم بلصق المواتير كما هو موضح فى الصورة


فينتج لدينا هذا الشكل 
كل ما عليكم وضع باقى التوصيلات على هذا المجسم وهذا الأمر يقف على حسب مهارتكم

ثالثا التوصيلات : 




التوصيلات هى كما موضحه فى الأعلى لم نقوم بشرحها لاننا شرحناها من قبل 

رابعا الكود : 


فى البداية يجب ان نصل الى البيانات التى يقوم الريموت بارسالها عند الضغطة على اى زر
عن طريق هذا الكود 
#include <IRremote.h>
IRrecv rec(8);
decode_results res;
void setup(){
  rec.enableIRIn();
  Serial.begin(9600);
}
void loop(){
  if(rec.decode(&res)){
   Serial.println(res.value , HEX);
   rec.resume();
  }
}
حيث يقوم هذا الكود بقراءة البيانات المرسلة من الريموت وطباعتها فى السيريال مونيتور كل ما عليك تحديد الأزرار التى تريد ان تستعملها 

الكود النهائى :-


#include <IRremote.h>
#define IN1 12
#define IN2 11
#define IN3 10
#define IN4 9
IRrecv rec(8);
decode_results res;
void setup(){
 rec.enableIRIn();
 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, LOW);
}
void loop(){
  if(rec.decode(&res)){
    if(res.value == 0xZZZZZZZ){
      Serial.print("right");
      right();   }
    rec.resume();
    if(res.value == 0xZZZZZZZ){
      Serial.print("back");
      reverse();  }
    rec.resume();
    if(res.value == 0xZZZZZZZ){
      Serial.print("left");
      left(); }
    rec.resume();
    if(res.value == 0xZZZZZZZ){
      Serial.print("forward");
      forward();    }
    rec.resume();
    if(res.value == 0xZZZZZ){
      Serial.print("stop");
      stoprobot();  }
    rec.resume(); }}
void forward()
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}
void reverse()
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}
void left()
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}
void right()
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}
void stoprobot()
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

شرح الكود :-


فى البداية قمت باضافة المكتبة الأساسية لكي اتعامل مع ir remote

#include <IRremote.h>
من ثم انشاء متغيرات تحتوى على منافذ الموتور
#define IN1 12
#define IN2 11
#define IN3 10
#define IN4 9
من ثم قمت بانشاء كائنين كائن يتم وضع فيه منفذ الخاص بالمستلم
ثم كائن الأخر يتم انشائه وهو خاص بالبيانات المستلمة من الريموت
IRrecv rec(8);
decode_results res;
من ثم تشغيل المستلم وتهيئته لاستلام البيانات 
 rec.enableIRIn();
بعد ذلك القيام بتعيين جميع منافذ الموتور كخرج واخراج 0 فولت على جميع المنافذ
pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, LOW);
بعد هذا بدء استلام البيانات عن طريق هذا الأمر
 if(rec.decode(&res)){
من ثم البدء فى عمل مقارنات من القيمة المرسلة وقيمة الزر الذي قمت بتعيينه ويجب استبدال ZZZZZ بقيمة الزر التى سبق ان قرانها من على السيريال مونيتر مع الحفاظ على وجود 0x
وباقى الكود لن نقوم بشرحه بسبب اننا قمنا بشرحه  العديد من المرات

لتحميل الكود اضغط هنا 

خامسا التجربة النهائية :
تجربة المشروع النهائية على موقع تنكر كاد يمكنك مشاهدة هذا الفيديو 







تصميم وبرمجة : بلال حسان سعدى