Arduino e PHP

Dezembro 1, 2008 at 7:32 pm | In Arduino, PHP | 10 Comments

O PHP é uma linguagem muito versátil, utilizada sobretudo em aplicações Web. Foi a primeira linguagem que aprendi e é sem dúvida a minha preferida até agora. Tendo umas bases de programação, é relativamente fácil aprender esta linguagem. Para mais informações, vejam nos “Links Relacionados” no final do artigo.

Este artigo não é uma introdução ao PHP, é recomendado um conhecimento prévio básico. De qualquer forma, pode ser um ponto de parida para a aprendizagem de uma nova linguagem de programação. Vou tentar ser o mais explicativo possível, mas se tiverem dúvidas, não hesitem em colocá-las nos comentários deste artigo.

Além disto, apesar deste tutorial ser uma implementação do PHP no Arduino, funcionará (com as devidas alterações) com qualquer outra linguagem que faça comunicação pela porta Serial.

Chega de conversa, vamos pôr mãos à obra. Vou dividir o artigo em duas partes:

  • Aprender a comunicar com o Arduino usando o PHP
  • Pôr Arduino a comunicar com o PHP e vice-versa

Introdução

Normalmente não podemos aceder directamente aos dispositivos USB como fazemos para enviar dados para a impressora ou porta COM. Para a maiorida dos dispositivos é necessário um driver especial. Felizmente, os designers do Arduino fizeram a ligação por USB um pouco diferente. O Arduino funciona através de um controlador Serial por USB, o que significa que podes abrir uma porta USB e enviar dados directamente para o Arduino, tal como fazemos com a porta LPT ou COM. É exactamente isso que pretendemos fazer: enviar dados do PHP para o Arduino e processá-la sem ser necessário qualquer driver que falei à pouco.

Vou então explicar como se enviar dados para uma porta USB através do PHP. O nosso Arduino corresponde a uma porta COM. Para saber o número dessa porta, basta abrir o Gestor de Tarefas, no Painel de Controlo. (Clica na figura ao lado para aumentá-la).

Procura um “USB Serial Port” (O meu XP está em Inglês) – é o teu Arduino – tem um COMX, em que X é o número da porta COM.

Agora vamos ao código PHP utilizado para enviar dados pela porta COM. Reparem no código a seguir:

$fp = fopen("com5", "w");
fwrite($fp, chr(1));
flose($fp);

Primeiro usamos a função fopen para abrir ligação com a porta e declaramos a função fp, usando o comando W, o que indica ao PHP que vamos escrever (Write, em inglês).

De seguida, usamos a função fwrite. Como já devem ter percebido é usada para enviar os dados. Dentro da função indicamos a ligação (definida na variável fp) e enviamos o caracter “1″. Reparem na função chr() – não podemos apenas enviar o valor inteiro, temos de o encriptar em ASCII, que é o que faz a função chr().

No final fechamos a ligação. É muito importante que fechemos a ligação no final de enviarmos os dados que queremos.

Resumindo:

  1. Abrimos ligação para a porta COM do Arduino
  2. Enviamos os dados
  3. Fechamos a ligação

Código!!!

Agora vamos à programação do Arduino. O que vou mostrar aqui é uma forma de testar se a ligação está correcta. Vamos fazer um programa simples: se o valor inteiro que enviarmos for 1, irá piscar 1 vez, se for 2, irá piscar 2 vezes.

int ledPin = 13;
int usbnumber = 0;
void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    if (Serial.available() > 0) {
        usbnumber = Serial.read();
    }

    if (usbnumber > 0) {
        if (usbnumber == 1){
            digitalWrite(ledPin, HIGH);
            delay(300);
            digitalWrite(ledPin, LOW);
            delay(300);
        }
        if (usbnumber == 2){
            digitalWrite(ledPin, HIGH);
            delay(300);
            digitalWrite(ledPin, LOW);
            delay(300);
            digitalWrite(ledPin, HIGH);
            delay(300);
            digitalWrite(ledPin, LOW);
            delay(300);        }
        }
        usbnumber = 0;
    }
}

Vamos devagar. Não se deixem intimidar pela extensão do código.

Antes do setup definimos que vamos usar o pino 13 do Arduino para ligar o LED. Para além disso iniciamos a variável que vai “carregar” o número lido por USB.

No setup definimos que o pino do LED vai ser um output e iniciamos a ligação Serial.

No loop, o Arduino verifica se há algum dado novo recebido. Se houver, vamos passar esse dado para a nossa variável usbnumber. Depois vemos se a variável é maior que zero; se for, sabemos que recebeu algum dado. Segue-se uma simples condição.

Até agora temos o código do Arduino. Vamos contruír código PHP!

$fp =fopen("com5", "w");
while (true){
    $i = 1;
    echo "Enviado o valor 1 - o LED deve piscar 1 vez \r\n";
    fwrite($fp, chr($i));
    sleep(3);

    $i = 2;
    echo "Enviado o valor 2 - o LED deve piscar 2 vezes \r\n";
    fwrite($fp, chr($i));
    sleep(3);
}
fclose($fp);

Nada de novo. Tal e qual como no exemplo anterior. A nova parte é o loop, que contém o número que enviamos por Serial.

O código é simples: vai alternando o valor da variável entre 1 e 2. Depois escreve alguma informação na consola, espera 3 segundos e volta a repetir o Loop.

Os últimos bits

  1. Fazer upload do código do Arduino para o Arduino
  2. Correr o código PHP

Penso que quanto ao primeiro passo não há dúvidas.
Apenas o segundo pode suscitar algumas dúvidas, mas vou tentar explicar como fazê-lo. Vamos supor que eu fiz o download do PHP para o Windows e fiz unzip para C:/php. Entro na linha de comandos do Windows, mudo a directoria para c:/php e escrevo

php c:/path/to/usb/php/script.php

Feito! Deita olho ao LED do Arduino e repara na informação na Janela da Consola.

Já sabem que gosto de saber a vossa opinião sobre o que escrevo, portanto deixem o vosso comentário.

Links Relacionados

http://www.php.net/ – Site oficial do PHP; tem toda a informação sobre funções de origem e suas sintaxes

http://www.arduinoprojects.com/?q=node/10

10 Comentários »

Feed RSS para comentários a este post. TrackBack URI

  1. Boa explicação que tens aqui ;) parabéns….

    Só uma coisa apontar…no código php tens:

    Enviado o valor 1 – o LED deve piscar 2 vezes
    Enviado o valor 2 – o LED deve piscar 1 vez

    Não devia ser:

    Enviado o valor 1 – o LED deve piscar 1 vez
    Enviado o valor 2 – o LED deve piscar 2 vezes

    ???

    cumps

  2. Boas fifas.

    Sim tens razão. Era para ver se alguém reparava. :D

    Corrigido, obrigado.

  3. Estava lendo seu post e achei muito interessante, tenho uma duvida, pois estou trabalhando em um projeto similar, seria possivel ao invés de usar o arduino usar o chip da FTDI FT232bm (conversor USB Serial).

  4. Boas Cleidir.

    Sim, claro. O PHP pode comunicar com qualquer dispositivo ao qual o Windows atribua uma porta COM.

    Cumprimentos,
    Ricardo

  5. Quero lhe dizer, poucos tutoriais explicam tão detalhadamente assim, sei programar um pouco em PHP e tenho um Arduino Diecimila. Adorei o tutorial unindo as 2 coisas que gosto muito PHP e Arduino. Valeu…Gostaria de perguntar se tem algum projeto usando controle remoto via IR?

  6. Boas “Cléber”

    Antes de mais obrigado pelo comentário.

    Não tenho nenhum projecto meu com controlo remoto por IR. No entanto lembrei-me de um projecto que vi há uns tempos, combinando o Arduino com os infravermelhos.
    Aqui fica o link:
    http://www.5volt.eu/archives/14

    Espero que lhe dê umas ideias. :-D

    Cumprimentos,
    Ricardo Dias

  7. Bom Noite, sabe me dizer se posso enviar comandos para o modem usando a mesma ideia?

  8. Boas Paulo.

    Não estou a par da comunicação entre o PHP e um modem. No entanto encontrei esta página, que pode ser um bom ponto de partida:
    http://www.activexperts.com/activcomport/howto/php/

    Terá de saber quais os comandos que o modem aceita para depois programar no PHP.

    Cumprimentos,
    Ricardo Dias

  9. Ola Ricardo, legal seu blog, gostei, amigo eu fiz este projeto que vc desccreve aqui sobre arduino com php. Porem, eu nao consigo fazer o led 13 piscar como programado, tenho duas placas arduino que estao em pleno funcionamento mas ao rodar o codigo php somente o led do adaptador de usb que tenho separado pisca, mostrando assim que esta enviando o comando para a placa mas o led nada; troquei de placa mesmo assim nao pisca o led da outra placa tambem,falta outra coisa ou estou fazendo algo errado! os codigo estao iguais ao seu.e outra coisa, nao sou expert em php ok, aqui no micro estou usando o easyPHP-3.0, o que eu fiz foi o seguinte: montei seu codigo no editor e salvei com extençao *.php e coloquei no diretorio www do easyphp e qunado rodo ele acho que manda o comando para o arduino e o led da usb fica piscando mas o led do arduino nao pisca como programado. Es pero que tenho me entendido, Obrigado Ailton.

  10. Boas Ailton

    Vamos conversar por e-mail para não encher aqui os comentários, ok?
    Vou tentar ajudá-lo e perceber o que está mal, para que possamos corrigir o post inicial.

    Cumprimentos,
    Ricardo Dias


Publicar um comentário

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog em WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.