AAyWall Uma porta virtual baseada em Arduino para aspiradores IRobot Roomba. Parte1
Autor: Paulo Cezar Cunha | Publicado: 2012-09-30T23:12:00-03:00




Introdução


Roomba serie 500


Ha cerca de 3 anos, ganhamos de presente (Obrigado Michel)&nbsp;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&nbsp;faróis&nbsp; autorizando ou não a passagem do aspirador para outros cômodos da casa.


IRobot Lighthouse




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



Ela&nbsp;também&nbsp;pode funcionar no modo de Farol(lighthouse) neste modo o&nbsp;robô&nbsp;limpa um ambiente por 20 minutos e após isto, localiza o farol para passar a limpar o próximo cômodo. O&nbsp;robô&nbsp;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.&nbsp;



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&nbsp;recarregável&nbsp;(1.2v) e deve durar pelo menos 2 meses;
Usar o mínimo de componentes&nbsp;possível;
Fazer um projeto&nbsp;fácil&nbsp;de replicar.




Desafios


Como funciona uma porta de verdade?

Após analisar algumas páginas WEB sobre o assunto como&nbsp;esta&nbsp;e&nbsp;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&nbsp;cálculos&nbsp;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,&nbsp;Attiny84 e&nbsp;Attiny85.





Para o projeto, precisamos de um processador capaz de operar em um&nbsp;nível&nbsp;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&nbsp;protótipo&nbsp;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:&nbsp;



8Mhz@5v 50% - 14ma

1Mhz@5v: 50% - 7mah

1Mhz@5v&nbsp;25% - 6.6ma

1Mhz@5v&nbsp;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:



1mhz@2.4v - 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&nbsp;não&nbsp;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&nbsp;normal&nbsp;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)






&nbsp;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&nbsp;botão&nbsp;pressionado até o numero de piscadas desejado:

1 piscada: - 7% de duty cycle,
2 piscadas - 15% ,
3 piscadas - &nbsp;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&nbsp;código&nbsp;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&nbsp;código&nbsp; 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&nbsp;terciário&nbsp;por 1 ms em intervalos de 26&nbsp;microsegundos&nbsp; 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&nbsp;alcance&nbsp;dos modos de operação do infravermelho.