Программа

Как мы уже отмечали, если к линии подключены несколько устройств, то в один момент времени только одно из них может передавать данные. Получается, нам нужно каким-то образом сообщить всем соседям, что мы готовы к передаче, а они при этом должны молчать и слушать. Делается это при помощи контактов DE и RE. Если мы подаём высокий уровень на эти контакты, то устройство переходит в режим передатчика. Низкий уровень — приёмника.

Напишем две программы. Одна будет передавать в эфир текст «ping», каждые 500 мс. Другая будет слушать эфир и при получении текст «ping» — мигать светодиодом №13.

Программа передатчика

#define SerialTxControl 2 // контакт №2 будет переключать режим приёмник/передатчик
#define RS485Transmit HIGH
#define RS485Receive LOW

void setup(void) {
    Serial.begin(9600); // настраиваем последовательный порт на скорость 9600бод
    pinMode(SerialTxControl, OUTPUT);
    digitalWrite(SerialTxControl, RS485Transmit); // переводим устройство в режим передатчика
}
 
void loop(void) {
    Serial.print("ping"); // отправляем текст 
    delay(500);
}

Программа приёмника

#define SerialTxControl 2
#define RS485Transmit HIGH
#define RS485Receive LOW

char buffer[100];
byte state = 0;

void setup(void) {
    Serial.begin(9600);
    pinMode(13, OUTPUT); 
    pinMode(SerialTxControl, OUTPUT); 
    digitalWrite(SerialTxControl, RS485Receive); // переводим устройство в режим приёмника
}
 
void loop(void) {
    int i=0;
    if( Serial.available() ){ // если в порт пришли какие-то данные
        delay(5); // немного ждём, чтобы вся пачка данных была принята портом
        while( Serial.available() ){
            buffer[i++] = Serial.read(); // считываем данные и записываем их в буфер
        }
    }
    if(i>0){ // если в буфере что-то есть
        buffer[i++]='\0'; // превращаем содержимое буфера в строку, добавляя нулевой символ
        if( strcmp(buffer, "ping") ){ // если принятая строка равна тексту ping
            digitalWrite(13, state); // мигаем светодиодом
            state = !state;
        }
    }
}

Загружаем программы на обе платы и наблюдаем за происходящим. Если всё собрано верно, то после подачи питания, на второй плате начнет мигать светодиод, подключённый к выводу №13.

В этом примере, приёмник и передатчик не меняют своей роли на всём протяжении работы. Усовершенствуем программы и сделаем так, чтобы приёмник и передатчик менялись ролями в процессе работы.


Изменено:

Ардуино: передача данных на большие расстояния — RS485: 3 комментария

  1. Светодиод не мигает, хотя pjng приходит, проверено через монитор порта, функция сравнения почему-то не работает.

  2. По стандарту полагается тянуть не только линии A и B, но и общий провод, подключая его через последовательный 100-омный резистор на каждом устройстве — это необходимо для уравнивания потенциалов, без него входы могут и погореть. Жаль, что на платке клеммник не имеет такой возможности. Не смертельно, конечно — можно и внешний поставить, а этот использовать для подключения терминатора.
    Кстати, интересно: организовано ли смещение линий A и B? Этих модулей у меня пока нет, куплю — проверю.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.