الصنّاع العرب

صناعة روبوت أردوينو بإمكانيات بسيطة

وصف المشروع

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

جدول المكونات

العدد النوع
1 لوحة أردوينو أونو 3 Arduino Uno R3
1 إضاءة ليد Red LED
3 موتور سيرفو 9ج Micro Servo 9g
1 جهاز إنذار صوتي Piezo
1 حساس الاستشعار بالموجات فوق الصوتية Ultrasonic sensor
1 مقاومة 150 اوم 150 ohm Resistor
1 مفتاح فتح وإغلاق الدائرة Slide switch
1 حساس درجة الحرارة Temperature sensor

من أين أتت الفكرة

في الحقيقة أعمل كمطور برمجيات، قرأت الكثير عن مجال الإلكترونيات وتصنيع الروبوتات وقد قررت إقتحام هذا العالم الشيق لما فيه من تحديات ونظرة أعمق في التطلع إلى المستقبل، ومن ثم سألت نفسي “لم لا أصنع روبوت في المنزل كتجربة أوليه بإمكانيات بسيطة؟”.
بدأت مباشرة في تصور شكل الروبوت وتعلم برمجة الأردوينو حيث انها تكتب بنفس لغة البرمجة التي أستخدمها عادة في عملي كمطور وهي لغة “C”، كما قمت بشراء المكونات المطلوبة للمشروع واحدة تلو الأخرى.

تصميم المجسم

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

يمكنكم تحميل المجسم من هنا: تحميل المجسم

  • رأس الروبوت

بعد تحميل المجسم الورقي بصيغة PDF أتبعت خطوات التركيب ثم قمت بوضع حساس الاستشعار بالموجات فوق الصوتية بدلاً من العينين كما هو موضح.

  • إختبار الحساسات

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

للتعلم أكثر كيف تعمل الحساسات يمكنك زيارة الرابط: https://www.arduino.cc/en/Tutorial/Ping

  • آليه تحريك جسم الروبوت

كيف يتم تحريك الرأس والذراعين لكي يبدو الروبوت أكثر واقعية؟
قمت بأستخدام ثلاثة مواتير سيرفو servo motors 9g أحدهم للرأس واثنان لتحريك الذراعين، يتم وضعهم بهذا الشكل دخل جسم الروبوت

للتعلم أكثر كيف يعمل موتور السيرفر يمكنك زيارة الرابط : https://www.arduino.cc/en/Reference/Servo

  • تركيب ذراعي الروبوت

لا يزال ينقصنا تركيب الذراعين، لذا قمت بوضع عجلة موتور السيرفو داخل الذراع لتسهيل عملية التحريك كما هو موضح بالشكل

  • الدائرة الكهربية

كما هو موضح، تم تثبيت ووضع الدائرة الكهربية ولوحة الأردوينو داخل المجسم في القاعدة الكرتونية للروبوت، وتتكون هذه الدائرة من:

كيف يعمل الروبوت؟

يعد الروبوت من فئة الروبوتات الثابتة Stationary Robots ، فعادةً ما يستخدم مثل هذا النوع في المصانع والمختبرات ومعامل الأبحاث لتؤدي عملها بشكل روتيني مستمر.

1. يقوم بشكل تلقائي بقياس المسافة المحيطة وإعطاء إنذار في حال اقتراب الاجسام لمسافة تقل عن 10 سم.
2. يقوم بحساب درجة حرارة الغرفه عند تلقي الامر “temp” عن طريق شاشة السيريال “serial port screen”
3. يقوم بالاستدارة في إلى اليمين واليسار مع تحريك الرأس عند تلقي الأمر “right” او “left” من شاشة السيريال مع تحريك الرأس جهه الاستداره لتوجية حساس الموجات الصوتية لمساحة اخرى.

الكود

#include <Servo.h>

Servo Hservo,Rservo,Lservo;  // create servo object to control a servo

// defines pins numbers
const int trigPin = 6;
const int echoPin = 7;
int piezoPin = 11;
int led = 13;
const int temperaturePin = 0;

// defines variables
long duration;
int distance,val;

 
void setup() {

pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(led, OUTPUT);

Serial.begin(9600); // Starts the serial communication

  Rservo.attach(8); // right arm servo
  Hservo.attach(9); // head servo
  Lservo.attach(10);  // left arm servo
}
void loop() {

   float voltage, degreesC;
   voltage = getVoltage(temperaturePin);
   degreesC = (voltage - 0.5) * 100.0;
  
    // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    // Sets the trigPin on HIGH state for 10 micro seconds
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    // Reads the echoPin, returns the sound wave travel time in microseconds
    duration = pulseIn(echoPin, HIGH);
    // Calculating the distance
    distance= duration*0.034/2;
    
    delay(50);

    if (distance < 10) //
    {
      // Prints the distance on the Serial Monitor
      Serial.print("Distance: ");
      Serial.println(distance); // print the currnet distance on serial port
      tone(piezoPin, 1000, 500);  // this will alarm the sound every time distance 
      digitalWrite(led, HIGH); 
      delay(1000); // wait 1 1second   
    }
    else
    {
      noTone(piezoPin);
      digitalWrite(led, LOW);
      delay(50); 
    }


   if(Serial.available())
   {
     String value = Serial.readStringUntil('\n'); // read the string from serial window
     Serial.println(value);
     if(value == "left")
     {
        Hservo.write(80);   // moving the head little left                
        delay(15); 
        Lservo.write(60);   // left arm up               
        delay(15);
        Rservo.write(20);   // right arm down               
        delay(15);
     }
     else if(value == "right")
     {
        Hservo.write(40);   // moving the head little right                
        delay(15);
        Lservo.write(20);   // left arm down               
        delay(15);
        Rservo.write(60);  // right arm up                
        delay(15);
     }
     else if(value == "temp")
     {
       Serial.print("voltage: "); // print temperature
       Serial.print(voltage);
       Serial.print("  deg C: "); 
     }
   }
}

float getVoltage(int pin)
{
  // point value, which is the true voltage on that pin (0 to 5V).
  return (analogRead(pin) * 0.004882814);
}

Ahmed Azouz

مطور برمجيات ، مهتم بمجال التكنولوجيا والروبوت

أضف تعليق

اترك رد

تابعنا