پروژه راه اندازی ماژول سنسور سنجش فاصله GP2D12 با استفاده از مجموعه آموزشی AVR WIZZARD توسط برد پلاریس به زبان C

 پروژه راه اندازی ماژول سنسور سنجش فاصله GP2D12 با استفاده از مجموعه آموزشی AVR WIZZARD توسط برد پلاریس به زبان C

راهنمای راه اندازی ماژول سنسور مسافت GP2D12 با استفاده از مجموعه آموزشی AVR WIZZARD به زبان C

هدف از این آموزش راه اندازی واحد ADC با  ماژول GP2D12 و سنجش مسافت، به زبان برنامه نویسی C  توسط مجموعه آموزشی AVR WIZZARD میباشد . ( شما می توانید مقادیر سنسور های آنالوگ مشابه را به این روش بخوانید )

لوازم مورد نیاز

  1. برد اصلی AVR WIZZARD
  2. برد ROBO-SHIELD
  3. LCD2X16
  4. ماژول GP2D12
  5. تغذیه 9 ولت

عملکرد سنسور های مادون قرمز شارپ

برای اندازه گیری فاصله تا یک شیء سنسورهای نوری وجود دارد که با استفاده از روش اندازه گیری مثلث فاصله را می دهند. شرکت “شارپ” متداول ترین سنسور های طول موج مادون قرمز را برای سنجش مسافت با خروجی آنالوگ تولید میکند. سنسورهای ساخته شده توسط “شارپ” دارای IR LED مجهز به لنز هستند که پرتوهای نور باریکی را ساطع می کنند. پس از بازتاب از جسم ، پرتو از طریق لنز دوم بر روی یک آشکارساز حساس موقعیت (PSD) هدایت می شود. ضریب هدایت این PSD بستگی به موقعیتی دارد که پرتو بر آن می نشیند. سپس رسانایی پرتو (ضریب هدایت) به ولتاژ تبدیل می شود که اگر ولتاژ با استفاده از مبدل آنالوگ به دیجیتال، تبدیل شود ، می توان فاصله را محاسبه کرد.

مسیر دریافت پرتو GP2D12
مسیر دریافت پرتو GP2D12

خروجی سنسورهای فاصله “شارپ” با ولتاژ خروجی، این بدان معنی است که با افزایش فاصله ، خروجی کاهش می یابد (به تدریج کاهش می یابد). نمودار دقیق رابطه بین فاصله و خروجی معمولاً در برگه اطلاعات سنسور قرار دارد. همه سنسورها محدوده اندازه گیری خاص خود را دارند که نتایج اندازه گیری شده معتبر است و این دامنه به نوع سنسور بستگی دارد. حداکثر فاصله اندازه گیری شده توسط سنسور به دو جنبه محدود شده است: کاهش  میزان نور منعکس شده و عدم توانایی PSD در ثبت تغییرات کوچک محل اشعه منعکس شده. هنگام اندازه گیری اشیاء که خیلی دور هستند ، خروجی تقریباً همان اندازه است که در هنگام اندازه گیری اشیاء در حداکثر فاصله وجود دارد. حداقل فاصله به دلیل خاصیت سنسورهای Sharp به یک مقدار مشخصی محدود شده است ، به این معنی که در یک نقطه خاص بسیار نزدیک ، به دلیل فاصله (بسته به مدل 4-20 سانتی متر) به شدت کاهش می یابد.

نمودار GP2D12
نمودار GP2D12

سنسورسنجش مسافت GP2D12

سنسور GP2D12  دارای دامنه اندازه گیری 10 سانتی متر – 80 سانتی متر است. ولتاژ خروجی این سنسور بسته به فاصله اندازه گیری شده ، حداکثر -0.3 to (VCC + 0.3) است. سنسور فاصله را می توان به هر کانال ADC مبدل آنالوگ-دیجیتال متصل کرد.

نحوه اتصال  سنسورGP2D12 به برد SENSOR_SHIELD از مجموعه آموزشی AVR WIZZARD

در برد شیلد ربات موسوم به ROBO_SHIELD از مجموعه آموزشی AVR WIZZARD کافی است سنسور GP2D12 مورد نظر را به سوکت مربوطه اتصال دهیم.

نحوه اتصال سنسورGP2D12 به برد SENSOR_SHIELD

نحوه برنامه نویسی سنسور GP2D12

نوشتن برنامه ای که ولتاژ خروجی سنسورهای مسافت را اندازه گیری کند ، آسان است ، اما نکته مهم ، شامل تبدیل این ولتاژ خروجی به فاصله است.

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

همچنین با استفاده از نرم افزار متلب می نواند معادله منحنی داده شده در دیتاشیت سنسور را بدست آورد.

در ادامه نحوه محاسبه مسافت با سنسور GP2D12 را در تابع MAIN مشاهده می کنید:


#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int timer_ovf=0;
float distance=0.0;
char dist_str[20];
// Declare your global variables here

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  timer_ovf++;
  TCNT0=0;
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (1<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 0.128 ms
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
lcd_clear();
lcd_gotoxy( 0 , 0 );
lcd_putsf( "WWW.REDRONIC.COM" ) ;
delay_ms(2000);

// Global enable interrupts
#asm("sei")
while (1)
      {
       PORTA.1=1;               // set trig pulse
       TCNT0= 0;  
       TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00);
       while(TCNT0<20);
       PORTA.1=0;               //reset trig pulse
       TCCR0=0;
       while(PINA.2==0);      //listen to echo puls
       timer_ovf=0;
       TCNT0=0;
       TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00); while(PINA.2==1); //listen to echo puls TCCR0=0; distance=((timer_ovf*256+TCNT0)/116.62) ; // calculate distance if(distance>450) 
        { 
               //lcd_clear();
               lcd_gotoxy(0,1);  
               lcd_putsf("             ");
               lcd_gotoxy(0,1); 
               lcd_putsf("Out of Range");
               delay_ms(500);
        }
       else 
        {
         //sprintf(dist_str,"Distance = %3.1f cm",distance);  
         ftoa(distance,1,dist_str);
         lcd_gotoxy(0,1);  
         lcd_putsf("Distance:");   
         lcd_gotoxy(9,1); 
         lcd_puts(dist_str); 
         lcd_gotoxy(14,1);  
         lcd_putsf("cm"); 
         delay_ms(1000); 
         lcd_gotoxy(9,1);
         lcd_putsf("   ");
        }

      }
}

خروجی برنامه

اتصال GP2D12 به برد ROBO SHIELD

zahra_ahmadi

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

3 × 3 =