Работа с последовательным портом

Так как Arduino на компьютере устанавливается как последовательный порт, имеется возможность связать его с компьютером через этот порт. В среде Arduino IDE имеется ‘Монитор последовательного порта’, который может, как отображать принятые данные, так и отправлять их. Его можно найти в меню ‘инструменты’:

Рисунок 9. Меню ‘Монитор последовательного порта’

Нажав на этот пункт меню, открывается окно, в котором можно как принимать данные с последовательных портов, так и отправлять.

Рисунок 10. Монитор порта

Все принятые данные автоматически появляются в этом окне. Для отправки данных, достаточно вписать их в однострочный редактор и нажать на кнопку ‘Отправить’. Важно убедиться, чтобы скорость передачи данных тут и в контроллере совпадали, иначе будут приняты искаженные данные.

На примере управления светодиодом через последовательный порт, ниже рассматриваются основные команды, которые необходимы для отправки и принятия данных из компьютера в контроллер.

Задача: Написать программу, которая позволит управлять светодиодом через последовательный порт.

Пусть, светодиод подключен к 13-му порту. Тогда можно запрограммировать следующий алгоритм: В цикле, проверять пришло ли что-то через последовательный порт. Если да, то проверить, пришла ли ‘1’. При единице включить светодиод, иначе – выключить.

Для проверки выполнения некоторых условий, в Arduino применяется следующая конструкция:

if (Условие) {Команды, которые выполняются при истинности условия;}
else {Команды, которые выполняются, если условие  ложно;}

Фигурные скобки можно опустить, если в них находится только одна команда.

Само условие обязательно пишется в круглых скобках и может содержать любое выражение, которое возвращает результат после его выполнения. То есть, там могут содержаться математические выражения, такие как 2+4, A+B, X*X. Но чаще применяются логические выражения, для проверки каких-то условий. Например, A==5 (Используется двойное равно, так как одно равно зарезервировано для команды присваивания), A<5, A>6, A>=B и т.д.. Здесь A, B, и X – Переменные, то есть именованные ячейки памяти, в которые может быть записано какое-то значение. Подробнее они будут рассмотрены ниже.

Так как последовательный порт может работать при различных скоростях, необходимо указать скорость передачи данных перед его использованием. Для этого в программу вписывают следующую команду:

Serial.begin(9600);

Здесь в скобках указана скорость передачи в бодах. Данная скорость должна совпадать со скоростью указанной в мониторе последовательного порта. Все отправленные данные в Arduino записываются в буфер. И перед тем, как читать этот буфер, нужно проверять, есть ли там что-то. Для проверки этого условия, существует следующая команда:

Serial.available();

Эта команда возвращает значение истины, если буфер не пуст. Иначе, результатом выполнения этой команды будет ‘ложь’.

Для чтения принятых значений из буфера применяют следующую команду:

Serial.read()

Она возвращает символ из буфера последовательного порта.

А для отправки данных на компьютер применяют следующую команду:

Serial.print(“Отправляемый текст”);

После выполнения этой команды, указанная в кавычках строка тут же появляется в мониторе последовательного порта.

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

Настройка порта производится однократно в начале выполнения программы, поэтому её лучше написать в функцию void setup() {}Там же следует провести настройку порта, к которому подключен светодиод. Таким образом, функция void setup() {} Будет содержать 2 команды:

void setup() {
  Serial.begin(9600);//Инициализация последовательного порта
  pinMode(13,1);//Настройка 13-го порта на вывод
}

Теперь в цикле необходимо проверять принятые команды через последовательный порт и выполнять их. Пусть ‘1’ означает включить светодиод, а все остальное – выключить.

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

void setup() {
  Serial.begin(9600);//Инициализация последовательного порта
  pinMode(13,1);//Настройка 13-го порта на вывод
  //вывод сообщения в монитор последовательного порта
  Serial.println("Введите команду. 1 - включение, 0 - выключение");
}
void loop() {
  if (Serial.available()) //Есть ли в буфере что-то?
    if (Serial.read()=='1') //Равно ли оно единице?
      digitalWrite(13,1); //Включить светодиод
    else digitalWrite(13,0); //Иначе, выключить светодиод.
}

Осталось, загрузить ее на плату и готово.