Как передать данные с ардуино на компьютер

Обновлено: 06.07.2024

При создании многоканальных систем регистрации данных, требуется передать относительно большое число измеренных параметров в персональный компьютер, где происходит их обработка и сохранение. Данная задача довольно просто решается на Ардуино (многоканальный вольтметр на Ардуино). Ограничением может быть разве что АЦП Ардуино, разрешения которого (10 бит) может оказаться не достаточно для решения некоторых задач. Поэтому, при необходимости, можно подключать внешний АЦП. Ведь любой электронный датчик преобразует измеряемую величину в напряжение электрического тока.

Проблема здесь заключается в том, что при большом числе измеряемых параметров и высокой частоте опроса датчиков (частоте дискретизации) необходимо успеть передать всю эту информацию через последовательный интерфейс RS-232 (и USB) в персональный компьютер. При текстовой передаче данных информационный пакет получается сильно раздутым и не фиксированной длины. Ведь каждый разряд десятичного числа передается в виде одного байта данных, а значит занимает один пакет протокола RS-232 (или UART микроконтроллера). Это очень не экономичный способ передачи, так как вместо 10…16 бит, требуется передать до 32 бит данных, не считая спецсимволов! Из-за этого могут возникнуть непрогнозируемые потери данных. Поэтому такой метод возможен для целей отладки и при небольшой числе передаваемых параметров.
В данной статье рассмотрим решение задачи построения многоканальной измерительной системы на Ардуино. Её задачами является:

  1. Измерение аналоговых сигналов с датчиков (подключение Ардуино);
  2. Кодирование измеренных параметров в набор бит;
  3. Отправка на персональный компьютер (ПК) в виде набора бит по интерфейсу USB (Ардуино serial);
  4. Получение данных в программе Lazarus и выделение из него отправленных чисел;
  5. Визуализация полученных чисел в форме графика в зависимости от времени;
  6. Сохранение в текстовый файл.

Надо отметить, что в Интернет данная информация разрозненна и сложно найти скомбинированную информацию по этой задаче!

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

Подключение Ардуино в среде Lazarus (язык pascal)

Сделано в последней на данный момент версии Lazarus 2.0.8 (в других вервиях возможны незначительное изменения)

Для доступа к последовательному порту будет использован модуль synaser. Файлы synaser.pas, synafpc.pas, synautil.pas, нужно поместить в папку с проектом.

Разработка интерфейса в Lazarus

Вначале необходимо создать пустой проект и настроить его в меню Проект -> Параметры проекта.
Сохранить проект в отдельной папке: Проект -> Сохранить проект как…
На форму поместить следующие элементы:

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

две серии tchart

Настройка исходного кода Pascal

Теперь нужно создать обработку событий в исходном коде программы.
Понадобятся три процедуры:

  1. Инициализации procedure TForm1.FormShow(Sender: TObject);
    В инспекторе объектов выбрать Form1 -> вкладка События -> OnShow (нажать …) Функция автоматически создается средой
  2. Обработка нажания на кнопку Старт procedure TForm1.StartBClick(Sender: TObject);
    На форме совершить двойное нажатие на кнопку StartB
  3. Обработка нажания на кнопку Стоп procedure TForm1.StopBClick(Sender: TObject);
    На форме совершить двойное нажатие на кнопку StopB

Для доступа к компонентам порта нужно дописать в раздел uses исходного кода модуля: synaser,jwawinbase, jwawinnt.

Затем нужно задать объект доступа к порту (ser: TBlockSerial;) и признак разрешения мониторинга порта (mon:boolean;). Все это объявляется в разделе глобальных переменных var (перед implementation).

Протокол передачи данных

Теперь необходимо принять протокол передачи информации. Например, такой:

Разработка функций обработки событий на Рascal

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

Полный исходный код Pascal модуля Lazarus с пояснениями представлен ниже:

Работа с Ардуино

Теперь нужно собрать тестовый макет на базе Ардуино. Здесь представлен пример на Arduino UNO, однако должно работать на всех базовых моделях.

Как подключить Ардуино к компьютеру. Бинарная передача сигнала.

Можно сделать подключение только одного датчика, а второй эмулировать программно.

Программирование Ардуино

В среде Arduino IDE необходимо создать новый проект: Файл -> Новый
Затем сохранить его: Файл -> Сохранить как…
Затем можно написать программу для микроконтроллера.
Данная программа должна через строго определенное время выполнять аналого-цифровое преобразование (АЦП) и отправлять посылку в порт по определенному выше протоколу. Внимание! Использование обычной задержки delay не обеспечивает пригодной точности задания частоты дискретизации.

Ниже представлен исходный код для Arduino, реализующий правильный алгоритм задания периода дискретизации. Он основан на вычислении времени, прошедшего с момента предыдущего измерения, привязавшись к внутреннему таймеру. Данный таймер стабилизирован кварцевым резонатором на плате Ардуино, поэтому достаточно точен.

После этого нужно подключить макет к персональному компьютеру и не забыть выбрать правильный порт Инструменты -> Порт, а также используемую версию Ардуино: Инструменты -> Плата.

Тестирование системы

Затем можно проверить программу в Lazarus (не забыв закрыть монитор порта!).

Здесь изображено подключение ардуино к потенциометру (датчик).

Arduino UNO подключена к потенциометру

Нажав Старт начнется мониторинг сигнала, нажав после на Запись, начнется регистрация в файл. По окончании нужно нажать на Стоп.

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

Если нажималась Запись, то в папке с проектом появится файл data.csv. Его можно открыть в текстовом редакторе или в табличном процессоре типа Excel.

Все работает!
Кстати, есть модифицированные варианты Ардуино, которые имеют более точный АЦП!
При возникновении вопросов, пишите в комментариях здесь или в сообществе ВК!

Последовательный интерфейс (serial) предназначен передачи данных через универсальный асинхронный порт UART. Порт UART очень часто используется для передачи данных с Ардуино на компьютер, и обратно, а также для связи нескольких плат ардуин между собой.

Для многопортовых DUE/MEGA см. здесь.

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

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

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

Serial.println(data) -- Передаёт данные в последовательный порт, сопровождая автоматическим возвратом каретки и переходом на новую строку.

Serial.print(data) -- тоже самое без возврата каретки и перехода на новую строку.

Serial.begin(скорость_передачи); -- Инициализация порта. Задает скорость передачи в битах в секунду. Нормированные скорости: 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, или 115200.

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

char = Serial.read(); -- Считывает следующий байт из буфера последовательного порта. возвращает -1 если нет входящих данных

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

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

Serial.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(str); // где str - строка для передачи, как последовательность байт

Serial.write(buf, len); // где buf - массив для передачи, как последовательность байт; len - длина массива.

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

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

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

serialEvent() -- функция вызывается автоматически, когда поступают данные.

Serial.setTimeout() -- задает максимальное время (в мс) для работы Serial.readBytesUntil();

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

1) auto-reboot DTR : возможна автоперезагрузка МК при передаче на него данных по serial-пору. Чтобы отключить это, надо поставить конденсатор 10мкФ между RES и GND. Я ставил электролитический кондер (естественно, + на RES).

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

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

Длина провода и скорость: RS-232 (англ. Recommended Standard 232) -- стандарт физического уровня для асинхронного интерфейса (UART).

Расстояние связи по RS232 максимум 15 метров.

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

Работа 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 ), которые используются в коде программы для работы с их методами. Всё просто! Например,

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

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

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

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

$sudo apt-get install python-serial

$sudo apt-get install python3-serial

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

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

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

В этом уроке мы подключим датчик барометрического давления BMP280 к Arduino и запишем результаты на компьютер, используя PuTTY.

О проекте

BMP280 будет подключен с использованием I2C. Мы будем собирать данные и записывать в файл временную метку смены, считывая время, прошедшее с момента запуска Arduino.

Файл будет записан в формате CSV (значения, разделенные запятыми), который часто используется, когда данные со сходной структурой сохраняются в файл или передаются по ссылке. Он совместим с программой MS Excel и может быть просто открыт в ней, чтобы удобно отобразить значения в столбцах и строках.

Используя PuTTY, мы создадим регистратор данных для BMP280, подключенного к Arduino. Как правило, регистратор данных - это электронное устройство, используемое для записи данных с датчиков во времени и их хранения для дальнейшего использования или анализа.

Putty (скачиваем, устанавливаем, настраиваем)

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

PuTTY - эмулятор терминала. В прошлом программисты вводили и считывали информацию с мейнфреймных компьютеров с терминалами.

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

Эмуляторы терминалов широко использовались для подключения к другим удаленным компьютерам до появления Интернета.


На этот раз сконцентрируйтесь сначала на получении программы Arduino, прежде чем запускать и находить данные, записываемые в окно вашего последовательного монитора. Запишите используемый порт в самой верхней части окна (например, COM12).

Закройте окно Serial, так как мы хотим открыть этот же порт в PuTTY. Не нужно беспокоиться, потому что Arduino будет продолжать отправлять данные в порт.

Теперь откройте PuTTY и нажмите «Session» в левой части окна. Введите com-порт (например, COM12) в поле «Последовательная линия» (Serial line) в правой части окна и выберите «Последовательный» (Serial).

С левой стороны выберите "Logging" (Ведение журнала), затем выберите "Printable output" (Вывод на печать) и, возможно, выберите "Always" (Всегда).

Хорошей идеей будет поместить расширение имени файла .csv (например, 'logging.csv'), чтобы MS Excel мог его сразу распознать.

Вернитесь в окно сеанса (Session) и в поле "Сохраненные сеансы" (Saved Sessions) введите свое имя или инициалы и нажмите "Сохранить" (Save). Делая это, каждый раз, когда вы открываете PuTTY, просто выберите Saved Session (Сохраненная сессия) и нажмите кнопку "Load" (Загрузить), и вам не придется делать всё это снова.

Чтобы начать регистрацию, просто нажмите кнопку "Open" (Открыть).

Подключаем BMP280 к Arduino

Для получения более подробной информации о том, как BMP280 работает с Arduino Uno, ознакомьтесь с нашим уроком по беспроводной связи между двумя ардуинами.

Теперь подключите компоненты с помощью инструкции ниже.

BMP280UNO
VCC3.3V
GNDGND
SCLA5
SDAA4
CSBНе используется
SDDНе используется

Наглядно схема соединений будет такой:


Установка библиотек

Библиотеку Adafruit BMP280 можно скачать с нашего сайта отсюда или с Github.

Скетч Ардуино

Скетч (эскиз) для Ардуино Уно скопируйте ниже:

Для этих эскизов я не использовал объект String (строка) Arduino. Серьезные программисты избегают этого на самом деле и предпочитают использовать символьные строки типа C (C-type). Подробнее о том, почему следует избегать объекта string мы поговорим в следующих уроках.

Функция loop() начинает работу с сброса dataStr до 0, чтобы обновить его, а затем получает метку времени с помощью функции millis() (количество миллисекунд, прошедших с момента нашего запуска). Теперь его нужно добавить в конец dataStr , за которым следует переменная, разделенная запятыми.

strcat() немного сбивает с толку, так как дает нечто подобное:

Но на самом деле буфер является временным хранилищем для хранения результата.

Если соединения выполнены правильно, в последовательном окне Arduino должно отображаться следующее:


На этот раз закройте окно последовательного порта Arduino (PuTTY не откроет порт, если Arduino держит его открытым). Откройте PuTTY и нажмите «Открыть».

После этого Arduino выйдет из последовательного порта, поэтому вы должны увидеть что-то вроде этого:


PuTTY дает вам возможность добавить или перезаписать ваш файл. После сохранения вы можете открыть файл в MS Excel.

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

Подготовка к работе

Большинство микроконтроллеров обладают множеством портов ввода-вывода. Для связи с ПК наиболее пригоден из них протокол UART. Это протокол последовательной асинхронной передачи данных. Для его преобразования в интерфейс USB на плате есть конвертор USB-RS232 – FT232RL.
Для выполнения примеров их этой статьи вам будет достаточно только Arduino-совместимая плата. Мы используем EduBoard. Убедитесь, что на вашей плате установлен светодиод, подключенный к 13му выводу и есть кнопка для перезагрузки.

Таблица ASCII

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

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

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

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

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

Обратите внимание на вот эту часть кода:

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

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

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

После того, как код будет загружен в память микроконтроллера, откройте монитор COM-порта. Введите один символ и нажмите Enter. В поле полученных данных вы увидите: “I received: X”, где вместо X будет введенный вами символ.
Программа бесконечно крутится в основном цикле. В тот момент, когда в порт записывается байт функция Serial.available() принимает значение 1, то есть выполняется условие Serial.available() > 0. Далее функция Serial.read() вычитывает этот байт, тем самым очищая буфер. После чего при помощи уже известных вам функций происходит вывод.
Использование встроенного в Arduino IDE монитора COM-порта имеет некоторые ограничения. При отправке данных из платы в COM-порт вывод можно организовать в произвольном формате. А при отправке из ПК к плате передача символов происходит в соответствии с таблицей ASCII. Это означает, что когда вы вводите, например символ “1”, через COM-порт отправляется в двоичном виде “00110001” (то есть “49” в десятичном виде).
Немного изменим код и проверим это утверждение:

После загрузки, в мониторе порта при отправке “1” вы увидите в ответ: “I received: 110001”. Можете изменить формат вывода и просмотреть, что принимает плата при других символах.

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

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

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

Читайте также: