Galera,
Queria pedir uma força. Estou fazendo um Webserver com Apache no meu netbook com Ubuntu 10.10. A página é em PHP, e será um controle de um robô. O Apache parece estar respondendo normalmente porque a página em PHP carrega e responde. O problema é que ela deveria estar abrindo a serial também e enviando um caracter para o Arduino via serial, que irá acionar os motores do robô.
Quando abro a serial pelo Serial Monitor da IDE do Arduino e digito os caracteres de comando, ele responde corretamente acendendo o LED no pino 13 por 2 segundos, conforme código abaixo.
Quando abro a página em PHP, e clico nos botões, a página responde escrevendo abaixo do formulário o comando apertado.
A m... é que os mesmos botões na página em PHP, quando apertados, deveriam enviar os caracteres de comando pela serial, acionando o LED no pino 13 do Arduino, o que não acontece.
Parece que o PHP não consegue abrir a serial.
Alguém tem alguma sugestão?
Será que o problema é no Apache? Tem alguma permissão a configurar? Como?
Já tentei usando a biblioteca "php_serial.class.php". Mas dá na mesma. Ela deve ficar salva na mesma pasta do index.php?
Qualquer pitaco é bem-vindo! Códigos seguem abaixo.
Valeu!
########### FIRMWARE NO ARDUINO (2009) #####################
char c;
void setup(){
//Inicializaçao da Serial e Abertura
Serial.begin(9600);
Serial.println("### WWW.LAB DE GARAGEM .COM ###");
Serial.println("### Servidor PHP e Arduino ###");
pinMode(13, OUTPUT);
}
void loop(){
if (Serial.available() > 0)
{
c = Serial.read();
Serial.println(c);
}
else
{
delay(100);
}
if (c=='e'){
Serial.println("esquerda");
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
}
if (c=='f'){
Serial.println("frente");
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
}
if (c=='d'){
Serial.println("direita");
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
}
if (c=='t'){
Serial.println("tras");
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
}
c='\0';
}
################# PHP ###########################
<html>
<head>
<title>Controle WebServer</title>
</head>
<body>
<?php
echo "<p>Pagina de Controle</p>";
/* Ja tentei isso tambem mas não funcionou :(
include "php_serial.class.php"; //Esta na mesma pasta dessa pagina
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();
sleep(2);
$serial->sendMessage('f');
$serial->deviceClose();
*/
$port = fopen("/dev/ttyUSB0", "w");
sleep(2);
?>
<br>
<table>
<tr>
<td></td>
<td>
<?php
// Botão para Frente ?>
<form action="index.php" method="POST">
<input type="hidden" name="direcao" value="frente" />
<input type="Submit" value="Frente">
</form>
</td>
</tr>
<td>
<?php
// Botão para Esquerda ?>
<form action="index.php" method="POST">
<input type="hidden" name="direcao" value="esquerda" />
<input type="Submit" value="Esquerda">
</form>
</td>
<td>
</td>
<td>
<?php
// Botão para Direita ?>
<form action="index.php" method="POST">
<input type="hidden" name="direcao" value="direita" />
<input type="Submit" value="Direita">
</form>
</td>
</tr>
<tr>
<td></td>
<td>
<?php
// Botão para Trás ?>
<form action="index.php" method="POST">
<input type="hidden" name="direcao" value="tras" />
<input type="Submit" value="Tras">
</form>
</td>
</tr>
</table>
<?php
if ($_POST['direcao']=="esquerda"){
echo "Anda para esquerda";
fwrite($port, "e");
}
if ($_POST['direcao']=="frente"){
echo "Anda para frente";
fwrite($port, "f");
}
if ($_POST['direcao']=="direita"){
echo "Anda para direita";
fwrite($port, "d");
}
if ($_POST['direcao']=="tras"){
echo "Anda para tras";
fwrite($port, "t");
}
fclose($port);
?>
</body>
</html>
Tags:
O que me parece:
O PHP não executa como um programa em C, a parte de abertura da serial será executada, porém não é garantido que quando você for escrever na serial ela ainda esteja aberta, são ações executadas em tempos diferentes.
Sempre que for enviar alguma coisa pela seria, abre a serial, envia e fecha.
Abraços
Marcelo,
Verifique se o usuário sob o qual o Apache roda tem permissão de abrir o /dev/ttyUSB0
tente dar um:
sudo chmod a+rw /dev/ttyUSB0
Agora, outra coisa que eu estive pensando. Na CNC, toda vez que vc abre o serial monitor, o Arduino é resetado. Será que isso não vai acontecer também toda hora que você abrir a porta via php?
Abs,
Fernando
Hehehehe... Funcionou!!!! Era isso mesmo Fernando! Valeu!!!
Bruno, vou tomar esse cuidado também. Ainda bem que no teste, eu mantive como você descreveu, abrindo e fechando, se não ia ser mais complicado de achar o problema.
Mas o problema era esse mesmo, de permissão de acesso a serial. Agora tá rodando como deveria. :))
Abraços!!
Mas a ideia é muito boa.
Albert,
Valeu! Agora que destravou, vou trabalhar na fila de usuários para acesso e no hardware.
O core está aí em cima, para quem quiser fazer um, mas depois posto um passo-a-passo de como desenvolver um igual. Assim a galera pode criar outras coisas assim.
Abraço!!
Que bom que funcinou. Perdi um tempinho nesse mesmo passo... Só que fiz o PHP chamar um script de python. No final das contas, pra não abrir totalmente a permissão do /dev/ttyUSB0 (onde meu arduino tava conectado), tudo que precisei fazer foi adicionar o user 'www-data' ao grupo 'dialout'.
Valeu! :D
PS.: Meu vídeo: http://www.youtube.com/watch?v=oyUBSFYI2M0
EDIT: Depois de adicionar você precisa ou reiniciar o sistema ou logar de novo com o user www-data. Pra isso, logue como root e dê um 'su - www-data'. :D
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por