DAMI-M3 v1.1.0
Esta versão do DAMI-M3 tem como principais novidades: a inclusão de um transceiver nRF24L01 que é usado para efectuar a comunicação com o exterior sem estar agarrado ao cabo USB, e o uso dessa capacidade de comunicação para, através de uma estação base, proceder à integração dos dados com um programa no Processing3 que desenha o mapa do espaço.
Para além desta novidade foi também acrescentado um led amarelo, que supostamente iria servir como indicador de bateria. Mas que por enquanto serve como substituto do led interno já que a porta D13 é usada como sinal SCL na interface de comunicação SPI usada pelo nRF24L01.
Durante a ultima fase de preparação desta versão passei a considerar abandonar o uso do sensor de distancia VL53L01 pois ele funcionava ou funciona ainda (não tive tempo para perceber) de forma errática.
Simplesmente para de fazer leituras. Associei esse problema ao uso do servo. Pois acontece logo no inicio (inicialização do servo), ou durante o seu uso no processo de varrimento frontal.
Para mitigar o problema fui colocando condensadores electroliticos entre a positivo e a terra, no barramento de ligações (alimentação 5V).
Parei no condensador de 1000 uF. Com este pelo menos funcionou em dois testes preliminares e no teste geral efectuado.
Sem o PI para comunicar com o exterior via wifi, estive a avaliar as seguintes alternativas de módulos rádio:
- Módulo WIFI ESP8266-M1
- Par de módulos transmissor/receptor rádio RF433MHz
- Módulo Wireless 2.4GHz nRF24L01
Acabei por optar pelo módulo nRF24L01 devido à sua rapidez na comunicação de pequenos blocos de dados.
O módulo foi ligado e integrado no robot de forma provisória (sem estar fixo a nenhum suporte).
Também por causa da falta do PI avaliei as seguintes opções para aumentar a memoria disponivel nos arduinos:
- Módulos de Cartão SD
- EEPROMS I2C (24C32)
Neste caso acabei por escolher as EEPROMS, mas ainda não experimentei no robot. Apenas num circuito teste separado.
Espero testar estas memórias no robot brevemente, e incluir uma na proxima versão do DAMI-M3
Solução de comunicação nRF24L01
A solução de comunicação adoptada implica a existência de dois transceivers nRF24L01. Um no robot e outro numa estação base, que entretanto se liga ao computador por USB serial.
Esta solução técnica é bi-direcional. Tanto podemos receber informações do robot, como podemos enviar informações e comandos para ele.
Foi adoptada a arquitetura de comunicação bi-direcional usando o conceito de ackPayload, implementada na demonstração que envolve os seguintes programas.
- SimpleTxAckPayload.ino
- SimpleRxAckPayload.ino
fonte: http://forum.arduino.cc/index.php?topic=421081
Nesta versão ainda não faço uso do ackPayload para transmitir informações ou comandos uteis para o robot. O método está presente mas envia dados exemplo, que são ignorados pelo robot após a recepção.
Robot
Neste momento a unica comunicação sistemática do robot são os dados gerais do loop enviados em todas as iterações do loop.
Base de comunicações
A estação base de comunicações recebe os dados via rádio, e processa os para envio por comunicação USB serial.

A base provisória é composta por um arduino nano168 e um condensador de 100 uF, montados numa placa de testes e um módulo nRF24L01 pendurado pelos fios de ligação.
O programa permite selecionar o formato da saida USB serial, entre o geral e o requerido para processar o mapa no Processig3.
A primeira versão funcional é a usada no teste desta versão do robot DAMI-M3.
Mapa no Processing3
Para desenhar o mapa decidi usar o Processing3. Sem nunca ter contactado com este tipo de programa, demorei algum tempo a apreender pelo menos a parte do seu funcionamento necessária ao projecto.
O Processing3 é um software muito versatil, que entre outras coisas permite fazer desenhos ou gráficos animados.
A versatilidade do processing3 manifesta-se por exemplo na diversidade de fontes de aquisição de dados e nas bibliotecas disponiveis.
Mas o grande poder do processing3 é ser programavel. Ou seja, o desenho é o resultado de um programa.
Sem nunca ter encontrado um programa de exemplo para fazer um mapa, decidi partir para a sua concepção.
A primeira versão funcional, mas ainda cheia de erros é a usada no teste desta versão do robot DAMI-M3.
Hardware
Adicionado ao robot relativamente à versão anterior:
- nRF24L01
- Led amarelo + resistência
Estação base de recepção
- Arduino Nano 168
- nRF24L01
- Condensador 100 uF
Software
- Robot
- dami_m3_master_sensor_mod2_v11
- dami_m3_slave_motion_mod2v5
- Base
- dami_nrf24l01_rxbase_v1
- Processing
- dami_map_mod1_v1
Descrição do teste
O DAMI-M3 fica confinado num espaço delimitado, onde pode circular à vontade sem bater em nenhum dos limites.
O programa continua a ser bastante simples, foram apenas efectuadas as correções aos erros existentes na ultima versão.
O programa limita-se evitar obstaculos com o seguinte método:
- Quando o sensor frontal detecta uma distancia abaixo do limite:
- Pára;
- Anda para trás;
- Faz um varrimento de 180 graus de 15 em 15 graus com o sensor frontal;
- Decide pela maior distancia;
Para além de se desviar de obstaculos, em todas as iterações do loop, a odometria é recalculada e os dados gerais são enviados para a base.
O Processing3 liga-se à base de comunicação por USB serial e recebe a pose do robot (x,y, orientação) e os dados das distancias dos 3 sensores.
Com estes dados o Processing3 desenha a posição do robot e os pontos ocupados detectados.
Resultados
Os resultados do teste desta versão do robot estão documentados no video abaixo.
Considerações sobre o mapa
De uma forma geral o icone do robot é satisfatório. O seu movimento aparenta estar globalmente bem representado. Existe uma falha. Um pormenor errado no movimento de rotação em que a pose altera-se rapidamente antes de efectuar a rotação, no final aponta para a direção certa.
O desenho das áreas ocupadas é que é muito defeituoso. Ou melhor completamente errado. Acho que devo seguir outra abordagem.
Neste momento mando as coordenadas dos pontos, e desenho apenas os pontos, num fundo branco.
Penso que irei experimentar mandar as coordenadas polares, e passar a usar um fundo preto, desenhando linhas a branco até aos pontos, que podem ser de cor, azul ou vermelho por exemplo.
Considerações sobre o movimento
Não compreendo muito bem as decisões do robot. Terei que arranjar forma de passar cá para fora os dados recolhidos neste tipo de eventos.
Considerações gerais
Os resultado foram encorajadores. O robot não colidiu com nenhuma parede.
E o mapa foi desenhado de forma rudimentar e com falhas mas já é uma base de trabalho. Portanto há que melhorar seguindo os caminhos identificados acima.
Para além das duvidas sobre a implementação do processo de decisão, também notei um comportamento anormal do servo a partir do segundo varrimento.
No primeiro varrimento. o servo vai para os 0 graus e faz o varrimento até aos 180 graus. No final regressa aos 90 graus.
A partir dai, o comportamento muda. Antes de ir para os 0 graus o servo vai aos 180 graus, volta aos 0 e só depois faz o varrimento normal.
Por último também acho oportuno implementar numa próxima versão dos programas envolvidos a comunicação de comandos básicos (ex: parar, iniciar) da base para o robot.
Ideias a fazer transportadas da antiga versão
- Limpar o programa de lixo
- Repensar o nome de variaveis e funções
- Documentar minimamente
- Desenvolver mais comportamentos
- Scan rotate
- Saida de beco
- Remover os HARDCODED
- Melhorar o processo de decisão
- Estudar o comportamento da bateria
Integração com Processing3 para fazer mapasPor 1 ou dois leds como indicadores da bateria