اطلاعیه

Collapse
No announcement yet.

اجرا چند لوپ در اردوینوuno

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : اجرا چند لوپ در اردوینوuno

    نوشته اصلی توسط pourya1368 نمایش پست ها
    سلام
    من میخوام درب یک کشویی رو با موتور باز و بسته کنم. یک کلید دو وضعیتی برای این کار در نظر گرفتم. یک کلید که محدوده باز شو درب و یک کلید هم در محدوده بسته شدن درب. وقتی فرمان باز شو رو میدم باید اول وضعیت کلید حد باز سنجیده بشه چون ممکنه درب کشو اصلا باز باشه و نیاز نباشه ما فرمان باز شدن رو بدیم. حالا فرض اینکه فرمان داده شد و کلید حد باز 0 بود درب باز میشه. حالا باید بگیم تا زمانی باز بشه که اون کلید 1 نشه. بعبارتی وقتی کشو کاملا باز شد موتور خاموش بشه. تو این قسمت دوم کار موندم. ممنون میشم کمکم کنید



    int Motor1 = 5;
    int Motor2 = 6;
    int BUTTON1 = 7;
    int BUTTON2 = 8;
    int BUTTON3 = 12; // Button position in End of Limit
    int BUTTON4 = 13; // Button position in Start of Limit
    int BUTTON1state = 0;
    int BUTTON2state = 0;
    int BUTTON3state = 0;
    int BUTTON4state = 0;
    unsigned long Timer1 = 0;
    unsigned long Delay1 = 1000;
    int lastBUTTON1state = 0;
    int lastBUTTON2state = 0;
    int lastBUTTON3state = 0;
    int lastBUTTON4state = 0;






    void setup() {


    pinMode(7, INPUT);
    pinMode(8, INPUT);
    pinMode(12, INPUT);
    pinMode(13, INPUT);
    pinMode(Motor1, OUTPUT);
    pinMode(Motor2, OUTPUT);
    }


    void loop() {
    Timer1 = millis();
    BUTTON1state = digitalRead(BUTTON1);
    BUTTON2state = digitalRead(BUTTON2);
    BUTTON3state = digitalRead(BUTTON3);
    BUTTON4state = digitalRead(BUTTON4);
    lastBUTTON1state =! BUTTON1state;
    lastBUTTON2state =! BUTTON2state;
    lastBUTTON3state =! BUTTON3state;
    lastBUTTON4state =! BUTTON4state;






    if ((digitalRead(BUTTON1)) && (digitalRead(BUTTON3)) ) { // Button position in End of Limit
    Stop_Ramp();
    }


    if ((digitalRead(BUTTON1)) && !(digitalRead(BUTTON3)) ) {
    Open_Ramp();


    }


    if ((digitalRead(BUTTON2)) && (digitalRead(BUTTON4)) ) { // Button position in End of Limit
    Stop_Ramp();
    }


    if ((digitalRead(BUTTON2)) && !(digitalRead(BUTTON4)) ) {
    Close_Ramp();
    }


    }
































    void Open_Ramp() {
    while (!(digitalRead(BUTTON3)) && ((millis()-Timer1) >= Delay1))
    {
    digitalWrite(Motor1 , HIGH) ; // Open
    analogWrite(Motor2 , 235 ) ;
    }


    }






    void Close_Ramp() {
    while (!(digitalRead(BUTTON4)) && ((millis()-Timer1) >= Delay1))
    {
    digitalWrite(Motor1 , LOW) ; // Close
    analogWrite(Motor2 , 20 );
    }
    }








    void Stop_Ramp() {
    digitalWrite(Motor1 , HIGH) ; // Stop
    analogWrite(Motor2 , 255 ) ;
    }




    void Blink() {


    }






    void Alarm() {


    }




    [COLOR=#353C41][FONT=Inter][/FONT][/COLOR]

    سلام
    ببخشید من دقیق متوجه مشکل شما نشدم. مشکلتون دقیقا با چیه؟

    دیدگاه


      #17
      پاسخ : اجرا چند لوپ در اردوینوuno

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      ببخشید من دقیق متوجه مشکل شما نشدم. مشکلتون دقیقا با چیه؟

      با بازو بسته شدن یک درب از طریق دو عدد کلید که مشکلی نداری؟

      حالا میخوام با دوتا کلید اضافه قطع کن خودکار بذارم. وقتی در باز شد و به کلید برخورد کرد دیگه باز نشه و برعکس
      قبلش میخوام این شرط رو هم چک کنم که مثلا فرض کنید درب باز هست و شما دوباره فرمان باز شدن درب رو اشتباها وارد کنید. خب نباید موتور فعال بشه

      دیدگاه


        #18
        پاسخ : اجرا چند لوپ در اردوینوuno

        نوشته اصلی توسط pourya1368 نمایش پست ها
        با بازو بسته شدن یک درب از طریق دو عدد کلید که مشکلی نداری؟

        حالا میخوام با دوتا کلید اضافه قطع کن خودکار بذارم. وقتی در باز شد و به کلید برخورد کرد دیگه باز نشه و برعکس
        قبلش میخوام این شرط رو هم چک کنم که مثلا فرض کنید درب باز هست و شما دوباره فرمان باز شدن درب رو اشتباها وارد کنید. خب نباید موتور فعال بشه

        با سلام و احترام.
        آیا فانکشنهای Open_Ramp و Close_Ramp اجرا میشوند؟
        جدیدترین ویرایش توسط evergreen; ۲۲:۰۸ ۱۴۰۱/۰۲/۲۶.

        دیدگاه


          #19
          پاسخ : اجرا چند لوپ در اردوینوuno

          نوشته اصلی توسط pourya1368 نمایش پست ها
          با بازو بسته شدن یک درب از طریق دو عدد کلید که مشکلی نداری؟

          حالا میخوام با دوتا کلید اضافه قطع کن خودکار بذارم. وقتی در باز شد و به کلید برخورد کرد دیگه باز نشه و برعکس
          قبلش میخوام این شرط رو هم چک کنم که مثلا فرض کنید درب باز هست و شما دوباره فرمان باز شدن درب رو اشتباها وارد کنید. خب نباید موتور فعال بشه
          اینا رو که فهمیدم، ظاهرا یه کدهایی هم براش نوشتید. منظورم این بود دقیقا کجای پیاده سازی گیر کردید؟ مثلا این که کلیدها رو نمیتونید چک کنید، یا این که برنامه توی یه نقطه گیر میکنه و امثال این موارد.
          پیشنهاد میدم شما ۴ وضعیت توی برنامه در نظر بگیرید. باز، بسته، در حال باز شدن، در حال بسته شدن. کلید ها و سنسورها این حالت ها رو تغییر میدن، کنترل موتورها هم با توجه به این وضعیت ها صورت بگیره و کاری نداشته باشه کدوم کلید یا سنسور چه سیگنالی داره.
          پیاده سازی روش پیشنهادی هم به این صورته که شما یک متغیر وضعیت در نظر میگیرید و بالای loop با چک کردن سنسورها و کلیدها این متغیر رو روی یکی از اون وضعیت ها تنظیم میکنید. در ادامه ی loop، موتورها با توجه به وضعیت این متغیر به شکل مناسب فعال میشن که میتونه حالت باز شدن یا بسته شدن یا خاموش شدن باشه. انتهای loop هم یک delay اگر لازم شد میذارید که کمی تاخیر توی برنامه ایجاد کنه. خوبی این روش اینه که میتونید وضعیت های مختلف دیگه ای به خواست خودتون به برنامه اضافه یا کم کنید و مدیریتش زیاد سخت نمیشه. از طرفی برنامه توی حلقه ها طولانی گیر نمیکنه و میتونید هر زمانی وضعیت دستگاه رو با کلیدها تغییر بدید.

          دیدگاه


            #20
            پاسخ : اجرا چند لوپ در اردوینوuno

            سلام وقت بخیر

            برای اینکار شما باید 2 عدد میکروسوئیچ اهرمی استفاده کنید و یک کلید شستی

            اصول کار به این شکل هست که میکروسوئیچ ها باید ابتدا و انتهای چهار چون درب نصب بشه و وقتی که در باز یا بسته میشه یکی از اونها فشرده و فعال بشه تا بتونید محدودیت ابتدا و انتهای درب همچنین وضعیت باز یا بسته بودن درب رو تشخیص بدید.

            یک کلید شستی هم نیاز دارید که با فشردنش اگه درب باز باشه بسته میشه و اگه بسته باشه باز میشه

            همچنین 2 عدد LED هم کنار کلید باید در نظر بگیرید که نشون بده درب باز هست یا بسته

            در همین حین میتونید یک فلاشر هم برای مواقعی که درب در حال حرکت هست در نظر بگیرید

            دیدگاه


              #21
              پاسخ : اجرا چند لوپ در اردوینوuno

              نوشته اصلی توسط electropedia نمایش پست ها
              سلام وقت بخیر

              برای اینکار شما باید 2 عدد میکروسوئیچ اهرمی استفاده کنید و یک کلید شستی

              اصول کار به این شکل هست که میکروسوئیچ ها باید ابتدا و انتهای چهار چون درب نصب بشه و وقتی که در باز یا بسته میشه یکی از اونها فشرده و فعال بشه تا بتونید محدودیت ابتدا و انتهای درب همچنین وضعیت باز یا بسته بودن درب رو تشخیص بدید.

              یک کلید شستی هم نیاز دارید که با فشردنش اگه درب باز باشه بسته میشه و اگه بسته باشه باز میشه

              همچنین 2 عدد LED هم کنار کلید باید در نظر بگیرید که نشون بده درب باز هست یا بسته

              در همین حین میتونید یک فلاشر هم برای مواقعی که درب در حال حرکت هست در نظر بگیرید
              با درود
              ایشون با برنامه نویسی مشکل دارند و نمیتونن وضعیت کلید های اهرمی یا سنسور چک کنن و نمیدونن باید چگونه این کار انجام بدن
              در حال حاظر ایشون فقط از دو شستی برای باز کردن و بسته کردن درب استفاده کردن و هیچ چیزی در نظر نگرفتن
              مثل اینکه بخوان یک ال ای دی رو با یک شستی روشن کنن و یک ال ای دی دیگرو با یک شستی دیگه روشن کنن
              من به برنامه توجه نکردم چون خوانا نبود ولی گویا از دو موتور استفاده کردن
              اگر ایشون میپرسیدن کار این دستور چیه موضوع فرق داشت یا بگن نمیدونم دقیق از چه دستوری استفاده کنم
              بلکه با طراحی در برنامه نویسی مشکل دارند و در سطوح ابتدایی هستن
              این تجارب با گذر زمان و تلاش و تمرین ایجاد میشه
              مثل اینه بخوای اب دستی توی چاه بریزی .. چاه باید خودش اب بده
              این پروژه ها برای کاردستی مناسب هستن در این سطوح .. در صورتی که در پروژه های واقعی خیلی موارد باید رعایت بشه چه سخت افزار و چه نرم افزار
              خب شما درست میفرمایید که باید از یک شستی برای باز بسته کردن درب استفاده بشه یا یک سنسور تشخیص حرکت
              خب نفر اول میاد و درب در حال باز شدن هست و فرد رد میشه نفر دوم میاد و سنسور یا شستی فعال میکنه ولی درب که در حال باز شدن هست اقدام به بسته شدن میکنه
              و سکانس بعد فرد لای درب گیر میکنه ؟ چه تدابیری اندیشیده شده ؟ موتور همچنان روشن و داره قفسه سینه فرد خرد میکنه
              مردم میان کمکش و سعی میکنن درب رو باز کنن تا فرد بتونه خارج بشه
              خب چی میشه موتور میسوزه
              ولی همچنان فرمان روشن بودن موتور در حال اجراست و چون موتور باید گیربکس دار باشه و احتمالا مردم نمیتونن فرد رو نجاب بدن چون گیربکس در جهت عکس راحت نمیچرخه
              فرد لای درب نفسش بند اومده و یک اشنا که در جمع کمک کنندگان هست احساساتی میشه و با لگد به درب میزنه و توسط لگد سنسور یا کلید اهرمی دیگه درست نمیتونه کار کنه
              بگذریم دیگه داره هندی میشه
              فکر نکن کم اوردم تا یک ساعت دیگه برات تعریف میکنم
              منظورم این پروژه ها به این سادگی نیستن و موارد خیلی زیادی باید چک بشه و در سخت افزار و نرم افزار رعایت بشه

              دیدگاه


                #22
                پاسخ : اجرا چند لوپ در اردوینوuno

                نوشته اصلی توسط evergreen نمایش پست ها

                با سلام و احترام.
                آیا فانکشنهای Open_Ramp و Close_Ramp اجرا میشوند؟

                هر دو فعال میشن ولی زمانیکه مخواد شرط باز بودن و بسته بودن رو اول چک بکنه در یک جهت دیگه حرکت نمیکنه و باید یکبار جهت خلاف رو فعال کنم تا دوباره بونه در هر دوجهت حرکت کنه


                شفافتر بگم
                مثلا درب باز هست، یعنی سنسور باز بودن high شده وقتی میگم باز شو اتفاقی نمیوفته و وقتی سنسور رو low میکنم موتور فعال میشه. در جهت عکس هم قاعدتا باید همینطور باشه ولی وقتی سنسور رو یکبار high میکنم و موتور با فرمان من حرکت نمیکنه و دوباره سنسور رو low میکنم دیگه حرکت نمیکنه. در این وضعیت باید یکبار در جهت خلاف حرکت بدم تا بتونم چپگرد راستگرد کنم. اینم بگم که این اتفاق فقط برای یک پین میوفته و وقتی جابجا میکنم در جهت عکس اون اشکال پیش میاد

                احتمال 90 درصد متوجه نشدید درسته؟

                دیدگاه


                  #23
                  پاسخ : اجرا چند لوپ در اردوینوuno

                  در صورتی که امکان استفاده از یک شستی برای باز و بسته شدن و دو میکرو سوئیچ به عنوان کنترل کننده باز یا بسته بودن درب دارید کد موجود در لینک زیر رو بررسی کنید :

                  For those who helped create the Genki Dama


                  البته کد بالا بصورت تئوری نوشته شده و در عمل ممکنه نیازمند تغییراتی باشه اما به صورت کلی منطق کد بالا بدین شکل هست :

                  2 عدد میکروسوویچ وجود داره که بررسی میکنه درب باز هست یا بسته و یا در صورتی که درب در حال باز و بسته شدن باشه مشخص میکنه چه زمان باید موتور خاموش بشه, در کد بالا طبق کد خودتون از 2 موتور استفاده شده

                  2 عدد LED وجود داره که اگه درب باز باشه pin_led_open روشن و در صورت بسته بودن درب pin_led_close روشن میشه.

                  همچنین اگه درب به هر دلیلی مثل قطع شدن برق اواسط راه متوقف بشه, بعد از راه اندازی مجدد, هر دو LED خاموش میشه و سیستم بصورت خودکار درب رو میبنده

                  طبق روشن بودن LED میتونید در صفحه کنترل باز یا بسته بودن درب رو متوجه بشید

                  با یک بار فشردن شستی درب باز و با فشردن مجدد درب بسته میشه

                  دیدگاه


                    #24
                    پاسخ : اجرا چند لوپ در اردوینوuno

                    نوشته اصلی توسط electropedia نمایش پست ها
                    در صورتی که امکان استفاده از یک شستی برای باز و بسته شدن و دو میکرو سوئیچ به عنوان کنترل کننده باز یا بسته بودن درب دارید کد موجود در لینک زیر رو بررسی کنید :

                    For those who helped create the Genki Dama


                    البته کد بالا بصورت تئوری نوشته شده و در عمل ممکنه نیازمند تغییراتی باشه اما به صورت کلی منطق کد بالا بدین شکل هست :

                    2 عدد میکروسوویچ وجود داره که بررسی میکنه درب باز هست یا بسته و یا در صورتی که درب در حال باز و بسته شدن باشه مشخص میکنه چه زمان باید موتور خاموش بشه, در کد بالا طبق کد خودتون از 2 موتور استفاده شده

                    2 عدد LED وجود داره که اگه درب باز باشه pin_led_open روشن و در صورت بسته بودن درب pin_led_close روشن میشه.

                    همچنین اگه درب به هر دلیلی مثل قطع شدن برق اواسط راه متوقف بشه, بعد از راه اندازی مجدد, هر دو LED خاموش میشه و سیستم بصورت خودکار درب رو میبنده

                    طبق روشن بودن LED میتونید در صفحه کنترل باز یا بسته بودن درب رو متوجه بشید

                    با یک بار فشردن شستی درب باز و با فشردن مجدد درب بسته میشه



                    ممنون
                    اجرا کردم کد رو و ایراداتی داشت

                    قبلش بگم که باید دو کلید برای بازو بسته شدن در نظر بگیرم و دو کلید برای تعیین وضعیت درب. یعنی 4 میکرو سوییچ

                    نکته بعدی اینکه یک موتور دارم. چطور میگید دو موتور دارم؟ ممنون میشم دستورات باز بسته شدن رو مثل من در قالب void open و void close بنویسید و همچنین برای ال ای دی هم دستورات راه انداز رو خارج از حلقه اصلی بنویسید. ممنون میشم


                    ایراد کار این بود که یکی از ماسفت ها داغ میکنه
                    لطفا از کدی که من نوشتم استفاده کنید و اونو اصلاح کنید. خیلی ممنونم ازت

                    دیدگاه


                      #25
                      پاسخ : اجرا چند لوپ در اردوینوuno

                      فکر میکنم درست متوجه منظورتون نشدم اما کد زیر رو بررسی کنید :

                      For those who helped create the Genki Dama


                      در این کد لازم هست پین ها رو در خط 1 الی 8 بر اساس مدارتون تغییر بدید

                      همچنین در خط 76 - 84 - 101 - 110 شاید نیاز باشه بر اساس نوع موتوری که استفاده میکنید برای روشن شدن و خاموش شدن موتور کد رو تغییر بدید

                      دیدگاه


                        #26
                        پاسخ : اجرا چند لوپ در اردوینوuno

                        نوشته اصلی توسط electropedia نمایش پست ها
                        فکر میکنم درست متوجه منظورتون نشدم اما کد زیر رو بررسی کنید :

                        For those who helped create the Genki Dama


                        در این کد لازم هست پین ها رو در خط 1 الی 8 بر اساس مدارتون تغییر بدید

                        همچنین در خط 76 - 84 - 101 - 110 شاید نیاز باشه بر اساس نوع موتوری که استفاده میکنید برای روشن شدن و خاموش شدن موتور کد رو تغییر بدید

                        همون ایراد قبلی هنوز هست و در یک جهت کلا حرکتی نداره و باید کلید های تشخیص وضعیت چندبار فعال و غیر فعال شه تا کار کنه

                        یه سوال
                        digitalWrite(pin_motor_2, HIGH);


                        while (1 != 2)

                        منظورت از 1 != 2 چیه؟

                        دیدگاه


                          #27
                          پاسخ : اجرا چند لوپ در اردوینوuno

                          نوشته اصلی توسط pourya1368 نمایش پست ها
                          همون ایراد قبلی هنوز هست و در یک جهت کلا حرکتی نداره و باید کلید های تشخیص وضعیت چندبار فعال و غیر فعال شه تا کار کنه

                          یه سوال
                          digitalWrite(pin_motor_2, HIGH);


                          while (1 != 2)

                          منظورت از 1 != 2 چیه؟
                          از چه موتور استفاده میکنید ؟

                          عملکرد while (1 != 2) درواقع یک loop بینهایت هست که درون اون یک شرط تعریف شده و زمانی که میکرو سوئیچ بررسی باز یا بسته شدن درب فشرده بشه حلقه break / متوقف میشه

                          دیدگاه


                            #28
                            پاسخ : اجرا چند لوپ در اردوینوuno

                            نوشته اصلی توسط electropedia نمایش پست ها
                            از چه موتور استفاده میکنید ؟

                            عملکرد while (1 != 2) درواقع یک loop بینهایت هست که درون اون یک شرط تعریف شده و زمانی که میکرو سوئیچ بررسی باز یا بسته شدن درب فشرده بشه حلقه break / متوقف میشه


                            ایراد از موتور نیست. چون با کدی که من نوشته بودم کار میکرد. ببینید من از Hbridge استفاده میکنم و در کد خودم یک نیم پل رو 0 میکردم و نیم پل دیگر رو pwm میدادم. ولی شما فقط یک نیم پل رو فرمان میدید. داستان چیه؟!

                            دیدگاه


                              #29
                              پاسخ : اجرا چند لوپ در اردوینوuno

                              در کد ارسالی باید خطهای 76 - 84 - 101 - 110 رو باتوجه به موتورتون تغییر بدید

                              دیدگاه

                              لطفا صبر کنید...
                              X