domingo, 30 de setembro de 2012

AAyWall Uma porta virtual baseada em Arduino para aspiradores IRobot Roomba. Parte1

Introdução

Roomba serie 500
Ha cerca de 3 anos, ganhamos de presente (Obrigado Michel) um aspirador IRobot Roomba Série Professional 500. O aspirador é maravilhoso e faz milagres. Possui programação para limpar automaticamente em determinados períodos, possui uma base inteligente que possibilita que ele retorne para ela automaticamente para carregar e alem do kit de manutenção ele vem com 2 portas virtuais que podem agir como faróis  autorizando ou não a passagem do aspirador para outros cômodos da casa.
IRobot Lighthouse

A porta virtual (que também pode agir como farol) é um dispositivo bem interessante. Ela emite um feixe de infravermelho invisível a olho nu que o robô "enxerga" e automaticamente para a sua jornada quando deparado com este feixe.

Ela também pode funcionar no modo de Farol(lighthouse) neste modo o robô limpa um ambiente por 20 minutos e após isto, localiza o farol para passar a limpar o próximo cômodo. O robô ao localizar o farol negocia com ele a sua passagem e pede para o farol desligar o seu facho infravermelho. Após a passagem o facho é religado. 

Este sistema de farol é bem inteligente, possibilitando o robô voltar para a sua base mesmo após passar por alguns farois.

Mais isto tudo tem um grande ponto negativo para nós pobres mortais brasileiros: o custo. Cada portinha destas custa nada menos que US$40,00 aqui. Para chegar aqui de forma legal este preço mais que dobra, fora o tempo de transito, liberação na alfandega, etc...

Como eu preciso de mais 3 portas virtuais alem das duas que vireram no Kit, eu optei por construir uma porta eu mesmo. Com base em alguns artigos na internet pude estudar o funcionamento da porta atual e desenvolver uma porta própria com um grande diferencial: preço.

Idéia

  • Aprofundar os meus conhecimentos em processadores AVR e Arduino;
  • Construir uma porta virtual de baixo custo;
  • A porta deverá ser pequena, sendo alimentada no máximo por 2 pilhas alcalinas AA;
  • A bateria deverá poder ser recarregável (1.2v) e deve durar pelo menos 2 meses;
  • Usar o mínimo de componentes possível;
  • Fazer um projeto fácil de replicar.

Desafios

Como funciona uma porta de verdade?

Após analisar algumas páginas WEB sobre o assunto como esta e esta outra, alem de diversas consultas ao google, cheguei a seguinte conclusao:

O robo fica andando a procura de um sinal infravermelho de 500hz modulado em uma onda portadora de 38khz. Para simular isto, precisamos misturar 2 frequencias diferentes. Quando o robo acha esta infravermelho ele automaticamente para e da marcha ré.

Para simular esta onde precisamos gerar pulsos com um intervalo de 26 microsegundos por 1 milisegundo, aguardar 1 milisegundo e repetir o processo.

Pensando em microcontroladores, se utilizar um com um clock de 1Mhz, facilitará bastante o projeto, pois os cálculos ficarão redondos, sem frações.

Escolha do circuito

Após pesquisa na internet por circuitos que pudessem atender a necessidade do projeto, identifiquei alguns circuitos bem simples utilizando 2 CIs timer 555, alguns capacitores e resistores que muito provavelmente atenderiam a demanda do projeto de uma porta simples. Mais eu queria utilizar um microcontrolador AVR para fazer. Alem do mais queria fazer alguns recursos adicionais como detecção de bateria fraca e configuração da intensidade do fecho infravermelho, no qual o processador me permitiria.

De início eu tinha a disposição 3 modelos de processadores:

Atmega328P, Attiny84 e Attiny85.

Para o projeto, precisamos de um processador capaz de operar em um nível de baixo consumo, com no minimo 3 portas lógicas de entrada e saída, e para facilitar a programação, se o mesmo tiver um oscilador interno de 1Mhz melhor ainda. O Attiny85, com 8Kb de memoria de programa possui todos os requisitos, e foi o escolhido.

Consumo de energia

Após um protótipo de código coloquei o robô para andar e apontei o treco para ele, e funcionou! Só que o meu protótipo estava rodando a 8Mhz e 5V. Consumindo nada menos que 14ma.

Comecei pensando em diminuir o dudy cicle do LED infravermelho, ou seja, o tempo que ele fica ligado, para diminuir o consumo, e consegui os seguintes resultados: 

8Mhz@5v 50% - 14ma
1Mhz@5v: 50% - 7mah
1Mhz@5v 25% - 6.6ma
1Mhz@5v 14% - 3.7ma

Pronto, pensei logo que a meta de 2 meses com 2 pilhas não seria alcançada. Foi quando comecei a ler e pensar em alternativas para diminuir o consumo de energia e achei os seguintes gráficos no datasheet do microcontrolador:



Isto me deu uma nova esperança. Corri, peguei 2 pilhas e fui fazer os mesmos testes rodando em pilhas, e fui direto para o melhor cenário possível:

[email protected] - 25% - 1.05 ma

1800 /1.05 / 24 = 71,24 dias

Agora sim. partindo-se do princípio que uma bateria recarregavel de baixo indice de descarga possui algo entre 1800-2000 mah, o circuito poderia rodar por algo em torno de 71 dias ou 2 meses e 10 dias!

E o melhor, quanto mais fraca a pilha, menos o circuito consome! Como o processador roda até o limite de 1.8v, isto não seria um problema.

O Circuito


Lista de compras:
Sigla Nome Modelo Digikey Part Number
IC1 AVR AtTiny85 ATTINY85V-10PU-ND
L1 Infrared Led 160-1029-ND
L2 Normal Led 751-1099-ND
R1 Resistor 1k
S1 Botão P8080SCT-ND
B1 Porta Baterias BC22AAW-ND


Eu acho que o quesito simplicidade foi alcançado. Um microcontrolador, 2 leds, sendo um infravermelho e um normal verde ou vermelho, um botão para configuração e duas pilhas. Nada que R$ 15 não resolvam.

O Código

Projeto do AVR Studio 6
Código para arduino

O Código é subdividido em 4 partes:

Configuração do duty-cycle (potencia do led infravermelho)


 A cada 20 segundos (ou configuração da variavel COUNTERVAL) o código de emissão do infravermelho é parado para verificação do botão de configuração. A consiguração é muito simples. basta deixar o botão pressionado.

2 piscadas no led de notificação indicam o inicio da rotina de configuração. Dai basta manter o botão pressionado até o numero de piscadas desejado:

1 piscada: - 7% de duty cycle,
2 piscadas - 15% ,
3 piscadas -  23%,
4 piscadas - 30%,
5 piscadas - 38%,
6 piscadas - 50%.

Ao soltar o botão, o valor é automaticamente armazenado na EEPROM, desta forma não há necessidade de reconfiguração na troca de pilhas.

Código de verificação de bateria fraca


Esta parte faz uma verificação a cada 80 segundos do nivel da bateria e o compara com um valor pre definido de 2.43 Volts. O meu avr faz uma leitura 0.05 volts a menos do real, o valor que eu realmente queria aqui é o de 2,49 volts.

A Rotina utiliza o comparador analógico do chip, bem como a sua referencia interna de 1.1volts (Bandgap) para tal. Isto não é muito bem documentado, foram necessárias varias tentativas e muitas buscas no google por "Bandgap Voltage Reference", mais o código funciona. E o melhor, sem mais componentes envolvidos.

2.49Volts, por que? Simples, ao analisar esta página, dentre outras, cheguei a conclusão de que 2.49 volts seria um bom ponto de corte para uma indicação de bateria fraca. Quando o circuito identificar bateria fraca, ele piscará o led de notificação uma vez a cada 20 segundos. A Bateria que pretendo utilizar é uma Sanyo Eneloop 2000, e o seu gráfico de descarga é o seguinte:


Loop de seleção da configuração

Esta parte do código apenas seleciona a cada 2 segundos qual a potencia escolhida e chama a rotina abaixo.

Se não tiver nenhuma potencia definida, ele escolhe o default de 23% de duty cycle.

Loop de formatação da onda (o mais importante)


Existe um loop deste para cada duty cycle. Esta é a parte mais importante do código  Eu utilizei o Atmel Avr Studio para efetuar a contagem das instruções do processador, e com isto determinar o numero correto de tempo entre cada operação. O loop primário roda 10000 vezes por 20 segundos, enquanto o loop secundário roda por 2 ms e o terciário por 1 ms em intervalos de 26 microsegundos  formando a onda descrita mais acima. Quanto mais alto for o valor de COUNTERVAL, menos o processador vai checar pelo botão e nível de bateria, pois ele ficará preso neste código.

A casa 20 segundos o código para a emissão do infravermelho por algo em torno de 1ms para efetuar estas outras rotinas. Acho que a probabilidade do robô passar nestes 1ms é bem pequena e não estou muito preocupado com isto.

Continuação

Este post continua com a Parte 2 - onde montarei o circuito em seu case definitivo, ensinarei a gravar o microcontrolador com um Arduino e testarei o alcance dos modos de operação do infravermelho.