به نام خدا : پروژه لاجیک آنالایزر ساده با رزبری پای ، تو این مطلب از سری مطالب پروژه رزبری پای ، میخوایم یه لاجیک آنالایزر با هم بسازیم و ببینم اصلا چی هستش و….
لاجیک آنالایزر چیست
یه دستگاهیه که باهاش میشه زمان تغییرات سطح ولتاژ منطقی رو استخراج کرد؛ کاربرد این دستگاه، در مشاهده سیگنال پورت های ارتباطی ( سریال، i2c و spi و… ) هست.
کاربرد لاجیک آنالایزر
میشه ازش در زمینه مهندسی معکوس استفاده کرد، مثلا میشه با مشاهده سیگنال دستگاه دیاگ ماشین، پروتوکل ارتباطی ECU ماشین رو استخراج کرد؛ وقتی شما پروتکل ارتباطی رو داشته باشید، می تونید باهاش ارتباط برقرار کنید، مثلا سرعت، کیلومتر پیموده شده رو بخونید و احیانا اونا رو تغییر بدید!!!
پروژه لاجیک آنالایزر ساده با رزبری پای و ذخیره اطلاعات در اکسل
شماتیک پروژه رزبری پای :
مسلم است که بعد از تست های اولیه، به جای کلید از منبع پالس استفاده می شود!! LED هم برای تشخیص سطح ولتاژ یک، قرار داده شده است.
کد پروژه : ابتدا یه برنامه می نویسیم که زمان تغییر و استقرار سطوح منطقی پالس رو در یه فایل اکسل ذخیره کنه :
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 |
//g++ -o lat lat.cpp -lwiringPi #include <wiringPi.h> #include <iostream> #include <fstream> #include "vector" #include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> using namespace std; vector<long> a; int i=0; double p=0; void interrupt(void) { a.push_back(micros()); i++; } int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(!kbhit()) { ofstream la("logictime.xls"); for(int i=1;i<a.size();i++) { la << a[i]-a[i-1]<<'\t'; } } //la.close(); return 0; } |
نتیجه کد بالا، یک فایل اکسل با محتوای زمان پالس ها است ( بر حسب میکرو ثانیه ) :
که خانه های فرد، مربوط به زمان سطح منطقی یک و خانه های زوج، مربوط به زمان سطح منطقی صفر را نشان می دهد.
در این باب، نامه ای از نهج البلاغه، می تواند راه گشای حق طلبان باشد.
نامه 29 نهج البلاغه که خطاب به مردم بصره نوشته شده است :
پس از هجوم عمرو عاص به مصـر و کشـته شدن محمد بن ابی بکر، مخالفان امام علی(ع) در بصره نیز به فکر شورش افتادند، صّحار بن عباس عبدي نامه اي به معاویه نوشت و از او خواست مردي را به بصـره بفرسـتد تا مخالفان را سازماندهی کند، معاویه خوشحال شد و ابن حضـرمی را فرسـتاد که تحرکاتی پدید آمد، و سـران و بزرگان قبائل رو در روي هم قرار گرفتند، وقتی به امام درکوفه اطّلاع دادند، آن حضـرت این نامه را خطاب به مردم بصره نوشتند :
شما از پیمان شکسـتن، و دشـمنی آشـکارا با من آگاهید. با این همه جرم شما را عفوکردم، و شمشیر از فراریان برداشتم، و استقبال کنندگان را پذیرفتم، و از گناه شـما چشم پوشیدم، اگر هم اکنون کارهاي ناروا، و اندیشه هاي نابخردانه، شـما را به مخالفت و دشمنی با من بکشاند، سپاه من آماده، و پا در رکابند. و اگر مرا به حرکت دوباره مجبور کنیـد، حمله اي برشـما روا دارم که جنگ جمل در برابر آن بسـیار کوچک باشد، با اینکه به ارزشهاي فرمانبردارانتان آگاهم، و حق نصـیحت کنندگان شـما را می شـناسم، و هرگز به جاي شخص مّتهمی، انسان نیکوکاري را نخواهم گرفت، و هرگز پیمان وفاداران را نخواهم شکست.
سرانجام پس از این نامه امام(ع) به مردم بصره، طرفداران آن حضرت، ابن حضرمی را شکست داده و او را کشتند. و فتنه را خاموش کردند.
منبع : نهج البلاغه نامه 29 و الغارات جلد 2 صفحه 373
در بخش بعدی، این تغییرات سطح ولتاژ رو به صورت گرافیکی نشان می دهیم.
طبق معمول چند موضوع آخر، برای انجام این پروژه، نیاز به نصب کتابخانه opencv روی رزبری دارید.
برای نصبش، به لینک زیر مراجعه فرمایید : نیازمندی های رزبری پای
جهت آشنایی با نحوه کار با پایه های ورودی و خروجی رزبری، به لینک زیر مراجعه فرمایید :
آموزش و پروژه gpio رزبری پای به زبان c
پروژه لاجیک آنالایزر ساده با رزبری پای و نمایش ساده و نموداری منطق 0 و 1
ابتدا یه برنامه ساده برای رسم تغییر سیگنال تولیدی توسط یک کلید فشاری می نویسیم؛ یه فایل 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 |
//g++ la.cpp -o la $(pkg-config --libs opencv) -l wiringPi #include <wiringPi.h> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "iostream" #include "stdio.h" using namespace std; using namespace cv; volatile int i=0; Mat img = Mat::ones(512,512,CV_32FC1); void interrupt(void) { i++; img = Mat::ones(512,512,CV_32FC1); if(i%2==1) line(img,Point(10,400),Point(400,400),Scalar(0,0,0)); else line(img,Point(10,20),Point(400,20),Scalar(0,0,0)); } void zero(cv::Mat img) { line(img,Point(10,400),Point(400,400),Scalar(0,0,0)); imshow("signal",img); waitKey(1); img = Mat::ones(512,512,CV_32FC1); } void one(cv::Mat img) { line(img,Point(10,20),Point(400,20),Scalar(0,0,0)); imshow("signal",img); waitKey(1); img = Mat::ones(512,512,CV_32FC1); } Mat image,gray; int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(waitKey(100)<3) { printf("%d\n",i); imshow("signal",img); } destroyWindow("signal"); return 0; } |
برنامه بالا، پس از هر بار تغییر وضعیت کلید ( لبه بالا رونده و پایین رونده )، تابع مربوط به روال وقفه خارجی فراخوانی میشه که در اون، به متغیر i یک واحد اضافه میشه و بنا بر وضعیت موجود، خط صفر یا یک رو در ماتریس img رسم می کنه و در حلقه اصلی برنامه هم، مقدار i و همچنین تصویر موجود در ماتریس img رو نمایش میده.
نتیجه رو در ویدئو زیر مشاهده فرمایید : aparat.com/v/KUJmo
عوض شدن احتمالی جای صفر یک، به علت لرزش کلید فشاریست.
پروژه لاجیک آنالایزر ساده با رزبری پای و نمایش نموداری اطلاعات
برنامه زیر هم کامل شده برنامه بالاست برای رسم شکل پالس های اعمالی به پایه مذکور است :
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 |
//g++ la2.cpp -o la2 $(pkg-config --libs opencv) -l wiringPi #include <wiringPi.h> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "iostream" #include "stdio.h" #include "vector" using namespace std; using namespace cv; vector<long> a; int i=0; Mat img = Mat::ones(512,512,CV_32FC1); double p=0; void interrupt(void) { img = Mat::ones(512,512,CV_32FC1); a.push_back(micros()); i++; p = 512.0/(a[(a.size()-1)] - a[0]); Point a1 = Point(0,100); Point a2; for(int t=0;t<a.size();t++) { if(t%2==0) { a2.x=a1.x+15; a2.y=100; line(img,a1,a2,Scalar(0,0,0)); line(img,Point(a1.x,400),a1,Scalar(0,0,0)); a1=a2; a1.y=400; } else { a2.x=a1.x+15; a2.y=400; line(img,a1,a2,Scalar(0,0,0)); line(img,Point(a1.x,100),a1,Scalar(0,0,0)); a1=a2; a1.y=100; } } } Mat image,gray; int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(waitKey(100)<3) { for(int j=0;j<a.size();j++) { cout<<"a[j+1] : "<<a[j+1]<<endl; cout<<"512/a[end]-a[0] :"<<512.0/(a[a.size()-1]-a[0])<<endl; } printf("%d\n",i); imshow("signal",img); } destroyWindow("signal"); return 0; } |
نتیجه کد بالا رو در ویدئو زیر مشاهده می فرمایید : aparat.com/v/wksc0
پیشنهادات :
- احتمالا دریافتید که زمان پالس ها با شکل خروجی متناسب نیست؛ برای حل این مشکل، کافیه که ضریبی از متغیر p رو در اسکیل شکل خروجی دخیل کنید، و برای تعداد پالس های زیاد، اندازه ماتریس img رو بزرگتر کنید.
- بهتر است تا صفحه را درجه درجه بندی کنید ( grid )
- با اضافه کردن یک مبدل آنالوگ به دیجیتال، می توانید یک اسیلوسکوپ جمع و جور درست کنید!!!
جهت هر چه مستحکم تر شدن مقام ولایت فقیه و تعجیل درظهور بابای خوبمون مهدی(عج) صلوات
آیت الله جوادی آملی : بانک های ربوی باید تحریم شوند. aparat.com/v/WD5ZI
مهمان
سلام یه پروژه با برنامه avrمیخواستم کسی داره
یا یه راهنمایی کنه؟؟
نویسنده این مطلب
سلام پروژه نداریم!!!ولی اگر کمکی از دستمون بربیاد،دریغ نمی کنیم.
لینک گروه در سروش:
گروه الکترونیک در سروش
مهمان
با سلام و عرض ادب
ممنون بابت آموزش آیا این اندازی های که داخل اکسل ذخیره میشه دقیق هستش میشه بهش اطمینان کرد یا خیر!
ممنون میشم جواب رو به ایمیل من ارسال کنید با تشکر
نویسنده این مطلب
سلام
متاسفانه لاجیک آنالایزر ندارم تا مقایسه کنم.
ولی روی کاغذ، تا فرکانس ۱۰۰ کیلو هرتز،با دقت خوبی اندازه گیری می کنه.
مهمان
سلام خدمت جناب مهندس من تا حالا با زبان cرو میکرو کنترلر avrکار میکردم حالامیخوام با رزبری پروژه هامو انجام بدم زبان cواسه رزبری چه جوری به همه امکانات دسترسی هست؟
نویسنده این مطلب
سلام
بنده مهندس نیستم،معمولیم…
بله با زبان c و c++ به خوبی قابل استفاده هست.
مهمان
سلام. اول از همه از سایت بسیار خوبتون خیلی سپاسگزارم.
همچنین یه سوال هم داشتم. فرض کنید ما یک پروژه درست کردیم که یه برنامه با محیط گرافیکی (GUI) داره. حالا میخوام یه جورایی رزبین رو قفل بکنیم. منظورم اینه که Deploy کنیم. یعنی طوری بشه که دیگه نشه بهش کیبورد و موس وصل کرد و یا به قسمت های مختلف سیستم عامل دسترسی داشت. فقط همون GUI اختصاصی که خودمون درست کردیم هنگام Boot بیاد بالا. میخواستم بدونم همچین کاری امکان پذیر هست و اگر هست چطور ؟
خیلی ممنونم.
موفق باشید.
نویسنده این مطلب
اجرای یک برنامه به صورت اتوماتیک امکان پذیره ولی قفل کردن رو تا چند روز آینده امکان تست ندارم که جواب بدم.
مهمان
سلام
میشه باهاش ecu ماشین رو کنترل کرد؟ اگه میشه یه توضیحی بفرمایید
mpars590@yahoo.com
علی یارتون
نویسنده این مطلب
با سلام
با این فقط می تونید پروتوکل ارتباطی با ecu رو استخراج کنید.
اگر این پروتوکل رو به دست بیارید،می تونید زبون اتوموبیلتون رو بفهمید.
مثلا با استخراج کد های دستگاه دیاگ،می شه یه دستگاه دیاگ ارزون قیمت تهیه کرد.
ولی منظورتون از کنترل ecu رو متوجه نشدم.
مهمان
منظورم اینه گاز و میزان ترزیق سوخت رو کنترل کنم و دستی کم و زیادش کنم
نویسنده این مطلب
بله .امگان تنظیم گاز با ای سیو هست (کامنت هاش تو اینترنت نیست)
ولی می شه دور موتور رو خوند و با یه موتور که به سیم گاز وصله،دور موتور رو کم و زیاد کرد.
در مورد تنظیم سوخت هم اگر با دستگاه دیاگ امکان تنظیم سوخت وجود داره،پس میشه این کار رو کرد.(از تعمیر کارها بپرسید)
ولی با این پروژه،امکان خواندن اطلاعات وجود ندارد تنها می شود پرو توکل ارتباطی رو استخراج کرد.!!!