3.6.md


РАБОТА С ПОСЛЕДОВАТЕЛЬНЫМ ПОРТОМ

Мы научились взаимодействовать с контроллером «РУДИРОН» посредством кнопок и светодиодов. Но очень часто нам необходимо взаимодействие контроллера с компьютером для передачи важной информации.

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

НАПОМИНАНИЕ при использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.

ПОРТ ПОСЛЕДОВАТЕЛЬНОЙ ПЕРЕДАЧИ ИНФОРМАЦИИ

В составе контроллера есть универсальный асинхронный приёмопередатчик (Univsersal Asynchronos Reciever-Transmitter UART). Это физическое устройство приёма и передачи данных по двум проводам. Оно позволяет двум устройствам обмениваться данными на различных скоростях.

Рисунок 1

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

Рисунок 1

Задача — программа реагирует на нажатие кнопок В1, В2, В3 и выводит в UART сообщение о том какая кнопка нажата. Сообщение принимается терминалом на компьютере и печатается пользователю на экране.

#include “Arduino.h” void setup()

{

//конфигурация встроенных кнопок pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN); 

pinMode(BUTTON_BUILTIN_2, INPUT_PULLDOWN); 

pinMode(BUTTON_BUILTIN_3,  INPUT_PULLDOWN);

//конфигурация встроенных светодиодов pinMode(LED_BUILTIN_1, OUTPUT); 

pinMode(LED_BUILTIN_2, OUTPUT);

//включение встроенных светодиодов digitalWrite(LED_BUILTIN_1, true); 

digitalWrite(LED_BUILTIN_2,  true);

//конфигурация последовательного порта

Serial.begin(115200);

//отправка приветствия через последовательный порт

Serial.println(«Рудирон  Бутерброд!»);

}

void loop()

{

//чтение встроенных кнопок, true = есть нажатие bool pressed1 = digitalRead(BUTTON_BUILTIN_1); 

bool pressed2 = digitalRead(BUTTON_BUILTIN_2); 

bool pressed3 = digitalRead(BUTTON_BUILTIN_3);

//определение какая кнопка нажата и отсылка данных if (pressed1) 

{ 
    
    Serial.println(“Нажата кнопка B1”);} 
    
    if (pressed2) { Serial.println(“Нажата кнопка B2”);} 
    
    if (pressed3) { Serial.println(“Нажата кнопка B3”);}

//пауза программы на 0,5 секунды

delay(500);

}

Для общения компьютера с контроллером необходима программа — монитор серийного порта.

В Arduino IDE монитор уже встроен в оболочку и его достаточно вызвать из среды программирования.

Рисунок 1

В Visual Studio Code при первом запуске монитор необходимо установить. Для выполнения выполните следующие действия:

1 В любом браузере перейдите на адрес https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-serial-monitor

Рисунок 1

2 Нажмите кнопку «Install».

Рисунок 1

3 На вопрос «Открыть приложение Visual Studio Code – нажмите кнопку «Открыть приложение».

Рисунок 1

4 Произойдет запуск приложения Visual Studio Code и откроется вкладка ** «Расширение Serial Monitor». ** Если приложение уже было запущено, то в нем просто откроется вкладка «Расширение Serial Monitor». Если данная вкладка не активно, просто перейдите на нее. Для установки нажмите кнопку «Установить» (в англоязычной версии «Install»).

Рисунок 1

5 Установка монитора серийного порта завершена Для вызова консоли терминала в Visual Studio Code необходимо выбрать в основном меню «Вид - Терминал» или по горячей клавише «CTRL+`».

Рисунок 1

И далее в окне терминала выбрать «Последовательный монитор» или «…» и «Последовательный монитор», если меню терминала не умещается на экране.

Рисунок 1

Убедитесь, что в настройках терминала правильно выбран порт подключения и скорость соединения. Скорость соединения должна соответствовать той, которая написана в программе. Для Arduino IDE настройки производятся аналогичным образом.

Рисунок 1

Терминал «Последовательного монитора» в Visual Studio Code

Рисунок 1

ТЕРМИНАЛ В ARDUINO IDE

После установки необходимых параметров в Visual Studio Code необходимо нажать на кнопку «Запустить мониторинг». В Arduino IDE мониторинг порта запускается автоматически.

Теперь, когда мы все настроили, можно нажимать на кнопки В1, В2, В3. В главном окне «Последовательного монитора» будут появляться сообщения, когда вы нажимаете на одну из кнопок.

Рисунок 1

Может быть ситуация, что будет выводиться сообщение о постоянном нажатии кнопки В2. Это связано с перемычкой IRQ. Снимите ее и все будет работать корректно.

Рисунок 1

Рассмотрим, что у нас нового в программе:

1 Установка скорости обмена Serial.begin(115200); Данную скорость выставляем в настройках терминала на компьютере.

Рисунок 1

2 Даем контроллеру команду на передачу данных в виде текстовой строки Serial.println(“Нажата кнопка B1”); Очень простая возможность передавать данные в компьютер. Часто используют данную передачу данных из разных частей программы, чтобы понять в какие значения хранятся в тех или иных переменных. Такой прием позволяет отладить программу если не понятно почему она работает некорректно.

Как пример передадим в компьютер значение переменной angle.

1 Создаем переменную: int angle = 20; Переменной сразу присвоили значение 20.

2 Передаем сначала информационную строку о переменной в виде строки: Serial.print(“Переменная angle =”); Обратите внимание, что используем print вместо ** printl. Printl** печатает сообщение и переводит указатель на строку ниже. Поэтому следующее сообщение печатается под первым. Print не переводит указатель поэтому следующее сообщение будет распечатано в этой же строке.

3 Передаем в UART значение самой переменной Serial.println(angle, DEC). Помимо указания самой переменной необходимо указать константу форматирования – DEC десятичное число.

Варианты значений констант для форматирования:

DEC – обычное число в десятичной системе исчисления • BIN – преобразует в двоичный код и выведет строку, содержащую только символы 0 и 1 • OCT – преобразует в восьмеричную систему исчисления • HEX – преобразует в шестнадцатеричную систему • Цифра от 0 до 9 – используется, если первый аргумент – вещественное число с плавающей запятой. Форма указывает количество знаков после запятой, которые останутся при выводе. Само число при этом будет округлено.

#include «Arduino.h» int angle = 20; void setup()

{

//конфигурация встроенных кнопок pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN); pinMode(BUTTON_BUILTIN_2, INPUT_PULLDOWN); pinMode(BUTTON_BUILTIN_3,  INPUT_PULLDOWN);

//конфигурация встроенных светодиодов pinMode(LED_BUILTIN_1, OUTPUT); pinMode(LED_BUILTIN_2, OUTPUT);

//включение встроенных светодиодов digitalWrite(LED_BUILTIN_1, true); digitalWrite(LED_BUILTIN_2,  true);

//конфигурация последовательного порта

Serial.begin(115200);

//отправка приветствия через последовательный порт

Serial.println(«Рудирон  Бутерброд!»);

}

void loop()

{

//чтение встроенных кнопок, true = есть нажатие bool pressed1 = digitalRead(BUTTON_BUILTIN_1); bool pressed2 = digitalRead(BUTTON_BUILTIN_2); bool pressed3 = digitalRead(BUTTON_BUILTIN_3);

//определение какая кнопка нажата и отсылка данных

if (pressed1) {

Serial.println(“Нажата кнопка B1”); 

Serial.print(“Переменная angle =”); 

Serial.println(angle, DEC);

}

if (pressed2) {

Serial.println(“Нажата кнопка B2”); 

Serial.print(“Переменная angle =”); 

Serial.println(angle, DEC);

}

if (pressed3) {

Serial.println(“Нажата кнопка B3”); 

Serial.print(“Переменная angle =”); 

Serial.println(angle, DEC);

}

//пауза программы на 0,5 секунды

delay(500);

}

В итоге в терминале мы увидим вот такой результат. Обратите внимание на кнопку В2. Мы про нее писали выше.

Рисунок 1

Программа «Последовательный монитор» позволяет нам передавать в контроллер информацию. Напишем программу, которая принимает от компьютера 1 или 0. Если приняли 1, то включаем светодиод L1. Если принимаем 0, то выключаем L1.

#include «Arduino.h»

byte inputByte; void setup()

{

pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN); pinMode(LED_BUILTIN_1, OUTPUT);

digitalWrite(LED_BUILTIN_1,  true);

//конфигурация последовательного порта

Serial.begin(115200);

}

void loop()

{

if (Serial.available() > 0)

{

inputByte = Serial.read(); if (inputByte == ‘1’)

{

digitalWrite(LED_BUILTIN_1,  HIGH);

}

else if (inputByte == ‘0’)

{

digitalWrite(LED_BUILTIN_1,  LOW);

}

Serial.print(“Я принял следующие символы: “); Serial.println(inputByte, DEC);

}

delay(10);

}

Новые строчки в программе:

1 Serial.available() > 0 – проверка был ли принят хоть один символ от компьютера во внутреннюю память UART. Если принят, то можно его считать в переменную. 2 inputByte = Serial.read() – заносим в переменную считанный символ из внутренней памяти UART. 3 Если принятый символ 1, то подаем на светодиод L1 3.3 вольта (светится):

if (inputByte == ‘1’)

{

digitalWrite(LED_BUILTIN_1,  HIGH);

}

4 Если принятый символ 0, то подаем ноль вольт на светодиод L1 (не светится):

else if (inputByte == ‘0’)

{

digitalWrite(LED_BUILTIN_1,  LOW);

}

5 Выводим обратно в компьютер строки, чтобы увидеть какие символы были приняты нашим контроллером от компьютера:

Serial.print(«Я принял следующие символы: «); 

Serial.println(inputByte, DEC);

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

Рисунок 1

Программа работает корректно. При передаче символа 1 светится светодиод L1 при передаче символа 0 он гаснет. Однако можно заметить, что контроллер принимает не один символ, а сразу 3. Это связано с системой передачи строковых данных через UART. Первый символ у нас не 1 или 0, а 49 и 48. Это связано с тем, что передаются коды символов, а не десятичные числа 0 или 1. За каждой клавишей на клавиатуре (вернее символом) зарезервирован свой код.

Рисунок 1

Остальные символы пришли к нам от печатающих машинок.

Рисунок 1

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

  • символ 13 - carriage return (возврат каретки return/ввод).
  • символ 10 - line feed (новая строка).

Вот как исторически сложилась система передачи информации.

ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.

ВЫВОДЫ

Мы научились работать с последовательным портом, принимать и передавать информацию, изучили принципы кодировки символов.

ВСПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ

  1. Как вызвать терминал «Последовательный монитор» в Visual Studio Code?
  2. Как вызвать терминал «Последовательный монитор» в Arduino IDE?
  3. Что необходимо настроить в терминале «Последовательного монитора» для корректного вывода информации с последовательного порта Рудирона?
  4. Как выполнить настройки из п.3 в в Visual Studio Code?
  5. Как выполнить настройки из п.3 в в Arduino IDE?
  6. Из каких символов состоит «переход на новую строку» в терминале?
  7. Что будет результатом выполнения нашей первой программы?
  8. Что будет результатом выполнения нашей второй программы?
  9. Что будет результатом выполнения нашей третьей программы?
  10. Почему при вводе в терминале символа «1», мы при приеме получаем не символ «1», а некий десятичный код? Что этот код означает?

СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ

  1. Использовать для написания программы среду Arduino IDE.
  2. Собрать все 3 программы в одну программу, которая анализирует нажатие кнопок, сообщает в терминал результат нажатия, выводит переменную, включает/выключает встроенный светодиод L1 в зависимости от введенных данных («0» - выключить, «1» - включить).
  3. В программе из п.2 заменить выводимую переменную, ввести управление встроенным светодиодом L2 («1» - выключить, «0» - включить).

ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ

  1. Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
  2. Программирование задач с использование разных кнопок и встроенного светодиода L2.
  3. Проведение соревнования «Я умею управлять…» по индивидуальному техническому заданию. Техническое задание составляется из нескольких частей:

а) Проверка нажатия определенной кнопки (Варианты B1, B2, B3) и вывод информации об этом в терминал.

б) Вывод символов (фраз) в терминал последовательного порта (Варианты: «различные фразы», можно использовать мемы или изречения). в) Управление встроенными светодиодами (варианты L1, L2) в зависимости от нажатой кнопки (варианты B1, B2, B3).

г) Управление встроенными светодиодами (варианты L1, L2) в зависимости от введенного через терминал символа (варианты пар символов: «1» и «2», «3» и «4» и т.д.).

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

По завершению соревнования произвести разбор написанных программ и работу над допущенными ошибками.