Socrat.in.ua

Навчальні конструктори та DIY електроніка

Управление Arduino через PHP

2016-01-27

Давайте для начала разделим задачу на две части: первая - понять, как передавать и получать данные к/от 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.

  1. Единственный порт на плате, к которому мы можем подключать светодиод без токоограничительного резистора, этой 13-й порт. Если светодиод надо подключить к другому порту, последовательно ему следует подключать резистор.
  2. В PHP существует на ограничение времени работы скрипта. Если ваш скрипт неожиданно завершает работу, следует проверить величину переменной max_execution_time, установленную в файле php.ini (в секундах).
  3. Для FreeBSD, *linux-подобных операционных систем строку $fp =fopen("comХ", "w"); следует заменить на $fp = fopen("/dev/ttyUSBХ", "w");
  4. Поскольку, скрипт может запускаться веб-сервером, у нас открылось большое поле деятельности - мы может передавать плате данные о количестве пользователей на сайте, о появлении в каком-либо ресурсе или форуме новых сообщений, можем выводить текст новостной ленты на дисплей платы, или управлять двигателем веб-камеры или ещё какого-нибудь исполнительного устройства.
  5. Также становится возможным вывод PHP-скриптом данных, полученных от платы, начиная от температуры воды в вашем любимом аквариуме (с отправкой SMS или электронной почты в случае проблемы) до передачи координат на сайт с картой от Google Maps.
Автор: hobbytech


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *



© HobbyTech 2017