Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Связь chevron_right Serial Call and Response с ASCII-кодированием:握手-протокол между Arduino и компьютером

Serial Call and Response с ASCII-кодированием:握手-протокол между Arduino и компьютером

Передача нескольких переменных через последовательный порт с использованием метода запрос-ответ (handshaking) и ASCII-кодирования значений.

В этом уроке разберём строковый способ обмена данными между Arduino и компьютером по протоколу «запрос-ответ» (call-and-response, или handshaking). Такой подход гарантирует, что Arduino не будет «стрелять» данными вхолостую — она отправляет новую порцию значений только тогда, когда компьютер явно попросит об этом.

При старте скетч посылает ASCII-строку и повторяет её до тех пор, пока не получит ответ от компьютера. После «рукопожатия» Arduino начинает отправлять три значения датчиков в виде ASCII-чисел, разделённых запятыми и завершённых символами перевода строки (\n) и возврата каретки (\r). Затем она снова ждёт запроса.

Посмотреть отправляемые данные можно прямо в Serial Monitor Arduino IDE. Кроме того, их легко принять в Processing, Flash, PD, Max/MSP и других средах — примеры для Processing и Max/MSP приведены ниже.

Чем этот пример отличается от обычного Serial Call and Response

Сравните этот урок с Serial call and response example. Оба используют handshaking, но здесь значения датчиков кодируются как ASCII-строки, а не передаются как сырые байты. Это даёт два важных преимущества:

  • Значения больше 255 — ASCII-строка легко вмещает любое число, тогда как один байт ограничен диапазоном 0–255.
  • Читаемость — данные можно открыть в любом терминале и сразу увидеть осмысленные числа, а не загадочные байты.

Плата за это — чуть больший объём трафика: число 1023 занимает 4 байта в ASCII против 2 байт в бинарном виде. Для большинства задач это несущественно.

Необходимое оборудование

  • Arduino Board
  • 2 аналоговых датчика (потенциометр, фоторезистор, датчик давления FSR и т. п.)
  • тактовая кнопка
  • 3 резистора по 10 кОм
  • провода-перемычки
  • макетная плата

Необходимое программное обеспечение

Схема подключения

Подключите аналоговые датчики к пинам A0 и A1 через резисторы 10 кОм, образующие делители напряжения. Кнопку или переключатель подключите к цифровому пину 2 с резистором 10 кОм на GND (подтяжка к земле).

Схема подключения Arduino UNO к макетной плате с двумя датчиками давления и кнопкой

Принципиальная схема

На схеме: два датчика-резистора подключены к A0 и A1, два резистора 10 кОм формируют делители напряжения, кнопка с резистором 10 кОм — на пине 2

Код

Как это работает

  1. При включении Arduino отправляет строку-«маяк» и ждёт ответного байта от компьютера.
  2. Получив ответ, она считывает значения с A0, A1 и состояние кнопки на пине 2, формирует строку вида 512,768,1\r\n и отправляет её.
  3. После отправки Arduino снова замолкает и ждёт следующего запроса.
  4. Принимающая сторона (Processing, Max/MSP и т. д.) разбивает строку по запятым, преобразует фрагменты в числа и использует их по назначению.

Код для Processing

Скопируйте Processing-скетч из примера выше. По мере изменения аналогового датчика на экране будет перемещаться шарик — примерно так, как показано ниже. Шарик появляется только при нажатой кнопке:

Окно Processing-скетча SerialCallResponse: белый круг на чёрном фоне реагирует на положение датчиков

Код для Max/MSP

Патч Max/MSP выглядит следующим образом. Скопируйте текст из примера выше и вставьте его в новое окно Max:

Патч Max/MSP считывает данные с Arduino через последовательный порт и отображает круг, координаты и цвет которого задаются тремя значениями датчиков. Патч ждёт байт 65 (ASCII A) при старте, а затем отправляет ASCII A каждый раз, когда нужны новые данные.

Типичные ошибки и отладка

  • Ничего не приходит в Serial Monitor — убедитесь, что скорость порта в мониторе совпадает с той, что указана в Serial.begin() скетча.
  • Данные приходят один раз и останавливаются — скорее всего, принимающая сторона не отправляет ответный байт. Проверьте, что Processing-скетч или Max-патч действительно шлют байт обратно после каждого получения строки.
  • Строка выглядит обрезанной — убедитесь, что в Serial Monitor включён показ символов \r\n и что принимающая сторона ждёт именно символ перевода строки как признак конца пакета.
  • Значения прыгают или не соответствуют реальным — проверьте делители напряжения: резисторы 10 кОм должны быть подключены между пином датчика и GND, иначе пин «висит в воздухе».
  • В Processing шарик не двигается — убедитесь, что выбран правильный COM/tty-порт и что Arduino уже загружена со скетчем до запуска Processing.

Где пригодится

Метод call-and-response с ASCII-кодированием хорошо подходит для:

  • прототипирования интерактивных инсталляций (Processing, openFrameworks, TouchDesigner);
  • отладки — данные читаются в любом терминале без декодирования;
  • передачи значений, выходящих за пределы одного байта (например, показания АЦП 0–1023);
  • интеграции с музыкальными средами Max/MSP и Pure Data.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Также изучите language reference — подробный справочник по языку программирования Arduino.

Последнее обновление: 29.07.2015, SM