Передача данных с помощью Serial

Передатчик

Класс Serial, который есть в стандартной библиотеке Arduino IDE, умеет передавать данные через аппаратный интерфейс UART (он же последовательный порт). На плате семейства Ардуино контакты 0 (RX) и 1 (TX) как раз привязаны к аппаратному UART, а значит мы сможем их использовать для наших целей.

Схема излучателя у нас останется прежней, кроме контакта Ардуино, к которому она подключается. Мы передаем данные, значит используем контакт №1 (он же TX).

Программа передатчика будет каждую секунду отправлять в последовательный порт текст «ping».

void setup() {
  Serial.begin(4800);
}

void loop() {
  Serial.println("ping");
  delay(200);
}

Приёмник

Программа приёмника должна с одной стороны слушать детектор и считывать оттуда полученные байты данных, а с другой стороны, выводить эти данные на компьютер. Задачу усложняет то, что детектор у нас имеет инверсную логику, а значит UART на принимающей стороне должен как-то уметь менять логику.

Таким образом, для создания приёмника нам необходимо, чтобы контроллер имел два UART интерфейса, причём с возможностью менять логику. Надо ли говорить, что у Ардуино Уно UART только один и логика там не меняется. Хмм.

Как вариант, можно вместо Уно использовать версию Мега, у которой есть несколько UART. Проблему с инверсной логикой можно решить переделав схему детектора и заменив транзистор на PNP. А можно всё оставить как есть и использовать программный UART интерфейс. Благо, в среде Arduino IDE есть специальная библиотека SoftwareSerial, которая как раз для таких целей и нужна.

Как и в большинстве случаев, при использовании разного рода библиотек, нам потребуется в самом начале программы создать объект класса SoftwareSerial. Пишем:

SoftwareSerial Photo(10, 11, 1);

здесь первый аргумент 10 — контакт, на котором будет RX канал; второй аргумент 11 — контакт TX канала; 1 — означает инверсию сигнала, это нам и нужно!

Программа по приёму данных будет выглядеть так.

#include <SoftwareSerial.h>

SoftwareSerial Photo (10, 11, 1);

void setup() {
  Serial.begin(9600);
  Photo.begin(4800);
}

void loop() {
  while( Photo.available() ){
    char v = Photo.read();
    Serial.write(v);
  }
}

Загружаем программы, выставляем излучатель и детектор на линии и подаем питание. Если при этом открыть монитор последовательного порта, то там будут появляться слова «ping».

В данном примере мы использовали скорость передачи 4800 бод. Откуда именно такая скорость? Дело в том, что скорость работы нашей ИК системы сильно проседает из-за программного UART. Если от него избавиться, то линию связи вполне можно разогнать до куда более высоких скоростей.

Подобную систему связи уже можно применить для передачи сообщений в плотной среде роевых роботов. При такой скученности радиосвязь работает плохо, а вот передача данных ИК-светом ближайшим соседям вполне подойдет.

В следующей главе посмотрим как сделать оптическую линию еще надежнее и быстрее.


Изменено:

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

Ваш адрес email не будет опубликован.