Какие действия нужно предпринять чтобы читать на компьютере данные с arduino

Обновлено: 03.07.2024

В этом уроке мы подключим датчик барометрического давления 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.

Для демонстрации сбора статистики я с помощью ультразвукового датчика HC-SR04 фиксирую, когда коллеги проходят перед моим рабочим столом. Некоторую полезную информацию как скрестить Arduino, Processing и R я взял отсюда.

Arduino

image

Вот схема для Arduino Uno

Если кто-то проходит перед столом срабатывает спикер (и лампочка).

Скетч для Arduino находится здесь.

Нужно учесть несколько моментов

  1. Используется библиотека NewPing, ее нужно проинсталлировать в вашу Arduino среду и перезапустить IDE
  2. Чтобы минимизировать ложные срабатывания, я проверяю наличие сигнала несколько раз. См. функцию pingConfirms. В общем-то надежность срабатывания все еще не идеальна, то срабатывает по нескольку раз за один проход, то пропускает проходы. Но для нашей цели это не очень важно
  3. Обратите внимание на константу MAX_DISTANCE, она задает максимальное расстояние до которого срабатывает датчик.
  4. Самый важный момент: данные на компьютер передаются через серийный порт. Чтобы отличить дебажный вывод перед данными я вывожу "$data:", этот текст я воспринимаю как маркер данных, которые будут добавляться к CSV файлу, поэтому если данных несколько, можно их разделить запятой
  5. В нашем случае в качестве данных передается расстояние в сантиметрах, но рельно нас это значение не будет интересовать, мы будем группировать по количеству

Processing

В этом проекте Processing 2 я буду использовать исключительно для считывания данных с серийного порта (USB) и дописывание их в CSV файл. Вы можете также использовать Processing для визуализации своих данных, но здесь графики я буду рисовать с помощью R.
Среда Processing очень похожа на среду Arduino, но язык Java-подобный. Универсальный скетч для считывания данных с Arduino здесь.
Вам нужно сначала запустить скетч, он выведет в консоль список всех доступных сериальных портов, найдите порт, на котором работает Arduino, возьмите его порядковый номер (нумерация начинается с нуля) и пропишите его в константу mySerialPort. Обратите также внимание, куда пишутся данные

Функция sketchPath создаст путь относительно папки в которой находится скетч. Если файл нет он создастся, если уже есть в него будут добавляться строки. Автоматически первым элементом в каждой строке CSV файла будеть timestamp (колличество миллисекунд после 1970-01-01).

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

ArduinoServo1_bb
ArduinoServo1_схема
ArduinoServo1_foto

Рассмотренный в статье Arduino. Управление сервоприводом, на примере SG90 скетч. По мне не очень интересен, так как не даёт полного представления о том, для чего использовать сервопривод. А серво привод это не просто туда сюда, это точные сильные движения. За одно мы рассмотрим, как взаимодействовать с платой Arduino через USB.

Рассмотрим следующий скетч:

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

Рассмотрим данный скетч:

Нам так же понадобится библиотека Servo.h

Мы объявляем так же переменные:

С объектом Servo myservo. И переменная pos в которую мы будем записывать позицию, на которую надо установить сервопривод.

Так же нам понадобится переменная

Сюда мы будем заносить данные поступающие с порта USB на плату.

Мы так же задаём, что общаться с серво приводом мы будем через 9 ножку (myservo.attach(9);)

Все действия с портом USB проходят через объект Serial. Функция объекта Serial begin() выставляет скорость передачи данных по порту usb. в нашем случае begin(9600) означает, что скорость передачи данных с портом USB будет 9600 бод(бит/c).

Дальше начинается самое интересное, блок loop:

Конструкция if(если выполняется условие). В нашем случае Serial.available() возвращает кол-во байт доступных для чтения. соответственно если их больше нуля, выполняем блок кода внутри if.

соответственно если мы ожидаем только цифры и какое нибудь значение обозначающее окончание ввода, то можно из кода вводимого символа вычесть 48 и у нас будет цифровое значение.

Данное значение мы помещаем в переменную incomingByte.

То есть в переменной incomingByte будет находится либо цифра или число большее 10 или меньшее 0.

if (incomingByte>=0 and incomingByte<=9) else

тоесть если incomingByte больше или равно 0 и меньше или равно 9 то это число. Рассмотрим что мы будем делать если во входящем байте закодирована цифра:

мы умножаем значение позиции pos на 10 и прибавляем знчение цифры. По сути прибавляем новое число с права. например если сейчас pos=1 и мы ввели 2 то pos=12.

Платформа Arduino – это один из самых простых путей погрузиться в мир микроконтроллеров и попробовать самому их программировать. Но однако и на этом пути вас могут подстерегать различные ошибки. Некоторые из них устранить очень просто, а на устранение других у вас могут уйти целые дни. В этой статье мы рассмотрим 10 самых распространенных ошибок при работе с платформой Arduino и способы их устранения.

10 самых распространенных ошибок при работе с Arduino

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

1. Плата Arduino не распознается

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

Плата Arduino не распознается компьютером

Решение

Эта проблема обычно случается когда вы используете не оригинальную плату Arduino, а ее дешевые клоны, обычно китайского производства. В этих клонах Arduino вместо стандартного для оригинальных плат Arduino FTDI чипа (FT232RL) используется более дешевый чип CH340g (для преобразования USB в последовательный интерфейс). Драйверы для стандартного чипа FT232RL уже содержатся в установочном пакете Arduino IDE, поэтому при ее установке они также автоматически устанавливаются на ваш компьютер. А чтобы использовать клон платы Arduino с чипом CH340g вам необходимо предварительно скачать и установить драйвер для этого чипа – скачать его можно по следующей ссылке. Установка его крайне простая – я думаю, она не вызовет у вас никаких затруднений.

Установка драйвера для чипа CH340g

После его установки вы сможете увидеть в диспетчере устройств, к какому COM порту подключена ваша плата Arduino.

2. Плата не синхронизируется

Решение

Ошибка синхронизации resp = 0x00 является общим ответом (ошибкой) на все проблемы, связанные с некорректной работой микроконтроллера Atmega (или вообще его неработоспособным состоянием), являющегося "сердцем" платы Arduino. Соответственно, причин этой ошибки может быть достаточно много. Мы рекомендуем вам выполнить следующую последовательность шагов чтобы попробовать устранить эту проблему:

  1. Убедитесь в том, что ничего не подключено к цифровым контактам 0 и 1 платы Arduino (включая шилды).
  2. Убедитесь в том, что в настройках Arduino IDE вы выбрали правильный тип платы и правильный COM порт.
  3. Пару раз нажмите кнопку сброса на плате Arduino и попробуйте после этого загрузить в нее код программы.
  4. Если не помогло, то отключите и заново подсоедините плату Arduino к компьютеру.
  5. Закройте и снова запустите Arduino IDE.

Если ничего из перечисленного не помогло, то попробуйте подключить к своему компьютеру другую плату Arduino или же подключите вашу плату Arduino к другому компьютеру. Если вы обнаружите, что проблема в компьютере, то переустановите Arduino IDE. Иногда бывает и так, что Arduino IDE из Windows работает с глюками, а из другой операционной системы на этом же компьютере работает без проблем. Также встречаются энтузиасты, которые устанавливают Arduino IDE в операционную систему от платы Raspberry Pi, то есть работают с Arduino IDE на компьютере, который состоит из платы Raspberry Pi и монитора – они говорят, что в этом случае Arduino IDE работает гораздо лучше чем из под Windows. Также, если не хотите менять компьютер или операционную систему на нем, вместо Arduino IDE можно попробовать использовать аналогичные инструменты - оболочку PlatformIO или Arduino Web Editor (официальный онлайн инструмент, его не нужно устанавливать).

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

3. Код программы не начинает исполняться при нажатии кнопки сброса (Reset)

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

Решение

Описанная проблема может возникать по достаточно большому количеству причин.

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

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

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

4. Invalid Device Signature Error (ошибка подписи)

Ошибка подписи при работе с платой Arduino

Эта ошибка возникает при попытке загрузки кода программы в плату Arduino, тип которой отличается от той платы, которую вы выбрали в настройках Arduino IDE. Ошибка возникает из-за того, что подпись устройства (device signature) на используемой плате отличается от подписи того типа платы, которую вы выбрали в Arduino IDE.

Решение

Выбрать правильный тип платы Arduino в настройках Arduino IDE. Если это не помогает, то можно попробовать прошить плату последней версией загрузчика Arduino (Arduino bootloader).

5. Ошибка запуска (Launch4j Error)

Ошибка запуска Arduino IDE

Arduino IDE необходимо некоторое время для того чтобы запуститься и если после ее запуска вы на что-нибудь кликаете, то возникает ошибка Launch4J error как показано на представленном рисунке. Launch4j – это инструмент, который используется для упаковки (wrapping) приложений Java в программной среде Windows, который позволяет им исполняться как обычным программам Windows.

Arduino IDE написана на JAVA и эта ошибка возникает из-за несовместимости библиотеки Java Run Time Environment (JRE), поставляемой вместе с Arduino IDE.

Решение

Часто решить эту проблему удается простым выключением Bluetooth или WiFi на вашем компьютере. Если это не помогает, то более сложным вариантом решения данной проблемы является замена библиотеки JRE в Arduino IDE на ее последнюю версию.

6. Последовательный порт уже используется (Serial Port Already in Use)

Ошибка повторного использования последовательного порта в Arduino IDE

Одна из самых простых проблем для решения. Она обычно происходит когда вы пытаетесь загрузить код программы в плату Arduino в то время когда открыто окно монитора последовательной связи (serial monitor) (но эта проблема в последних версиях Arduino IDE уже устранена) или вы пытаетесь его открыть во время обмена информацией между Arduino IDE и платой Arduino, или вы пытаетесь в это время использовать этот же самый COM порт для связи с другим устройством. То есть данная проблема возникает тогда, когда вы пытаетесь использовать последовательный порт одновременно для двух вещей.

Решение

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

7. Скетч успешно загружен, но ничего не происходит

Решение

  1. Убедитесь в том, что тип выбранной в настройках Arduino IDE платы совпадает с типом платы, в которую вы загрузили программу.
  2. Также подобная ошибка может быть вызвана тем, что размер загружаемого в плату скетча превышает объем ее памяти для хранения программ. Уменьшите объем скетча или используйте плату Arduino с большим объемом памяти.
  3. Еще одной причиной подобной ошибки может быть сильная зашумленность цепей питания. Убедитесь в том, что питающее напряжение, подаваемое на плату, достаточно стабильно.

8. Неизвестная ошибка связи (Unsatisfied Link Error)

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

Решение

Для решения этой проблемы найдите файл comm.jar или jcl.jar в папке /System/Library/Frameworks/JavaVM.framework/ или в папках на вашем компьютере, относящимся к переменным окружения CLASSPATH или PATH.

9. Размер скетча слишком большой (Sketch Too Large)

Ошибка слишком большо размера скетча при работе с Arduino

Эта ошибка происходит когда размер кода программы больше чем объем перепрограммируемой памяти (flash memory, памяти для хранения программ) используемой вами платы Arduino. К примеру, объем этой памяти в плате Arduino Uno составляет 32 Кбайта, из которых 2 Кбайта заняты загрузчиком. Если вы попытаетесь загрузить в данную плату скетч объемом более 32 Кбайт, то увидите подобную ошибку.

Решение

Для решения этой проблемы модно использовать следующие способы уменьшения объема кода программы:

  1. Там, где это возможно, используйте целые типы данных (integer) вместо вещественных (float).
  2. Там, где это возможно, используйте при объявлениях переменных спецификатор “const”.
  3. Подключайте в программу только те библиотеки, которые вы будете использовать. Там, где это возможно, используйте облегченные версии используемых библиотек.
  4. Используйте специальные алгоритмы и другие способы уменьшения объема кода программы.

Более радикальным решением этой проблемы является смена платы Arduino на плату с большим объемом памяти. Например, плату Arduino Uno можно заменить на плату Arduino Mega, или даже на плату Arduino Due.

10. Ошибка переполнения стека (java.lang.StackOverflowError)

Иногда плата Arduino не может выполнить программы, в которых используется некорректная работа со строками, например, у строковых переменных пропущены кавычки в некоторых выражениях (или функциях).

Решение

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

В данной статье мы рассмотрели 10 самых распространённых ошибок при работе с Arduino. Разумеется, реальное число ошибок, которые могут возникать при работе с платами Arduino, гораздо больше чем 10, однако мы попытались в этой статье рассмотреть самые распространённые из них. Если у вас возникает какая либо ошибка, которая не рассмотрена в данной статье, можете описать ее в комментариях и мы попробуем вместе с вами ее решить.

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