Arduino вывод в консоль

Пересылает через последовательный порт данные в виде ASCII-текста. Эта функция может принимать разные формы. Для отображения цифр используются ASCII-символы, соответствующие этим цифрам. Для отображения чисел с плавающей точкой тоже используются ASCII-символы, соответствующие этим числам (по умолчанию — с двумя знаками после запятой). Байты отсылаются в виде отдельных символов. Символы и строки отсылаются как есть. Например:

Serial.print(78) дает «78» Serial.print(1.23456) дает «1.23» Serial.print(‘N’) дает «N» Serial.print(«Hello World.») дает «Hello World.»

У этой функции есть и еще один (опциональный) параметр, который указывает формат пересылаемых данных. Допустимые значения — BIN (двоичный формат; или основание 2), OCT (восьмеричный формат; или основание 8), DEC (десятичный формат; или основание 10) и HEX (шестнадцатеричный; или основание 16). Для чисел с плавающей точкой в этом параметре указывается количество знаков после запятой. Например:

Serial.print(78, BIN) дает «1001110» Serial.print(78, OCT) дает «116″ Serial.print(78, DEC) дает «78» Serial.print(78, HEX) дает «4E» Serial.println(1.23456, 0) дает «1» Serial.println(1.23456, 2) дает «1.23» Serial.println(1.23456, 4) дает «1.2346»

Кроме того, при помощи этой функции можно выводить строки, сохраненные во flash-памяти, для чего нужно воспользоваться макросом F(). Например:

Serial.print(F(«Hello World»))

Если вам нужно отправить один байт, используйте Serial.write().

Синтаксис

Serial.print(val) Serial.print(val, format)
val — значение, которое нужно вывести (данные любого типа) format — значение для указания формата (для целых чисел) или для знаков после запятой (для чисел с плавающей точкой)

Функция Serial.print().

Описание.

Начинаем с функции Serial.print(), которая позволяет нам выводить на экран любую информацию, какую только потребуется. Выглядит вызов функции так: Serial.print(data) , где data — аргумент (параметр) функции. При этом функция сама форматирует свой вывод в зависимости от переданного в нее аргумента. Например:

Вызов функции Результирующий вывод
Serial.print(«Hello world!»);Hello world!
Serial.print(‘H’);H
Serial.print(77);77
Serial.print(2.71);2.71
Serial.print(3.14159265);3.14

Обратите внимание, что по умолчанию выводятся два знака после запятой в дробных числах, чуть ниже мы разберем, как изменить эту ситуацию. Результат же работы функции можно увидеть в мониторе порта («Tools > Serial Monitor»):

Закодил Google Dino на Arduino! [Arduino GameDev]

Arduino Serial Monitor.

В этом окне настроить нужно только скорость передачи данных, поставим для примера 115200 baud:

Установка Baudrate.

Оставляем окно монитора порта открытым и возвращаемся к скетчу. Для того, чтобы использовать функцию Serial.print() , необходима одна дополнительная операция, а именно вызов функции:

Serial.begin(speed)

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

Serial.begin(115200)

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

Параметр Значение
Кол-во битов в байте данных8
Проверка четностиОтсутствует
Кол-во стоп-битов1

С теорией здесь все понятно, испробуем на практике )

Пример скетча.

Как вы помните, скетч состоит из двух базовых функций — setup() и loop() . При этом первая из них вызывается однократно при запуске платы. В нее и поместим код, который позволит вывести текстовую строку в консоль. При этом не забываем о Serial.begin() :

void setup() < Serial.begin(115200); Serial.print(«setup() function is working»); >void loop()

С подключением платы к Arduino IDE мы уже разобрались ранее, поэтому сейчас просто компилируем скетч и прошиваем в контроллер, это можно осуществить одной кнопкой:

Программирование Arduino.

А теперь разворачиваем Serial Monitor и анализируем увиденное (если монитор был открыт после того, как функция setup() отработала, то можно перезапустить плату кнопкой Reset):

Пример работы скетча с Serial.print().

А увиденное в данном случае четко соответствует задуманному, то есть при запуске скетча однократно производится вызов функции setup() . А из нее так же однократно при помощи Serial.print() в монитор порта выводится строка «setup() function is working». Таким образом, данный инструмент, Serial Monitor, можно использовать для отладки скетча. Помимо текста, как мы уже обсудили, возможен вывод любых числовых значений:

void setup() < Serial.begin(115200); Serial.print(«setup() function is working»); Serial.print(50); Serial.print(51); Serial.print(52); >void loop()

И в Serial Monitor теперь:

Проблема при выводе через Serial.print().

Очевидно, что возникла сложность. Связана она с тем, что вывод идет подряд, без перехода на новую строку. Не проблема, модернизируем скетч, добавив вызовы Serial.print(‘n’) , как раз-таки для перехода на новую строку :

void setup() < Serial.begin(115200); Serial.print(«setup() function is working»); Serial.print(‘n’); Serial.print(50); Serial.print(‘n’); Serial.print(51); Serial.print(‘n’); Serial.print(52); Serial.print(‘n’); >void loop()

Но это нерационально и неприемлимо с любой точки зрения, поэтому лучший вариант — использование функции Serial.println() . Собственно, ее отличие заключается в том, что ‘r’ и ‘n’ добавляются в конце строки автоматически, что и дает необходимый переход на новую строку перед последующими выводами:

void setup() < Serial.begin(115200); Serial.println(«setup() function is working»); Serial.println(50); Serial.println(51); Serial.println(52); >void loop()

Использование функции Serial.println().

Помимо прочего есть возможность форматировать аргумент функции под определенную систему счисления:

Вызов функции Результирующий вывод
Serial.print(85, DEC);85
Serial.print(85, BIN);1010101
Serial.print(85, OCT);125
Serial.print(85, HEX);55

Соответственно, число 85 в десятичной системе счисления соответствует 1010101 в двоичной, 125 в восьмеричной и 0x55 в шестнадцатеричной. Все очень просто и удобно, аналогичным же образом можно задать количество знаков после запятой для дробных значений:

Вызов функции Результирующий вывод
Serial.print(3.14159265, 0);3
Serial.print(3.14159265, 1);3.1
Serial.print(3.14159265, 3);3.141
Serial.print(3.14159265, 5);3.14159

Отлично, с этим успешно разобрались, плавно перемещаемся ко второй запланированной части статьи

Функция delay().

Описание.

Второй функцией, который мы сегодня уделим повышенное внимание будет функция delay() . Ее задача полностью соответствует названию — функция останавливает выполение программы на время, переданное в нее в качестве аргумента. При этом время в данном случае исчисляется в миллисекундах. Например, delay(15) спровоцирует задержку на 15 мс.

Для чего это нужно? Да просто для формирования примитивных задержек. Примитивных по той простой причине, что при вызове этой функции микроконтроллер намертво останавливается, ожидая указанное время. А ведь в это время могли выполняться какие-либо другие операции, вместо банальнейшего простаивания.

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

Аналогичным образом работает и еще одна функция — delayMicroseconds() . Вся разница только в том, что здесь значение временного интервала задается в микросекундах, а не в миллисекундах. Причем максимальное значение аргумента функции в данном случае составляет 16383, то есть чуть более 16-ти мс. Таким образом: delayMicroseconds(5000) — задержка на 5000 мкс, то есть на 5 мс. И теперь переходим к практическому примеру.

Пример скетча.

Итак, дополним наш самый первый пример из этой статьи дополнительным выводом в монитор порта. В функции loop() , которая вызывается периодически и неотвратимо, добавляем:

void setup() < Serial.begin(115200); Serial.println(«setup() function is working»); >void loop()

При вызове delay(1000) программа останавливается на 1000 мс (1 секунду), а значит в Serial Monitor мы видим вывод строки «loop() function is working» ровно раз в секунду. Убедиться в этом также можно, включив отображение меток времени:

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

И результат не заставляет себя ждать:

Пример использования функции delay() на Arduino.

С небольшой погрешностью вывод строки происходит строго через 1000 мс, которые мы задали в скетче, так что все сработало как и задумано. И на этой позитивной ноте заканчиваем сегодняшнюю статью, перечисленные функции в дальнейшем будем использовать постоянно, так что до встречи в статьях курса

Плоттер

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

void setup() < Serial.begin(9600); >void loop()

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

значение1 пробел_или_запятая значение2 пробел_или_запятая значение3 пробел_или_запятая перенос_строки

Давайте выведем значения с аналоговых пинов A0, A1 и A2:

void setup() < Serial.begin(9600); >void loop()

Получим вот такие графики:

blank

В Arduino IDE с версии 1.8.10 добавили возможность подписать графики, для этого перед выводом нужно отправить названия в виде название 1, название 2, название n с переносом строки, и дальше просто выводить данные:

Отправка в порт

blank

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

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

Давайте вспомним урок циклы и массивы и выведем в порт элементы массива:

void setup() < Serial.begin(9600); byte arr[] = ; for (byte i = 0; i < 8; i++) < Serial.print(arr[i]); Serial.print(‘ ‘); >> void loop()

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

Arduino

Библиотека Serial содержит набор функции для работы с последовательным портом Arduino.

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

В таблице ниже представлены данные по последовательным портам основных плат Arduino:

Плата Пины сериального порта 1 Пины сериального порта 2 Пины сериального порта 3 Пины сериального порта 4
Uno0(RX), 1(TX)
Nano0(RX), 1(TX)
Mini0(RX), 1(TX)
Mega0(RX), 1(TX)19(RX), 18(TX)17(RX), 16(TX)15(RX), 14(TX)
Due0(RX), 1(TX)19(RX), 18(TX)17(RX), 16(TX)15(RX), 14(TX)

TX — пин передачи данных, RX — пин получения данных.

Для соединения двух устройств, необходимо подключить пин TX первого устройство к пину RX второго, а пин RX первого — к пину TX второго соответственно.

Для связи с компьютером используется USB порт на Arduino, однако нужно помнить, что и в этом случае при использовании функций Serial нельзя задействовать пины RX и TX для каких-либо других целей.

Среду разработки Arduino IDE и PlatformIO имеют встроенный монитор порта Serial , главное — не забыть выставить одинаковую скорость на Arduino через функцию begin() и в IDE.

Функции библиотеки Serial

Описание

Инициирует последовательное соединение, а также задает скорость передачи данных. Скорость измеряется в бит/с (бод). Для обмена данных с компьютером через USB используются значения из следующего списка: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 и 115200. При подключении двух устройств через пины RX и TX, могут использоваться любые другие значения.

Синтаксис

Serial.begin(speed)
Serial.begin(speed, config)

Параметры

speed — скорость передачи данных

config — необязательный параметр, устанавливает данные, четность и стоповые биты

Возвращаемое значение
Пример

void setup() < Serial.begin(115200); >void loop()

Arduino

Библиотека Serial содержит набор функции для работы с последовательным портом Arduino.

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

В таблице ниже представлены данные по последовательным портам основных плат Arduino:

Плата Пины сериального порта 1 Пины сериального порта 2 Пины сериального порта 3 Пины сериального порта 4
Uno0(RX), 1(TX)
Nano0(RX), 1(TX)
Mini0(RX), 1(TX)
Mega0(RX), 1(TX)19(RX), 18(TX)17(RX), 16(TX)15(RX), 14(TX)
Due0(RX), 1(TX)19(RX), 18(TX)17(RX), 16(TX)15(RX), 14(TX)

TX — пин передачи данных, RX — пин получения данных.

Для соединения двух устройств, необходимо подключить пин TX первого устройство к пину RX второго, а пин RX первого — к пину TX второго соответственно.

Для связи с компьютером используется USB порт на Arduino, однако нужно помнить, что и в этом случае при использовании функций Serial нельзя задействовать пины RX и TX для каких-либо других целей.

Среду разработки Arduino IDE и PlatformIO имеют встроенный монитор порта Serial , главное — не забыть выставить одинаковую скорость на Arduino через функцию begin() и в IDE.

Функции библиотеки Serial

Описание

Инициирует последовательное соединение, а также задает скорость передачи данных. Скорость измеряется в бит/с (бод). Для обмена данных с компьютером через USB используются значения из следующего списка: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 и 115200. При подключении двух устройств через пины RX и TX, могут использоваться любые другие значения.

Синтаксис

Serial.begin(speed)
Serial.begin(speed, config)

Параметры

speed — скорость передачи данных

config — необязательный параметр, устанавливает данные, четность и стоповые биты

Возвращаемое значение
Пример

void setup() < Serial.begin(115200); >void loop()

Работа Arduino MEGA/DUE с несколькими последовательными serial портами

Многопортовые ардуино.

Как вы уже заметили, на ардуиновских платах Mega и Due имеется по 4 последовательных порта, а именно:

Serial — выводы 0 (RX) and 1 (TX);

Serial1 — выводы 19 (RX) and 18 (TX);

Serial2 — выводы 17 (RX) and 16 (TX);

Serial3 — выводы 15 (RX) and 14 (TX).

Естественно, что на Due используется напряжение 3.3 В (на MEGA как обычно 5 В).

Как с ними работать?

Здесь синим цветом выделены собственно имена объектов ( Serial , Serial1 , Serial2 , Serial3 ), которые используются в коде программы для работы с их методами. Всё просто! Например,

// Пример работы с несколькими serial-портами: void setup() < // инициализируем те порты, котор: Serial.begin(9600); Serial1.begin(9600); Serial2.begin(9600); Serial3.begin(9600); >// и так же с ними работаем: void loop() < // выводим строку в порт-2: Serial2.print(«Hello World!»); // читаем данные из порта-1 и пишем в порт-3: if (Serial1.available()) < int inByte = Serial1.read(); Serial3.write(inByte); >>

Пример вывода на дисплей LCD1602 через последовательный порт UART Arduino из-под Linux средствами языка Python

Короче говоря, есть комп с линуксом, к которому подключена Arduino через USB, а к арудине подключен дисплей LCD1602, и мы хотим на него выводить инфу.

Сначала привожу полный код программы для Arduino UNO, к которой подключен дисплей LCD1602:

#include gt LiquidCrystal_I2C lcd(0x27,16,2); /* или 0x3F. */ const char TERM_SYMBOL = ‘#’; String inputString = «»; void serialEvent() < while (Serial.available()) < char inChar = (char)Serial.read(); // get the new byte Serial.print(inChar); if (inChar != TERM_SYMBOL) < inputString += inChar; >else < lcd.setCursor(0, 0); lcd.print(inputString); // Выводим текст inputString = «»; >> > void setup() < Serial.begin(9600); Serial.println(«Hi Computer»); lcd.init(); // Инициализация lcd.backlight(); // Включаем подсветку lcd.print(«Ready to work»); // Выводим текст >void loop() // цикл

Я сделал здесь решетку ‘#’ в качестве символа завершения передачи пакета данных. Как только в потоке данных встречается символ #, данные выводятся на дисплей, и буфер обнуляется, при этом сам символ ‘#’ не выводится. Конечно, можно было бы использовать ‘n’ или др.

Далее мы напишем скрипт на Python, который будет выводить инфу на дисплей. Я выбрал Python, потому что это прикладной язык и он лучше всего подходит для подобных задач. С такими языками как C++/C# и т.п. больше возни с библиотеками, а здесь всё просто, особенно если это дело происходит под линуксом.

Первым делом устанавливаем необходимые библиотеки (для 2-ой или 3-ей версии python)

$sudo apt-get install python-serial

$sudo apt-get install python3-serial

Далее в интерпретаторе python пишем:

import serial ser = serial.Serial(«/dev/ttyUSB0») ser.baudrate = 9600 ser.write(‘ #’) # очищаем строку ser.write(«123; It’s work#») # выводим какие-либо данные

Здесь ардуина у меня подключена к порту /dev/ttyUSB0 — это я узнавал из Arduino IDE. Обычно она всегда на этом порту сидит, если других устройств на последовательный порт не подключено.

Как вы уже догадались, и в первой, и во второй программы должна быть указано одинаковая скорость в бодах. В моем случае это 9600 — стандартная, хотя и маленькая скрость. Может быть и больше (читай выше).

write()

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

Синтаксис

Serial.write(val, len)

Параметры

val — значение, строка или буфер для отправки.

len — размер буфера

Возвращаемые значения

Байт или количество отправленных байтов

serialEvent

Автоматически вызывается, когда есть доступные данные. Для захвата этих данных нужно воспользоваться функцией Serial.read().

Синтаксис

void serialEvent() < // statements >

Параметры

statements — любые корректные функции, позволяющие делать что-то с поступившими данными.

Железо

Стартовый набор с Arduino Mega и RFID

Стартовый набор с Arduino Mega и RFID Это расширенный стартовый набор. В комплект входит Arduino Mega R3, макетные платы, множество датчиков, управляемые механизмы и необходимые радиоэлектронные компоненты. Полный список.

Плата Arduino Uno R3

Плата Arduino Uno R3 Arduino Uno — плата на базе микроконтроллера ATmega328P с частотой 16 МГц. На плате есть все необходимое для удобной и быстрой работы.

Оцените статью
TutShema
Добавить комментарий