پروژه های AVR, پروژه‌ها

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

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

فهرست مطالب

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

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

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

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

شکل 1. مسیر دریافت پرتو GP2D12

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

شکل 2.نمودار GP2D12

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

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

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

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

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

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

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

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

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

				
					
#include <mega16a.h>
#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(" ");
}
}
}

				
			

خروجی برنامه

نظرتان را درباره این مقاله بگویید 2 نظر

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

دیدگاهتان را بنویسید

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