arduino_s_04

Вопросы и ответы

Считываем состояние кнопки

Сборка схемы

Мы отображаем данные о состоянии кнопки на мониторе последовательного интерфейса. Кнопка подключается по схеме PULL DOWN. На выходе будет 1 — если кнопка нажата, и 0 — если отпущена.

Switch Case

Эта конструкция аналогична if else. Но пользоваться им гораздо удобнее, когда у вас много вариантов запуска программы. Это работает вот так. Переменная, поступающая на вход switch (), сравнивается с параметрами в case, и выполняется фрагмент кода, удовлетворяющий условию.

Теперь переменная i сравнивается с каждым случаем, и активируется часть кода, соответствующая условию.

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

Изменить график нажатия кнопки дела
Изменить график нажатия кнопки дела

Получение ввода

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

Нахождение конца строки

Строка — это серия символов. Чтобы прочитать строку из окна монитора порта в Arduino, нам нужно знать, когда линия заканчивается. Один из способов сделать это — вставить символ новой строки в конец строки. Символ новой строки — это непечатаемый символ ASCII с именем «перевод строки» в таблице управляющих кодов ASCII».

Символ перевода строки имеет десятичное значение, но может быть записан как ‘ n’.

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

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

Перед рисованием убедитесь, что в окне монитора порта Arduino установлено значение New Line, как показано на этом изображении:

Новая линия из окна монитор двери

Если для окна Port Monitor установлено значение Newline, символ новой строки будет следовать за тем, что введено в поле Send окна Port Monitor.

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

Этот код проверяет наличие символа новой строки, представленного ‘ n’, и печатает «Новая строка» в окне монитора порта, если он обнаружен.

Чтение строки

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

Каждый отдельный символ строки берется так же, как и в предыдущих набросках, и сохраняется в переменной rx_byte.

Если символ не равен символу новой строки, он добавляется к объекту String rx_str

Строка кода rx_str + = rx_byte; такой же как:

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

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

Получение числа

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

В следующем эскизе проверяется, являются ли полученные символы числовыми, а затем число преобразуется в целое число.

Создание строки

Строка состоит из полученных символов, как это было сделано в предыдущем наброске. Если полученный символ не является номером символа, not_number устанавливается в значение true, чтобы «отметить», что был получен нечисловой символ.

Использование логического флага

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

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

Обработка строки

Если все полученные символы были числами, строка преобразуется в целое число с помощью rx_str toInt (), умноженного на 2, и результат сохраняется в переменной результата. Результат расчета затем распечатывается в окне Port Monitor.

Управление устройством через COM-порт

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

Когда символ «H» отправляется на COM-порт, светодиод на 13-м контакте горит, а когда отправляется «L», светодиод гаснет.
Если по результатам приема данных из COM-порта вы хотите, чтобы программа выполняла различные действия в основном цикле, вы можете проверить условия в основном цикле. Например:

Если монитор порта отправляет значение «1», светодиод будет мигать с частотой 5 Гц. Если вы отправите «0», частота изменится на 1 Гц.

Отправка команд с ПК

Перед тем как это сделать, вы должны иметь представление о том, как работает COM-порт.
Прежде всего, вся подкачка происходит через буфер памяти. То есть, когда вы отправляете что-то с ПК на устройство, данные помещаются в специальный раздел памяти. Как только устройство готово, оно считывает данные из буфера. Функция Serial.avaliable () позволяет вам проверять состояние буфера. Эта функция возвращает количество байтов в буфере. Чтобы прочитать эти байты, используйте функцию Serial.read (). Давайте посмотрим, как работают эти функции на примере:

После того, как код был загружен в память микроконтроллера, откройте монитор COM-порта. Введите символ и нажмите Enter. В поле полученных данных вы увидите: «Я получил: X», где вместо X будет введенный вами символ.

Программа работает в основном цикле бесконечно. Когда байт записывается в порт, функция Serial.available () принимает значение 1, то есть выполняется условие Serial.available ()> 0. Затем функция Serial.read () считывает этот байт, удаляя так что буфер. Далее с помощью уже известных функций происходит вывод.

Использование монитора COM-порта, встроенного в IDE Arduino, имеет некоторые ограничения. При отправке данных с карты в COM-порт вывод можно организовать в произвольном формате. А при отправке с ПК на карту символы передаются согласно таблице ASCII. Это означает, что когда вы вводите, например, символ «1», «00110001» (т.е. «49» в десятичном формате) отправляется через COM-порт в двоичном формате).

Давайте немного подправим код и проверим это объявление:

После загрузки в мониторе порта при отправке «1» вы увидите в ответ: «Я получил: 110001». Вы можете изменить формат вывода и посмотреть, что карта принимает с другими символами.

Пакетная передача данных

Что, если нам нужно построить график в масштабе от 0 до 1024? или даже больше, от -1000000 до 1000000 И вы все еще задаетесь вопросом, как передавать данные с двух или трех датчиков одновременно? Нам нужен другой способ передачи данных. Метод, при котором данные добавляются в виртуальный пакет в определенном порядке, а затем отправляются получателю, который расширяет пакет. По сути, такой способ передачи данных называется пакетной передачей. Весь Интернет и большинство промышленных линий связи работают на основе пакетов.

SFMonitor использует библиотеку SerialFlow для передачи пакетов. Эта библиотека позволяет вам указать формат пакета и предоставляет функции для сжатия данных в пакете и их распаковки.

Напишем программу для Arduino, которая будет передавать показания акселерометра ADXL345 для всех трех осей в диапазоне от -32768 до 32767.

Чтобы позволить SFMonitor отображать три графика, настройте следующие параметры:

  • Формат данных — выберите v (t);
  • Stream — отметьте галочкой все три;
  • Размер значения в пакете — 2 байта;
  • Беззнаковые значения: устанавливаются для всех трех потоков.

После запуска монитора мы получаем следующие три графика:

Настройте SFMonitor. Данные акселерометра из COM-порта Arduino

Считывание данных из монитора последовательного интерфейса и управление светодиодом

Сборка схемы

Считываем данные с дверного монитора. Для их сохранения мы используем переменную данных типа char. Поскольку вводимые вами команды не сохраняются автоматически в мониторе порта, мы сами выполним их, используя команду Serial.print().

  • Если data == 1, то светодиод включается.
  • Если date == 0, выключите его.

Плоттер

В дополнение к монитору последовательного порта в Arduino IDE есть плоттер, графическое устройство в реальном времени, основанное на данных последовательного порта. Достаточно отправить значение через команду Serial.println (value) и открыть плоттер через последовательное соединение, например, мы сообщим значение с аналогового вывода A0:


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

Значения выводятся каждые 10 миллисекунд, а значения обновляются каждые 300 миллисекунд. Получаем следующий график:
Начиная с версии 1.8.10, в Arduino IDE добавлена ​​возможность подписывать графики, для этого перед их просмотром вам нужно отправить имена в виде name 1, name 2, name n с разрывом строки, а затем просто просмотреть данные:

Управляющие символы

Существуют так называемые управляющие символы, позволяющие форматировать вывод. Их около десятка, но вот самые полезные

  • n — новая строка
  • r — возврат каретки
  • v — вертикальная табуляция
  • t — горизонтальная табуляция

Кроме того, если вы хотите использовать одинарные или двойные кавычки для вывода «или обратную косую черту «, вам необходимо вывести их, используя соответствующий специальный символ, иначе вывод будет «сломанным», я думаю, нет необходимости объяснять, почему:

  • «- цитаты
  • ‘- апостроф
  • — обратная косая черта
  • 0 — нулевой символ
  • ? — Вопросительный знак

Как использовать? Просто напишите на выходе. Например, комбинация r n переместит строку и вернет курсор в левую позицию:

Так работает функция println (), кстати, она просто добавляет вывод r n после print () =) Символы табуляции позволят вам удобно отправлять данные для последующей вставки в Excel или другие таблицы. Например, мы показываем несколько степеней двойки в табличной форме с помощью символа табуляции t:

Скопируйте и вставьте результат в Excel
Комфортный!

Таблица ASCII

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

В переменном символе хранится код символа. Таблица начинается с 33 и заканчивается 126, поэтому символу изначально присвоено значение 33.
Функция Serial.begin () используется для запуска операции порта UART. Единственный его параметр — скорость. Необходимо заранее согласовать скорость на отправляющей и принимающей сторонах, так как протокол передачи асинхронный. В этом примере скорость 9600 бит / с.
Для записи значения в порт используются три функции:

  1. Serial.write () — записывает двоичные данные в порт.
  2. Serial.print () может иметь много значений, но все они служат для отображения информации в удобочитаемом формате. Например, если информация, указанная в качестве параметра передачи, выделена в кавычках, терминальная программа отобразит ее без изменений. Если вы хотите вывести какое-либо значение в определенной системе счисления, необходимо добавить служебное слово: BIN — двоичный, OCT — восьмеричный, DEC — десятичный, HEX — шестнадцатеричный. Например, Serial.print (25, HEX).
  3. Serial.println () делает то же самое, что и Serial.print (), но также переводит строку после того, как информация напечатана.

Чтобы убедиться, что программа работает, на вашем компьютере должна быть установлена ​​программа терминала, которая принимает данные из COM-порта. В Arduino IDE уже есть встроенный. Для его вызова выберите в меню Инструменты-> Дверной монитор. Окно утилиты очень простое:

Дверной монитор

Теперь нажмите кнопку перезапуска. МК перезагрузится и отобразит таблицу ASCII:

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

Управление светодиодом с клавиатуры

Напишем пример управления встроенным светодиодом с клавиатуры. При нажатии клавиши 1 светодиод должен включиться, при нажатии клавиши 0 светодиод должен погаснуть.

Часть кода нам уже знакома: мы используем светодиод номер 13.

Сигнал с компьютера поступает в виде байтов. Для этого создадим новую переменную incomingByte.

Последовательный порт включается командой begin () с указанной скоростью.

Если от компьютера получен сигнал, функция available () вернет количество байтов, доступных для чтения. Итак, мы просто убеждаемся, что пришел сигнал (больше нуля).

После первой проверки проверяем введенный символ, который также может быть представлен в виде байта. Если символ равен единице, включите светодиод, как мы это делали раньше. Если символ равен 0, выключите его.

Как это выглядит на практике. Скомпилируйте скетч и запустите Serial Monitor (Ctrl + Shift + M). Окно Serial Monitor имеет текстовое поле вверху. Введите цифры 1 или 0 и нажмите кнопку «Отправить». Вы также можете нажать клавишу Enter для быстрого ввода.

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

Функция Serial.end () закрывает последовательное соединение, порты RX и TX освобождаются и могут использоваться для ввода-вывода.

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

Если вам больше не нужно получать данные, закройте окно Serial Monitor.

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

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

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

Вывод: 0 50 68 85 15 214 63 254 — элементы массива, разделенные пробелами! Проблемы возникают при попытке получить данные по порту. Дело в том, что метод read () считывает символ, даже если вы отправляете длинное число — программа будет получать его по одной цифре за раз, и вам придется вручную набирать номер из цифр. Проблема усугубляется тем, что read () читает именно символ, то есть код символа в таблице ASCII.
Давайте посмотрим на этот пример, где полученные в нем данные (так называемое эхо) отправляются в порт):

void setup () {Serial.begin (9600); } void loop () {если (Serial.available ()) {Serial.println (Serial.read ()); // вернется на порт 49, если отправлено 1 // выдаст 97, если отправлено на (англ.) } }

Так как именно принять номер? Есть уловка: вычесть числовой код 0 из полученного кода символа или сам 0 как символ: ‘0’

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

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

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

Другие варианты

Чтение данных из последовательного порта возможно и другими способами. Ищите расширения, такие как Arduino Chrome Serial Monitor. В видео показано, как самому создать пристройку.

Вы также можете написать приложение на C #, которое может читать данные.

Processing также умеет работать с последовательным портом.

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

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

Возможные проблемы

1) Автоматическая перезагрузка DTR: вы можете автоматически перезагружать MC при передаче на него данных в последовательном режиме. Чтобы выключить его, поместите конденсатор 10 мкФ между RES и GND. Поставил электролитический конденсатор (конечно + на РЭС).

Пример 1. Передача данных по Serial-порту с Arduino на компьютер

Инициализация порта на скорости 9600 бот и передача данных (с Arduino на внешние устройства, например на компьютер):

Видео

Как соединить две ардуины по UART (serial) порту

Схема соединения двух ардуин:

  • 1-й —- 2
  • GND <—> GND
  • RX <—> TX
  • TX <—> RX

Длина и скорость кабеля: RS-232 (рекомендуемый стандарт 232) — это стандарт физического уровня для асинхронного интерфейса (UART).

Максимальное расстояние связи RS232 15 метров.

Но все зависит от скорости.

Основные функций для работы с последовательным портом (Serial)

Serial.begin (скорость) — открывает последовательный порт и устанавливает скорость последовательной передачи данных. Типичная скорость передачи данных для компьютерной связи составляет 9600 бод.

Очевидно, что когда последовательный порт включен, контакты 0 (RX) и 1 (TX) не могут использоваться для каких-либо других целей.

Serial.println (данные) — отправляет данные в последовательный порт с последующим переносом слов и новой строкой.

Serial.print (data) — тоже самое без возврата каретки и новой строки.

count = Serial.available (); — Байты, полученные через последовательный порт, попадают в буфер микроконтроллера, откуда ваша программа может их прочитать. Функция возвращает количество байтов, накопленных в буфере. В последовательном буфере может храниться до 128 байт.

Serial.flush (); — Ожидает окончания передачи выходных данных (до Arduino 1.0 функция очищала буфер последовательного соединения)..

Разные варианты функции print:

Серийный принт (b, DEC); — вывести строку ASCII — десятичное представление числа b.

Serial.print (b, BYTE) — выводит младший байт числа b.

(аналогично HEX, OCT, BIN).

Serial.print (str) // если str является строкой или символьным массивом, передать str в COM-порт по байтам.

Serial.println (); — разница в том, что после данных выводятся два дополнительных символа: символ возврата каретки (ASCII 13 или ‘ r’) и символ новой строки (ASCII 10 или ‘ n’).

Функция write:

Serial.write (uint8_t c); — Записывает данные в последовательный порт. Данные отправляются в виде байта или последовательности байтов.

Serial.write (val); // где val — это переменная, которая должна быть передана в виде одного байта

Serial.write (ex); // где str — строка, которая должна быть передана как последовательность байтов

Serial.write (buf, len); // где buf — массив, который нужно передать как последовательность байтов; len — это длина массива.

Читайте также: Программирование ESP8266 на Arduino IDE: прошивка и настройка

Оцените статью
Блог про Arduino