Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Связь chevron_right Physical Pixel: управление светодиодом через Serial

Physical Pixel: управление светодиодом через Serial

Управляйте светодиодом на Arduino, отправляя символы H и L через последовательный порт из Processing, Max/MSP или монитора порта.

В этом уроке Arduino получает команды от компьютера через последовательный порт и управляет светодиодом: символ 'H' включает его, символ 'L' — выключает.

Отправить команду можно из встроенного монитора порта Arduino IDE, а также из сторонних программ: Processing (код приведён ниже), Max/MSP, PD или Flash (через serial-net прокси). Это классический пример двусторонней коммуникации между компьютером и микроконтроллером.

Необходимое железо

  • Светодиод (опционально)
  • Резистор 220 Ом (опционально)

Необходимое ПО

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

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

Схема подключения: светодиод с резистором подключён к выводу 13 платы Arduino UNO через макетную плату.

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

Принципиальная схема: светодиод и резистор 220 Ом подключены к выводу 13 Arduino UNO.

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

Скетч постоянно проверяет, есть ли данные в буфере Serial. Как только приходит байт, программа читает его и сравнивает с символами 'H' и 'L':

  • 'H' (ASCII 72) → digitalWrite(ledPin, HIGH) — светодиод включается;
  • 'L' (ASCII 76) → digitalWrite(ledPin, LOW) — светодиод выключается.

Всё остальное игнорируется. Именно поэтому важно отправлять символы в верхнем регистре — строчные 'h' и 'l' не сработают.

Код

/*

  Physical Pixel

  Пример использования платы Arduino для приёма данных от компьютера.

  Плата включает светодиод при получении символа 'H' и выключает его

  при получении символа 'L'.

  Данные можно отправлять через Serial Monitor Arduino или другие программы,

  например Processing (см. код ниже), Flash (через serial-net proxy), PD или Max/MSP.

  Схема:

  - светодиод подключён от цифрового пина 13 к GND

  создан в 2006 году

  автор David A. Mellis

  изменён 30 Aug 2011

  авторы Tom Igoe и Scott Fitzgerald

  Код примера находится в открытом доступе.

  https://www.arduino.cc/en/Tutorial/PhysicalPixel

*/

const int ledPin = 13; // пин, к которому подключён светодиод
int incomingByte;      // переменная для хранения входящих данных по Serial

void setup() {

  // инициализация Serial:

  Serial.begin(9600);

  // инициализация пина светодиода как выхода:

  pinMode(ledPin, OUTPUT);
}

void loop() {

  // проверяем, есть ли входящие данные по Serial:

  if (Serial.available() > 0) {

    // читаем старший байт из буфера Serial:

    incomingByte = Serial.read();

    // если это заглавная H (ASCII 72) — включаем светодиод:

    if (incomingByte == 'H') {

      digitalWrite(ledPin, HIGH);

    }

    // если это L (ASCII 76) — выключаем светодиод:

    if (incomingByte == 'L') {

      digitalWrite(ledPin, LOW);

    }

  }
}

/* Код Processing для этого примера

  // Мышь над Serial

  // Показывает, как отправлять данные на плату Arduino I/O,

  // чтобы включать свет, когда мышь над квадратом, и выключать, когда нет.

  // создан в 2003–4

  // основан на примерах Casey Reas и Hernando Barragan

  // изменён 30 Aug 2011

  // автором Tom Igoe

  // Код примера находится в открытом доступе.

  import processing.serial.*;

  float boxX;

  float boxY;

  int boxSize = 20;

  boolean mouseOverBox = false;

  Serial port;

  void setup() {

    size(200, 200);

    boxX = width / 2.0;

    boxY = height / 2.0;

    rectMode(RADIUS);

    // Выводим список всех доступных Serial-портов в консоль.

    // Нужно выбрать порт, к которому подключена плата Arduino.

    // Первый порт в списке — #0, третий — #2.

    // Если используется Processing 2.1 или новее, применяйте Serial.printArray()

    println(Serial.list());

    // Открываем порт, к которому подключена плата Arduino (в данном случае #0)

    // Убедитесь, что скорость порта совпадает со скоростью Arduino (9600bps)

    port = new Serial(this, Serial.list()[0], 9600);

  }

  void draw() {

    background(0);

    // Проверяем, находится ли курсор над квадратом

    if (mouseX > boxX - boxSize && mouseX < boxX + boxSize &&

        mouseY > boxY - boxSize && mouseY < boxY + boxSize) {

      mouseOverBox = true;

      // рисуем рамку вокруг квадрата и меняем его цвет:

      stroke(255);

      fill(153);

      // отправляем 'H', чтобы сообщить, что мышь над квадратом:

      port.write('H');

    }

    else {

      // возвращаем квадрат в неактивное состояние:

      stroke(153);

      fill(153);

      // отправляем 'L', чтобы выключить светодиод:

      port.write('L');

      mouseOverBox = false;

    }

    // Рисуем квадрат

    rect(boxX, boxY, boxSize, boxSize);

  }

*/

/* Патч Max/MSP версии 5 для работы с этим примером:

----------begin_max5_patcher----------

1672.3oc2ZszaaiCD9ryuBBebQVCQRYao8xhf1cQCPVfBzh8RRQ.sDsM2HSZ

HQmlzh9eu7gjsjsEk7y0oWjiHoHm4aluYHGlueUmtiDuPy5B9Cv8fNc99Uc5

XZR2Pm726zcF4knDRlYXciDylQ4xtWa6SReQZZ+iSeMiEQR.ej8BM4A9C7OO

kkAlSjQSAYTdbFfvA27o2c6sfO.Doqd6NfXgDHmRUCKkolg4hT06BfbQJGH3

5Qd2e8d.QJIQSow5tzebZ7BFW.FIHow8.2JAQpVIIYByxo9KIMkSjL9D0BRT

sbGHZJIkDoZOSMuQT.8YZ5qpgGI3locF4IpQRzq2nDF+odZMIJkRjpEF44M3

A9nWAum7LKFbSOv+PSRXYOvmIhYiYpg.8A2LOUOxPyH+TjPJA+MS9sIzTRRr

QP9rXF31IBZAHpVHkHrfaPRHLuUCzoj9GSoQRqIB52y6Z.tu8o4EX+fddfuj

+MrXiwPL5+9cXwrOVvkbxLpomazHbQO7EyX7DpzXYgkFdF6algCQpkX4XUlo

hA6oa7GWck9w0Gnmy6RXQOoQeCfWwlzsdnHLTq8n9PCHLv7Cxa6PAN3RCKjh

ISRVZ+sSl704Tqt0kocE9R8J+P+RJOZ4ysp6gN0vppBbOTEN8qp0YCq5bq47

PUwfA5e766z7NbGMuncw7VgNRSyQhbnPMGrDsGaFSvKM5NcWoIVdZn44.eOi

9DTRUT.7jDQzSTiF4UzXLc7tLGh4T9pwaFQkGUGIiOOkpBSJUwGsBd40krHQ

9XEvwq2V6eLIhV6GuzP7uzzXBmzsXPSRYwBtVLp7s5lKVv6UN2VW7xRtYDbx

7s7wRgHYDI8YVFaTBshkP49R3rYpH3RlUhTQmK5jMadJyF3cYaTNQMGSyhRE

IIUlJaOOukdhoOyhnekEKmZlqU3UkLrk7bpPrpztKBVUR1uorLddk6xIOqNt

lBOroRrNVFJGLrDxudpET4kzkstNp2lzuUHVMgk5TDZx9GWumnoQTbhXsEtF

tzCcM+z0QKXsngCUtTOEIN0SX2iHTTIIz968.Kf.uhfzUCUuAd3UKd.OKt.N

HTynxTQyjpQD9jlwEXeKQxfHCBahUge6RprSa2V4m3aYOMyaP6gah2Yf1zbD

jVwZVGFZHHxINFxpjr5CiTS9JiZn6e6nTlXQZTAFj6QCppQwzL0AxVtoi6WE

QXsANkEGWMEuwNvhmKTnat7A9RqLq6pXuEwY6xM5xRraoTiurj51J1vKLzFs

CvM7HI14Mpje6YRxHOSieTsJpvJORjxT1nERK6s7YTN7sr6rylNwf5zMiHI4

meZ4rTYt2PpVettZERbjJ6PjfqN2loPSrUcusH01CegsGEE5467rnCdqT1ES

QxtCvFq.cvGz+BaAHXKzRSfP+2Jf.KCvj5ZLJRAhwi+SWHvPyN3vXiaPn6JR

3eoA.0TkFhTvpsDMIrL20nAkCI4EoYfSHAuiPBdmJRyd.IynYYjIzMvjOTKf

3DLvnvRLDLpWeEOYXMfAZqfQ0.qsnlUdmA33t8CNJ7MZEb.u7fiZHLYzDkJp

R7CqEVLGN75U+1JXxFUY.xEEBcRCqhOEkz2bENEWnh4pbh0wY25EefbD6EmW

UA6Ip8wFLyuFXx+Wrp8m6iff1B86W7bqJO9+mx8er4E3.abCLrYdA16sBuHx

vKT6BlpIGQIhL55W7oicf3ayv3ixQCm4aQuY1HZUPQWY+cASx2WZ3f1fICuz

vj5R5ZbM1y8gXYN4dIXaYGq4NhQvS5MmcDADy+S.j8CQ78vk7Q7gtPDX3kFh

3NGaAsYBUAO.8N1U4WKycxbQdrWxJdXd10gNIO+hkUMmm.CZwknu7JbNUYUq

0sOsTsI1QudDtjw0t+xZ85wWZd80tMCiiMADNX4UzrcSeK23su87IANqmA7j

tiRzoXi2YRh67ldAk79gPmTe3YKuoY0qdEDV3X8xylCJMTN45JIakB7uY8XW

uVr3PO8wWwEoTW8lsfraX7ZqzZDDXCRqNkztHsGCYpIDDAOqxDpMVUMKcOrp

942acPvx2NPocMC1wQZ8glRn3myTykVaEUNLoEeJjVaAevA4EAZnsNgkeyO+

3rEZB7f0DTazDcQTNmdt8aACGi1QOWnMmd+.6YjMHH19OB5gKsMF877x8wsJ

hN97JSnSfLUXGUoj6ujWXd6Pk1SAC+Pkogm.tZ.1lX1qL.pe6PE11DPeMMZ2

.P0K+3peBt3NskC

-----------end_max5_patcher-----------

*/

Код для Processing

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

Окно Processing-скетча PhysicalPixel: серый квадрат в центре чёрного экрана.

Наведите курсор на квадрат — светодиод включится. Уберите курсор — светодиод выключится.

Патч Max/MSP

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

Патч Max/MSP для управления светодиодом через последовательный порт: отправляет символы H (включить) и L (выключить) на Arduino.

В патче три режима:

  • клик по кнопке включает или выключает светодиод разово;
  • режим мигания отправляет H и L поочерёдно раз в секунду;
  • список портов позволяет выбрать нужный COM/tty порт перед открытием соединения.

Проверка через монитор порта

Даже без Processing или Max/MSP вы можете проверить скетч прямо в Arduino IDE:

  1. Загрузите скетч на плату.
  2. Откройте Инструменты → Монитор порта (или нажмите Ctrl+Shift+M).
  3. Убедитесь, что скорость передачи в мониторе порта совпадает с той, что указана в Serial.begin() скетча (обычно 9600).
  4. Введите H в строке ввода и нажмите Отправить — светодиод включится.
  5. Введите L — светодиод выключится.

Типичные ошибки

  • Регистр символов. h и l в нижнем регистре не распознаются — отправляйте только заглавные H и L.
  • Неправильная скорость порта. Если скорость в мониторе порта не совпадает со значением в Serial.begin(), вместо команд Arduino будет получать мусор.
  • Занятый порт. Если монитор порта открыт в Arduino IDE, Processing или Max/MSP не смогут подключиться к тому же порту. Закрывайте монитор перед запуском внешней программы.
  • Неверный номер порта в Processing/Max. Убедитесь, что в коде Processing или в патче Max указан именно тот порт, к которому подключена Arduino. Список доступных портов можно вывести в консоль Processing командой printArray(Serial.list()).
  • Светодиод не горит. Проверьте полярность: анод (длинная ножка) — к выводу 13, катод (короткая ножка) — к GND. Если используете встроенный светодиод, внешние компоненты не нужны.

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

Эта схема взаимодействия «компьютер → Arduino → физический мир» лежит в основе множества проектов: управление реле, сервоприводами, RGB-лентами, звуковыми сигналами. Освоив принцип на светодиоде, вы легко перенесёте его на любой другой исполнительный механизм.

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

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

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

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