Меню Закрыть

Arduino монитор порта кракозябры

Содержание

  • Уроки
  • Базовые уроки Arduino
  • Монитор порта, отладка

Монитор порта

Как мы с вами знаем из урока “О платформе“, на платах Ардуино стоит USB-TTL конвертер, позволяющий микроконтроллеру в текстовом режиме “консоли” общаться с компьютером по последовательному интерфейсу, Serial. На компьютере создаётся виртуальный COM порт, к которому можно подключиться при помощи программ-терминалов порта, и принимать-отправлять текстовые данные. Через этот же порт загружается прошивка, т.к. поддержка Serial является встроенной в микроконтроллер на “железном” уровне, и USB-TTL преобразователь подключен именно к этим выводам микроконтроллера. На плате Arduino Nano это кстати пины D0 и D1.

К этим же пинам можно подключаться при помощи отдельных плат “программаторов”, например на чипах CP2102 или том же CH340 с целью загрузки прошивки или просто общения с платой.

В самой Arduino IDE тоже есть встроенная “консоль” – монитор порта, кнопка с иконкой лупы в правом верхнем углу программы. Нажав на эту кнопку мы откроем сам монитор порта, в котором будут настройки:

Если с отправкой, автопрокруткой, отметками времени и кнопкой “очистить вывод” всё понятно, то конец строки и скорость мы рассмотрим подробнее:

  • Конец строки: тут есть несколько вариантов на выбор, чуть позже вы поймёте, на что они влияют. Лучше поставить нет конца строки, так как это позволит избежать непонятных ошибок на первых этапах знакомства с Ардуино.
  • Нет конца строки – никаких дополнительных символов в конце введённых символов после нажатия на кнопку отправка/Enter
  • NL – символ переноса строки в конце отправленных данных
  • CR – символ возврата каретки в конце отправленных данных
  • NL+CR – и то и то
  • Скорость – тут на выбор нам даётся целый список скоростей, т.к. общение по Serial может осуществляться на разных скоростях, измеряемых в бод (baud), и если скорости приёма и отправки не совпадают – данные будут получены некорректно. По умолчанию скорость стоит 9600, её и оставим.
  • Очистить вывод – тут всё понятно, очищает вывод
  • Объект Serial

    Начнём знакомство с одной из самых полезных штук Arduino-разработчика – Serial. Serial это объект класса Stream, позволяющий как просто принимать/отправлять данные через последовательный порт, так и наследует из класса Stream кучу интересных возможностей и фишек, давайте сразу их все рассмотрим, а потом перейдём к конкретным примерам.

    Запустить связь по Serial на скорости speed (baud rate, бит в секунду). Скорость можно поставить любую, но есть несколько “стандартных”. Список скоростей для монитора порта Arduino IDE:

    • 300
    • 1200
    • 2400
    • 4800
    • 9600 чаще всего используется, можно назвать стандартной для большинства устройств с связью через TTL
    • 19200
    • 38400
    • 57600
    • 115200 тоже часто встречается
    • 230400
    • 250000
    • 500000
    • 1000000
    • 2000000

    Отправляет в порт значение val – число или строку. В отличие от write выводит именно символы, т.е. отправив 88 вы получите 88: Serial.print(88); выведет 88. Также метод print/println имеет несколько настроек для разных данных, что делает его очень удобным инструментом отладки:

    format позволяет настраивать вывод данных: BIN, OCT, DEC, HEX выведут число в соответствующей системе исчисления, а цифра после вывода float позволяет настраивать выводимое количество знаков после точки

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

    Читает данные из буфера и ищет набор символов target (тип char), опционально можно указать длину length. Возвращает true, если находит указанные символы. Ожидает передачу по таймауту

    Плоттер

    Помимо монитора последовательного порта, в Arduino IDE есть плоттер – построитель графиков в реальном времени по данным из последовательного порта. Достаточно отправить значение при помощи команды Serial.println(значение) и открыть плоттер по последовательному соединению, например построим график значения с аналогового пина A0:

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

    Вывод значений происходит каждые 10 миллисекунд, а каждые 300 миллисекунд значения обновляются. Получаем вот такой график:

    Подписи графиков

    В Arduino >“название 1, название 2, название n” с переносом строки, и дальше просто выводить данные:

    Использование пинов

    Как я писал выше, аппаратный Serial имеет выводы на ноги микроконтроллера, для Nano/Uno/Mini это выводы D0 и D1. Можно ли работать с этими пинами, как с обычными цифровыми пинами? При отключенном Serial – можно, при включенном – нет. После вызова Serial.begin() ноги перестают функционировать как цифровые пины в ручном режиме, но после вызова Serial.end() можно снова ими пользоваться!

    Отправка и парсинг

    Рассмотрим самый классический пример для всех языков программирования: Hello World!

    Отправка данных в порт не должна вызывать трудностей и вопросов, потому что всё понятно/очевидно, да и чуть выше в описании метода print мы рассмотрели все варианты вывода. Отправка в порт позволяет узнать значение переменной в нужном месте программы, этот процесс называется отладка. Когда код работает не так, как нужно, начинаем смотреть, где какие переменные какие значения принимают. Или выводим текст из разных мест программы, чтобы наблюдать за правильностью (порядком) её работы. Давайте вспомним урок циклы и массивы и выведем в порт массив:

    Читайте также:  Доска для проектора как называется в школе

    Вывод: 0 50 68 85 15 214 63 254 – элементы массива, разделённые пробелами!

    Проблемы возникают при попытке принять данные в порт. Дело в том, что метод read() читает один символ, даже если вы отправите длинное число – программа получит его по одной цифре, и составлять число из цифр придётся вручную. Проблема усугубляется тем, что read() читает именно символ, то есть код символа в таблице ASCII.

    Посмотрим вот такой пример, в котором в порт отправляются принятые в него данные (так называемое эхо):

    Так как же принять именно цифру? Есть хитрость – вычитать из полученного кода символа код цифры 0, либо сам 0 в виде символа: ‘0’

    Также для принятия одиночных чисел у нас есть готовый метод – parseInt/parseFloat – для целочисленных и рациональных чисел соответственно. Процесс приёма и расшифровки данных называется парсинг (parsing). Давайте примем в порт число 1234, используя готовый метод парсинга.

    Итак, мы используем конструкцию if (Serial.available()) <> чтобы опрашивать порт только в том случае, если в него что-то пришло. Отправив в порт число 1234 мы получим ответ ОК, отправив любое другое – error. Также вы заметите, что после отправки проходит секунда, прежде чем плата ответит. Эта секунда спрятана внутри метода parseInt, программа ждёт секунду после принятия данных, чтобы все данные успели прийти. Секунда это очень много, достаточно было ждать, скажем, 50 миллисекунд. Это можно сделать при помощи метода setTimeout.

    Теперь после отправки цифры программа будет ждать всего 50 мс, и сразу же вам ответит.

    В реальном устройстве часто требуется передавать несколько параметров, например у нас Bluetooth танк. Мы ему должны отправить например скорость правой гусеницы, скорость левой гусеницы, положение башни, состояние подсветки, команду на выстрел… Да что угодно. Как быть в таком случае? Тут начинается настоящий парсинг, и появляются варианты, нам придётся придумывать собственный протокол связи.

    Есть два базовых варианта: отправка пакета всех-всех данных и его парсинг, или отправка отдельно каждого параметра с уникальным “ключом” у каждого. Как это понимать: суть первого варианта состоит в принятии пакета данных, которые разделены разделителем. Также правильно будет выделить начало и конец посылки. Пример: $120 80 180 1; – начальный символ $, разделитель ” ” (пробел) и завершающий символ ; . Наличие начального и завершающего символа повышает скорость работы и помехозащищённость связи. Второй вариант – посылки вида MOT1_120, содержащие ключ и значение, соответствующее этому ключу.

    Как реализовать данные способы парсинга я очень подробно разбирал в примерах в сборнике полезных алгоритмов Arduino, раздел “Работа с Serial”. Но давайте я оставлю их также и здесь, пользуйтесь!

    • Уроки
    • Базовые уроки Arduino
    • Монитор порта, отладка

    Монитор порта

    Как мы с вами знаем из урока “О платформе“, на платах Ардуино стоит USB-TTL конвертер, позволяющий микроконтроллеру в текстовом режиме “консоли” общаться с компьютером по последовательному интерфейсу, Serial. На компьютере создаётся виртуальный COM порт, к которому можно подключиться при помощи программ-терминалов порта, и принимать-отправлять текстовые данные. Через этот же порт загружается прошивка, т.к. поддержка Serial является встроенной в микроконтроллер на “железном” уровне, и USB-TTL преобразователь подключен именно к этим выводам микроконтроллера. На плате Arduino Nano это кстати пины D0 и D1.

    К этим же пинам можно подключаться при помощи отдельных плат “программаторов”, например на чипах CP2102 или том же CH340 с целью загрузки прошивки или просто общения с платой.

    В самой Arduino IDE тоже есть встроенная “консоль” – монитор порта, кнопка с иконкой лупы в правом верхнем углу программы. Нажав на эту кнопку мы откроем сам монитор порта, в котором будут настройки:

    Если с отправкой, автопрокруткой, отметками времени и кнопкой “очистить вывод” всё понятно, то конец строки и скорость мы рассмотрим подробнее:

    • Конец строки: тут есть несколько вариантов на выбор, чуть позже вы поймёте, на что они влияют. Лучше поставить нет конца строки, так как это позволит избежать непонятных ошибок на первых этапах знакомства с Ардуино.
    • Нет конца строки – никаких дополнительных символов в конце введённых символов после нажатия на кнопку отправка/Enter
    • NL – символ переноса строки в конце отправленных данных
    • CR – символ возврата каретки в конце отправленных данных
    • NL+CR – и то и то
  • Скорость – тут на выбор нам даётся целый список скоростей, т.к. общение по Serial может осуществляться на разных скоростях, измеряемых в бод (baud), и если скорости приёма и отправки не совпадают – данные будут получены некорректно. По умолчанию скорость стоит 9600, её и оставим.
  • Очистить вывод – тут всё понятно, очищает вывод
  • Объект Serial

    Начнём знакомство с одной из самых полезных штук Arduino-разработчика – Serial. Serial это объект класса Stream, позволяющий как просто принимать/отправлять данные через последовательный порт, так и наследует из класса Stream кучу интересных возможностей и фишек, давайте сразу их все рассмотрим, а потом перейдём к конкретным примерам.

    Читайте также:  Стойка для ушм 125 своими руками

    Запустить связь по Serial на скорости speed (baud rate, бит в секунду). Скорость можно поставить любую, но есть несколько “стандартных”. Список скоростей для монитора порта Arduino IDE:

    • 300
    • 1200
    • 2400
    • 4800
    • 9600 чаще всего используется, можно назвать стандартной для большинства устройств с связью через TTL
    • 19200
    • 38400
    • 57600
    • 115200 тоже часто встречается
    • 230400
    • 250000
    • 500000
    • 1000000
    • 2000000

    Отправляет в порт значение val – число или строку. В отличие от write выводит именно символы, т.е. отправив 88 вы получите 88: Serial.print(88); выведет 88. Также метод print/println имеет несколько настроек для разных данных, что делает его очень удобным инструментом отладки:

    format позволяет настраивать вывод данных: BIN, OCT, DEC, HEX выведут число в соответствующей системе исчисления, а цифра после вывода float позволяет настраивать выводимое количество знаков после точки

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

    Читает данные из буфера и ищет набор символов target (тип char), опционально можно указать длину length. Возвращает true, если находит указанные символы. Ожидает передачу по таймауту

    Плоттер

    Помимо монитора последовательного порта, в Arduino IDE есть плоттер – построитель графиков в реальном времени по данным из последовательного порта. Достаточно отправить значение при помощи команды Serial.println(значение) и открыть плоттер по последовательному соединению, например построим график значения с аналогового пина A0:

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

    Вывод значений происходит каждые 10 миллисекунд, а каждые 300 миллисекунд значения обновляются. Получаем вот такой график:

    Подписи графиков

    В Arduino >“название 1, название 2, название n” с переносом строки, и дальше просто выводить данные:

    Использование пинов

    Как я писал выше, аппаратный Serial имеет выводы на ноги микроконтроллера, для Nano/Uno/Mini это выводы D0 и D1. Можно ли работать с этими пинами, как с обычными цифровыми пинами? При отключенном Serial – можно, при включенном – нет. После вызова Serial.begin() ноги перестают функционировать как цифровые пины в ручном режиме, но после вызова Serial.end() можно снова ими пользоваться!

    Отправка и парсинг

    Рассмотрим самый классический пример для всех языков программирования: Hello World!

    Отправка данных в порт не должна вызывать трудностей и вопросов, потому что всё понятно/очевидно, да и чуть выше в описании метода print мы рассмотрели все варианты вывода. Отправка в порт позволяет узнать значение переменной в нужном месте программы, этот процесс называется отладка. Когда код работает не так, как нужно, начинаем смотреть, где какие переменные какие значения принимают. Или выводим текст из разных мест программы, чтобы наблюдать за правильностью (порядком) её работы. Давайте вспомним урок циклы и массивы и выведем в порт массив:

    Вывод: 0 50 68 85 15 214 63 254 – элементы массива, разделённые пробелами!

    Проблемы возникают при попытке принять данные в порт. Дело в том, что метод read() читает один символ, даже если вы отправите длинное число – программа получит его по одной цифре, и составлять число из цифр придётся вручную. Проблема усугубляется тем, что read() читает именно символ, то есть код символа в таблице ASCII.

    Посмотрим вот такой пример, в котором в порт отправляются принятые в него данные (так называемое эхо):

    Так как же принять именно цифру? Есть хитрость – вычитать из полученного кода символа код цифры 0, либо сам 0 в виде символа: ‘0’

    Также для принятия одиночных чисел у нас есть готовый метод – parseInt/parseFloat – для целочисленных и рациональных чисел соответственно. Процесс приёма и расшифровки данных называется парсинг (parsing). Давайте примем в порт число 1234, используя готовый метод парсинга.

    Итак, мы используем конструкцию if (Serial.available()) <> чтобы опрашивать порт только в том случае, если в него что-то пришло. Отправив в порт число 1234 мы получим ответ ОК, отправив любое другое – error. Также вы заметите, что после отправки проходит секунда, прежде чем плата ответит. Эта секунда спрятана внутри метода parseInt, программа ждёт секунду после принятия данных, чтобы все данные успели прийти. Секунда это очень много, достаточно было ждать, скажем, 50 миллисекунд. Это можно сделать при помощи метода setTimeout.

    Теперь после отправки цифры программа будет ждать всего 50 мс, и сразу же вам ответит.

    В реальном устройстве часто требуется передавать несколько параметров, например у нас Bluetooth танк. Мы ему должны отправить например скорость правой гусеницы, скорость левой гусеницы, положение башни, состояние подсветки, команду на выстрел… Да что угодно. Как быть в таком случае? Тут начинается настоящий парсинг, и появляются варианты, нам придётся придумывать собственный протокол связи.

    Есть два базовых варианта: отправка пакета всех-всех данных и его парсинг, или отправка отдельно каждого параметра с уникальным “ключом” у каждого. Как это понимать: суть первого варианта состоит в принятии пакета данных, которые разделены разделителем. Также правильно будет выделить начало и конец посылки. Пример: $120 80 180 1; – начальный символ $, разделитель ” ” (пробел) и завершающий символ ; . Наличие начального и завершающего символа повышает скорость работы и помехозащищённость связи. Второй вариант – посылки вида MOT1_120, содержащие ключ и значение, соответствующее этому ключу.

    Читайте также:  Path finder mac os x

    Как реализовать данные способы парсинга я очень подробно разбирал в примерах в сборнике полезных алгоритмов Arduino, раздел “Работа с Serial”. Но давайте я оставлю их также и здесь, пользуйтесь!

    Самой популярной средой разработки для Arduino является официальная программа от итальянских разработчиков — Arduino IDE. Можно конечно использовать и другие программы, например, имеющая обширный функционал, Atmel Studio и другие. Но сегодня мы остановимся на самом оптимальном варианте для начинающих, да и просто для любителей пошаманить долгими вечерами за компьютером, проектируя очередной проект.

    Скачать Arduino IDE можно на официальном сайте Arduino, в разделе программное обеспечение. Вы можете скачать любую версию, как самую новую, так и самую старую. Однако, советую также использовать версию 1.6.5 или 1.6.9, поскольку они является одними из самых стабильных и реже выдают ошибки при компиляции, казалось бы, правильно написанного кода.

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

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

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

    Функция “Открыть недавние” достаточна полезная, так как поможет вам открыть программные кода, с которыми вы ранее работали, и не придется тратить лишнее время на их поиски. В подразделе “Примеры” содержится огромное множество уже готовые программных кодов (скетчей), взятых на разные направления: механика, мигание светодиодом, циклы, работа с дисплеями и аналоговыми выходами и так далее. При установке новых библиотек в Arduino (для различных модулей и датчиков) число примеров увеличится. Также, эти коды содержат подробные пояснения, и поэтому данный раздел будет очень полезен начинающим, программировать на платформе Ардуино. Еще есть подраздел “Настройки”. В нем стоит обратить внимание на отдельное поле для вставки ссылок, которые позволят загрузить в программу возможность работы с другими платформами и модулями, например с семейством интернет модулей на чипе ESP.

    Раздел “Правка” служит для редактирования текста, кода и пояснений для него.

    Раздел “Скетч” позволит выполнить различные действия с вашим кодом, например, проверить его (отправить на компиляцию) или загрузить в память вашего устройства.

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

    И также имеется раздел “Помощь”, который, вроде как, должен решать возникающие проблемы при работе с Arduino IDE.

    Остановимся подробнее на разделе “Инструменты”. Когда вы подключаете плату к компьютеру, то в этом разделе нужно настроить все необходимые параметры: выбрать в списке предложенных вашу плату, указан номер порта, к которому она подключается (посмотреть номер можно в диспетчере устройств в панели управления компьютера).

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

    В данной статье хотелось бы затронуть возможность открытия в программе специального дополнительного окна, на котором будут выводиться значения сигналов и различные данные с датчиков и модулей, подключенных к Ардуино. Называется эта функция Serial Monitor (в русскоязычной версии – монитор порта). Ее, также, можно открыть с помощью сочетания клавиш Ctrl+Shift+M

    По сути, это окно отвечает за последовательный порт соединения и служит для принятия или отправки различных данных на этот самый порт. В первом поле вы можете вводить различные значения (отправлять их в порт с помощью кнопки “отправить”) и получать, засчет этого, определенную информацию с Ардуино (если это прописано в вашем коде). Есть также поле для получения данных, а внизу справа можно менять скорость последовательного соединения (измеряется в битах и или в бод на секунду). Чаще всего используется значение в 9600. При использовании монитора порта, смотрите, чтобы скорости передачи данных, одна из которых прописана в скетче, а другая – установлена в самом мониторе порта, совпадали.

    Чаще всего для работы с этим окном, используют две функции — Serial.print () и Serial.read(). Первая позволяет отправлять данные через порт последовательного соединения, а вторая – принимать их.

    Приведем два кода для работы с монитором порта в Arduino IDE

    Управление светодиодом с помощью монитора порта. Суть кода такова, что если мы введем цифру 1 в поле ввода и нажнем “отправить”, то светодиод загорится, если введем 0, то погаснет.

    Следующий программный код позволит нам передавать данные из Arduino в Монитор порта, например слово "Amperkot"

    Рекомендуем к прочтению

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

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