نرم افزار processing (پروسسینگ) یکی از نرم افزار های قوی در زمینه برنامه نویسی و پردازش تصویر هست که به علت رایگان بودن اون از اهمیت زیادی برخوردار هست . و همینطور فضای باز برنامه نویسی این نرم افزار باعث میشه که در مقایسه با نرم افزار های قدرتمندی از قبیل لب ویو , متلب و متمتیکا , برتری های خاص خودش رو داشته باشه.
فضای برنامه نویسی پروسسینگ شباهت بسیار زیادی به فضای برنامه نویسی آردوینو داره و از دیگر فواید و خصوصیت های این نرم افزار امکان ارتباط بین دستگاه اندروید و این نرم افزار هست. و همینطور ارتباط با میکرو کامپیوتر هایی از قبیل رزبری پای ( raspberry pi ) و دیگر سخت افزار های موجود یکی دیگه از نقاط قوت این نرم افزار رایگان محسوب میشه.
روشی که این نرم افزار برای داده گیری از آردوینو استفاده میکنه درواقع داده گیری مستقیم از پورت سریال به usb متصل به کامپیوتر هست که داده های سریال رو دریافت میکنه و بنا به کدهای نوشته شده توسط شما تغییرات رو اعمال میکنه.
البته با کمی جستجو متوجه شدم که بنیاد آردوینو هم به نرم افزار processing توجه خاصی داره و توی وبسایت بنیاد آردوینو کتابخانه های ارتباط بین processing و آردوینو قرار داده شده که شما میتونید این کتابخانه رو از وبسایت مرجع آردوینو دیجی اسپارک دانلود کنید .
در این آموزش قصد داریم از طریق یک سنسور فتوسل شدت نور محیط یا نوری که به فتوسل میرسه رو دریاقت کنیم و بعد تغییرات این شدت در زمان رو بصورت نمودار و منحنی رسم کنیم. توجه داشته باشید که این تغییرات بصورت آنی و لحظه ای ثبت و نمایش داده میشه.
برای داده گیری آنالوگ از سنسور فتوسل میتوانید آموزش راه اندازی سنسور فتوسل با آردوینو رو از همین وبسایت مطالعه کنید.
وسایل استفاده شده در این آموزش :
- میکروکنترلر آردوینو – خرید از فروشگاه
- سنسور فتوسل – خرید از فروشگاه
- تعدادی سیم نری به مادگی
از اونجایی که آموزش راه اندازی سنسور فتوسل با آردوینو یکبار در وبسایت دیجی اسپارک قرار داده شده دیگه نیازی به توضیحات مربوطه نیست و مستقیم به سراغ قسمت برنامه نویسی این نرم افزار میریم:
آموزش راه اندازی :
یکی از کتابخانه هایی که نیاز دارید تا نرم افزار processing شما بتواند داده های سریال آردوینو شما رو پردازش کند , کتابخانه processing.serial است. برای فراخوانی این کتابخانه از کد زیر استفاده کنید :
import processing.serial.*;
سریال پورت را تعریف کنید :
Serial myPort;
پهنای خطوط را به اندازه یک واحد تعریف میکنیم :
int xPos = 1;
متغیر float را تعریف میکنید و مقدار آن را در ابتدا برابر با صفر قرار میدهیم:
float inByte = 0;
حلقه void setup را شروع میکنیم :
void setup () {
سایز پنجره ای را که میخوایم پلات را نمایش بدهد تعیین میکنیم , در اینجا متناسب با نیاز خود ابعاد ۱۶۸۰ در ۳۰۰ پیکسل را انتخاب کردم :
size(400, 300);
دستور زیر را برای شروع ارتباط سریال وارد نمایید :
println(Serial.list());
مقدار سریال را درون متغیر myport بریزید . توجه داشته باشید که در اینجا من از پورت [۲] خود استفاده نموده ام. شما میتوانید چنانچه این پورت برای شما شناسایی نشد مقداره ۲ را به مقدار ۰ , ۱ , ۳ و یا ۴ تغییر بدهید و امتحان کنید :
myPort = new Serial(this, Serial.list()[2], 9600);
از دستور زیر استفاده میکنیم تا وقتی داده گیری سریال انجام نشد , فعالیتی انجام نشود :
myPort.bufferUntil('\n');
از دستور زیر برای تغییر رنگ بک گراند استفاده میکنیم : شما میتوانید کد رنگ دلخواه خودتان را قرار بدهید :
background(0);
حلقه void draw که یک حلقه مهم در نرم افزار processing است را شروع میکنیم. این حلقه شباهت زیادی به حلقه void loop در فضای برنامه نویسی اندروید دارد :
void draw () {
دستور stroke را با مقادیر زیر اجرا میکنیم ( این مقادیر رنگ استروک ما را مشخص میکند ). توجه داشته باشید که دستوراتی از این قبیل در نرم افزار پراسسینگ به وفور استفاده میگردد. بعنوان مثال دستوراتی مانند rect برای ایجاد مستطیل و line برای ایجاد خط و از این قبیل موارد :
stroke(127, 34, 255);
دستور line را اجرا میکنیم . این دستور برای ترسیم یک خط مورد استفاده قرار میگیرد . در پرانتز این دستور باید مقادیر ارتفاع و ضخامت این خط را مشخص کنیم که بجای وارد کردن یک عدد از متغیر هایی که در قبل تعریف کردیم استفاده میکنیم. مثلا برای ضخامت آن از متغیر xpos و برای ارتفاع آن از متغیر height استفاده میکنیم که در ادامه مقدار آن را از عدد inByte که از پورت سریال خود گرفتیم کم میکنیم.
line(xPos, height, xPos, height - inByte);
شرط زیر را وارد میکنیم تا در صورت زیاد بودن مقدار xpos از عرض (width) آن را برابر با صفر قرار دهد یعنی دوباره صفحه نمایش به رنگ سیاه دربیاد و موقعیت xpos در ابتدای صفحه نمایش قرار بگیرد. که در واقع همان مقدار اولیه xpos است که در ابتدای برنامه مشخص کردیم :
if (xPos >= width) { xPos = 0; background(0); } else { // increment the horizontal position: xPos++; }
یک حلقه جدید با نام serialEvent را میسازیم و متغیر string را با نام inString تعریف میکنیم و مقدار آنرا از متغیر سریال myport میگیریم و شرط داده گیری را تا زمانی انجام میدهیم که از پورت سریال داده ای دریافت شود.
void serialEvent (Serial myPort) { String inString = myPort.readStringUntil('\n');
سپس دستور شرطی میسازیم که اگر instring مقداری داشته باشد متغیر های instring و inbyte را برابر باهم قرار دهند و همینطور محدوده inbyte را طبق دستور زیر از ۱۰۲۳ تا ۰ قرار دهند. توجه داشته باشید که اگر محدوده از ۰ تا ۱۰۲۳ باشد داده گیری معکوس انجام میشود.
if (inString != null) { // trim off any whitespace: inString = trim(inString); // convert to an int and map to the screen height: inByte = float(inString); println(inByte); inByte = map(inByte, 0, 1023,0,height); }
در آخر برنامه را وقتی اجرا کنید که میکروکنترلر آردوینو شما قبل از آن اجرا شده باشد و داده های سریال را دریافت نماید.
کد برنامه :
برای صرفه جویی در وقت کدهای زیر را کپی کنید و در نرم افزار processing خود جایگذاری نمایید.
import processing.serial.*; Serial myPort; // The serial port int xPos = 1; // horizontal position of the graph float inByte = 0; void setup () { // set the window size: size(400, 300); // List all the available serial ports // if using Processing 2.1 or later, use Serial.printArray() println(Serial.list()); // I know that the first port in the serial list on my mac // is always my Arduino, so I open Serial.list()[0]. // but if it dosent work try Serial.list()[1] or [0] or [3] or [4]. myPort = new Serial(this, Serial.list()[2], 9600); // don't generate a serialEvent() unless you get a newline character: myPort.bufferUntil('\n'); // set inital background: background(0); } void draw () { // draw the line: stroke(127, 34, 255); line(xPos, height, xPos, height - inByte); // at the edge of the screen, go back to the beginning: if (xPos >= width) { xPos = 0; background(0); } else { // increment the horizontal position: xPos++; } } void serialEvent (Serial myPort) { // get the ASCII string: String inString = myPort.readStringUntil('\n'); if (inString != null) { // trim off any whitespace: inString = trim(inString); // convert to an int and map to the screen height: inByte = float(inString); println(inByte); inByte = map(inByte, 0, 1023,0,height); } }
امیدوارم از این آموزش نهایت استفاده را برده باشید.
با اشتراک گذاری این آموزش حامی وبسایت دیجی اسپارک باشید.
عالی بود. اما میشه از serial plotter داخل خود نرم افزار هم استفاده کرد.
با تشکر از نشر دانش
میخواستم بدونم که چه لزومى داره بجاى نرم افزار آردوینو از این نرم افزار استفاده کنیم؟؟
با سلام.
نرم افزار آردوینو تنها قادر به دریافت داده های سریال هست. به تازگی در ورژن جدید نرم افزار آردوینو شما میتونید داده های سریال خودتون رو برحسب زمان پلات کنید. اما برای رسم نمودارهای دیگر مثل نموداری که در این آموزش از آن استفاده کردیم و حتی موارد دیگر مانند ساخت بازی با جوی استیک یا استفاده از یک تصویر سه بعدی و چرخاندن آن از طریق سنسور ژیروسکوپ و ده ها ایده ی دیگر این نرم افزار میتونه خیلی کارامد باشه.که مواردی از این قبیل رو واقعا با نرم افزار آردوینو نمیشه انجام داد.
سلام
حلقه void draw که یک حلقه مهم در نرم افزار processing است شباهت زیادی به حلقه void loop در فضای برنامه نویسی اندروید دارد .
اندروید رو به آردوینو تغییر دهید .
با سلام
از توجه شما سپاسگزارم. لطفا موارد را دقیقتر و حرفهایتر توضیح دهید. تا امکان اقدام وجود داشته باشد.