با سلام خدمت همه دوستان عزیز و گرامی : یکی از مسایلی که این روزها خیلی مهم شده، پیدا کردن موقعیت یک شخص یا یک جسم از راه دور هستش، مثلا فرض کنین یکی یه حیوون خونگی داره خیلی مراقبشه، خب در صورتی که این حیوون بره جایی و کم بشه، میشه با یه ردیاب پیداش کرد و به دردسر نیفتاد!!!!!!! مثلا همین چند روز پیش دیدم یکی عکس سگش رو روی دیوار زده و بود نوشته بود گمشده!!!!!!!!!!!!!!!! قدیما عکس آدما رو میزدن جدیدا عکس سگ ها رو هم میزنن!!!!!!!!!!! به هر حال اگه این حیوون خونگی یه ردیاب داشت راحت میشد پیداش کرد. یا مثلا میشه روی ماشن گذاشتش و اگر یه روزی خدایی نکرده ماشین سرقت شد، میشه موقعیت ماشین رو پیدا کرد و دزد نامرد رو گرفت!!!!!!! یا اینکه افرادی که دچار اختلال حواس هستند هم میتونن از این وسیله استفاده کنن، اینجوری موقعیتشون رو داریم و نگرانی از بابت گمشدنشون نداریم. همونطور که میبینید این وسیله کاربردهای زیادی داره و میتونه تو مواقع حساس مفید واقع بشه ( پروژه ردیاب ماشین با میکروکنترلر مگا 16 )
پروژه ردیاب ماشین با میکروکنترلر مگا 16
انواع روش موقعیت یابی
خب بریم اصل متلب که ببینیم کلا قضیه از چه قراریه. برای موقعیت یابی دو روش رایج وجود داره :
1) استفاده از ماهواره های gps که الان همه جا به وفور هستش، مثلا توی گوشی های هوشمند هستش؛ یه گیرنده است که با ماهواره های درحال گردش در فضا ارتباط برقرار میکنه و موقعیت خودش را به دست میاره؛ استفاده از این سرویس رایگان هستش و هزینه ای نداره؛ چند کشور این سرویس رو دارن پشتیبانی میکنن؛ اولین کشور که در این زمینه فعالیت کرد آمریکا بودش، الان روسیه، چین و اتحادیه اروپا در این زمینه فعال هستن.
2) روش دیگه ای که میتونه موقعیت یابی کنه ولی خطای نسبتا زیادی داره، استفاده از دکل های مخابراتی هست که گوشی تلفن و یا ماژول سیم کارتی مثل sim800c به اون وصل میشن و یه موقعیت تقریبی از بین سه دکل مخابراتی نزدیک به تلفن همراه به دست میاد و به عنوان موقعیت تقریبی ازش استفاده میشه. مثلا من وقتی امتحان کردم یه کوچه بالاتر رو نشون میداد.
ما در این پروژه از روش دوم استفاده میکنیم؛ برای استفاده از این روش باید به اینترنت متصل بشیم. پس طبعا باید اینترنت روی سیم کارتمون فعال باشه؛ بعد به کمک یه دستور میتونیم موقعیت تقریبی خودمون ببینیم؛ روش کاری ما در این پروژه اینطور هستش که ما به شماره سیم کارتی که توی دستگاهمون هست زنگ میزنیم؛ مثل پروژهای قبلی دستگاه تماس رو قطع میکنه و این بار مثل پروژه های قبلی که دما رو میفرستاد، یه لینک بهمون اس ام اس میکنه که اگه روش کلیک کنیم، میتونیم موقعیت تقریبیمون رو مشاهد کنیم.
قطعات مورد نیاز پروژه ردیاب ماشین
برای این پروژه احتیاج به قطعات زیر داریم:
1) میکروکنترلر ( یه میکرو مگا 16 کافیه، حالا میتونین مگه 32 و … استفاده کنین، ولی مگا 16 جوابه )
2) ماژول sim800c ( این همون ماژول سیم کارت خور هستش که قراره بهش زنگ بزنیم و موقعیتمون رو بگیریم؛ شما میتونین از ارزونترین مدل این ماژول ها ینی sim800l استفاده کنین )
3) سه تا مقاومت یه کیلویی+ خازن برای تغذیه (ی ه هزار میکروفاراد توصیه میشه، اکه بتونین 4 هزار و یا حتی 10 هزار بزارید بهتره، چون نویز تو مدار بخاطر ارتباط اینترنتی یکم زیاد میشه )
نکته خیلی مهم : منبع تغذیه اتون باید بتونه جریان حداقل 2 آمپر رو تامین کنه وگرنه یا ماژول مخابراتی روشن نمیشه و یا اگر بشه حین کار بخاطر اتصال به اینترنت و دریافت تماس خاموش میشه.
توضیحات پروژه ردیاب خودرو
اگر تو پروژه قبلی که ارسال دما با اس ام اس بود دقت کرده باشید ما یه پایه ri تو ماژول داشتیم زمانیکه با ماژول تماس میگرفتیم این پایه 0 منطقی ( یا همون 0 ولت ) میشد و ما می فهمیدیم که با دستگاه تماس گرفته شده، اینجا توی میکرو یه وقفه خارجی رخ میداد، وارد روتین وقفه میشدیم پس تماس رو قطع میکردیم و دما رو به کاربر ارسال میکردیم، این جا هم دقیقا همینه فقط جای دما باید موقعیت رو بفرستیم. برای پیدا کردن موقعیت اول با دستور at+sapbr=1,1 اینترنت رو فعال میکینم و بعد با دستور at+cipgsmloc=1,1 موقعیت رو پیدا میکنیم. وقتی که دستور موقعیت یابی رو وارد میکنیم، ماژول موقعیت ( طول و عرض جغرافیایی ) رو به همراه تاریخ و ساعت برامون میفرسته و بعد با یکم برنامه نویسی طول و عرض جغرافیای رو از داده دریافتی استخراج میکنیم و به کاربر پیامک میکنیم؛ نکته مهم این هست که برای برنامه، من از قابلیت codewizard استفاده کردم، تنظیماتش به اینصورت هست که تو قسمت وقفه خارجی، وقفه خارجی صفر رو به صورت low level تعریف کردم، تو قسمت تنظیمات مربوط به سریال ارسال و دریافت رو فعال کردم، وقفه دریافت رو هم فعال کردم و بافر گیرنده رو اندازه اش رو روی 248 بایت تنظیم کردم. فرکانس میکرو هم 8 مگاهرتز با اسیلاتور داخلی تنظیم کردم.
قبل از این که سراغ کد برنامه بریم، بهتره یکبار دیگه سازوکار برنامه رو بررسی کنیم. مراحل به این ترتیب هست که شما با دستگاه تماس میگیرین، میکرو با ارسال دستور ath به ماژول sim800c ارتباط تلفنی رو قطع میکنه و متغیر ri2=1 میشه، بعد از روتین وقفه خارج میشه و تو حلقه تکرار بی نهایت بدنه اصلی برنامه، ینی حلقه (while(1 تو تابع main، با بررسی شرط 1 بودن متغیر ri2 وارد شرط میشه، اینجا ابتدا با دستور at+sapbr=1,1 اینترنت فعال میشه، بعد با دستور 1و1 at+cipgsmloc= موقعیت رو همونطور که در بالا هم گفتیم دریافت میکنیم. در قسمت پایین کد برنامه رو بررسی میکنیم.
شماتیک پروژه :
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
#include <mega16.h> #include <stdio.h> #include <string.h> #include <delay.h> int ri2=0; // متغیر بررسی برقراری تماس تلفنی bit st0; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) // روتین وقفه مربوط به تماس تلفنی { ri2=1; printf("ath\r\n"); // دستور قطع تماس تلفنی delay_ms(50); } #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 248 char rx_buffer[RX_BUFFER_SIZE]; unsigned char rx_wr_index,rx_rd_index,rx_counter; // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine #pragma savereg- interrupt [USART_RXC] void uart_rx_isr(void) // وقفه مربوط به سریال { char status,data; #asm push r26 push r27 push r30 push r31 in r26,sreg push r26 #endasm status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; #asm pop r26 out sreg,r26 pop r31 pop r30 pop r27 pop r26 #endasm } #pragma savereg+ #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif void main(void) { int i,k,j; char gps_data[70],lo[20],lat[20]; int vir_start,vir_end,tmp; PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Low level // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x00; MCUCSR=0x00; GIFR=0x40; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; #asm("sei") // Global enable interrupts while(1) { #asm("sei") if(ri2==1){ #asm("cli") for(i=0;i<50;i++) gps_data[i]=NULL; // پاک کردن داده های قبلی rx_wr_index=0; // پاک کردن شمارنده بافر سریال rx_counter=0; rx_buffer_overflow=1; for(i=0;i<248;i++) rx_buffer[i]=NULL; //********************************* for(i=0;i<20;i++) lat[i]=NULL; lo[i]=NULL; //********************************* for(i=0;i<70;i++) gps_data[i]=NULL; //********************************* i=0; k=0; st0=0; tmp=0; #asm("sei") ri2=0; // صفر کردن متغیر تماس برای اینکه دفعات بعدی قابل استفاده باشه printf("at+sapbr=1,1\r\n"); delay_ms(15000); #asm("sei") delay_ms(500); for(i=0;i<248;i++) rx_buffer[i]=NULL; printf("at+cipgsmloc=1,1\r\n"); delay_ms(15000); //*********************************************************** vir_start=0; vir_end=0; j=0; #asm("cli") // در اینجا به دنبال اطلاعات قسمت طول جغرافیایی هستیم for(i=0;i<248;i++) { if(vir_start==2) break; if(rx_buffer[i]==',') vir_start++; } vir_start=i; // در اینجا به دنبال اطلاعات عرض جغرافیایی هستیم for(i=0;i<248;i++){ if(vir_end==4) break; if(rx_buffer[i]==',') vir_end++; } vir_end=i; j=0; for(i=vir_start;i<vir_end-1;i++){ gps_data[j]=rx_buffer[i]; j++; } i=0; puts(gps_data); for(i=0;i<strlen(gps_data);i++){ if(gps_data[i]==',') break; } j=0; tmp=0; for(j=0;j<i;j++){ lo[j]=gps_data[j]; } j=i+1; tmp=0; for(j;j<strlen(gps_data);j++){ lat[tmp]=gps_data[j]; tmp++; } strcatf(lat,","); // پاک کردن داده برای اینکه بتونیم داده جدید قرار بدیم for(i=0;i<50;i++) gps_data[i]=NULL; //************************************************************ strcpyf(gps_data,"https://google.com/maps?q="); // لینک گوگل مپ strcat(gps_data,lat); strcat(gps_data,lo); //************************************************************* delay_ms(1000); printf("\n"); delay_ms(250); printf("AT+CMGF=1\r\n"); delay_ms(700); printf("AT+CMGS=\"+98************\"\r\n"); // جای ستاره ها شماره خودتون رو بزارین delay_ms(700); puts(gps_data); delay_ms(500); printf("\n"); putchar(26); delay_ms(15000); } }; } |
عکس پروژه در عمل : اول مطلب قرار داده شده.
فیلم پروژه : https://www.aparat.com/v/Sf6ai
هر جای برنامه موردی و یا مشکلی و یا ابهامی دیدن تو قسمت نظرات لطفا بگید تا با هم بررسیش کنیم.
مهمان
سلام جناب اقای صابری خسته نباشید من میخوام در کد مدار قسمت ارتباط سریال رو چجوری در کد ویزارد تنظیم کنم که متناسب با کد باشه ممنون می شوم اگر پاسخ دهید
مهمان
سلامدواتساپ یا کدوم نرم افزار هستین برام ارور میده کد هم کپی کد شما
مهمان
خازن به کجا وصل میشه
مهمان
خسته نباشین چقدر لقمه رو چرخوندین دور سرتون مهندس
مهمان
سلام
مهندس پروژه نمیشه دانلود کرد اگه امکانش بود لینک دانلود رو بذارین
مهمان
سلام
من هم مشکل علی آقا رو دارم. چرا پاسخ موقعیت رو 0و0 می ده؟
مهمان
سلام مهندس اینو عملی بستم تو اینترنت هم میره پیام هم میده لینک گوگل مپ و اینه0.000000,0.000000
لطفا راهنمای کنید وقتی تو اینترنت نباشه پیامی که میده 6تا 0 است ممنون میشم راهنمای کنید
مهمان
سلام. میشه در مورد دقت لوکیشنی که میده بگین و اینکه استفاده از این لوکیشن بهتره یا sim808؟
مهمان
سلام.من واسه تبدیل به hex مشکل دارم.میتونید لطف کنید بگید با چه زبانی یا چه برنامه ای نوشتید که بتونم تبدیل به hex کنم.ممنون
مهمان
سلام خسته نباشید
#define دقیقا برای چی کاربرد داره؟!
یک مثال ساده هم براش میزنید که متوجه بشم
تشکر
مهمان
سلام
لطفا دریافت پیامک از ماژول و کنترل رله رو بگذارید . با مگا 16 و کریستال8 یا بدون کریستال. ممنون
مهمان
سلام
ببخشید چجوری میتونم فایل شو دانلود کنم
مهمان
سلام خسته نباشید با چه ات کامنت ای میشه از حالت اینترنت بیایم بیرون
نویسنده این مطلب
سلام
ممنونم
با دستور زیر:
AT+SAPBR=0,1
مهمان
سلام sim800 رو باید کافیک کنیم
مهمان
سلام آقای صابری،ایمیل تون برای ارتباط بدید
مهمان
سلام،خسته نباشی،دستورات در برنامه کدویزارد،Erorمیده،خواهشا فایلشو بزارین برا دانلود
مهمان
سلام.خسته نباشید و ممنون بابت سایت خوبتون.
من میخوام با یه ماژول دوربین(ov7670)فیلم (نه عکس) ضبط کنم و روی یک کارت sd ذخیره کنم.آیا میتونم از میکروکنترلر استفاده کنم؟اگه میشه لطفا راهنماییم کنید.اگه با میکرو نمیشه با چی میتونم این کارو انجام بدم که خیلی هزینش بالا نره.(فکر کنم با رزبری پای بشه ولی هزینش بالاست)بهترین چیزی که تو اینترنت پیدا کردم ذخیره کردن عکس با اردوینو بود.
مهمان
سلام
با روش اول هم اگر امکان داره برامون بزارید ممنون
مهمان
سلام
یه مدت نبودم ولی انشالا حتما روش کار میکنم
مهمان
سلام/می خواستم بدونم چجوری sim 800c رو تو پروتوس کشیدید من که زدم هیچ ماژولی با این مشخصات نیاورد
مدیر سایت
سلام – مطالب آموزش پروتئوس در سطح نت رو دنبال کنید.
مهمان
سلام ، خود ماژول sim 800l تنظیماتی نمیخواد ؟؟
مهمان
عالی بود
دمتون گرم موفق باشید..
مهمان
سلام میخواستم بگم که نمیشه یه جوری برنامه نویسی کرد که مستقیم وصل بشه به گوگل مپ ومکانش رو به مابگه
مهمان
سلام و خسته نباشید
میشه بفرمایید چطوری باید مطمئن بشیم ماژول به اینترنت وصله
مهمان
سلام
برای اینکه مطمئن بشید به اینترنت وصله باید دستور زیر رو بزنید:
AT+SAPBR=2,1
ماژول در جواب به شما ای پی آدرس رو میگه، در صورتیکه به اینترنت وصل نشده باشه مقدار 0.0.0.0 رو برمیگردونه
مهمان
باز هم سلام
مدار این پیغام رو برام میفرسته
<>
بنظرتون مشکل از چیه؟
مهمان
سلام،والا نمیدونم، یه بررسی کنین ببینین اتصالات درست هستن؟
ضمنا حتما حتما حتما مطمئن شید یه ماژول به اینترنت متصل شده باشه
مهمان
سلام
ممنون از زحماتتون
میشه لطف کنید بهمراه پروژه ها فایل هگز اونها رو هم قرار بدید
من همین مدار و درست کردم و جواب نگرفتم. شک کردم نکنه فایل درست نباشه.
بازم از مدارات جالبتون ممنونم
نویسنده این مطلب
سلام متاسفانه کد هگز پاک شد چون ویندوزم پرید ولی در ابتدا چک کنین بینین سیم کارت بوق میخوره، بعد از اون حتما چک کنین قابلیت اتصال به اینترنت روی سیم کارت فعال شده باشه
نویسنده سایت
سلام

خدا قوت…
نویسنده این مطلب
سلام، ممنونم مهندس
مهمان
سلام مهندس اون دستورات اسمبلی که تو وقفه ی دریافت نوشتین واسه چیه؟
نویسنده این مطلب
سلام، اونها رو من ننوشتم کد ویزارد خودش تولید کرده
تو قسمت اول که عبارت push داره، مقادیر رجیسترهایی که ممکنه توی تابع دریافت وقفه استفاده بشن و مقدارشون تغییر کنه، تو حافظه ای به نام پشته ذخیره میشن که مقدارشون از دست نره
بعد که کار تابع وقفه تموم میشه و میخواد بیاد بیرون، اون مقادیری رو که ذخیره کرده بود با دستور pop از روی پشته آزاد میکنه
مهمان
سلام من یه ایمیل به شما دادم در مورد SX1278 هنوز جواب ندادید! حدود یک هفته شاید بشه
ممنون میشم پاسخ بدید
نویسنده این مطلب
سلام، من به همه ایمیل ها جواب میدم
شما هیچی ایمیلی نفرستادید
مهمان
سلام مهندس ایمیل تو بهم بده
مهمان
سلام فروشگاهی که ماژول sim800c گرفتین معرفی کنید؟
نویسنده این مطلب
سلام، فروشگاه الکترونیک 724