به نام خدا : آموزش ساخت ماشین کنترلی دوربین دار با رزبری پای ؛ تو این مطلب می خوایم یه ماشین کنترلی کنترل شونده توسط کامپیوتر درست کنیم که هم زمان، تصویر دوربین رو به روی کامپیوتر منتقل کنه. یک کامپیوتر متصل به شبکه وای فای ( مثلا مودم wifi ) داریم برای کنترل رزبری پای و مشاهده تصویر دوربین، و یک رزبری پای وای فای دار ( رزبری پای 3b و یا مدل های پایین تر به همراه دانگل وای فای رزبری ) برای دریافت و اعمال کنترل بر روی موتور ها و همچنین ارسال تصویر ویدئو.
قطعات مورد نیاز پروژه ماشین کنترلی دوربین دار با رزبری پای
- رزبری پای 3B و یا مدل های پایین تر به همراه دانگل وای فای مناسب
- یه کامپیوتر متصل به شبکه ( مودم وای فای دار )
- تخته سه لایه به عنوان شاسی ربات ( مثلا 10 * 25 سانتیمتر )
- دو عدد موتور DC به همراه درایور مناسب ( بنده از دو تا مینی موتور 300 دور بر دقیقه استفاده کردم.درایور هم ماژول l298 استفاده کردم )
- باتری مناسب با موتور ها ( بنده از دو تا سلول باتری لیتیوم یون استفاده کردم جمعا 8.4 ولت )
- ماژول رگولاتور dc به dc برای تغذیه رزبری پای ( خروجی 5 ولت )
- دوربین رزبری پای با کابل دیتای مناسب.
- پایه نگهدارنده دوربین و پیچ و …
- دو عدد چرخ مناسب موتورها و اتصالات لازم
- یک عدد هرزگرد برای نقطه اتکای سوم ربات
- یک عدد کلید راکر برای قطع و وصل تغذیه و سیم برد بوردی نری به مادگی و مادگی به مادگی
- چند تا تای رپ برای فیکس کردن باتری و …
آموزش سر هم کردن پروژه ماشین کنترلی دوربین دار با رزبری پای
اول، چرخ ها، موتور ها و هرزگرد رو به شاسی وصل کنید؛ برای یاد آوری ترتیب پایه های رزبری پای به تصویر زیر دقت کنید :
پایه های درایور موتور l298 ما هم به صورت زیره :
ما برای کنترل موتورها، از چهارتا پایه 26 و 27 و 28 و 29 استفاده کردیم.این پایه ها رو به چهار تا پایه کنترلی درایور وصل کنید ( logic input )؛ پایه های output B و output A رو به موتور ها وصل کنید؛ مثبت باتری رو بعد از عبور دادن از کلید راکر، به +12 power و همچنین به ورودی مثبت رگولاتور وصل کنید. و سیم منفی باتری رو به power gng و همچنین،ورودی منفی رگولاتور وصل کنید؛ ولتاژ خروجی رگولاتور رو روی ولتاژ 5 تا 5.2 ولت تنظیم کنید و سیم های خروجی رگولاتور رو به پایه +5 ولت و زمین رزبری پای وصل کنید؛ یه سیم هم از 3.3 ولت رزبری پای،به 3.3 ولت درایور وصل کنید ( برای مشخص کردن سطح ولتاژ 1 منطقی )
توجه : جامپر 5v enable رو بردارید ( رو بورد نوشته con5 )
دوربین رو هم به رزبری وصل کنید و مدار کلید راکر رو وصل کنید تا رزبری روشن بشه.
توسط کامپیوتر و با یکی از روش های زیر به رزبری پای متصل بشید ( روشهای اتصال رزبری پای به کامپیوتر ) :
- روش xrdp
- روش ultra vnc
- با استفاده از نرم افزار های putty و xlunch به صورت همزمان.
توجه : سایر روش ها، در نمایش پنجره ها مشکل دارن.
کتابخونه های مورد نیاز برای پروژه :
1) کتابخونه wiringpi که یه کتابخونه به زبان c هست برای استفاده از gpio رزبری پای ( 1) آموزش نصب کتابخانه gpio برای رزبری پای؛ 2) نحوه استفاده از کتابخانه wiringpi )
2) کتابخونه opencv برای کار با دوربین ( آموزش نصب کتابخونه در مورد شماره 1 )
3) کتابخونه مورد نیاز دوربین ( آموزش نصب کتابخونه در مورد شماره 6 )
4) کتابخونه gtk برای تشخیص کلید های کیبورد جهت کنترل ربات؛ برای نصب gtk روی رزبری پای، تو ترمینال تایپ کنید :
1 2 3 4 5 |
sudo apt-get update sudo apt-get install libgtk-3-dev LIBS=’pkg-config –libs gtk+-3.0’ CFLAGS=’pkg-config –cflags gtk+-3.0’ sudo apt-get install c++ |
5) کتابخونه pthread برای پردازش موازی؛ برای نصب این کتابخونه، دستورات زیر رو وارد کنید :
1 2 |
sudo apt-get update sudo apt-get install libpthread-stubs0-dev |
تاحالا پیش نیاز ها نصب شد؛ حالا بریم سراغ کد و برنامه؛ تو ترمینال یه فایل با پسوند cpp درست کنید و کد زیر رو توش بنویسید :
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 |
//g++ robat.cpp -o robat $(pkg-config --libs --cflags gtk+-3.0 opencv)-I/usr/local/include -lraspicam -lraspicam_cv -lwiringPi-lpthread #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "raspicam/raspicam_cv.h" #include <opencv2/imgproc/imgproc.hpp> #include "wiringPi.h" #include <pthread.h> #include <string.h> using namespace std; char farmoon[10]; char jahat[10]; int exit_flag = 0; void *thread0(void *l0) { delay(3000); raspicam::RaspiCam_Cv camera ; camera.open(); cv::Mat cam; // cv::namedWindow("camera",0); while(exit_flag == 0) { camera.grab(); camera.retrieve(cam); // cv::waitKey(50); cv::imshow("camera",cam); cv::waitKey(5); // delay(50); } cout << "camera Exit" << endl; camera.release(); } static gboolean key_press_function(GtkWidget *widget,GdkEventKey *event) { string pressed_key = gdk_keyval_name (event->keyval); char key[10]={}; for(int i=0;i<10;i++) key[i] = pressed_key[i]; if(strcmp(key,"Return") == 0) exit_flag = 1; if(strcmp(key,"Up") == 0 & strcmp(jahat,"jelo") != 0) { sprintf(jahat,"jelo"); cout << jahat << endl; digitalWrite(26,1); digitalWrite(27,0); digitalWrite(28,1); digitalWrite(29,0); } if(strcmp(key,"Down") == 0 & strcmp(jahat,"aghab") != 0) { sprintf(jahat,"aghab"); cout << "aghab" << endl; digitalWrite(26,0); digitalWrite(27,1); digitalWrite(28,0); digitalWrite(29,1); } if(strcmp(key,"Right") == 0 & strcmp(farmoon,"rast") != 0) { sprintf(farmoon,"rast"); cout << farmoon << endl; digitalWrite(26,1); digitalWrite(27,0); digitalWrite(28,0); digitalWrite(29,0); } if(strcmp(key,"Left") == 0 & strcmp(farmoon,"chap") != 0) { sprintf(farmoon,"chap"); cout << farmoon << endl; digitalWrite(26,0); digitalWrite(27,0); digitalWrite(28,1); digitalWrite(29,0); } return FALSE; } static gboolean key_release_function(GtkWidget *widget,GdkEventKey *event) { string released_key = gdk_keyval_name (event->keyval); char key[10]={}; for(int i=0;i<10;i++) key[i] = released_key[i]; if(strcmp(key,"Up") == 0 | strcmp(key,"Down") == 0) { sprintf(jahat,"ist"); cout << jahat << endl; digitalWrite(26,0); digitalWrite(27,0); digitalWrite(28,0); digitalWrite(29,0); } if(strcmp(key,"Left") == 0 | strcmp(key,"Right") == 0) { sprintf(farmoon,"mostaghim"); cout << farmoon << endl; if(strcmp(jahat,"jelo") == 0) { digitalWrite(26,1); digitalWrite(27,0); digitalWrite(28,1); digitalWrite(29,0); } if(strcmp(jahat,"aghab") == 0) { digitalWrite(26,0); digitalWrite(27,1); digitalWrite(28,0); digitalWrite(29,1); } if(strcmp(jahat,"ist") == 0) { digitalWrite(26,0); digitalWrite(27,0); digitalWrite(28,0); digitalWrite(29,0); } } return FALSE; } int main( int argc,char *argv[] ) { sprintf(jahat,"ist"); wiringPiSetup(); pinMode(26,OUTPUT); pinMode(27,OUTPUT); pinMode(28,OUTPUT); pinMode(29,OUTPUT); delay(1000); cv::namedWindow("camera",0); pthread_t a0; pthread_create(&a0,NULL,thread0,NULL); GtkWidget *window; gtk_disable_setlocale(); // cv::namedWindow("camera",0); gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press_function), NULL); g_signal_connect(G_OBJECT(window), "key-release-event", G_CALLBACK(key_release_function), NULL); gtk_widget_show (window); // gtk_main (); pthread_join(a0,NULL); return 0; } |
فایل رو ذخیره کنید و با دستور اول کد، اونو کامپایل و بیلد کنید و با دستور زیر برنامه رو اجرا کنید :
1 |
sudo ./robat |
نتیجه رو در ویدئو زیر مشاهده می فرمایید : https://www.aparat.com/v/1zHCo
به زبون ساده،حدود 1194000 میلیارد تومان هست!!!
کل بودجه دفاعی کشور ( وزارت دفاع، ارتش، سپاه، بسیج ) حدود 41000 میلیارد تومان هست.
با یه حساب ساده، کل بودجه دفاعی ما، حدود 3.4% از کل بودجه کشوره!!!
اینجا کاری به مقایسه با بقیه کشورها نداریم!!!! بحث یه جای دیگه هست...
سوال اینجاست که چرا متولیان بخش دفاعی، با این بودجه، نیاز های تسلیحاتی رو پوشش می دن ،به کشورهای منطقه کمک لجستیکی و تسلیحاتی می کنن، و در کل، اهرم قدرت ایجاد کردند ( شرایط آماده برای توسعه و پیشرفت اقتصادی کشور ) ولی دولت های ما که 97 درصد از بودجه رو در اختیار دارند، در مدیریت منابع عاجزند؟!!!!
و جالب اینجاست که فحش کم کاری دولت رو سازمان های دفاعی میل می کنن!!!!!!!
*******************************
نکته :
1.بنده به بسیاری از فعالیت های سپاه انتقاد دارم ( مثل نظام بانکی مشابه بقیه بانک های ربوی و... )
2.یک نظر هست که میگه 20 درصد از اقتصاد ایران دست سپاهه.برای این عدد و اعداد مشابه،هیچ منبعی ندیدم!!!!
که البته با محاسبه کل بودجه عمرانی کشور،میشه پی برد که این فعالیت های اقتصادی،انقدر ها هم زیاد نیست.
انتقاد دومم به سپاه ( و تقریبا همه نهاد های کشور!!! مجلس،دولت، قوه قضائیه و ... ) همین عدم شفافیت در همه امور هست.
جهت هر چه مستحکم تر شدن مقام ولایت فقیه،و ظهور بابای خوبمون مهدی(عج) صلوات…
مهمان
سلام من میخوام اطلاعاتی از رزبری پای به یک صفحه وب بفرستم. آیا آموزشی در این سایت وجود داره به من کمک کنه
میخوام اطلاعات سنسور را از راه دور و از طریق اینترنت مشاهده کنم
نویسنده این مطلب
سلام.
تا حالا در این باره مطلبی تو سایت نذاشتم.(برای ارسال به تلگرام مطلب داشتم که تعطیل شد!!)
اگر با ماژول gsm بخواید کار کنید،می تونم کمکتون کنم.(بارگزاری فایل)
قبلا عکس هم با رزبری روی وب ارسال کردم ولی مشاهده اطلاعات متنی رو کار نکردم.
مهمان
سلام
من تو محیط netbeans کار میکنم و وقتی برنامه رو اجرا میکنم بدون هیچ مشکلی کامپایل میشه اما موقع اجرا یه ارور میده
Unable to init server: Could not connect: Connection refused
(cppapplication_1:3488): Gtk-WARNING **: cannot open display:
RUN FAILED (exit value 1, total time: 203ms)
کسی میدونه مشکل از کجاست ؟
نویسنده این مطلب
با چه نرم افزاری به رزبری وصل میشید؟
Ultra vnc رو امتحان کنید.
مهمان
سلام. من وقتی که دستور اجرای برنامه رو وارد میکنم ارور Permission denied رو میده باید چیکارکنم؟
نویسنده این مطلب
سلام.
دستور sudo رو قبل از دستور اجرا وارد کنید.
اگر نشد،از ترمینال،بعد از اجرای دستور،یه عکس آپلود کنید
مهمان
سلام. واقعا ممنون بابت همه اموزشاتون.
اگه امکانش هست اون کد نوشته شده رو یه کم درمودش توضیح بدید, واسه ما مبتدی ها یه کم تجزیه تحلیلش سخته.
نویسنده این مطلب
سلام.
تشریح کد،زیر کد اصلی نوشته شده.
مهمان
سلام خسته نباشید
خیلی مفید بود و ازش میشه الگو گرفت
راجب کد هم اگر توضیح میدادی دیگه عالی میشد
خیلی ممنون
نویسنده این مطلب
سلام.
کدش خیلی ساده هست .و مطلبش،پیش نیاز مطلب(مطالب) بعدی برای پردازش تصویره.
ولی باز هم چشم،اگر خدا بخواد،خط به خط هم توضیح میدم.
نویسنده سایت
مهندس خسته نباشی عالی بود
روشی که برای انتقال تصویر استفاده کردین عالی بود