ساخت رادار هوشمند با آردوینو | آموزشگاه هادی - هادی روبو

ساخت رادار هوشمند با آردوینو | آموزشگاه هادی - هادی روبو

پروژه عملی | هادی روبو

ساخت رادار هوشمند خودکار با آردوینو

آموزشگاه فنی و حرفه ای آزاد هادی (هادی روبو) – در این پروژه گام‌به‌گام یک رادار هوشمند و خودکار با استفاده از آردوینو و سنسور فراصوت طراحی و ساخته می‌شود. این ربات می‌تواند به‌طور خودکار موانع را تشخیص دهد.

خلاصه پروژه

  • زمان ساخت: ۲ تا ۳ ساعت
  • سطح دشواری: مبتدی تا متوسط
  • مفاهیم کلیدی: سنسور فراصوت، درایور موتور L293D، برنامه‌نویسی آردوینو، کنترل خودکار

 

قطعات مورد نیاز

  • آردوینو UNO R3
  • سنسور فراصوت HC-SR04
  • درایور موتور L293D
  • شاسی ربات با دو موتور DC و چرخ‌ها
  • چرخ کاستور (برای تعادل)
  • باتری ۹ ولت یا ۷.۴ ولت (۲ عدد)
  • پاوربانک (برای تغذیه آردوینو)
  • برس کوچک (برای تمیز کردن)
  • سیم‌های رابط و برد بورد
جاروبرقی هوشمند با آردوینو

سنسور فراصوت HC-SR04

سنسور فراصوت HC-SR04 یکی از پرکاربردترین سنسورهای اندازه‌گیری فاصله در پروژه‌های رباتیک است. این سنسور با ارسال امواج فراصوت و دریافت بازتاب آنها از موانع، فاصله را محاسبه می‌کند.

سنسور فراصوت HC-SR04

مشخصات کلیدی سنسور فراصوت:

  • محدوده اندازه‌گیری: ۲ تا ۴۰۰ سانتی‌متر
  • ولتاژ کاری: ۵ ولت
  • فرکانس: ۴۰ کیلوهرتز
  • زاویه تشخیص: ۱۵ درجه

نحوه عملکرد ربات

رادار هوشمند با استفاده از سنسور فراصوت، فاصله خود را از موانع اندازه‌گیری می‌کند. سپس روی یک نمایشگر TFT موانع شناسایی شده را آشکار می کند.

نقشه مدار

نقشه مدار جاروبرقی هوشمند با آردوینو

اتصالات مدار به شرح زیر است:

  • سنسور فراصوت:
    • پایه VCC به ۵ ولت آردوینو
    • پایه GND به GND آردوینو
    • پایه TRIG به پایه ۱۲ آردوینو
    • پایه ECHO به پایه ۱۳ آردوینو
  • درایور موتور L293D:
    • پایه‌های ورودی به پایه‌های ۴، ۵، ۶ و ۷ آردوینو
    • پایه‌های Enable به ۵ ولت
    • خروجی‌ها به موتور

کد برنامه آردوینو

در ادامه کد کامل پروژه آورده شده است:

#include <Servo.h> 
#include <SPI.h>
#include "Ucglib.h"           


#define  trigPin   6       
#define  echoPin   5        
#define  ServoPin  3         
int Ymax = 240;              
int Xmax = 320;              

int Xcent = Xmax / 2;       
int base = 210;              
int scanline = 185;         

Servo baseServo; 
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);

void setup(void)
{
 
      ucg.begin(UCG_FONT_MODE_SOLID); 
      ucg.setRotate90();             
      
      pinMode(trigPin, OUTPUT);      
      pinMode(echoPin, INPUT);       
      Serial.begin(115200);            
      baseServo.attach(ServoPin);   
    
      
      ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
      ucg.setColor(0, 0, 100, 0);
      ucg.setColor(1, 0, 100, 0);
      ucg.setColor(2, 20, 20,20);
      ucg.setColor(3, 20, 20, 20);
      ucg.drawGradientBox(0, 0, 320, 240);
      ucg.setPrintDir(0);
      ucg.setColor(0, 5, 0);
      ucg.setPrintPos(70,120);
      ucg.setFont(ucg_font_logisoso32_tf);  
      ucg.print("Mini Radar");
      ucg.setColor(0, 255, 0);
      ucg.setPrintPos(70,120);
      ucg.print("Mini Radar");
      ucg.setFont(ucg_font_courB14_tf);
      ucg.setColor(20, 255, 20);
      ucg.setPrintPos(90,200);
      ucg.print("Testing...");
      baseServo.write(90);
    
    
      for(int x=0;x<180;x+=5)
          { baseServo.write(x);
            delay(50);
           }
      ucg.print("OK!");
      delay(500);
      ucg.setColor(0,0, 0, 0);
      ucg.setColor(1,0, 0, 0);
      ucg.setColor(2,0, 0, 0);
      ucg.setColor(3,0, 0, 0);
      ucg.drawGradientBox(0, 0, 320, 240);
      delay(10);
    
    
      //ucg.clearScreen();
      cls();
      ucg.setFontMode(UCG_FONT_MODE_SOLID);
      ucg.setFont(ucg_font_helvR08_hr);   // or freedoomr10_tr
  
}


void cls()
{
 
  ucg.setColor(0, 0, 0, 0);
  for(int s=0;s<240;s++)
  {
    ucg.drawHLine(0,s,320);
    delay(1);
  }
    
  //ucg.drawBox(0, 0, 160, 60);

}


int calculateDistance()
{ 
      long duration;
    
      digitalWrite(trigPin, LOW); 
      delayMicroseconds(2);
      
      digitalWrite(trigPin, HIGH); 
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      
      duration = pulseIn(echoPin, HIGH);
     
      return duration*0.034/2;
}

void fix_font() 
{
      ucg.setColor(0, 180, 0);
      ucg.setPrintPos(144,44);
      ucg.print("1.00");
      ucg.setPrintPos(144,100);
      ucg.print("0.60");
      ucg.setPrintPos(144,165);
      ucg.print("0.30");
}

void fix()
{

      ucg.setColor(0, 180, 0);
    
      ucg.drawDisc(Xcent, base+1, 3, UCG_DRAW_ALL); 
      ucg.drawCircle(Xcent, base+1, 210, UCG_DRAW_UPPER_LEFT);
      ucg.drawCircle(Xcent, base+1, 210, UCG_DRAW_UPPER_RIGHT);
      ucg.drawCircle(Xcent, base+1, 135, UCG_DRAW_UPPER_LEFT);
      ucg.drawCircle(Xcent, base+1, 135, UCG_DRAW_UPPER_RIGHT);
      ucg.drawCircle(Xcent, base+1, 70, UCG_DRAW_UPPER_LEFT);
      ucg.drawCircle(Xcent, base+1, 70, UCG_DRAW_UPPER_RIGHT);
      ucg.drawLine(0, base+1, Xmax,base+1);
     
      ucg.setColor(0, 180, 0);
     
       for(int i= 40;i < 300; i+=2)
       {

        if (i % 10 == 0) 
          ucg.drawLine(185*cos(radians(i))+Xcent,base - 185*sin(radians(i)) , 205*cos(radians(i))+Xcent,base - 205*sin(radians(i)));
        
        else
        
         ucg.drawLine(195*cos(radians(i))+Xcent,base - 195*sin(radians(i)) , 205*cos(radians(i))+Xcent,base - 205*sin(radians(i)));
         
       }
          
     
       ucg.setColor(0,200,0);
       ucg.drawLine(0,0,0,36);
       for(int i= 0;i < 5; i++)
       {
          ucg.setColor(0,random(200)+50,0);
          ucg.drawBox(2,i*8,random(28)+3,6);
       }

       ucg.setColor(0,180,0);
       ucg.drawFrame(292,0,28,28);
       ucg.setColor(0,60,0);
       ucg.drawHLine(296,0,20);
       ucg.drawVLine(292,4,20);
       ucg.drawHLine(296,52,20);
       ucg.drawVLine(318,4,20);
        
       ucg.setColor(0,220,0);
       ucg.drawBox(296,4,8,8);
       ucg.drawBox(296,16,8,8);
       ucg.drawBox(308,16,8,8);
       ucg.setColor(0,100,0);
       ucg.drawBox(308,4,8,8);

       ucg.setColor(0,90,0);
       ucg.drawTetragon(124,220,116,230,196,230,204,220);
       ucg.setColor(0,160,0);
       ucg.drawTetragon(134,220,126,230,186,230,194,220);
       ucg.setColor(0,210,0);
       ucg.drawTetragon(144,220,136,230,176,230,184,220);
}



void loop(void)
{
  
  int distance;
  
  fix(); 
  fix_font(); 

  for (int x=180; x > 4; x-=2){      
     
      baseServo.write(x);             
      
     
      int f = x - 4; 
      ucg.setColor(0, 255, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      f+=2;
      ucg.setColor(0, 128, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      f+=2;
      ucg.setColor(0, 0, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      ucg.setColor(0,200, 0);
     
      distance = calculateDistance();
     
     
      if (distance < 100)
      {
        ucg.setColor(255,0,0);
        ucg.drawDisc(2.2*distance*cos(radians(x))+ Xcent,-2.2*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL);
      }
      else
      { 
        ucg.setColor(255,255,0);
        ucg.drawDisc(208*cos(radians(x))+Xcent,-208*sin(radians(x))+base, 1, UCG_DRAW_ALL);
      }
    
           
     
      Serial.print(x); 
      Serial.print("    ,   ");
      Serial.println(distance); 
     

      if (x > 70 and x < 110)  fix_font(); 


      ucg.setColor(255,255,  0);
      ucg.setPrintPos(20,230);
      ucg.print("DEG: "); 
      ucg.setPrintPos(54,230);
      ucg.print(x);
      ucg.print("  ");
      ucg.setPrintPos(240,230);
      ucg.print("     ");
      ucg.print(distance);
      ucg.print(" cm    "); 
      
  }
  //ucg.clearScreen();  
  delay(50);
  cls();   
 
  fix(); 
  fix_font();         
  
  for (int  x=1; x < 176; x+=2){     
      baseServo.write(x);             
      
     
      int f = x + 4;
      ucg.setColor(0, 255, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      f-=2;
      ucg.setColor(0, 128, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      f-=2;
      ucg.setColor(0, 0, 0);
      ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f)));
      ucg.setColor(0, 200, 0);
      
      distance = calculateDistance();

      
      if (distance < 100)
      {
        ucg.setColor(255,0,0);
        ucg.drawDisc(2.2*distance*cos(radians(x))+Xcent,-2.2*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL);
      }
      else
      { 
        ucg.setColor(255,255,0);
        ucg.drawDisc(208*cos(radians(x))+Xcent,-208*sin(radians(x))+base, 1, UCG_DRAW_ALL);
      }
           
      
      Serial.print(x); 
      Serial.print("    ,   ");
      Serial.println(distance); 
     
      if (x > 70 and x < 110)  fix_font(); 
      
      ucg.setColor(255,255,  0);
      ucg.setPrintPos(20,230);
      ucg.print("DEG: "); 
      ucg.setPrintPos(54,230);
      ucg.print(x);
      ucg.print("  ");
      ucg.setPrintPos(240,230);
      ucg.print("     ");
      ucg.print(distance);
      ucg.print(" cm    "); 
  
  }
 //ucg.clearScreen(); //
 delay(50);
 cls();


}
  
نکته: می‌توانید فاصله تشخیص (عدد ۲۰) را بر اساس نیاز خود تغییر دهید. همچنین زمان‌های تاخیر (delay) را برای تنظیم رفتار ربات در مسیرهای مختلف تغییر دهید.

کالیبراسیون و تست

پس از آپلود کد، ربات را روی زمین قرار دهید و عملکرد آن را بررسی کنید. اگر ربات خیلی تند می‌چرخد، زمان‌های تاخیر را تنظیم کنید.

عیب‌یابی:
  • اگر ربات حرکت نمی‌کند، اتصالات باتری و درایور موتور را بررسی کنید.
  • اگر سنسور فاصله را اشتباه اندازه‌گیری می‌کند، اتصالات TRIG و ECHO را بررسی کنید.

جمع‌بندی از آموزشگاه فنی و حرفه ای آزاد هادی (هادی روبو)

در این پروژه، موفق به ساخت یک رادار هوشمند خودکار با آردوینو و سنسور فراصوت شدیم. این ربات می‌تواند به‌طور خودکار موانع را تشخیص داده و روی یک نمایشگر TFT نمایش دهد. تمام مراحل این پروژه در آموزشگاه فنی و حرفه ای آزاد هادی با رویکرد عملی و پروژه‌محور تدریس می‌شود.


برچسب ها :

نظرات (0)

پیام بگذارید

captcha
 redo