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>

Exibições: 14876

Responder esta

Respostas a este tópico

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço