Physical Pixel: управление светодиодом через Serial
Управляйте светодиодом на Arduino, отправляя символы H и L через последовательный порт из Processing, Max/MSP или монитора порта.
В этом уроке Arduino получает команды от компьютера через последовательный порт и управляет светодиодом: символ 'H' включает его, символ 'L' — выключает.
Отправить команду можно из встроенного монитора порта Arduino IDE, а также из сторонних программ: Processing (код приведён ниже), Max/MSP, PD или Flash (через serial-net прокси). Это классический пример двусторонней коммуникации между компьютером и микроконтроллером.
Необходимое железо
- Светодиод (опционально)
- Резистор 220 Ом (опционально)
Необходимое ПО
- Processing или
Схема подключения
На большинстве плат 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:
- Загрузите скетч на плату.
- Откройте Инструменты → Монитор порта (или нажмите
Ctrl+Shift+M). - Убедитесь, что скорость передачи в мониторе порта совпадает с той, что указана в
Serial.begin()скетча (обычно9600). - Введите
Hв строке ввода и нажмите Отправить — светодиод включится. - Введите
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