
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:
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
Olá, Paulo, gostaria de perguntar se vc sabe se existe alguma maneira de enviar a informação via serial de um módulo rfid conectado ao Arduino para o computador, ou para algum software que faça o controle dessa informação?Tenho interesse em saber pois estou fazendo um projeto e estou com esta grande dúvida.
Obrigada, e aguardo sua resposta !
Oi Isadora,
sim, existe como fazer isso. O segredo está em receber a informação vinda do Arduino. O script abaixo faz isso usando php. No Arduino basta fazer um Serial.println e enviar o que precisa, sempre seguido de um “sair” ou outro caractere que desejar. Você pode mudar o script abaixo para ler linhas se avaliar o caractere \n: