نمایش نتایج: از 1 به 9 از 9
Like Tree6 لایک
  • 1 Post By irmec
  • 1 Post By magmagmary
  • 1 Post By magmagmary
  • 1 Post By magmagmary
  • 1 Post By magmagmary
  • 1 Post By magmagmary

موضوع: شبکه rs485 در آردوینو

  1. #1
    Junior Member
    تاریخ عضویت
    Sep 2015
    نوشته ها
    8

    Cool شبکه rs485 در آردوینو

    با عرض سلام و وقت بخیر خدمت اساتید محترم
    بنده مدتی هست که قصد دارم با استفاده از ماژول های RS485 که در سایت آفتاب رایانه نیز موجود هست برای شبکه کردن چند آردوینو استفاده کنم.
    ماژول RS485 موجود در فروشگاه
    من میخوام دوتا آردوینو رو با استفاده از این ماژول بهم متصل کنم در این صورت یکی از آردوینو ها (master) و آردوینو دیگر (slave) میشه . تو این تست من از دوتا آردوینو مگا R3 استفاده کردم.
    عکسش رو در زیر برای دوستان قرار دادم.

    ترتیب اتصال پایه های ماژول rs485 با آردوینو به صورته زیر هست.
    RE و DE به یکدیگر پل شده و به پین 4 متصل شده (جهت فعال کردن ارسال درون شبکه کافیه یه بار HIGH بشه و داده ها ارسال بشه و در نهایت LOW بشه)
    Ro به پین شماره 2 (در نقش RX)
    DI به پین شماره 3 (در نقش TX)
    VCC به 5 ولت
    و پایه های A و B ماژول های RS485 نیز نظیر به نظیر به یکدیگر متصل می شوند همانند شکل زیر:
    rs485_setup2.jpg

    نحوه عملکرد کد:
    مستر مقادیر ولوم رو از پایه آنالوگ A0 میخونه و این مقادیر رو برای سلیو ارسال میکنه و ال ای دی متصل به اسلیو نیز توسط مقادیری که دریافت کرده میزان روشناییش تغییر میکنه و اسلیو نیز در پاسخ مقادیری رو برای مستر ارسال میکنه.

    کد به خوبی کار میکنه فقط من دوتا مشکل دارم:
    1- اون پاسخی که اسلیو برای مستر ارسال میکنه رو نمیتونم دریافت کنم، به طوری که گویا ارتباط یک طرفه هست (فقط از مستر به اسلیو)
    2- طبق شکل و کدی که برنامه نویس نوشته من نمیتونم ارتباط داشته باشم (یعنی در هردو آردوینو پایه های RO به 2 و DI به 3 ) در عوض من باید در یکی از ماژول ها Ro رو به 2 و توی آردوینو دیگه به 10 وصل کنم به همین ترتیب پایه DI رو به 3 و توی آردوینوی دیگه به 11 وصل کنم که ارتباط برقرار بشه ولی با این حال هنوز ارتباط یک طرفه هست
    ممنون میشم راهنماییم کنید تا مشکل برطرف بشه و دوستان دیگه هم بتونن استفاده کنن.
    لینک مرجع کد : RS485 communications
    و از کد های زیر جهت ارتباط استفاده میکنید:
    کد مستر:
    کد:
    #include "RS485_protocol.h"
    #include <SoftwareSerial.h>
    
    const byte ENABLE_PIN = 4;
    const byte LED_PIN = 13;
    
    SoftwareSerial rs485 (2, 3);  // receive pin, transmit pin
    
    // callback routines
      
    void fWrite (const byte what)
      {
      rs485.write (what);  
      }
      
    int fAvailable ()
      {
      return rs485.available ();  
      }
    
    int fRead ()
      {
      return rs485.read ();  
      }
    
    void setup()
    {
      rs485.begin (28800);
      pinMode (ENABLE_PIN, OUTPUT);  // driver output enable
      pinMode (LED_PIN, OUTPUT);  // built-in LED
    }  // end of setup
      
    byte old_level = 0;
    
    void loop()
    {
    
      // read potentiometer
      byte level = analogRead (0) / 4;
      
      // no change? forget it
      if (level == old_level)
        return;
          
      // assemble message
      byte msg [] = { 
         1,    // device 1
         2,    // turn light on
         level // to what level
      };
    
      // send to slave  
      digitalWrite (ENABLE_PIN, HIGH);  // enable sending
      sendMsg (fWrite, msg, sizeof msg);
      digitalWrite (ENABLE_PIN, LOW);  // disable sending
    
      // receive response  
      byte buf [10];
      byte received = recvMsg (fAvailable, fRead, buf, sizeof buf);
      
      digitalWrite (LED_PIN, received == 0);  // turn on LED if error    
      
      // only send once per successful change
      if (received)
        old_level = level;
    
    }  // end of loop
    کد اسلیو:
    کد:
    #include <SoftwareSerial.h>
    #include "RS485_protocol.h"
    
    SoftwareSerial rs485 (10, 11);  // receive pin, transmit pin
    const byte ENABLE_PIN = 4;
    
    void fWrite (const byte what)
      {
      rs485.write (what);  
      }
      
    int fAvailable ()
      {
      return rs485.available ();  
      }
    
    int fRead ()
      {
      return rs485.read ();  
      }
      
    void setup()
    {
      rs485.begin (28800);
      pinMode (ENABLE_PIN, OUTPUT);  // driver output enable
    }
    
    void loop()
    {
      byte buf [10];
      
      byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf));
      
      if (received)
        {
        if (buf [0] != 1)
          return;  // not my device
          
        if (buf [1] != 2)
          return;  // unknown command
        
        byte msg [] = {
           0,  // device 0 (master)
           3,  // turn light on command received
        };
        
        delay (1);  // give the master a moment to prepare to receive
        digitalWrite (ENABLE_PIN, HIGH);  // enable sending
        sendMsg (fWrite, msg, sizeof msg);
        digitalWrite (ENABLE_PIN, LOW);  // disable sending
        
        analogWrite (11, buf [2]);  // set light level
       }  // end if something received
       
    }  // end of loop
    تصاویر کوچک شده (Thumbnails) پیوست شده تصاویر کوچک شده (Thumbnails) پیوست شده 20161003_121750.jpg  
    لایک کردن

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,029
    من هم یک آموزش پیدا کردم دقیقا در مورد همینه : https://arduino-info.wikispaces.com/...alRS485Example

    کدهایی که استفاده کرده خیلی خیلی روون تره .
    کد سمت مستر:
    کد:
    #include <SoftwareSerial.h>
    /*-----( Declare Constants and Pin Numbers )-----*/
    #define SSerialRX        10  //Serial Receive pin
    #define SSerialTX        11  //Serial Transmit pin
    
    
    #define SSerialTxControl 3   //RS485 Direction control
    
    
    #define RS485Transmit    HIGH
    #define RS485Receive     LOW
    
    
    #define Pin13LED         13
    
    
    /*-----( Declare objects )-----*/
    SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
    
    
    /*-----( Declare Variables )-----*/
    int byteReceived;
    int byteSend;
    
    
    void setup()   /****** SETUP: RUNS ONCE ******/
    {
      // Start the built-in serial port, probably to Serial Monitor
      Serial.begin(9600);
      Serial.println("YourDuino.com SoftwareSerial remote loop example");
      Serial.println("Use Serial Monitor, type in upper window, ENTER");
      
      pinMode(Pin13LED, OUTPUT);   
      pinMode(SSerialTxControl, OUTPUT);    
      
      digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver   
      
      // Start the software serial port, to another device
      RS485Serial.begin(4800);   // set the data rate 
    
    
    }//--(end setup )---
    
    
    
    
    void loop()   /****** LOOP: RUNS CONSTANTLY ******/
    {
      digitalWrite(Pin13LED, HIGH);  // Show activity
      if (Serial.available())
      {
        byteReceived = Serial.read();
        
        digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit   
        RS485Serial.write(byteReceived);          // Send byte to Remote Arduino
        
        digitalWrite(Pin13LED, LOW);  // Show activity    
        delay(10);
        digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit       
      }
      
      if (RS485Serial.available())  //Look for data from other Arduino
       {
        digitalWrite(Pin13LED, HIGH);  // Show activity
        byteReceived = RS485Serial.read();    // Read received byte
        Serial.write(byteReceived);        // Show on Serial Monitor
        delay(10);
        digitalWrite(Pin13LED, LOW);  // Show activity   
       }  
    
    
    }//--(end main loop )---
    کد سمت سلیو :
    کد:
    #include <SoftwareSerial.h>
    /*-----( Declare Constants and Pin Numbers )-----*/
    #define SSerialRX        10  //Serial Receive pin
    #define SSerialTX        11  //Serial Transmit pin
    
    
    #define SSerialTxControl 3   //RS485 Direction control
    #define RS485Transmit    HIGH
    #define RS485Receive     LOW
    
    
    #define Pin13LED         13
    
    
    /*-----( Declare objects )-----*/
    SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
    
    
    /*-----( Declare Variables )-----*/
    int byteReceived;
    int byteSend;
    
    
    void setup()   /****** SETUP: RUNS ONCE ******/
    {
      // Start the built-in serial port, probably to Serial Monitor
      Serial.begin(9600);
      Serial.println("SerialRemote");  // Can be ignored
      
      pinMode(Pin13LED, OUTPUT);   
      pinMode(SSerialTxControl, OUTPUT);  
      
      digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
      
      // Start the software serial port, to another device
      RS485Serial.begin(4800);   // set the data rate 
    }//--(end setup )---
    
    
    
    
    void loop()   /****** LOOP: RUNS CONSTANTLY ******/
    {
      //Copy input data to output  
      if (RS485Serial.available()) 
      {
        byteSend = RS485Serial.read();   // Read the byte 
        
        digitalWrite(Pin13LED, HIGH);  // Show activity
        delay(10);              
        digitalWrite(Pin13LED, LOW);   
        
        digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit    
        RS485Serial.write(byteSend); // Send the byte back
        delay(10);   
        digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit      
    //    delay(100);
      }// End If RS485SerialAvailable
      
    }//--(end main loop )---
    لایک کردن

  3. #3
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,029
    توی کدی که براتون ارسال کردم داستان اینه که سمت مسیر شما از طریق کنسول سریال یه داده می فرستید.

    اون داده ارسال میشه برای سلیو

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

  4. #4
    Junior Member
    تاریخ عضویت
    Sep 2015
    نوشته ها
    8
    نقل قول نوشته اصلی توسط magmagmary نمایش پست ها
    توی کدی که براتون ارسال کردم داستان اینه که سمت مسیر شما از طریق کنسول سریال یه داده می فرستید.

    اون داده ارسال میشه برای سلیو

    سلیو به محض این که داده رو گرفت دوباره بر میگردونه به مستر و مستر هم تو کنسول خودش نمایشش میده
    با تشکر از شما دوست گرامی
    کدی که قرار دادید خیلی خوبه و جواب داد برای من
    ولی مشکلی که من با این کد دارم در رابطه صحت دریافت اطلاعاتی هست که ارسال میکنم و دریافت میکنم
    در مرحله اول که RS485Serial روی بوردریت 4800 بود من بامشکل مواجه شدم و کارکتری که تایپ میکردم چیز عجیبی رو به من برمیگردوند که من در زیر براتون ارسال کردم تصویر رو
    در مرحله دوم من RS485Serial هر دو طرف رو روی 9600 تنظیم کردم که به خوبی کارکتری رو که تایپ میکردم نشون میداد و خوب بود ولی در ادامه متوجه شدم که در بعضی مواقع اون کارکتری رو که ارسال میکنم همون کارکتر رو به من برنمیگردونه برای مثال تصویری رو که در زیر براتون قرار داد از ارسال کارکتر q هست در چندین مرحله ارسال کردم ولی در بعضی مواقع مقدار دیگه ای رو به من برگردونده حالا نمیدونم آیا به دلیل نویز هست به دلایل دیگه
    ممنون میشم راهنمایی بفرمایید
    با تشکر فراوان
    1.jpg2.jpg

  5. #5
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,029
    نقل قول نوشته اصلی توسط irmec نمایش پست ها
    با تشکر از شما دوست گرامی
    کدی که قرار دادید خیلی خوبه و جواب داد برای من
    ولی مشکلی که من با این کد دارم در رابطه صحت دریافت اطلاعاتی هست که ارسال میکنم و دریافت میکنم
    در مرحله اول که RS485Serial روی بوردریت 4800 بود من بامشکل مواجه شدم و کارکتری که تایپ میکردم چیز عجیبی رو به من برمیگردوند که من در زیر براتون ارسال کردم تصویر رو
    در مرحله دوم من RS485Serial هر دو طرف رو روی 9600 تنظیم کردم که به خوبی کارکتری رو که تایپ میکردم نشون میداد و خوب بود ولی در ادامه متوجه شدم که در بعضی مواقع اون کارکتری رو که ارسال میکنم همون کارکتر رو به من برنمیگردونه برای مثال تصویری رو که در زیر براتون قرار داد از ارسال کارکتر q هست در چندین مرحله ارسال کردم ولی در بعضی مواقع مقدار دیگه ای رو به من برگردونده حالا نمیدونم آیا به دلیل نویز هست به دلایل دیگه
    ممنون میشم راهنمایی بفرمایید
    با تشکر فراوان
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 1.jpg
مشاهده: 22
حجم: 19.1 کیلو بایتبرای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 2.jpg
مشاهده: 58
حجم: 17.6 کیلو بایت
    در مورد مشکل اولتون علت این که داده این که میدید نا مفهوم بوده اینه که بادریت کنسولتون هنوز روی 9600 بوده .
    شما باید علاوه بر تنظیم begin ها تو برنامه ( منظورم تغییر از 9600 به 4800 هست ) تو کنسول این هم تغییر رو ایجاد کنید و از لیست کشویی باد ریت رو بزارید روی 4800.

    البته دقت کنید که وقتی بادریت دارید تغییر میدید باید زمان ارسال و دریافت ها تونم محاسبه کنید.
    چرا که وقتی بادریت های دو تا سمت متفاوته یکی داره کند میفرسته و میگیره
    یکی داره تنند میفرسته و میگیره

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

  6. #6
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,029
    نقل قول نوشته اصلی توسط irmec نمایش پست ها
    با تشکر از شما دوست گرامی
    کدی که قرار دادید خیلی خوبه و جواب داد برای من
    ولی مشکلی که من با این کد دارم در رابطه صحت دریافت اطلاعاتی هست که ارسال میکنم و دریافت میکنم
    در مرحله اول که RS485Serial روی بوردریت 4800 بود من بامشکل مواجه شدم و کارکتری که تایپ میکردم چیز عجیبی رو به من برمیگردوند که من در زیر براتون ارسال کردم تصویر رو
    در مرحله دوم من RS485Serial هر دو طرف رو روی 9600 تنظیم کردم که به خوبی کارکتری رو که تایپ میکردم نشون میداد و خوب بود ولی در ادامه متوجه شدم که در بعضی مواقع اون کارکتری رو که ارسال میکنم همون کارکتر رو به من برنمیگردونه برای مثال تصویری رو که در زیر براتون قرار داد از ارسال کارکتر q هست در چندین مرحله ارسال کردم ولی در بعضی مواقع مقدار دیگه ای رو به من برگردونده حالا نمیدونم آیا به دلیل نویز هست به دلایل دیگه
    ممنون میشم راهنمایی بفرمایید
    با تشکر فراوان
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 1.jpg
مشاهده: 22
حجم: 19.1 کیلو بایتبرای دیدن سایز بزرگ روی عکس کلیک کنید

نام: 2.jpg
مشاهده: 58
حجم: 17.6 کیلو بایت
    این چیزی که من دارم متوجه میشم از مشل دومتون داده پرته به نظرم .
    سیم هاتون احتمالا زیاد محک نیستن .
    چون اگه قرار باشه چیزی کار نکنه کلا کار نمی کنه
    همون نویزی هست که خودتون میگید اما عاملش در این مورد به احتمال زیاد سیم هاتون خواهد بود
    لایک کردن

  7. #7
    Junior Member
    تاریخ عضویت
    Sep 2015
    نوشته ها
    8
    با تشکر از شما استاد گرامی
    بله به همین دلیل و مشکلم برطرف شد
    الان به مشکل دیگه ای برخوردم که ممنون میشم در این مورد هم راهنمایی بفرمایید انشالله کد درست شد آموزش کاملی از نحوه شبکه کردن در rs485 درون انجمن قرار بدم که دوستان نیز استفاده کنند
    الان مشکل من در ارسال اطلاعات هست و اینکه واقعا تفاوت بین serial.print و serial.write چیه چون با هر دو مورد ارسال میکنه رفرنس توی arduino.cc رو خوندم و منظورش رو متوجه نشدم
    الان من بخوام یک مقدار int رو با RS485Serial.write ارسال کنم نمشیه
    توی این لینک یک آموزش گذاشته ولی من سر در نیاوردم LBS , MSB چیه ولی گویا باید دو قسمتش کرد و به صورت باینری ارسال کرد و در مقصد دوباره دیکدش کرد که مقدار int بازسازی بشه ولی هرچی باهاش سرو کله زدم نتونستم ممنون میشم لطف کنید و کمکم کنید
    با تشکر از شما

  8. #8
    Junior Member
    تاریخ عضویت
    Sep 2015
    نوشته ها
    8
    تو رو خدا جواب بدین

  9. #9
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,029
    نقل قول نوشته اصلی توسط irmec نمایش پست ها
    تو رو خدا جواب بدین

    ببین اگر قصد داری یه int رو بقرستی
    یه راه حل میونبر که وجود داره اینه که اول int ات رو بکنی string با این راهنمایی
    https://www.arduino.cc/en/Reference/StringConstructor

    من خودم وقتی با این مشکل مواجه میشم از این روش استفاده می کنم . خیلی ساده تر از اون راهنمایی ای هست که شما خوندید/
    لایک کردن

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO