به نام خدا : پروژه لاجیک آنالایزر ساده با رزبری پای ، تو این مطلب از سری مطالب پروژه رزبری پای ، میخوایم یه لاجیک آنالایزر با هم بسازیم و ببینم اصلا چی هستش و….
یه دستگاهیه که باهاش میشه زمان تغییرات سطح ولتاژ منطقی رو استخراج کرد؛ کاربرد این دستگاه، در مشاهده سیگنال پورت های ارتباطی ( سریال، 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
ابتدا یه برنامه ساده برای رسم تغییر سیگنال تولیدی توسط یک کلید فشاری می نویسیم؛ یه فایل 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 رو نمایش میده.
نتیجه رو در ویدئو زیر مشاهده فرمایید
http://www.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; } |
نتیجه کد بالا رو در ویدئو زیر مشاهده می فرمایید :
http://www.aparat.com/v/wksc0
پیشنهادات :
جهت هر چه مستحکم تر شدن مقام ولایت فقیه و تعجیل درظهور بابای خوبمون مهدی(عج) صلوات
آیت الله جوادی آملی : بانک های ربوی باید تحریم شوند.
http://www.aparat.com/v/WD5ZI
فعلا دارم رو USB و میکرو LPC کار میکنم، 3 تا موضوع مطرح هستش ( که تو ذهنمه هر3شو برم ) :
1) میکرو در نقش Device ( فعلا محوریت کار من این مورد هستش )
2) میکرو در نقش Host
3) میکرو در نقش OTG
و باز 2 تا موضوع مطرح هستش، برا راه اندازی usb دو تا راه داریم ( که تو ذهنمه هر2شو برم ) :
1) استفاده از میکروکنترلر ( فعلا محوریت کار من این مورد هستش که از LPC1768 استفاده میکنم )
2) استفاده از آیسی های مختص اینکار.
فعلا کارم با دیتاشیت usb تموم شده، دارم کلاس های usb رو مطالعه میکنم، کلاس cdc رو ماستمالی کردیم و یه پروژه ازش منتشر کردیم، الان رو کلاس HID ریز شدم و دارم مطالعه میکنمش و پروژه ازش میزارم تو سایت.
جزئیات داستان رو در لینک زیر میتویند ببینید :
===
به علت اثطغبال بیش از حد دوستان از موضوع usb؛ فعلا یکم سرگرم طراحی قالب جدید سایت شدم ^_^
سلام
میشه باهاش ecu ماشین رو کنترل کرد؟ اگه میشه یه توضیحی بفرمایید
mpars590@yahoo.com
علی یارتون
با سلام
با این فقط می تونید پروتوکل ارتباطی با ecu رو استخراج کنید.
اگر این پروتوکل رو به دست بیارید،می تونید زبون اتوموبیلتون رو بفهمید.
مثلا با استخراج کد های دستگاه دیاگ،می شه یه دستگاه دیاگ ارزون قیمت تهیه کرد.
ولی منظورتون از کنترل ecu رو متوجه نشدم.
منظورم اینه گاز و میزان ترزیق سوخت رو کنترل کنم و دستی کم و زیادش کنم
بله .امگان تنظیم گاز با ای سیو هست (کامنت هاش تو اینترنت نیست)
ولی می شه دور موتور رو خوند و با یه موتور که به سیم گاز وصله،دور موتور رو کم و زیاد کرد.
در مورد تنظیم سوخت هم اگر با دستگاه دیاگ امکان تنظیم سوخت وجود داره،پس میشه این کار رو کرد.(از تعمیر کارها بپرسید)
ولی با این پروژه،امکان خواندن اطلاعات وجود ندارد تنها می شود پرو توکل ارتباطی رو استخراج کرد.!!!
سلام. اول از همه از سایت بسیار خوبتون خیلی سپاسگزارم.
همچنین یه سوال هم داشتم. فرض کنید ما یک پروژه درست کردیم که یه برنامه با محیط گرافیکی (GUI) داره. حالا میخوام یه جورایی رزبین رو قفل بکنیم. منظورم اینه که Deploy کنیم. یعنی طوری بشه که دیگه نشه بهش کیبورد و موس وصل کرد و یا به قسمت های مختلف سیستم عامل دسترسی داشت. فقط همون GUI اختصاصی که خودمون درست کردیم هنگام Boot بیاد بالا. میخواستم بدونم همچین کاری امکان پذیر هست و اگر هست چطور ؟
خیلی ممنونم.
موفق باشید.
اجرای یک برنامه به صورت اتوماتیک امکان پذیره ولی قفل کردن رو تا چند روز آینده امکان تست ندارم که جواب بدم.
سلام خدمت جناب مهندس من تا حالا با زبان cرو میکرو کنترلر avrکار میکردم حالامیخوام با رزبری پروژه هامو انجام بدم زبان cواسه رزبری چه جوری به همه امکانات دسترسی هست؟
سلام
بنده مهندس نیستم،معمولیم…
بله با زبان c و c++ به خوبی قابل استفاده هست.
با سلام و عرض ادب
ممنون بابت آموزش آیا این اندازی های که داخل اکسل ذخیره میشه دقیق هستش میشه بهش اطمینان کرد یا خیر!
ممنون میشم جواب رو به ایمیل من ارسال کنید با تشکر
سلام
متاسفانه لاجیک آنالایزر ندارم تا مقایسه کنم.
ولی روی کاغذ، تا فرکانس ۱۰۰ کیلو هرتز،با دقت خوبی اندازه گیری می کنه.
سلام یه پروژه با برنامه avrمیخواستم کسی داره
یا یه راهنمایی کنه؟؟
سلام پروژه نداریم!!!ولی اگر کمکی از دستمون بربیاد،دریغ نمی کنیم.
لینک گروه در سروش:
گروه الکترونیک در سروش