07 abril 2017

NodeMCU ESP8266 - Arduino Day 2017


Dia 1º de abril foi o Arduino Day, evento que ocorre mundialmente para comemorar o Movimento Maker principalmente na área de designers e eletrônica.

Aqui na região da baixada santista, tivemos o evento em 2016, e agora em 2017. O evento deste ano foi superior em quantidade de participantes, e também na qualidade das palestras. Maiores informações sobre o evento, podem ser obtidas no blog Engenheiro Caiçara.Tive a oportunidade de participar falando do NodeMCU ESP8266, e esse post fará um resumo do que foi apresentado lá.

ESP8266
 
É um SoC (System on a Chip) fabricado pela Espressif Systems, popularizado por volta de 2012, principalmente pela comunidade do mundo Maker devido seu baixo custo. Ele implementa toda a pilha TCP/IP e o padrão 802.11 b/g/n. Possui um microcontrolador interno. O primeiro módulo foi o ESP-01, ele era programado diretamente utilizando a linguagem LUA, ou através do Arduino UNO com suas bibliotecas.
ESP-01
Atualmente o encapsulamento do ESP8255 está no módulao ESP-12E, com o microcontrolador Tensilica L106 32-bit, com clock de 80 MHz, Spi, I2C, conexão serial RX/TX e 10 portas GPIO (sendo que 4 podem ser utilizadas como PWM). Continua sendo possível programá-lo diretamente, sem a necessidade do Arduino, somente através de um módulo FTDI para fazer a conexão USB.

ESP-12E

ESP-12E conectado através de módulo FTDI


NodeMCU ESP12-E
É uma plataforma de hardware Open-source de desenvolvimento para o ESP12-E. Além de programá-lo diretamente através da Linguagem Lua, é possível utilizar firmwares para diferentes linguagens como Espruino (JavaScript próximo ao Node.js), ESP-Open-SDK (Linguagem C), ESP-Open-RTOS (Linguagem C também), Micropyton (Python) e Arduino IDE (linguagem C++);

A vantagem em se trabalhar com o Arduino IDE está em aproveitar todas bibliotecas para se trabalhar com sensores já implementadas para o mundo Arduino. A única atenção que deve se ter é que o ESP8266 trabalha com 3V, e não 5V como o Arduino UNO, e isso talvez requeira algumas adaptações nas montagens eletrônicas dos módulos para Arduino.
NodeMCU ESP12-E
É necessário instalar a biblioteca referente ao ESP dentro do Arduino IDE. Isso é possível a partir da versão 1.6 do Arduino IDE. Um tutorial detalhado sobre como realizar essa instalação e implementação pode ser vista no blog FlipeFlop.

Para o Arduino Day realizei a montagem abaixo, com dois LEDs, e uma chave push button ligado a um resistor de 10K, conforme a imagem abaixo.

Sketch feito no Fritzing
Foi uma demonstração de como usar o NodeMCU como um "WebServer", onde é possível controlar a intensidade com que a Led vermelho pisca. O Led verde mostra o status da conexão WiFi, ele piscando demonstra que está tentando conectar no WiFi, ele ligado direto indica que dispositivo conectado no WiFi. O push button quando acionado faz com que o Led Vermelho pare de piscar. Pressionando-o novamente, ele volta a piscar.

O ESP retorna sempre uma página HTML com um botão de +, e outro botão de -. Quando pressionado um botão, ele envia uma requisição HTTP para o ESP com a string "more", quando o botão + é pressionado, e uma string "less" quando o botão - é pressionado.

O código trata a requisição recebida e altera o valor da variável "intensidade", fazendo com que o Led pisque mais rápido, ou mais devagar. O mesmo código do sketch de exemplo Blink do Arduino foi utilizado para fazer o Led piscar.

O código pode ser visto na minha página do github.

O próximo post espero fazer esse mesmo código com Mycropython!

Espero ter ajudado, até a próxima!


21 março 2017

VM Linux para servir como Access Point

Tive uma necessidade em criar uma rede wifi fechada que seja compartilhada através de um notebook, com configurações específicas de DNS e DHCP, e que fosse distribuível para qualquer notebook ou computador.

Um colega realizou tentativas, utilizando aplicativos para rotear a Internet através do Windows 7, e até mesmo o roteamento nativo do Windows 10, porém a rede se demonstrou muito instável para a necessidade que tínhamos.

Então surgiu a ideia de criar uma Máquina Virtual Linux, e configurá-la para agir como um Access Point, ou seja, para que os dispositivos wi-fi se conectassem através dele.


A máquina virtual 

Escolhemos o Debian 8 como distribuição pela estabilidade e larga documentação pela Internet. Utilizamos também como gerenciador de Máquinas Virtuais o Virtual Box da Oracle.

Foi realizada a instalação do Debian, com o mínimo de pacotes e sem Interface Gráfica, para deixá-la como mínimo possível de capacidade (atualmente ocupa 3 GB no disco rígido), já que uma das necessidade é que seja distribuível para qualquer computador hospedeiro (independente de Sistema Operacional: Linux, Windows ou Mac OS).

Hardware a Placa de rede wifi nativa.

A primeira dificuldade foi fazer com que a Máquina Virtual reconhecesse a placa de rede wifi do computador hospedeiro, e esta dificuldade não foi superada. É impossível fazer com que a Máquina Virtual (VM) reconhecesse a placa de rede wifi do computador hospedeiro, pois ela cria uma placa de rede virtual do tipo ethernet, e não como alterar isso, pelo menos esse é comportamento utilizando o Virtual Box.

Utilizando Adaptador Wireless USB

A solução então foi utilizar um adaptador wireless USB. O adaptador USB deve ser instalado no computador hospedeiro, sendo instalado todos os drivers necessários para o funcionamento normal do adaptador wireless no hospedeiro. Verifique se o adaptador wireless funcionada perfeitamente no computador hospedeiro, antes de tentar instalá-lo na VM.

O próximo passo é fazer com que a VM reconhecesse o adaptador USB. Para tanto é necessário ir nas configurações da VM. Basta selecionar a VM e clicar no botão "Configurações", selecionar USB e adicionar o dispositivo USB que deseja que a VM reconheça.

Porém, não foi tão simples assim. Estava usando a versão 4.3 do Virtual Box, e ela não reconhecia o adaptador USB. Achei uma documentação dizendo que precisaria de um "Extension package", um pacote de extensão para o Virtual Box, mas mesmo instalando-o não reconhecia o dispositivo USB. Mais um pouco de documentação, e percebi que a USB 2.0 e 3.0 só funcionam a partir da versão 5 do Virtual Box.

Baixei então o Virtual Box 5.1 e seu respectivo "Extension Package". Removi a versão anterior do Virtual Box, guardei a VM criada com o Debian 8 no computador. Realizei a instalação do Virtuabol 5.1 e Extension Package. Importei a VM, e consegui realizar a configuração USB sendo reconhecido o dispositivo USB.

O caminho para fazer com que a VM reconheça um dispositivo USB, pode ser acessado nesse link aqui, no meu caso em um hospedeiro Linux, mas a parte da instalação do "Extension Pack" é igual para qualquer hospedeiro:

https://blog.butecopensource.org/dispositivos-usb-nao-sao-reconhecidos-pelo-virtualbox-host-linux/

Instalando os drivers do adaptador wifi na VM Debian 8
Após o adaptador USB wifi estar instalado e funcional na máquina hospedeira, e o adaptador também esteja visível através das configurações da VM no Virtual Box, é a vez de instalar os drivers na VM Linux Debian 8.

Primeiro é preciso descobrir o id do fabricante e do dispositivo, basta usar o comando, todos com permissão de root:

# lsusb
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 006: ID 0a5c:2110 Broadcom Corp.
Bus 004 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
 
Localize o número Hexadecimal, onde os 4 primeiro dígitos é o fabricante, e os 4 após os "dois pontos" é o id do dispositivo.
Ex.: 0a5c:2110
0a5c ==> Fabricante
2110 ==> Dispositivo

Mais informações aqui na wiki do Debian

Após descobrir o id do fabricante e do dispositivo, localize o respectivo driver no nesta página da wiki do Debian. Onde é possível localizar o repositório do driver, ou baixá-lo diretamente.

No meu caso era um Realtek, e tive que usar apenas alguns comandos para atualizar via apt-get, em outros casos é necessário baixar o drivers e realizar a instalação manual.

Programa Hotspotd em python
Como o dispositivo USB funcionando na VM Debian 8, é a hora de instalar  os programas necessários para o funcionamento da VM como um access point. Resolvi usar, por escolha própria, um script em python que realiza essa tarefa. O script chama-se hotspotd, e pode ser obtido através do endereço abaixo:

https://pypi.python.org/pypi/hotspotd

Existe uma pegadinha aí na documentação do hostpotd presente no package index, pois antes de realizar a instalação do hotspotd, existe a dependência da instalação de dois pacotes do linux: hostapd e dnsmasq.

Dessa forma, antes de instalar o hotspotd é necessário instalar esses pacotes através do comando abaixo:

# apt-get install hostapd
# apt-get install dnsmasq

Após a instalação, é possível seguir a instalação do hotspotd, com os comandos:

# wget https://github.com/prahladyeri/hotspotd/raw/master/dist/hotspotd-0.1.4.tar.gz
# tar xvf hotspotd-0.1.4.tar.gz
# cd hotspotd-0.1.4/
# python setup.py install

Para iniciar a aplicação basta digitar

# python hotspotd.py start
 
A primeira vez será solicitada as configurações de SSID e senha, essas configurações serão salvadas, e o Access Point já aparece disponível na rede wifi.

Encontrei algumas falhas de autenticação, e resolvi deixar a rede aberta. Para isso deve-se alterar o arquivo:

 /usr/local/lib/python2.7/dist-packages/hotspotd/run.conf

Deixando como comentário todos as linhas referentes a autenticação, da linha

auth_algs=1

para baixo, colocando um # na frente.



Detalhes do código e funcionamento do hotspotd aqui.



VM Debian 8 iniciando com senha automática
Para que a VM inicie automaticamente e já inicie o hotspotd sem necessidade de autenticação de usuário e senha, foi necessário alterar o linux para autenticar automaticamente com um user. Para isso foi alterado o arquivo com os comandos abaixo:

# cd /etc/systemd/system
# nano getty.target.wants/getty\@getty\@tty1.service

Localize a linha:

ExecStart=-/sbin/agetty --noclear $TERM

Altere para:

ExecStart=-/sbin/agetty --noclear -a robo %I $TERM

Salve e saia pressionando CTRL+X

Isso fará com que o Debian inicie automaticamente com o user robo sem autenticação.

Para carregar e iniciar automaticamente o hotspotd, basta alterar o arquivo .bashrc do usuário, no caso usuário robo

# nano /home/robo/.bashrc

E ao final do arquivo a linha para iniciar o hotspotd, como encontrei intermitência com o adaptador USB, hora ele ficava ativo, hora fica inativo, antes de iniciar o hotspotd, eu ativo o adaptador wireless. Então as linhas ao final do .bashrc ficaram:

sudo ifconfig wlan0 up
cd /home/robo/hotspotd-0.1.6
sudo python hotspotd start

Apesar de se tratar de uma Máquina Virtual, as configurações aqui realizadas, principalmente a parte da instalação do adaptador wireless na Máquina Virtual Debian, o hotspotd e as customizações de inicialização do Debian, podem ser replicadas no Linux Raspbian (distribuição Debian para o Raspberry Pi), podendo transformar um Raspberry Pi em um Roteador WiFi.

Até a próxima.