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:

 

 

 

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:

 

 

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

Sobre Wesley Menezes 15 artigos
Engenheiro de T.I Formado em Engenharia de Software, Mecatrônica e Ciência da Computação.

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*