سلام به همه.
بعدازاینکه من چالش LED قسمت قبل آموزش رزبری پای با پایتون رو حل کردم زئوس یه چالش باحال تر برام گذاشت. چالش به این صورت بود که من باید با دوتا LED به رنگهای قرمز و سبز یه نور زرد تولید میکردم. یعنی طوری که باید از کاربر سؤال میشد میخواد چه رنگی رو انتخاب کنه؟ و کاربر ۳ حق انتخاب داشته باشه: حالت اول رنگ قرمز، حالت دوم رنگ سبز و حالت سوم رنگ زرد.
وسایلی که حق داشتم انتخاب کنم:
- رزبری پای (من یدونه نسخه ۴ انتخاب کردم)
- برد بورد ( کوچیک یا بزرگش فرقی نداره)
- دو تکه سیم نر و ماده (ترجیحاً در ۲ رنگ متفاوت من خودم از قهوهای و قرمز استفاده کردم)
- سه تکه سیم دوسر نر (ترجیحاً با رنگهای متفاوت)
- دوتا LED (یکی قرمز و دیگری سبز)
- یدونه مقاومت ۱۰ اهم
یه کوچولو فکر کردم و به این نتیجه رسیدم که طبق شکل زیر یه مدار رسم کنم:
حالا با این مدار من ۳ تا نور میتونم تولید کنم. حتماً میپرسید چطور؟
جواب خیلی راحته. اگه هرکدوم از ورودیهای ما ۰ و دیگری ۱ باشه ما میتونیم یه نور رو ببینیم. حالا اگه هرکدوم از ورودی و خروجیها رو توی بازه ۵۰ هرتز یا بیشتر ۰ و ۱ کنیم چی؟ چشم ما نمیتونه این حجم از روشن و خاموش شدن رو درک کنه و به نظرش دوتا LED ها روشنه. منطق برنامه رو درست گفتم. حالا باید برم و پیاده سازی کنم.
شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100 از مقدماتی تا پیشرفته
اتصالات سخت افزاری
تو قدم اول مداری که تو عکس میبینید رو روی برد بورد وصل کردم. پس با توجه به این عکس:
سیم قهوهای رو به پین شماره ۷ رزبری و پورت مثبت سمت چپ برد بورد وصل کردم. سیم قرمز رو هم به پین شماره ۸ رزبری و پورت مثبت ستون سمت راست وصل کردم.
یدونه از سیمهای دوسر نر رو از ستون مثبت سمت راست برد بورد به پورت شماره J۷ وصل کردم. مقاومت رو برداشتم و یه سر اون رو به پورت شماره I۷ و سر دیگه اون رو به پورت شماره E۱۲ وصل کردم. دوتا سیمهای دوسر نر رو از ستون مثبت سمت چپ به ترتیب یکی رو به پورت شماره A۱۰ و A۱۵ وصل کردم. LED قرمز رو برداشتم و سر منفی اون رو به پورت شماره C۱۵ و سر مثبت رو به پورت شماره C12 وصل کردم. LED سبز رو برداشتم و سر مثبت اون رو به پورت D۱۲ و سر منفی اون رو به پورت D۱۰ وصل کردم.
قسمت برنامه نویسی
تبریک میگم به خودم. حالا فقط مونده بود برنامه نویسی برای حل این چالش LED.
طبق روال قبل کتابخانههای مورد نظر رو فراخانی کردم:
1 2 | import RPi.GPIO as GPIO import time |
تنظیمات پورتها رو هم مثل قبل اینجا تعریف کردم:
1 2 3 4 5 6 7 | GPIO.setmode(GPIO.BCM) red_pin=14 green_pin=4 GPIO.setup(red_pin,GPIO.OUT) GPIO.setup(green_pin,GPIO.OUT) |
الآن من به ۳ تا تابع نیاز داشتم برای رنگ قرمز، سبز، زرد. اینم اینجا تعریف کردم:
1 2 3 4 5 6 7 8 9 10 11 12 | def red(): GPIO.output(red_pin,True) GPIO.output(green_pin,False) def green(): GPIO.output(red_pin,False) GPIO.output(green_pin,True) def yellow(): while True: red() time.sleep(0.013) green() time.sleep(0.013) |
اگه به تابع yellow دقت کنید میبینید که داخل یه حلقه بی نهایت داره توابع مربوط به رنگهای قرمز و سبز رو به ترتیب با ۰/۱۳ ثانیه داره فراخانی میکنه. در این سرعت چشم انسان نمیتونه تشخیص بده که الان LED ها داره خاموش و روشن میشه، پس مغز ما فکر میکنه الآن روشنه.
دیگه بقیش که مث آب خوردن بود. باید از کاربر میپرسیدم میخوای چیکار کنی و بعد هم تابع مربوط به خودش رو فراخوانی کنم. با این دستور از کاربر میپرسم الآن میخوای چیکار کنی؟
1 | FLAG=str(input("select your choise \n r -> red \n g-> green \n r_g -> yellow\n *** q for quiet ***")) |
کاربر اگه g رو وارد کنه LED سبز براش روشن میشه. اگه r رو وارد کنه LED قرمز براش روشن میشه. اگه هم r_g رو وارد کنه براش نور زرد تولید میشه. که با این کدها ادامه ماجرا براش در پشت صحنه انجام میشه:
1 2 3 4 5 6 7 8 9 10 | if FLAG == "r": red() elif FLAG =="g": green() elif FLAG=="r_g": yellow() elif FLAG=='q': exit() else: print("wrong data") |
تا اینجا درست پیشرفته بودم که ناگهان زئوس گفت: “باید تا برنامه اجرا میشه هربار از کاربر سؤال بشه الآن میخوای چه عملیاتی انجام بدی و با وارد کردن دستور، کار قبلی متوقف و کار جدید شروع بشه.”
من که ۸۰٪ راه رو رفتم، یکم فکر کردم دیدم خب تابعهای red و green که برای led اصن چالش خاصی نداره اما تابع مربوط به yellow چون داره توی حلقه بی نهایت میره نمیشه همین طوری به صورت عادی باهاش برخورد کرد. به خودم گفتم اگه تو thread بزارمش ممکنه درست کارکنه؟
امتحان کردم و جواب گرفتم:
1 2 3 4 5 6 7 8 9 10 11 12 | while True: FLAG=str(input("select your choise \n r -> red \n g-> green \n r_g -> yellow\n *** q for quiet ***")) if FLAG == "r": red() elif FLAG =="g": green() elif FLAG=="r_g": threading.Thread(target=yellow).start() elif FLAG=='q': exit() else: print("wrong data") |
حالا یه چیزی هم برای اینکه اون thread متوقف بشه باید بزارم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | try: while True: FLAG=str(input("select your choise \n r -> red \n g-> green \n r_g -> yellow\n *** q for quiet ***")) if FLAG == "r": stop_thread=True red() elif FLAG =="g": stop_thread=True green() elif FLAG=="r_g": stop_thread=False threading.Thread(target=yellow).start() elif FLAG=='q': stop_thread=True exit() else: print("wrong data") finally: GPIO.output(red_pin,False) GPIO.output(green_pin,False) |
اون سه تا تابع رو هم به این صورت تغییر دادم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def red(): GPIO.output(red_pin,True) GPIO.output(green_pin,False) def green(): GPIO.output(red_pin,False) GPIO.output(green_pin,True) def yellow(): global stop_thread while True: red() time.sleep(0.013) green() time.sleep(0.013) if stop_thread: break |
کد کامل چالش 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 | import RPi.GPIO as GPIO import time import threading GPIO.setmode(GPIO.BCM) sleep_time=0.20 red_pin=14 green_pin=4 GPIO.setup(red_pin,GPIO.OUT) GPIO.setup(green_pin,GPIO.OUT) #### def red(): GPIO.output(red_pin,True) GPIO.output(green_pin,False) def green(): GPIO.output(red_pin,False) GPIO.output(green_pin,True) def yellow(): global stop_thread while True: red() time.sleep(0.013) green() time.sleep(0.013) if stop_thread: break ### try: while True: FLAG=str(input("select your choise \n r -> red \n g-> green \n r_g -> yellow\n *** q for quiet ***")) if FLAG == "r": stop_thread=True red() elif FLAG =="g": stop_thread=True green() elif FLAG=="r_g": stop_thread=False threading.Thread(target=yellow).start() elif FLAG=='q': stop_thread=True exit() else: print("wrong data") finally: GPIO.output(red_pin,False) GPIO.output(green_pin,False |
مطلب جالبی بود.
ظاهرا به علت یه سری سو تفاهم ها برخی دوستان بی مهری کردن.
ای کاش ای کاش حداقل یه ذره فکر میکردید بعد چالش حل میکردید این مدار رو نشون بچه هم بدید میخنده از سیسوگ انتظار نداشتم مطلب زرد تولید کنه تعجبم از این همه کامنته که دارن همین موضوع رو فریاد میکشن اما باز اصلاح نمیکنید
دوست عزیز
سایت سیسوگ نویسنده های زیادی داره که سعی دارند تجربه های خودشون در حوزه های مختلف را ارائه بدند
این که یک نفر از دنیای نرم افزار سعی کرده با هیجان خودش یک کار ساده را انجام بده شاید برای خیلی پیش پا افتاده باشه ولی زرد محسوب نمیشه
ما هم یک بستر هستیم و از اینکه دوستی با هر میزان اطلاعات سعی در انتقال دانسته هاش برای عده ای دیگه میکنه از نظر ما پسندیده و قابل احترام هست
من یه ربعه فقققط دارم نفس میکشم
چرا این قدر چرت و پررت نوشتید واقعا؟ مگه مجبوری؟ سرم درد گرفته
از همون اول مقاله که
• دو تکه سیم نر و ماده (ترجیحاً در ۲ رنگ متفاوت من خودم از قهوهای و قرمز استفاده کردم)
• سه تکه سیم دوسر نر (ترجیحاً با رنگهای متفاوت)
مگه کفن میته؟ خوب بنویس مقداری سیم برد بوردی مثلا و سیم نری به مادگی
بعد اون مداری که کشیدید منبع متناوب داره چه ربطی داره اصلا به رزبری پای؟ چجوری به رزبری وصل شده؟ ورودی هاش کجاس؟ رزبری ولتاژ متناوب تولید میکنه؟ اگه میتونه ولتاژ منفی تولید میکنه بگید ما که 20 ساله کار الکترونیک میکنیم یاد بگیریم. اگه منظورت سیگنال مربعیه اون علامت که گذاشتی داری اشتباه میزنی داداش
بعد یجا تو ادامه نوشتید منطق برنامه رو درست گفتم، حالا دیگه باید کدشو بزنم
من الآن نمیدونم کلمو به طاق بکوبم، بخندم، سکته کنم؟
به نظرم من بیشتر ##### تا منطق درست بنویسی!!
آخه مردمومن سه تا حالت صفر و یکی بیشتر نیست من نمی فهمم چرا این همه لقمه رو دور سرت پیچوندی آخه.
میتونستی یه متغیر ساده تعریف کنی هربار دکمه رو زد یکی بشماره و وقتی هم به 3 رسید دوباره صفر بشه یعنی از 0 تا 2
بگی اگه حالت 0 شد، فقط LED قرمز اگه 1 شد فقط سبز اگه دو شد دو تاش! تازه میتونستی حالت چهارمی هم تعریف کنی همش خاموش باشه
کاری داشت؟ تازه یه کوچولو هم نشستی فکر کردی
مگه جلسه قبلی با کلید این کارو نکری پس چرا از سریال خوندی
بابا مرد روز های سخت!!!
از روزی که این پایتون اومد همه برنامه نویس شدن همینه
دیگه بقیه مقاله هم اصابم نکشید بخونم تا همینجاش بسمه
الحق که به قول خودت نایابی
سلام. ممنون از اینکه وقت گذاشتید و مطالعه کردید.
دوست عزیز شما خودتون دارید میگید ۲۰ ساله الکترونیک کار میکنید. اگه تیتر این نوشته رو بخونید میبینید که نوشته :آموزش رزبری پای با پایتون – قسمت چهارم. یعنی این این نوشته برای کساییه که تازه میخوان وارد دنیای الکترونیک و برنامه نویسی بشن. این که من رنگ سیم ها رو هم نوشتم یا تعداد سیم ها رو نوشتم خب دلم خواسته این طوری بنویسم و شما اگه باب میلتون نیست میتونید آروم از کنارش رد بشد یا اگه خیلی اذیت شدید میتونید باب دل خودتون مطلب بنویسید و منتشر کنید.
این که دارید این طور جاج میکنید به نظرم خیلی عجیبه. بعدشم کسی که داره آشنا میشه دوست داره برنامه ای که مینویسه کار کنه، براش مهم نیست که چطور نوشته میشه، ایا بهینه نوشته شده یا نه و…
لحن تند ایشون رو اگر فاکتور بگیریم، یه سری نقد ها رو هم درست دارن میگن. الآن اون مداری که کشیدید من هم واقعا درک نکردم. اصلا رزبری کجای این مداره؟ بعد شما اگه سیگنال مربعی بدی به LED فقط یکیش روشن میشه چون یکیش بایاس معکوسه. اگرم متناوب بهش بدی که خوب باز به اندازه همون زمانی که LED بالایی روشنه پایینی هم روشنه. اصلا منطق رو من هیچ درک نکردم. رزبری هم که متناوب نیست. ضمن اینکه نکته خوبی هم اشاره کردن. چالش مگه این نبوده که دکمه رو زد کاربر یا زرد یا قرمز یا دوتاش روشن بشه همزمان؟ اصلا صورت مساله هم نامفهومه. ایشون به نظر من نقد وقعا درستی کردن، بماند که حالا یکم واقعا تند و عصبی بودن. در ضمن کلمات انگلیسی مثل جاج و… رو هم خواهشا استفاده نکنیم و نزاریم این فرهنگ اشاعه پیدا کنه. ما پارسی زبان هستیم و خودمون باید به فکر زنده موندن این زبان باشیم.