Курс Arduino Starter. Урок №6. Монитор последовательного

Автор: | 23.05.2019

Обзор.

В этом уроке Вы узнаете, как в созданный проект на уроке 5, добавить возможность управления светодиодами с вашего компьютера используя монитор последовательного порта в Arduino. Монитор последовательного порта это своеобразный «трос» между компьютером и вашим Arduino — он позволяет отправлять и принимать текстовые сообщения, удобен для отладки, а также позволяет управлять Arduino с клавиатуры!

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

Монитор последовательного порта.

Загрузите представленный ниже код на плату. Позднее мы разберем как он работает.

После загрузки шаблона плату, нажмите на крайнюю правую кнопку на панели инструментов в Arduino IDE. Кнопка обведена ниже.

Откроется следующее окно.

Это окно называется серийный монитор это часть Arduino IDE. Его работа состоит в том, чтобы позволить вам отправлять сообщения с компьютера на плату Arduino (через USB), а также получать сообщения от Arduino.

Сообщение “Enter LED Number 0 to 9 or ‘x’ to clear” отправлено на Arduino, это означает, что мы можем отправлять команду в Arduino, которая либо отправит ‘х’ (чтобы включить все выключеные светодиоды) или количество светодиодов которое вы хотите включить (где 0-самый нижний светодиод, 1 следующий и  7 самый верхний).

Попробуйте ввести следующие команды в верхней строке серийного монитора, которая расположена на одном уровне с кнопкой «Отправить». Нажмите «Отправить», после ввода каждого из этих знаков: х 0 3 5

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

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

Код.

Как и следовало ожидать, шаблон основан на шаблоне, использованном в уроке 5. Так что, мы будем просто разберем новые части кода.

Во-первых, в “Setup”-функции, есть две новых строки в конце:

Во-первых, у нас есть команда Serial.begin(9600). Эта команда начинает серийную коммуникацию, так что Ардуино может посылать команды через USB-соединение. Значение 9600 называется ‘скорость’ соединения. Настолько быстро данные должны быть отправлены на плату. Значение можно изменить на более высокое, но также нужно изменить то же значение в серийном мониторе. Мы обсудим это позже, а пока оставьте его на 9600.

Последняя из новых строк в ‘настройках’ посылает сообщение, которое мы видим в верхней части серийного монитора.

Ниже Loop функция, где собраны все команды:

Все, что происходит внутри цикла содержится в операторе «if». Так если вызов встроенной в Arduino функции ‘Serial.available()’ вернет состояние ‘true’ больше ничего не произойдет.

Serial.available() вернет значение True, если данные были отправлены в Arduino и готовы к исполнению. Входящие сообщения хранятся в так называемом буфере и Serial.available() возвращает True, если буфер не пуст.

Если сообщение не получено, то смотрим следующую строку кода:

Эта строка читает следующий символ в буфере и удаляет его из буфера. Она также присваивает это значение переменной ‘ch’. Переменная ‘ch’ имеет Тип ‘char’, которая расшифровывается как «символ» и как следует из названия, вмещает один символ.

Если вы следовали инструкциям в строке в верхней части серийного монитора символ будет представлять собой либо единозначное число между 0 и 7 или букву ‘х’.

В операторе ‘if’ на следующей строке проверяется, если ‘ch’ больше или равно ‘0’ и меньше или равно ‘7’. Это выглядит немного странно сравнивать символы в эту сторону, но вполне приемлемо.

Каждый символ имеет уникальный номер, называемый ASCII кодом. Это означает, что когда мы сравниваем используя символы <= и >= на самом деле мы используем ASCII-значения. Если тест пройден, то мы приходим к следующей строке:

Сейчас мы выполняем арифметические действия над символами! Мы вычитаем цифру ‘0’ независимо от того что было введено. Итак, если вы набрали ‘0’, то ‘0’ – ‘0’ будет равно 0. Если вы ввели ‘7’, то ‘7’ – ‘0’ будет равно число 7, потому что это на самом деле ASCII-значения, которые используются в вычитание.

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

Следующие две строки отправляют обратно сообщение с подтверждением для серийного монитора.

Первая строка использует Serial.print, а не Serial.println. Разница между этими двумя функциями заключается в том, что Serial.print не переходит на новую строку после печати всего что есть в ее параметре. Мы используем эту функцию в первой строке, потому что мы печатаем сообщение состоящее из двух частях. Во-первых основной бит: “включение светодиодов», а затем количество светодиодов.

Количество светодиодов хранится в переменной типа ‘int’, а не в переменной строчного типа. Функция печати Serial.print может обрабатывать текстовые строки, заключенные в двойные кавычки, переменные типа ‘int’ и почти любой тип переменных.

После оператор ‘if’ обрабатывает случай, когда одиночный разряд был обработан, и есть второй оператор ‘if’ на случай если ‘ch’ содержит букву ‘х’.

Если это так, то он очищает все светодиоды и отправляет сообщение с подтверждением.

Что попробовать еще?

Мы отправляли символы управления светодиодам отдельно, нажимали “отправить” после каждого символа. Тем не менее, все будет работать так же хорошо, если вы пошлете все символы-команды в одну строку. Попробуйте ввести следующие команды в поле серийный монитор и нажмите кнопку ‘Отправить’:

x0246

Теперь, давайте посмотрим, как быстро наш Ардуино можете общаться. Измените скорость передачи данных в шаблоне с 9600 до 115200 и загрузить его на плату снова. Затем после открытия серийного монитора  выберите 115200 из выпадающего списка.

Вы должны увидеть, что все еще работает. Высокая скорость коммуникации не часто нужна, так что скорость передачи информации в 9600 часто используется, в таких последовательных периферийных устройствах как GPS-модули, так что 9600 является чем-то вроде стандарта.

Также, попробуйте несовпадение скоростей передачи данных — используйте функцию Serial.begin(9600) и выберите пункт 57600 в выпадающем меню серийного монитора. Смотрите, как все это выглядит? Все искажено? Вот и несоответствие. Если вы когда-нибудь увидите странные данные в последовательном мониторе, то трижды проверьте вашу скорость и убедитесь, что они совпадают!

Серийный монитор это отличный способ отладки шаблона, который плохо себя ведет. Иногда, когда шаблон ведет себя не так, как вы считаете он должен себя вести, размещения оператора Serial.println() в ключевых местах помогут вам увидеть, что происходит.