Разберемся как управлять светодиодом RGB через последовательный порт, используя PHP и компьютер, подключенный к Arduino через USB.
Комплектующие
Нам понадобится плата Arduino Micro или любая другая плата Arduino с подключением USB. Micro использует micro USB в качестве источника питания и связи, так что это довольно удобно и просто. Можно запустить PHP на своем компьютере и отправлять вывод на Arduino через USB.
- Arduino Micro
- 1 x RGB LED (светодиод)
- 3 x Резисторы 220 Ом
- Макетная плата
- 1 x Перемычки (П/П)
Схема соединения
Подключаем резисторы напрямую к ножкам RGB и контактам Arduino. Используем общий анодный RGB-светодиод, поэтому общий вывод должен быть подключен к 5В. Если вы используете светодиод RGB с общим катодом, вам следует вместо этого подключить общий вывод (который является более длинным) к GND (земля).
Используем цифровые выходы 3, 4 и 5, но вы можете использовать другие контакты, если хотите.
Тестирование соединений
Чтобы проверить правильность подключения, загрузите эскиз, представленный ниже. Эскиз будет в цикле проходить по цветам: красный, зеленый, синий, желтый, фиолетовый и голубой.
int redPin = 5; int greenPin = 4; int bluePin = 3; // раскомментируйте эту строку, если используете светодиод с общим анодом #define COMMON_ANODE void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { setColor(255, 0, 0); // red delay(1000); setColor(0, 255, 0); // green delay(1000); setColor(0, 0, 255); // blue delay(1000); setColor(255, 255, 0); // yellow delay(1000); setColor(80, 0, 80); // purple delay(1000); setColor(0, 255, 255); // aqua delay(1000); } void setColor(int red, int green, int blue) { #ifdef COMMON_ANODE red = 255 - red; green = 255 - green; blue = 255 - blue; #endif analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }
Вы должны увидеть мигание светодиода разными цветами. В данном случае мы подключили светодиод таким образом, чтобы красная нога была на выводе 5, зеленая нога была на выводе 4, а синяя нога на выводе 3. Если цвета выглядят неправильно, вы можете изменить числа, чтобы определить, какая нога какая.
Управление через Serial на Arduino
Теперь давайте реализуем последовательную связь, чтобы контролировать цвет светодиода. Мы собираемся использовать код, представленный ниже. Загрузите этот эскиз на свою плату:
// контакты для светодиодов: const int redPin = 5; const int greenPin = 4; const int bluePin = 3; void setup() { // инициализировать последовательную связь: Serial.begin(9600); // сделать пины выводами: pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { // если есть последовательная связь, прочитать: while (Serial.available() > 0) { // искать действительное целое число: int red = Serial.parseInt(); // сделать это снова: int green = Serial.parseInt(); // сделать это снова: int blue = Serial.parseInt(); // искать новую строку, окончание выражения: if (Serial.read() == '\n') { // ограничить значения 0-255 и инвертировать: // если светодиод с общим катодом, то использовать "constrain(color, 0, 255);" red = 255 - constrain(red, 0, 255); green = 255 - constrain(green, 0, 255); blue = 255 - constrain(blue, 0, 255); // постепенное угасание красного, зеленого и синего: analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); // вывести три числа в одну строку в шестнадцатеричном виде: Serial.print(red, HEX); Serial.print(green, HEX); Serial.println(blue, HEX); } } }
После загрузки и запуска кода откройте Serial Monitor в Arduino IDE (Инструменты -> Serial Monitor). Выберите 9600 бод (скорость, что мы использовали в коде) и выберите "Newline" (Новая строка) в поле выбора окончания строки (это поле слева от выбора скорости). Это важно, потому что по умолчанию не происходит отправки перевода строки и нам нужно определить окончание строки.
Теперь наберите 255,0,0 и нажмите ввод, чтобы увидеть, как светодиод становится красным.
Управление светодиодом через последовательный порт с помощью PHP
Теперь, когда последовательная связь настроена, нам нужно написать небольшой PHP-скрипт для отправки команд через последовательный порт на плату Arduino. Для этого мы будем использовать библиотеку Composer hyperthese/php-serial.
Создайте файл led.php
, куда напишем такую программу:
<?php require __DIR__ . '/vendor/autoload.php'; $serial = new PhpSerial(); // порт Arduino: $serial->deviceSet("/dev/ttyACM0"); $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); $serial->deviceOpen(); // отсылаем цвета в виде строк CSV $colors['red'] = '255, 0, 0'; $colors['green'] = '0, 255, 0'; $colors['blue'] = '0, 0, 255'; foreach ($colors as $color => $value) { echo "Отправляем $color\n"; $serial->sendMessage($value . "\n"); sleep(1); } echo "Сделано\n";
Обратите внимание, что очень важно использовать одинаковую скорость передачи везде. Здесь мы используем 9600.
Далее выполняем:
php led.php
Ниже небольшая демонстрация управления платой Ардуино с использованием PHP, API Twitter и старого LOLShield.
Конечно, это уже сложнее, но наш урок является отправной точкой для дальнейшей реализации такого проекта. Отдельное спасибо за проект Эрике Хайди (heidislab.com).