Controlando Arduino com PHP via Serial

O Problema

Apesar de existirem vários posts trazendo informações sobre o assunto, encontrei certa dificuldade em fazer o Arduino funcionar com a serial via PHP ou mesmo o terminal do Linux. Daí a origem deste post.

Para os testes demonstrados neste post, carregue o código do post Lendo uma string com Arduino via serial em seu arduino.

Como enviar dados para o arduino via terminal (Linux)?

De uma forma muito simples, para enviar uma informação para serial, no linux, fazemos assim:

// Define a velocidade de comunicação no dispositivo /dev/ttypACM1
$ /bin/stty -F /dev/ttyACM1 9600

// Envia informação para Arduino
$ echo "LED1:1" > /dev/ttyACM1

Onde /dev/ttyACM1 é a porta serial no linux. LED1:1 significa que o primeiro led configurado será ligado, veja no tutorial acima para entender como isso funciona.

Observação: Apesar dos comandos vistos estarem certos, não irão funcionar, em breve veremos o porquê.

Como enviar dados para o arduino via php?

O PHP é uma linguagem backend, ou seja, roda no servidor. Ele tem acesso à baixo nível no sistema do servidor, e entre outras coisas, podemos acessar diretamente a serial com PHP.

Para ligar uma lâmpada no Arduino diretamente via PHP, podemos fazer algo simples assim:

<?php

// Define porta onde arduino está conectado
$port = "/dev/ttyACM1";

// Configura velocidade de comunicação com a porta serial
exec("stty -F $port raw speed 9600");

// Inicia comunicação serial
$fp = fopen($port, 'c+');

// Escreve na porta
fwrite($fp, "LED1:1");

// Fecha a comunicação serial
fclose($fp);

Para desligá-la, precisamos apenas mudar o fwrite, passando como segundo parâmetro o valor: “LED1:0”

Observação: Apesar do código acima estar certo, não irá funcionar ainda.

Se você manter o terminal do Arduino aberto enquanto envia os comandos, eles funcionam, seja via php ou terminal mesmo. O desafio é fazer ele funcionar de maneira independente em releção a software, ou seja, com um simples comando via serial ou poucas linhas de código em php devem funcionar.

Para Windows, o script php fica levemente diferente:

<?php 
// Define porta onde arduino está conectado
$port = "COM1";
 
// Configura velocidade de comunicação com a porta serial
exec("MODE $port BAUD=9600 PARITY=n DATA=8 XON=on STOP=1");
 
// Inicia comunicação serial
$fp = fopen($port, 'c+');
 
// Escreve na porta
fwrite($fp, "LED1:1");
 
// Fecha a comunicação serial
fclose($fp);

O pulo do gato: Desativando autoreset do arduino na comunicação serial

Pois é, um detalhe muito importante que precisamos resolver para que tudo o que foi visto funcione é desativar o autoreset do arduino.

O autoreset é uma funcionalidade interessante pois permite enviar um novo código ao Arduino sem precisar pressionar o botão de reset, afinal o reset da placa é feito via software, pouco antes de enviar o código.

O problema é que toda vez que iniciamos uma nova comunicação serial ele reseta o Arduino impedindo que nosso comando via terminal ou software via PHP funcione.

Para entender mais sobre o autoreset, recomendo este post.

Como resolver então?
Simples: insira um capacitor de 10uF entre o pino GND e RESET do Arduino. O pino negativo irá no GND claro, e o positivo no RESET.

Veja abaixo:

IMG_20160701_114531545

Só isso?
Isso mesmo, funcionou perfeitamente para mim no Arduino Mega e Uno, mais detalhes você encontra neste link oficial do Arduino informando como desativar esta funcionalidade.

Referências

http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection
http://playground.arduino.cc/Learning/AutoResetRetrofit
http://forum.arduino.cc/index.php?topic=246169.0
http://php.net/manual/pt_BR/function.fopen.php
http://stackoverflow.com/questions/16860605/communicating-serial-port-on-windows-with-php

Comments

  1. By Isadora Muniz

    Responder

    • Responder

      • By Isadora Muniz

        Responder

  2. By Matheus Siqueira

    Responder

    • Responder

  3. By Eric

    Responder

    • Responder

  4. By Daniel

    Responder

  5. By nailson

    Responder

  6. By T. Tompson

    Responder

  7. By Regimar

    Responder

  8. By João Abreu

    Responder

  9. By Leandro

    Responder

  10. By mateus mamani

    Responder

    • Responder

  11. By Samuel Henrique

    Responder

    • Responder

  12. By Luís Fernando

    Responder

    • Responder

  13. By Bruno Martins

    Responder

  14. By Daniel Antônio

    Responder

    • Responder

  15. By Anderson Cardoso

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *