سلام به همه.
توی نوشته قبل آموزش رزبری پای با پایتون دیدین که چطور میشه توی رزبری پای یه LED رو خاموش و روشن کرد.
توی این مقاله از آموزش رزبری پای مقایسه ای بین زبان های pyhton ،java script (nodejs) و c برای برای اینکه ببینیم کدوم سرعت بیشتری رو کنترل ورودی و خروجی I/O داره انجام میدیم (به کمک زئوس).
اولین زبان که میخوایم بررسی کنیم پایتون هست. این که این زبان رو چه کسی ساخت و اصلا چیشد که پایتون درست شد قضیه مفصلی داره که توی این مقاله ما در مورد اون صحبت نمیکنیم.
زبان برنامه نویسی پایتون روی سیستم عامل raspbian به صورت پیش فرض نصبه. خب اولین قدم اینه که LED blink رو با زبان برنامه نویسی پایتون پیاده سازی کنیم. اینجا میتونید ببینید که چطور توی پایتون یه LED blink بنویسیم. تنها تفاوتی که داره اینه که ما نمیخوایم مدتی رو برای خاموش یا روشن بودن LED صبر کنیم. پس باید کد ما به این صورت باشه:
1 2 3 4 5 6 | import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(4,GPIO.OUT) while True: GPIO.output(4,True) GPIO.output(4,False) |
خب همون طور که میبینید کدش خیلی کم و راحته. حالا بیاید این برنامه رو اجرا کنیم و ببینیم که با چه سرعتی دستور برای خاموش و روشن شدن LED میده.
من وقتی دفه اول کد رو اجرا کردم سرعت ۱مگاهرتز رو دیدم اما دفعه های بعد با سرعت تقریبا ۹۲۰ کیلوهرتر دستور برای خاموش و روشن شدن LED داد.
زبان برنامه نویسی JavaScript
درسته زبان برنامه نویسی جاوا اسکریپت! درسته که فقط توی مرورگر اجرا میشه اما چندسال پیش یه Platform (چهارچوب) به اسم Nodejs ارائه شد تا کد های جاوا اسکریپت رو خارج از مرورگر اجرا کنید. اگه میخواید بیشتر در مورد Nodejs بخونید میتونید به این لینک که داکیومنت Nodejs هست مراجعه کنید. Nodejs به صورت پیشفرض روی سیستم عامل Raspbian نصب نیست و شما باید اون رو نصب کنید روی سیستم عامل خودتون. (توجه کنید که من نسخه ۱۰ رو نصب کردم و هنگام اجرا بهم خطا داد که باید نسخه Nodejs رو به روز رسانی کنم. منم به نسخه ۱۴ آپدیت کردم).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var GPIO=require("onoff").Gpio; var LED=new GPIO(4,'out'); while(true){ LED.writeSync(1); LED.writeSync(0); } function blinkLED(){ if (LED.readSync()===0){ LED.writeSync(1); }else{ LED.writeSync(0); } } function endBlink (){ clearInterval(blink); LED.writeSync(0); LED.unexport(); } |
اینجا ما از کتابخونه onoff استفاده کردیم که بر خلاف پایتون این کتابخونه به صورت پیشفرض نصب نیست و باید خودمون نصب کنیم. ما این کتابخونه رو با دستور npm install onoff نصب کردیم. همون طور که میشه توی کد ها دید این کتابخونه رو توی برنامه فراخانی کردیم و کد های خودمون رو نوشتیم.
نتیجه افتضاح بود. به خاطر اینکه با این کتابخونه به سرعت ۱۳۴ کیلوهرتز رسیدیم.
خیلی افتضاح بود. رفتیم یه جست و جوی کوچیک دیگه کردیم و به کتابخونه rpio رسیدیم. اون رو با دستور زیر نصب کردیم:
1 | npm install rpio |
بعدش هم این کد ها رو نوشتیم تو یه فایل با پسوند .js :
1 2 3 4 5 6 7 8 | var rpio = require('rpio'); rpio.open(7, rpio.OUTPUT, rpio.LOW); for (var i = 0; i < 50000000; i++) { rpio.write(7, rpio.HIGH); rpio.write(7, rpio.LOW); } |
خب همون طور که میبینید بعد از اینکه کتابخونه یا پکیج رو توی برنامه اوردیم و ازش استفاده کردیم. نتیجه خیلی بهتر بود. چون ما به سرعت ۱مگاهرتز رسیدیم.
زبان برنامه نویسی C
تا اینجا دوتا زبان اسکریپتی رو با هم مقایسه کردیم. من به زئوس گفتم بیا تا زبان برنامه نویسی C رو هم تست کنیم.
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 | #include <wiringPi.h> #define RED 7 static void interruptHandler(const int signal) { exit(0); } int main(void) { signal(SIGINT, interruptHandler); if (-1 == wiringPiSetup()) { printf("Failed to setup Wiring Pi!\n"); return 1; } pinMode(RED, OUTPUT); while(1) { digitalWrite(RED, HIGH); digitalWrite(RED, LOW); } return 0; } |
همون طور که میبینید زبان C کد هاش خیلی بیشتره نسبت به Python و Nodejs. اما وقتی اجرا کردیم نتیجه به صورت وحشتناکی خوب بود. دفعه اول که ران کردیم سرعت ۶ مگاهرتز رو دیدم. اما توی دفعه های بعد سرعت ۲ مگاهرتز رو دیدیم.
نتیجه گیری
زبان برنامه نویسی Python و JavaScript تقریبا با یه سرعت اجرا میشن. فقط با این تفاوت که زبان برنامه نویسی پایتون و کتابخونه های مرتبط به اون به صورت پیشفرض روی سیستم عامل رزبیان نصب هست و نیازی نداره که اون رو نصب کنیم اما Nodejs رو باید نصب کنیم (که چند ساعت از من وقت گرفت تا تونستم اون رو به نسخه ۱۴ به روز رسانی کنم).
اما زبان برنامه نویسی C. این برنامه به خاطر سطح پایین بودن کد های بیشتری نسبت به پایتون و Nodejs داره اما سرعت خیلی بیشتری نسبت بهشون داره. البته ما تا ۴۰۰ مگاهرتز رو هم توی زبان برنامه نویسی C دیدیم که این بدون واسط سیستم عامل انجام شد.
در این که زبان های برنامه نویسی فقط یه ابزار هستند شکی نیست. اما من به شخصه طرفدار زبان برنامه نویسی python بوده و هستم، همون طور که خودتون هم اطلاع دارین این زبان به شدت پر طرفداره و یکی دو هفته قبل پر طرفدار ترین زبان برنامه نویسی دنیا شده که اون هم به خاطر ساده بودن این زبان و فراوانی کتابخانه های اون هست.
مطالب جالبی مطرح میکنید.
خسته نباشید.
این گفتارها و پرسش و پاسخ تو بالابردن سطح علمی بچه هایی که اونا رو میخونند خیلی موثره
از بد خلقی ها و بد سلیقه ها ناراحت نباشید و دلسرد نشوید.
ممنون از اینکه وقت میذارید و مطالب رو مطالعه میکنید. امیدوارم که مطالب برای شما مفید بوده باشه
من توی کد مربوط به پکیج onoff شما استفاده از clearInterval رو میبینم. البته این کد ناقص هست اما به نظر میرسه شما واسه این کد از تایمر ها استفاده کردید که تایمر ها خیلی کند تر از حلقه های ساده while(true) هستن که واسه کد های بعدی استفاده کردید. و طبیعی هست که این مثال شما خیلی کند تر از بقیه باشه.
همچنین برای تغییر ورژن node.js من پیشنهاد میکنم از ابزار nvm استفاده کنید. با یه دستور میتونید ورژن های مختلف رو نصب کنید و بینشون سوییچ کنید.
به نظرم واقعا خیلی غیر منصفانه نقد کردید. چیزی که واضحه و خودتونم نوشتید اینه که طرفدار پایتونید و این هم باعث شده خیلی متعصبانه به موضوع نگاه کنید و جاهای زیادی فقط قصدتون این بوده جاواسکریپت رو به سخره بگیرید و پایتون رو بزرگ جلوه بدید. باید دید مشکل اون لایبری چی بوده که ضعیف تر عمل کرده وگرنه قطعا چیزی که ثابت شده و حتی توی کانال سیسوگ هم زدید اینه که پایتون یکی از کندترین و پرمصرف ترین زبان های برنامه نویسی دنیاست و به نظرم حداقل برای سخت افزار مناسب نباشه
سلام.ممنون از مطلبتون.
اینکه دفعۀ اول این مقدار و دفعه دوم این مقدار یعنی چی؟
منظور از دفعه اول و دفعه دوم یعنی اینکه وقتی اولین بار برنامه رو اجرا کردیم و دومین بار که برنامه رو ران کردیم
این زئوس خودش کجا هست که هر بچه ای از راه میرسه باهاش فیت میده
المپ، تشریف بیارید در خدمت هستیم
سلام
دوستان دیگه ای هم که با این دوتا زبان JavaScript یا python برای رزبری پای کار کردن تجربیاتشون رو بنویسن ممنون میشم ازشون
اینجوری هم من هم بقیه دوستان استفاده میبریم
ما تو شرکت برای بیگل بن بلک از جاوااسکریپت استفاده کردیم حالا میخوایم سوییچ کنیم روی رزبری پای خب قطعا هزینه بر بخوایم کل نرم افزارمون رو هم ببریم روی پایتون
خلاصه ممنون
ممنونم از اینکه وقت گذاشتید و مطالعه کردید
اون کاری که کردی بهش میگن اندازه گیری فرکانس نه سرعت خاموش روشن شدن چراغ
در کل مقاله خیلی چرند و غیر علمی بود
فکر میکنم اول باید مقداری دانش خودتون رو در زمینه ای که میخواید در موردش نظر بدید بیشتر کنید، بعد نظر بدید 😐
خیلی ساده است اگر به ویکی پدیا مراجعه کنید نوشته
فِرِکانس (به فرانسوی: Fréquence) برابر «تعداد رخداد یک رویداد تکراری» در «واحد زمان» است.
یعنی اون چراغه چند بار در ثانیه روشن و خاموش میشه ! به همین سادگی
در ضمن مقاله کاملا علمی است چون مقاله علمی مقاله ای است که نتایجش قابل تکرار باشند، من هم تست کردم نتیجه همین چیزی هست که در مقاله ذکر شده
من به زبان شیرین فارسی در اول مقاله به این موضوع ذکر کردم که : میخوایم ببینیم کدوم زبان سرعت بیشتری رو کنترل ورودی و خروجی I/O داره انجام میدیم. یعنی میخوایم ببینیم فرکانس رورودی و خروجی توی کدوم زبان سرعت بیشتری داره. حالا سوال مطرح شده اینه که فرکانس چیه؟ به تعداد رویداد (معنی رویداد رو میتونید از ویکیپدیا و یا سایت واژه یاب ببینید) هایی که در یک بازه زمانی مشخص تکرار میشن میگن فرکانس یا بسامد. اینجا رویداد ما چیه؟ ۰ و ۱ شدن خرورجی. ۰ و ۱ شدن مگه همون روشن و خاموش شدن نیست؟
در جواب اون جمله مقاله چرند و غیر علمی هم باید بگم که نظر شما بر روی چرند بودن مقاله ای که براش وقت گذاشته شده و زحمت کشیده شده محترمه. در غیر علمی; شما یا نمیدونید مقاله علمی و غیر علمی چیه یا کلا در مورد مقاله دارید اشتباه میزنید.(با نهایت احترام)
مطلب جالبی بود دست شما درد نکنه. در مورد کدی که به زبان C نوشتین کتابخانه wiringPi از دسترسی به رجیسترهای پردازنده استفاده می کنه. بد نیست سرعت رو با استفاده از sysfs هم توی C تست کنید چون روش روش هم خیلی کاربردیه. متشکرم.
https://elinux.org/RPi_GPIO_Code_Samples#:~:text=500)%20%3B%0A%20%20%7D%0A%20%20return%200%20%3B%0A%7D-,sysfs,-The%20following%20example
ممنونم که وقت گذاشتید و مطالعه کردید. این نظر لطف شماست. بله حتما تست میکنم ممنون از پیشنهادتون
چرند نگو باو جاواسکریپتو xxxx میدونه سریع تر پایتونه
بلد نیستی باش کار کنی الکی نگو افتضاح!!!
داشتن ادب اولین چیزی هست که لازمه یک بحث سالمه
من دقیقا آزمایش رو تکرار کردم نتایج همین چیزی است که در مقاله ذکر شده
اگر به نظر شما فرق میکنه، خوشحال میشم نتایج آزمایش شما رو هم بررسی کنم
کاری به ادب این آقا ندارم اما خب شما هم کاش به جای این حرفا یکم مفاهیم سیستم عامل رو میخوندید بعد شروع به نوشتن مقاله کنید
اونجا که سرعت دوبار متفاوت شد حداقل یه سرنخی میتونست بهتون بده که یکم علمی به موضوع نگاه کنید تا شبیه یک تکنسین
البته که من مقاله رو ننوشتم
البته حق با شماست، زیاد به تاثیر سیستم عامل در خصوص اجرای برنامه ها دقت نکردم وقتی که داشتم تست میکردم، من صرفا تست کردم ببینم مقادر ذکر شده در مقاله درست باشن و قابل استناد از این جهت که تکرار شونده باشه نتایج
هر چند به دنبال دلیل این اختلاف نبودم، ولی اگر بهش پرداخته میشد قطعا مقاله بهتری میشد
در اینکه زبان های برنامه نویسی فقط یک ابزار هستند و ما نباید روی اون ها تعصبی بشیم هیچ شکی نیست. اما به نظرم شما برید و از اول این نوشته رو بخونید. “onoff” داشت با سرعت ۱۳۴ کیلو هرتز دستور برای ۰ و ۱ شدن خروجی میداد. من به نظرم اگه دستی یه سیم رو قطع و وصل کنیم سرعتش به ۱۵۰ کیلو هرتز میرسه. اگه این نتیجه افتضاح نیست پس چیه؟
اما “rpio” با سرعت ۱ مگاهرتز دستور برای ۰ و ۱ شدن خروجی داد. پس مشکل از onoff بوده و نه از زبان جاوا اسکریپت. حالا در اینکه شما میگید بلد نیستی باش کار کنی باید بگم دقیقا باید باهاش چیکار کنم؟
اگه احساس میکنید من بلد نیستم پس شما رو به چالش برنامه نویسی دعوت میکنم. چه با پایتون و چه با جاوا اسکریپت.
آخه جوجه برنامه نویس تو خودت اول برنامه نویسی رو کامل یاد بگیر، 4 خط کد آماده نوشتی یه LED خاموش روشن کردی دعوت به مبارزه هم میکنی!!!
هنر بیار و زبان آوری مکن سعدی
چه حاجت است بگوید شکر که شیرینم