رسم هندوانه با OpenGL و WiringPi در رسپبری پای
در این پروژه قصد داریم با استفاده از رسپبری پای و کتابخانه های OpenGL و WiringPi یک نمونه برنامه را اجرا کنیم.برای این کار وسایل زیر مورد نیاز است :
- برد رسپبری پای 3 Raspberry pi 3 model B UK
- نمایشگر 7 اینچ لمسی دارای ورودی HDMI مناسب برای انواع برد های دارای پورت HDMI شرکت WAVESHARE
- آداپتور 5V-3A دیواری
- تبدیل جک آداپتور 5.5mm به USB MICRO
- آداپتور 5 ولت
- برد برد (پروجکت برد)
- سیم برد بردی آماده
- سیم جامپر نر به ماده 20cm
- حافظه MicroSD 8Gig مخصوص برد Raspberry Pi3
- تک سوئیچ 2 پایه بلند
- ماوس و صفحه کلید
در ابتدا سیستم عامل رزبین را دانلود و از حالت فشرده خارج کنید.بعد از متصل کردن کارت حافظه به کامپیوتر، با استفاده از نرم افزار SD Card Formatter با فعال نمودن حالت Size Adjustment کارت حافظه را فرمت کنید.سپس فایل img دانلود شده سیستم عامل را با استفاده از برنامه Win32DiskImager داخل کارت حافظه Write کنید.پس از اتمام کارت حافظه را در داخل برد قرار داده و نمایشگر را از طریق کابل HDMI موجود در داخل جعبه به برد رزپبری پای متصل کنید و توسط آداپتور ها برد و نمایشگر را روشن کنید.بعد از بالا آمدن کامل سیستم عامل نیاز است که به روز رسانی و ارتقاء سیستم انجام شود.برای این کار از دستور های زیر استفاده می کنیم :
sudo apt-get update
sudo apt-get upgrade
پس از اتمام به روز رسانی و ارتقا سیستم عامل با استفاده از دستور زیر کتابخانه freeglut3 را جهت اجرای کد های Open GL نصب کنید.
sudo apt-get install g++ freeglut3 freeglut3-dev
اکنون سیستم عامل آماده کد نویسی برای Open GL است.ابتدا یک فایل با فرمت CPP ایجاد کنید.
sudo nano Yalda.cpp
برنامه رسم هندوانه با OpenGL و WiringPi در رسپبری پای
نمونه کد زیر را برای رسم هندوانه شب یلدا در داخل فایل CPP کپی کنید.
#ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif #include<math.h> #include <stdlib.h> #include <string.h> #include <wiringPi.h> #include <GL/glext.h> #define GL_PI 3.1415926535898 GLint circle_point = 100; double t_Old = 0, t_New = 0; float Ratio = 1; float I_X=0,I_Y=0; float New_Color_R = 0.0, New_Color_G = 0.0, New_Color_B = 0.0; float Resize_W = 0, Resize_H = 0; int Dec_Count = 0, Inc_Count = 0; int Replot_Flag = 0; static void resize(int width, int height){ Ratio = (float) width / (float) height; glViewport(0, 0, width, height); glLoadIdentity(); //glOrtho(-Ratio*100, Ratio*100, -100.0, 100.0, -1.0, 1.0); if(Ratio >= 1){ glOrtho(-Ratio*100, Ratio*100, -100.0, 100.0, -1.0, 1.0); }else{ glOrtho(-Ratio*200, Ratio*200, -100.0, 100.0, -1.0, 1.0); } } void GLUT_Bitmap_String(float x, float y,void* font, char* String){ glRasterPos2f(x, y); for(int i=0;i<strlen(String);i++){ glutBitmapCharacter(font,String[i]); } } void Hendevane(GLfloat center_x,GLfloat center_y,GLfloat radios){ GLint i; GLdouble theta; glBegin(GL_POLYGON); glColor3f(0.0,0.802,0.0); for(i=0;i<circle_point;i++) { theta=2*GL_PI*i / circle_point; glVertex2f(center_x+(radios+20)*cos(theta),center_y+(radios-20)*sin(theta)); } glEnd(); glLineWidth(2); glBegin(GL_POLYGON); glColor3f(0.496, 1.0, 0.596); for(i=0;i<circle_point;i++) { theta=2*GL_PI*i / circle_point; glVertex2f(center_x+(radios+20)*cos(theta),center_y+(radios-45)*sin(theta)); } for(i=0;i<circle_point;i++) { theta=2*GL_PI*i / circle_point; glVertex2f(center_x+(radios+20)*cos(theta),center_y+(radios-41.5)*sin(theta)); } glEnd(); } void VasatHendevane(GLfloat center_x,GLfloat center_y,GLfloat radios,GLfloat R,GLfloat G,GLfloat B){ GLint i; GLdouble theta; glBegin(GL_POLYGON); glColor3f(R,G,B); for(i=0;i<circle_point;i++) { theta=2*GL_PI*i / circle_point; glVertex2f(center_x+(radios+20)*cos(theta),center_y+(radios-45)*sin(theta)); } glEnd(); glLineWidth(2.0); glBegin(GL_LINE_LOOP); glColor3f(R-0.05,G-0.05,B-0.05); glVertex2f((center_x-(radios+20)),(center_y)); glVertex2f((center_x+(radios+20)),(center_y)); glEnd(); } void DaneHendevane(GLfloat center_x,GLfloat center_y,GLfloat radios){ GLint i; GLdouble theta; glBegin(GL_POLYGON); glColor3f(0.0,0.0,0.0); for(i=0;i<circle_point;i++) { theta=2*GL_PI*i / circle_point; glVertex2f(center_x+(radios+(radios/5))*cos(theta),center_y+(radios-(radios/5))*sin(theta)); } glEnd(); } void myinit(void){ glClearColor(1.0,1.0,1.0,1.0); } void display(){ glClear(GL_COLOR_BUFFER_BIT); Hendevane(0.0 +I_X,0.0 +I_Y,60.0); VasatHendevane(0.0 +I_X,0.0 +I_Y,60.0 ,New_Color_R,New_Color_G,New_Color_B); DaneHendevane(-10.0 +I_X ,10.0 +I_Y ,2.5 ); DaneHendevane(-25.0 +I_X ,7.0 +I_Y ,2.7 ); DaneHendevane(-30.0 +I_X ,-8.0 +I_Y ,2.7 ); DaneHendevane(-50.0 +I_X ,5.0 +I_Y ,2.6 ); DaneHendevane(-60.0 +I_X ,-3.5 +I_Y ,2.4 ); DaneHendevane(55.0 +I_X ,7.0 +I_Y ,2.5 ); DaneHendevane(40.0 +I_X ,-5.0 +I_Y ,2.6 ); DaneHendevane(35.0 +I_X ,7.0 +I_Y ,2.4 ); DaneHendevane(24.0 +I_X ,6.5 +I_Y ,2.6 ); DaneHendevane(14.0 +I_X ,-7.5 +I_Y ,2.7 ); glColor3f(1.0,0.0,0.0); GLUT_Bitmap_String(-7.5,-75.0,GLUT_BITMAP_HELVETICA_18,"ECA"); glutSwapBuffers(); } static void idle(void) { t_New = glutGet(GLUT_ELAPSED_TIME) / 1000.0; if((t_New >= t_Old + 0.15)){ if(digitalRead(0)==HIGH){ I_Y++; Replot_Flag = 1; } if(digitalRead(1)==HIGH){ I_Y--; Replot_Flag = 1; } if(digitalRead(2)==HIGH){ I_X--; Replot_Flag = 1; } if(digitalRead(3)==HIGH){ I_X++; Replot_Flag = 1; } if(digitalRead(4)==HIGH){ New_Color_R = ((float)(rand()))/((float)(RAND_MAX)); New_Color_G = ((float)(rand()))/((float)(RAND_MAX)); New_Color_B = ((float)(rand()))/((float)(RAND_MAX)); Replot_Flag = 1; } if(digitalRead(5)==HIGH){ Inc_Count++; Resize_W = Resize_W + ((Dec_Count*0.1)+(0.1)) ; Resize_H = Resize_H + ((Dec_Count*0.1)+(0.1)) ; glScalef(Resize_W, Resize_H, 1.0f); Dec_Count = 0; Replot_Flag = 1; } if(digitalRead(6)==HIGH){ Dec_Count++; Resize_W = Resize_W - ((Inc_Count*0.1)+(0.1)) ; Resize_H = Resize_H - ((Inc_Count*0.1)+(0.1)) ; glScalef(Resize_W, Resize_H, 1.0f); Inc_Count = 0; Replot_Flag = 1; } t_Old = t_New; if(Replot_Flag == 1){ glutPostRedisplay(); Replot_Flag = 0; } } } int main(int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(500,500); wiringPiSetup () ; pinMode (0, INPUT) ; pinMode (1, INPUT) ; pinMode (2, INPUT) ; pinMode (3, INPUT) ; pinMode (4, INPUT) ; pinMode (5, INPUT) ; pinMode (6, INPUT) ; glutCreateWindow("Garpiz :)"); glutReshapeFunc(resize); myinit(); Resize_W = Resize_H =1.0; New_Color_R = 1.0; New_Color_G = 0.0; New_Color_B = 0.0; glOrtho(-100.0, 100.0, -100.0, 200.0, -1.0, 1.0); glutDisplayFunc(display); glutIdleFunc(idle); glutMainLoop(); }
پس از ذخیره کردن تغییرات در فایل،توسط دستور زیر کد را کامپایل کنید.
sudo g++ Yalda.cpp -o Yalda -lGL -lGLU -lglut -wiringPi
در صورت کامپایل شدن بدون خطا،می توانید برنامه را به صورت زیر اجرا کنید.
./Yalda
شماتیک رسم هندوانه با OpenGL و WiringPi در رسپبری پای
در این کد امکان تغییر اندازه و حرکت دادن شکل رسم شده و نیز تغییر رنگ بخشی از آن در نظر گرفته شده است که این کار با استفاده از متصل کردن دکمه به پورت توسعه برد رسپبری پای و کتابخانه WiringPi فراهم شده است.با استفاده از شماتیک زیر میتوانید این کار را انجام دهید.