Давайте для начала разделим задачу на две части: первая - понять, как передавать и получать данные к/от Arduino с использованием PHP; вторая - создать программы для PHP и Arduino для связи.
Обычно получить прямой доступ к USB-устройству нельзя, как в случае с COM- или LPT-портом. Для большинства USB-устройств вам потребуется установить специальные драйверы, которые буду выполнять за вас грязную работу. К счастью, разработчики Arduino реализовали USB-соединение несколько другим способом. Arduino работает с последовательным контроллером USB, что означает что вы можете открыть USB-порт и передать данные прямо плате Arduino точно так-же, как и в случае с COM- или LPT-портом. Как следует из условий нашей задачи, нам требуется записать данные посредством PHP в плату Arduino и обработать их без использования драйверов.
Следующей задачей становится при помощи PHP записать данные в USB-порт. Когда вы запустите среду разработки Arduino, вы увидите "последовательный" порт, к которому подключена ваша плата. Просмотрите список портов, а затем взгляните на код ниже:
<? $fp =fopen("com3", "w"); fwrite($fp, chr(1)); fclose($fp); ?>
Общение с COM-портами в PHP очень просто. Вам требуется просто открыть указатель на файл с именем “comХ”, где Х - номер COM-порта и записать в этот порт данные. В примере выше мы подключились к порту COM3 и записали в него целое число 1 (обратите внимание на функцию chr(x) - мы не может прямо записать целое число. Вместо этого нам потребуется закодировать его в ASCII-код, что и делает функция chr()).
Теперь нам требуется определиться - какие данные будет посылать плате и что мы хотим чтобы плата с ними делала. Попробуем такую несложную задачу - просто передавать случайные целые числа плате, а плата будет мигать светодиодом один или два раза в зависимости от чётности полученного числа.
Код для Arduino:
int ledPin = 13; int usbnumber = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { // основной цикл if (Serial.available() > 0) { usbnumber = Serial.read(); } if (usbnumber > 0) { if (usbnumber % 2 == 0){ digitalWrite(ledPin, HIGH); delay(300); digitalWrite(ledPin, LOW); delay(300); } else{ digitalWrite(ledPin, HIGH); delay(300); digitalWrite(ledPin, LOW); delay(300); digitalWrite(ledPin, HIGH); delay(300); digitalWrite(ledPin, LOW); delay(300); } usbnumber = 0; } }
Давайте разберём код пошагово. Перед функцией инициализации setup() мы определяемся, что 13-й вывод микроконтроллера будем использовать для вывода, и кроме этого, определяем переменную, в которой будем хранить полученное из USB-порта число. В функции setup() мы указываем 13-ю ножку микроконтроллера как предназначенную для вывода данных и запускаем USB-соединение. В основном цикле мы проверяем, не поступали-ли какие-либо данные по USB-соединению. Если эти данные есть, мы читаем их в нашу переменную usbnumber. Далее мы проверяем число - больше оно нуля или нет. Если больше, значит какие-то данные мы прочли. Теперь проверяем, делится-ли это число на 2 без остатка. Если остатка нет, мигает светодиодом один раз. Если остаток равен единице, мигнём светодиодом дважды.
Так, с кодом Arduino разобрались, теперь попробуем написать программу в PHP:
<? $fp =fopen("com3", "w"); while (true){ $i = ($i + 1) % 10; echo "В порт записано число $i - светодиод должен мигнуть (". ($i % 2 == 0 ? ' 1 раз ' : '2 раза ') . ")\r\n"; fwrite($fp, chr($i)); sleep(3); } fclose($fp); ?>
Этот код ещё проще, но мы всё-таки пройдём его пошагово.
Точно так-же, как в самом первом примере, мы открываем соединение COM3. Далее следует бесконечный цикл, который записывает в COM3 числа. После этого скрипт выводит на экран информацию о числе, делает паузу на три секунды и снова повторяет цикл.
Всё, что нам теперь осталось сделать - это загрузить скетч в Arduino и запустить на выполнение код PHP.
Первое выполняется простым нажатием кнопки "Upload" в среде разработки Arduino, а по поводу второго давайте поговорим ещё немножко 🙂
Для выполнения скриптов PHP нам следует сначала сохранить текстовый файл со скриптом на диске. Расширение у такого файла путь будет ".php". Далее, следует загрузить на компьютер установочный файлы PHP и запустить его. Допустим, мы выполнили установку в папку c:\php (для ОС Winows). После этого следует запустить командную строку, перейти в папку c:\php, и выполнить в ней команду "php c:/путь/к/скрипту/script.php". Готово! Следите за светодиодом на плате Arduino и за вспомогательной информацией на мониторе компьютера.
Примечания:
$fp =fopen("comX", "w");
$fp =fopen("/dev/ttyUSBX", "w");
на где Х - номер вашего порта USB.
- Единственный порт на плате, к которому мы можем подключать светодиод без токоограничительного резистора, этой 13-й порт. Если светодиод надо подключить к другому порту, последовательно ему следует подключать резистор.
- В PHP существует на ограничение времени работы скрипта. Если ваш скрипт неожиданно завершает работу, следует проверить величину переменной max_execution_time, установленную в файле php.ini (в секундах).
- Для FreeBSD, *linux-подобных операционных систем строку $fp =fopen("comХ", "w"); следует заменить на $fp = fopen("/dev/ttyUSBХ", "w");
- Поскольку, скрипт может запускаться веб-сервером, у нас открылось большое поле деятельности - мы может передавать плате данные о количестве пользователей на сайте, о появлении в каком-либо ресурсе или форуме новых сообщений, можем выводить текст новостной ленты на дисплей платы, или управлять двигателем веб-камеры или ещё какого-нибудь исполнительного устройства.
- Также становится возможным вывод PHP-скриптом данных, полученных от платы, начиная от температуры воды в вашем любимом аквариуме (с отправкой SMS или электронной почты в случае проблемы) до передачи координат на сайт с картой от Google Maps.