اطلاعیه

Collapse
No announcement yet.

کنترل 50 عدد LED با استفاده از پورت USB

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

    کنترل 50 عدد LED با استفاده از پورت USB

    دوستان سلام.
    من میخوام توسط یک یا چند عدد AVR از طریق پورت USB پنجاه عدد LED رو به صورت مجزا کنترل کنم.
    یعنی میخوام از طریق کامپیوتر(با زبان VB.NET) هر کدوم از LED هارو که خواستم روشن یا خاموش کنم.
    الان چند روز که مشغول مطالعه فایل های آموزشی موجود تو نت هستم اما با این چیزای که من متوجه شدم با یک AVR نمیتونیم بیشتر 15 تا LED رو کنترل کنیم
    لطفا اساتید راهنمایی بفرمایید. اگر هم لازم باشه هزینه ای رو پرداخت کنم در خدمتم.

    #2
    پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

    فکر کنم قسمت تابلو های روان به شما کمک کنه.
    به قسمت LED و تجهیزات مرتبط و تاپیک های مربوط به تابلوهای روان مراجعه کنید.(واسه دومی جستجو کنید توی فروم)

    دیدگاه


      #3
      پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

      نوشته اصلی توسط behzadsen
      دوستان سلام.
      من میخوام توسط یک یا چند عدد AVR از طریق پورت USB پنجاه عدد LED رو به صورت مجزا کنترل کنم.
      یعنی میخوام از طریق کامپیوتر(با زبان VB.NET) هر کدوم از LED هارو که خواستم روشن یا خاموش کنم.
      الان چند روز که مشغول مطالعه فایل های آموزشی موجود تو نت هستم اما با این چیزای که من متوجه شدم با یک AVR نمیتونیم بیشتر 15 تا LED رو کنترل کنیم
      لطفا اساتید راهنمایی بفرمایید. اگر هم لازم باشه هزینه ای رو پرداخت کنم در خدمتم.
      سلام دوست عزیز.
      شما میتونید از شیفت رجستر 74595 استفاده کنی . این شیفت رجستر 8 خروجی داره و امکان لچ کردن پورت هارو هم داره . ورودی این ic سریال هست .
      شما میتونی 8 تا از این ic رو به هم وصل کنی و پورت سریال رو به میکروت بدی . با یک الگوریتم خیلی ساده 56 بیت داده خودتو پشت سر هم به این ic ها میفرستی (شما از 50 بیت و 50 خروجی این ic استفاده میکنی 6 بیت دیگش دست نخورده باقی میمونه . 56 به دلیل 8 ic با 8 پورت هست)، سپس خروجی ها رو لچ میکنی تا حالتشون پابدار و ثابت بشه . از این روش برای گسترش پورت میکرو میشه استفاده کرد .

      برای سمت کامپیوتر به نظر من اعداد رو به صورت هگز بفرست و برای ارسال سعی کن طول ثابتی رو داشته باشه، یا از یک قالب خاص پیروی کنه تا گیرنده در دریافت داده ها به مشکل بر نخوره . من در یک پروژه ای طول داده های ارسالیم معلوم نبود ولی تعیین کردم که داده ها با کاراکتر < شروع بشن و به ; ختم بشن هم در ارسال به کامپیوتر هم در دریافت(این موضوع هنگامی که کامپیوتر گیرنده هست مهمتره چون به صورت بسته های 8 بیتی دریافت میکنه که اگه طول داده بیشتر باشه ما باید این داده هارو کناره هم بچینیم)...تا داده ای در این بین گم نشه .
      شما اول وضعیت led هارو تشخیص بده مثلا باینریش اینجوری میشه : 1010001010110100101011..... این رو به هگز تبدیل کن ، به شکلی که هر 8 تا از این 0 و 1 ها در مبنای 16 پشت سر هم ردیف بشن ،در نهایت این داده 56 بیتی شما (مبنای 2) به یک رشته به طول 8(مبنای16) تبدیل میشه مثلا : 01d4b9cf خوشبختانه طولش 8 کاراکتر هست و به راحتی میتونی این رو به میکرو بفرستی . من c#.net کار میکنم اگه خواستی میتونم با c#.net راهنماییت کنم وگرنه تو گوگل میتونی سرچ کنی...
      کد:
      hextmp = Convert.ToInt32(bincode, 2).ToString("x");
      در سمت گیرنده شما که میکرو هست باید 8 بیت رو از باس سریال بگیری و رشته رو به int تبدیل کنی. چطوری ؟ شما یک آرایه یه طول 8 از نوع int بساز
      کد:
      int byte[8];
      این آرایه وضیفه ذخیره وضعیت گروه های 8 تایی از led های شما رو داره ، فرض کن هر index از این آرایه یکی از 74595 های شماست .
      حالا با استفاده از یک حلقه به ترتیب 8 تا 8 تا داده هات رو به 74595 شیفت بده و وقتی آخرین داده رو فرستادی و لچ کن.
      یک نمونه ک برای ارسال به 74595 که خودم استفاده میکنم .
      فقط کافیه داده های 8 بیتی به تابع shiftout بفرستی :
      کد:
      #define DS_PORT  PORTC
      #define DS_PIN   0
      #define ST_CP_PORT PORTC
      #define ST_CP_PIN 1
      #define SH_CP_PORT PORTC
      #define SH_CP_PIN 2 
      #define MR_PORT PORTC
      #define MR_PIN 3 
      #define OE_PORT PORTC
      #define OE_PIN 4
      
      
      #define DS_low() DS_PORT&=~_BV(DS_PIN)
      #define DS_high() DS_PORT|=_BV(DS_PIN)
      #define ST_CP_low() ST_CP_PORT&=~_BV(ST_CP_PIN)
      #define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN)
      #define SH_CP_low() SH_CP_PORT&=~_BV(SH_CP_PIN)
      #define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN)
      #define MR_high()  MR_PORT|=_BV(MR_PIN) 
      #define MR_low()  MR_PORT&=~_BV(MR_PIN)
      #define OE_high()  OE_PORT|=_BV(OE_PIN) 
      #define OE_low()  OE_PORT&=~_BV(OE_PIN)
      int _BV (int index)
      {
        return  0b00000000|(1<<index);
      }
      void ShiftOut(unsigned int data)
      { int i;
        for (i=0;i<8;i++)
        {
         if(data & 0x01) //bit_is_set doesn’t work on unsigned int so we do this instead
           DS_high();
         else 
           DS_low(); 
               
         SH_CP_low(); 
         SH_CP_high();
         data=data>>1; //Now bring next bit at MSB position
        }
      }

      برای قسمت rx میتونی از کد های زیر استفاده کنی :
      ایتدا ورودی rx سریال رو در یک char به طول 8 ذخیره کن (چون به هگز تدبل کردی طول کل داده ها 8 کاراکتر شده)
      کد:
      int Buffer[8];
      بعد به Int تبدیل کن و در متغیری که باید شیفت داده بشه بریز :
      کد:
      for(j=0;j<8;j++)
      {
      byte[index]= convert_to_hex(Buffer[i])*0x10+ convert_to_hex(Buffer[i+1]);
      {
      تابع تبدیل char به هگز :
      کد:
      
      int convert_to_hex(char hex)
      {
        switch(hex){
          case '0':
            return 0x0;
          case '1':
            return 0x1;
          case '2':
            return 0x2;
          case '3':
            return 0x3;
          case '4':
            return 0x4;
          case '5':
            return 0x5;
          case '6':
            return 0x6;
          case '7':
            return 0x7;
          case '8':
            return 0x8;
          case '9':
            return 0x9;
          case 'a':
            return 0xa; 
          case 'b':
            return 0xb;
          case 'c':
            return 0xc;
          case 'd':
            return 0xd;
          case 'e':
            return 0xe;
          case 'f':
            return 0xf;
          } 
        return -1;  
      }
      حالا میتونی نمایشش بدی رو led ها :

      کد:
      ST_CP_low();
            for (i=0;i<8;i++)
            {
                ShiftOut(byte[i]);
      
            } 
         ST_CP_high();
      موفق باشی :redface:

      دیدگاه


        #4
        پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

        آقا کیوان از بابت کمک هاتون ممنون. :applause: ولی من اینقدر حرفه ای نیستم که بتونم همه گفته های شیرین شمارو متوجه بشم.
        لطفا اگر امکانش هست از طریق نقشه های شماتیک بنده رو راهنمایی بفرمایید.
        ظمنا من تو بخش کد نویسی فقط میتونم با vb.net کار کنم. لطفا بقیه دوستان هم به من کمک کنن.

        دیدگاه


          #5
          پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

          با سلام، اگه غلط املایی داشت ببخشید چون خیلی هستم و عجله دارم
          راستش هفته آخر دانشگاهه و کلی امتحان پشت هم دارم ، اگه تا 22 ام خرداد صبر کنی واست کامل توضیح میدم :biggrin:
          ولی نقشه راه اندازی 74595 تو اینترنت پره حتی تو انجمن قسمت های تابلوی روان کلی توضیح دادن . اگه دیتا شیتشم ببینی متوجه میشی .
          به این کد توجه کن :
          کد:
          #define DS_PORT  PORTC
          #define DS_PIN   0
          #define ST_CP_PORT PORTC
          #define ST_CP_PIN 1
          #define SH_CP_PORT PORTC
          #define SH_CP_PIN 2 
          #define MR_PORT PORTC
          #define MR_PIN 3 
          #define OE_PORT PORTC
          #define OE_PIN 4
          من 4 تا پابه ای که تعریف کردم مربوط به 74595 هس ، به پورت c دادمش .
          این ic یک پایه داره که اطلاعات ارسالی از قسمت ورودی سریال رو دریافت کرد(8 بیت اول) با نام DS، اگه شما باز هم بیت های جدید به این پایه بدین از یک پایه دیگه که خروجی سریال هست سر ریز میشه . مزیت این پایه اینه که میتونین پایه خروجی رو به پایه DS یک 74595 بعدی بدین و اینهارو تا بینهایت سری کنین.... (فرض کن داده های سریالت مثل واگن های قطار(هر 8 بیت یک واگن) از یک تونل رد میشه وقتی یکی وارد میشه دیگری خارج میشه ، درسته ؟ همینجوری 8 بیت 8 بیت از این ic به اون ic پشت هم میرن .... :nice.
          حالا کافیه 56 بیت داده رو(یعنی 8 تا واگن قطارتو رو بفرستی تو تونل سریال :biggrin به پایه سریال 74595 اولی بدی...با کمک کدی که واست گذاشتم (shiftout) این داده ها به ترتیب از پورت DS این ic به ic های سری شده باهاش میره .... حالا تا زمانی که شما داده جدیدی ارسال نکنی ثابت میمونه ... پس برای تغییر وضعیت یک led کافیه 56 بیتت رو اصلاح کنی دوباره توی باس سریال بفرستی به 74595 ها... :redface:
          من خودم vb.net کار میکردم ولی الان یادم نیس . تو گوگل بزن معادلش پیدا میشه . خیلی راحته بزن int to hex string vb.net خودش پیدا میشه

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

          تابع shiftout , convert_to_hex که فقط باید تعریف کنی و در برنامت بزاری .
          اطلاعاتتو هم که از توی vb.nrt کمپرس کردی و طولش 8 بیت بیشتر نیست چون یک داده 56 بیتی در مبنای 2 میشه 8 بیت در مبنای 16 ... فقط کافیه در وقفه rx این داده 8 بیتی رو در متغیر Buffer[8] کپی کنی.
          بعد با این کد:
          کد:
          for(j=0;j<8;j++)
          {
          byte[index]= convert_to_hex(Buffer[i])*0x10+ convert_to_hex(Buffer[i+1]);
          {
          این داده 8 بیتی که از نوع char بوده رو باید به int تبدیل کنی تا بتونی روی پورت های میکروت به نمایش در بیاری ...

          بعد میرسی به کد :

          کد:
          ST_CP_low();
                for (i=0;i<8;i++)
                {
                    ShiftOut(byte[i]);
          
                } 
             ST_CP_high();
          با این کد 56 بیت شما روی پورتی که به سریال 74595 وصل هست هدایت میکنه و 8 تا ic 74595 که به led وصل هستن داده هات رو نشون میده ....
          میکرو << 8 تا 74595 سری شده با هم << led ها

          حالا خودت یکم سرچ کن اگه خودت تست کنی و جواب بگیری قشنگ درک میکنی ماجرا چیه .
          توی گوگل هم 74595 سرچ کنی کلی مطلب میاد . منم خودم همینجوری یاد گرفتم باهاش کار کنم :redface: :nerd: :applause:

          دیدگاه


            #6
            پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

            دوست خوب من از راهنمای هاتون ممنوم، باید این چیزای رو که گفتی تست کنم، بعد جوابش رو بهت خبر میدم. :job:

            دیدگاه


              #7
              پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

              روش اتصال ماتریسی رو هم تست کنی بد نیست مثل اتصال کلید های KEYPAD.
              امام حسين(عليه السلام) فرمودند: کسي که از تو انتقاد ميکند تو را دوست دارد و کسي که با تو دشمني دارد، از تو تعريف و تمجيد ميکند.
              از پاسخ به سوالات انجمن به صورت خصوصی معذورم.

              دیدگاه


                #8
                پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                میشه در مورد اطصال ماتریسی برای ال ای دی منو راهنمایی کنید، بنظرم روش جالبی میتونه باشه.

                دیدگاه


                  #9
                  پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                  http://t2.gstatic.com/images?q=tbn:ANd9GcSQL2ualpM-oEgwMY_eNLAIQvo1GRxN4GaAcoDbcFxRBUbZF55Lsg
                  امام حسين(عليه السلام) فرمودند: کسي که از تو انتقاد ميکند تو را دوست دارد و کسي که با تو دشمني دارد، از تو تعريف و تمجيد ميکند.
                  از پاسخ به سوالات انجمن به صورت خصوصی معذورم.

                  دیدگاه


                    #10
                    پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                    نوشته اصلی توسط behzadsen
                    میشه در مورد اطصال ماتریسی برای ال ای دی منو راهنمایی کنید، بنظرم روش جالبی میتونه باشه.
                    سلام.
                    راجب این موضوع چندتا پست باز کردین.... ؟ :NO:
                    منظورشون همون اتصالات 8*8 led هاست که توی تابلوی روان استفاده میشه ....




                    و یک مثال با 16 تا led :
                    http://www.protostack.com/blog/2010/...lling-16-leds/

                    دیدگاه


                      #11
                      پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                      [quote author=کیوان قاسمی link=topic=76905.msg463836#msg463836 date=1368445952]
                      سلام.
                      راجب این موضوع چندتا پست باز کردین.... ؟ :NO:
                      منظورشون همون اتصالات 8*8 led هاست که توی تابلوی روان استفاده میشه ....




                      و یک مثال با 16 تا led :
                      http://www.protostack.com/blog/2010/...lling-16-leds/
                      [/quote
                      دوست خوب من شما با این شماتیک تون کمک خیلی بزرگی به من کردید اما چون کدنویسیش با زبان C بود نتونستم پیادش کنم،لطفا اگر امکانش هست کد بسکامش رو برای اون نمونه 16 ال ای دی برام بنویسید.
                      اگر بازم امکانش بود یه مختصری هم در مورد کدنویسیش برای توسعه اون به 50 تا ال ای دی هم بهم کمک کنید. :job:
                      بی نهایت از لطف تون ممنون. :applause:

                      دیدگاه


                        #12
                        پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                        برای ارتباط usb باید از ft232 استفاده کنی .
                        یک سری داده از کتاب 11 پروژه موج آبی واست گذاشتم
                        پسورد : www.eca.ir

                        http://uplod.ir/qbb6738rlbqj/FT323L.rar.htm



                        باید در jp2
                        mrtx , mrrx رو به rx tx میکروت وصل کنی ... و mvcc mrgnd هم که معلومه دیگه ! پایه ولتاژن ....
                        حالا هرچی از سریال کامپیوتر به میکروت وصله مثل max232 ....

                        دیدگاه


                          #13
                          پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                          نوشته اصلی توسط کیوان قاسمی
                          برای ارتباط usb باید از ft232 استفاده کنی .
                          یک سری داده از کتاب 11 پروژه موج آبی واست گذاشتم
                          پسورد : www.eca.ir

                          http://uplod.ir/qbb6738rlbqj/FT323L.rar.htm



                          باید در jp2
                          mrtx , mrrx رو به rx tx میکروت وصل کنی ... و mvcc mrgnd هم که معلومه دیگه ! پایه ولتاژن ....
                          حالا هرچی از سریال کامپیوتر به میکروت وصله مثل max232 ....
                          دوست من از بابت فایل تون ممنونم، من خودم یه فایل آموزشی برای ارتباط میکرو با USB دارم که توی آموزش با کامپیوتر 2 تا LED رو کنترل میکنه، حالا من میخوام با شیفت رجیستر این دو تا LED رو به 50 تا افزایش بدم.
                          فایل آموزش رو براتون میزارم تا شما هم بهش یه نگاه بندازید و اگر براتون مقدور بود نقشه شماتیک همین فایل آموزشی رو برام با شیفت رجیستر گسترش بدید.
                          ممنون.
                          http://uplod.ir/ixarkp64zhwd/USB_Tutorial.rar.htm

                          دیدگاه


                            #14
                            پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                            نوشته اصلی توسط behzadsen
                            دوست من از بابت فایل تون ممنونم، من خودم یه فایل آموزشی برای ارتباط میکرو با USB دارم که توی آموزش با کامپیوتر 2 تا LED رو کنترل میکنه، حالا من میخوام با شیفت رجیستر این دو تا LED رو به 50 تا افزایش بدم.
                            فایل آموزش رو براتون میزارم تا شما هم بهش یه نگاه بندازید و اگر براتون مقدور بود نقشه شماتیک همین فایل آموزشی رو برام با شیفت رجیستر گسترش بدید.
                            ممنون.
                            http://uplod.ir/ixarkp64zhwd/USB_Tutorial.rar.htm
                            سلام
                            دوست عزیز اون مثال 16 led که واست گذاشتم رو خودت برای 50 تا led تعمیم بده(8 تا 74595 رو عین اون مدار بهم وصل کن، دستاشیت 74595 رو دانلود کردی چکش کنی چطور کار میکنه؟!) و توی پروتئوس بکش ، پلود کن شاید بچه ها فرست کردن برنامش هم واست نوشتن ولی خودت دس به کارشو ، برای تست برنامت هم لازمش داری...
                            مدارش که معلومه دیگه...ابهامی داره ؟ حتی قسمت spi هم هس...من از همین پروژه واسه تابلو روانم ایده گرفتم ، یادت باشه اگه مجبور بشی خودت بیشتر تلاش کنی درک بهتری از کارایی که انجام میدی پیدا میکنی :read:

                            اون فایلی هم که گذاشتین رو یک نگاهی انداختم. اون ارتباط مستقیم usb به میکرو هس... خوب من با بسکام کار نکردم ولی شما اگه همون ft232 رو استفاده کنی بدون نیاز به کدنویسی میتونی با پورتکل سریال دقیقا عین rs232 استفاده کنی...اگه rs232 کار کردی میدونی که چقد راحته .
                            اگه ساخت مدارش هم واست سخته مدل های rs232 به usb هس که میشه روی بورد ازش استفاده کنی.... پس فکرتو واسه این موضوع درگیر نکن....
                            فقط میمونه قسمت کد بسکام شیفت رجستر دیگه . درسته ؟ اینو هم میزارم به عهده اساتید دیگه ، اگه هم عجله داری ، هیچ چیزی نیس که از توی منابع انگلیسی گوگل در نیاد... سرچ کن حتما کارت راه میوفته ، ساختار 74595 که یکیه فقط شما کد شیفت رجسترشو لازم داری...

                            دیدگاه


                              #15
                              پاسخ : کنترل 50 عدد LED با استفاده از پورت USB

                              با توجه به توصیه هاب دوستان برای جستجوی بیشتر تو اینترنت،الان تقریباً یاد گرفتم با شیفت رجیستر کار کنم، اکا هنوز یه مشکل بزرگ دارم.
                              اونم اینه که چطوری میتونم مثلاً به طور همزمان پایه های Q0,Q3,Q7 رو یک کنم و مابقی رو صفر کنم(لطفاً با بسکام بهم راهنمایی کنید)

                              دیدگاه

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