OpenWRT como plataforma wireless para projetinhos

Olá!

Como estou de férias posso tirar o atraso nos projetinhos que tenho tocado, e um deles é uma demonstração de como um simples roteador WiFi pode se transformar numa excelente plataforma wireless para eletrônica!

A idéia:
   
    Outro dia, na hora do almoço, eu e meu amigo Guto, - que também gosta de eletrônica e já é formado em Eng. Elétrica - estávamos conversando sobre formas de se implementar um controle remoto de baixo custo, capaz de suprir as necessidades básicas de qualquer projetinho. Analizamos diversas opções, desde shields p/ arduino, chips ethernet embutidos em MCU's Microchip, mini placas x86 (ALIX PcEngines), avr32 (NGW100), etc, etc... Em um dado momento conversamos sobre a possibilidade de se utilizar um modem ou roteador wireless qualquer que pudesse rodar linux, foi quando o Guto comentou que ele já havia feito alguns testes e que o resultado era satisfatório. Pronto! nao preciso falar mais nada! Comecei a caçar um modelo que pudesse rodar linux. Acabei comprando um modelo da TP-Link WR1043ND por indicação do próprio Guto (valeu cara!) e mergulhei de cabeça na 'Fuçada'.

Especificações do router (tiradas do site do OpenWrt)

CPU Ram Flash Network Gigabit USB Serial JTag
Atheros AR9132@400MHz 32MB 8MB 4x1 Sim Sim Sim (interna) SIM

    Confesso que não perdí muito tempo na firmware original que veio com ele, e acabei usando-a apenas para executar o procedimento de instalação (que pode ser acessado aqui). Gostei muito do OpenWRT, boota muito rápido, é extremamente customizável e possui um gerenciador de pacotes muito legal, o opkg. É com ele que iremos instalar os drivers da placa de rede sem fio do Router.

Instalando os drivers wlan no router:

    Faça o router acessar a internet via cabo. Para isto existem diversos métodos, o mais comum é colocar a interface wan dele para adquirir um IP automaticamente e pluga-lo em uma porta livre no seu switch, ou entao compartilhar a conexão do seu laptop roteando a placa Lan para a rede wireless. Nao vou entrar nos detalhes no momento mas nao se preocupe que isto é muito simples e se voce nunca fez, está cheio de exemplos na internet.

    Com o router acessando a internet, rode os comandos abaixo:
    #opkg update
    #opkg install kmod-ath9k wpad-mini

    Após isto, reinicie o router e voce terá a parte de wireless funcionando.

Preparando o ambiente:

    Uma das coisas mais legais que o OpenWRT tem é o gerenciador de pacotes opkg (já falei disso, né?), ele permite voce instalar diversos pacotes já compilados para a plataforma mips, poupando muito trabalho para por o seu projeto em andamento. Uma das primeiras coisas que instalei foi o Python, que será a base para a comunicação com meus projetos.

    Pra começar, é importante ficar claro que a memória interna de qualquer equipamento deste tipo é bem limitada, este foi um dos motivos que levei em conta ao escolher um modelo com porta USB, pois com ela e um pendrive, eu posso expandir o storage interno dele para colocar mais coisas legais :-) .
   
    EPA! como fazer isso ?

    Bem, para isso nao tinha muita receita de bolo pronta na net, entao, seguem os passos que eu executei:
   
    1 - Instalar suporte para Mass Storage USB
        Esta parte foi relativamente simples, com o router acessando a net, execute os comandos abaixo:
           
      #opkg update
      #opkg install kmod-usb-core kmod-usb-uhci kmod-usb-storage

    2 - Instalar drivers USB 2.0
         Para isto, execute:
        
            #opkg install kmod-usb2

    3 - Instalar o suporte ao sistema de aqrquivos ext2

           #opkg install kmod-fs-ext2

    Com estes passos, espete um pendrive na porta USB e verifique as mensagens do kernel e procure por uma linha parecida com esta:
            scsi 0:0:0:0: Direct-Access     Kingston DT 101 II        PMAP PQ: 0 ANSI: 0 CCS
    Isto significa que seu pendrive foi reconhecido com sucesso e está pronto para uso, bastando formatá-lo em padrao Linux EXT2 e montá-lo no caminho desejado.
   
    OK, até o momento temos o router com um storage aumentado, agora vamos configurar o opkg para usar este espaço para instar os pacotes. Para isto, edite o arquivo localizado em /etc/opkg.conf, que deverá se parecer com isto:

    src/gz packages http://downloads.openwrt.org/backfire/10.03/ar71xx/packages
    dest root /
    dest ram /tmp
    lists_dir ext /var/opkg-lists
    option overlay_root /overlay

  Adicione um novo destino, no meu caso, o pendrive está montado em /mnt e vou chamar o destino de usb:

    src/gz packages http://downloads.openwrt.org/backfire/10.03/ar71xx/packages
    dest root /
    dest ram /tmp
        dest usb /mnt
    lists_dir ext /var/opkg-lists
    option overlay_root /overlay

   
    A primeira linha é a declaração do repositório de onde o opkg vai baixar os pacotes, note que o final da URL pode variar de acordo com o modelo/plataforma de seu device e a versão do seu OpenWRT.

    Prontinho, agora temos o opkg configurado para usar o espaço externo como path de instalação. Para usá-lo voce precisa especificar o destino, da seguinte forma:

    #opkg install -d usb <nomedopacote>

    Agora que temos o opkg como destino dos pacotes, vamos para a próxima parte, que é a instalação do python.

Instalando o python no OpenWRT
   
    Aqui cabe uma observação, pelo que eu fucei, existem dois tipos de pacotes que instalam o python, um é o python-mini que é uma versão light do python, e até cabe na memoria interna do router, porém, faltam diversas libs, como por exemplo as libs de porta serial. Até daria para copiar as libs pra dentro do router conforme for sendo necessário, mas é um saco ficar fazendo isso, e como temos espaço de sobra agora, vamos logo colocar o python completo!

    #opkg update
    #opkg install -d usb python

    Prontinho, python instalado!  Agora, para fazer o python se comunicar com o mundo exterior, vamos instalar os drivers do conversor USB/Serial.

Instalando os drivers do PL2303 no OpenWRT

    Este procedimento é super dificil de ser feito, coisa que voce ainda nunca viu antes :-P

    #opkg update
    #opkg install kmod-usb-serial kmod-usb-serial-pl2303

    Agora espete um conversor USB/Serial com chip prolific pl2303 e verifique nas mensagens do kernel se aparece algo assim:
   
    USB Serial support registered for pl2303
  pl2303 1-1.2:1.0: pl2303 converter detected
  usb 1-1.2: pl2303 converter now attached to ttyUSB0
  usbcore: registered new interface driver pl2303
  pl2303: Prolific PL2303 USB to serial adaptor driver

    Pronto, voce tem uma porta serial adicional ao seu router! para usá-la junto com o pendrive, basta plugar um HUB USB2.0 (uso um de 4 portas sem alimentação externa).

    Mas peraí! Na tabelinha logo acima já diz que existe uma porta serial nesse cara! como é isso ?

    Bem, existe sim, mas nao é muito bom usá-la para automação/comunicação, ela é uma porta de console, com ela voce pode acessar a shell do router, como num terminal serial de um servidor unix. O próximo passo mostra como usa-la.

Console serial para o WR1043ND
   
    Dentro do router existe uma porta serial com níves LVTTL (3.3v). Com ela é possível acessar a console serial do router, caindo diretamente na shell, porém como os níveis de tensão sao muito abaixo dos níveis das portas seriais comuns, nao é possível utiliza-la diretamente, sendo necessário fazer algum tipo de interfaceamento. No meu caso, como eu costumo utilizar muito a dita cuja, mas o mesmo router que eu fuço é o router que distribui a grande rede pro resto da casa, nao posso deixar ele aberto o tempo todo, entao eu coloquei um XBEE da Maxtream nele, e acabei com uma porta serial de console wireless, sem a necessidade de componentes adicionais.

Veja:

O conector precisou ser soldado, mas nao é tão complicado, precisa de um suga solda pra desentupir os furos antes.

Conector soldado, repare que abaixo existe um outro conector, JP1, que é o JTAG do Atheros

Aqui o serviço pronto, console serial wireless, o XBEE cabe dentro do modem com a antena whip a 45 graus. Isolei os pinso extra pra evitar curtos.