
رسم هندوانه با 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 موجود در داخل جعبه به برد رزپبری پای متصل کنید و توسط آداپتور ها برد و نمایشگر را روشن کنید.بعد از بالا آمدن کامل سیستم عامل نیاز است که به روز رسانی و ارتقاء سیستم انجام شود.برای این کار از دستور های زیر استفاده می کنیم :
1 |
sudo apt-get update |
1 |
sudo apt-get upgrade |
پس از اتمام به روز رسانی و ارتقا سیستم عامل با استفاده از دستور زیر کتابخانه freeglut3 را جهت اجرای کد های Open GL نصب کنید.
1 |
sudo apt-get install g++ freeglut3 freeglut3-dev |
اکنون سیستم عامل آماده کد نویسی برای Open GL است.ابتدا یک فایل با فرمت CPP ایجاد کنید.
1 |
sudo nano Yalda.cpp |
برنامه رسم هندوانه با OpenGL و WiringPi در رسپبری پای
نمونه کد زیر را برای رسم هندوانه شب یلدا در داخل فایل 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 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 |
#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(); } |
پس از ذخیره کردن تغییرات در فایل،توسط دستور زیر کد را کامپایل کنید.
1 |
sudo g++ Yalda.cpp -o Yalda -lGL -lGLU -lglut -wiringPi |
در صورت کامپایل شدن بدون خطا،می توانید برنامه را به صورت زیر اجرا کنید.
1 |
./Yalda |
شماتیک رسم هندوانه با OpenGL و WiringPi در رسپبری پای
در این کد امکان تغییر اندازه و حرکت دادن شکل رسم شده و نیز تغییر رنگ بخشی از آن در نظر گرفته شده است که این کار با استفاده از متصل کردن دکمه به پورت توسعه برد رسپبری پای و کتابخانه WiringPi فراهم شده است.با استفاده از شماتیک زیر میتوانید این کار را انجام دهید.