Robô de vigilância Roomberry:Roomba + Pi Zero + Câmera
Roomberry é um robô de vigilância baseado no Roomba usando um Raspberry Pi Zero W e um módulo de câmera. Anos atrás, comecei a fazer alguns testes para controlar um Roomba remotamente usando um Arduino One com um módulo RN-VX WiFly.
No mês passado decidi revitalizar a ideia, mas com um novo objetivo:transformar o Roomba em um robô de vigilância com a capacidade de tirar fotos e vídeos. A primeira ideia era continuar usando o Arduino como microcontrolador empregando um módulo Arducam para captura de fotos. No entanto, descobri rapidamente que a capacidade de processamento de imagem do Arduino era muito limitada para meus interesses. A segunda opção foi mudar a plataforma e usar um Raspberry Pi Zero W com um módulo de câmera. Esta alternativa significou alguns desafios, principalmente no que diz respeito à alimentação, mas também ofereceu mais possibilidades. Neste post, explicarei como construir o Roomberry, um robô de vigilância baseado no Roomba usando um Raspberry Pi Zero W e um módulo de câmera.
Uma demonstração dos recursos do Roomberry e da interface da web desenvolvido para interagir com ele pode ser visto no vídeo a seguir.
iRobot Roomba
iRobot’s Roomba oferece uma Interface aberta (OI) para interagir com o robô através de um conector mini DIN. O OI é uma interface de software projetada para o criador 2 do Roomba (uma adaptação da série 600). No entanto, também é totalmente compatível com as séries 500 e 700. No entanto, existem alguns bugs dependendo da plataforma e da versão de firmware usada. A interface do software permite que você manipule o comportamento do Roomba e leia seus sensores. Uma descrição completa de seus recursos pode ser encontrada neste documento.
Conector Mini DIN
O mini conector DIN do Roomba está localizado no lado direito frontal do Roomba serie 700 e tem 7 pinos. Sua posição varia ligeiramente na série 600, cuja localização é na parte traseira direita do Roomba, sob uma proteção de plástico removível. Mini DIN 7 os conectores machos são complicados de comprar, no entanto, o mais comum mini conector macho DIN de 8 pinos também é compatível.
Para garantir uma conexão / desconexão suave e confiável da porta, soldei um cabo de 5 pinos (projetado para tiras de LED) com um conector fêmea a um conector mini DIN de 8 pinos macho usando os pinos 1-2 (potência), 6-7 (terra), 3 (RxD), 4 (TxD) e 5 (BRC). No entanto, como comentado posteriormente, a conexão de energia / aterramento finalmente não foi necessária. O cabo resultante pode ser visto nas fotos a seguir.
Porta serial do Roomba
Para usar o OI, os comandos deve ser enviado por meio de uma comunicação serial bidirecional criado em mini DIN 7 pinos 3 (RxD) e 4 (TxD). Esta porta UART funciona em níveis TTL (0 - 5 V). Essa tensão é perfeitamente adequada para microcontroladores que usam lógica de 5 V, como a maioria das placas Arduino. No entanto, não é bom para aqueles com níveis lógicos de voltagem mais baixos (como o Raspberry Pi).
Em teoria, o pino 3 (RxD) terá 3,3 V como o nível lógico alto. Mas o Roomba produzirá 5 V em seu pino 4 (TxD), o que pode danificar o Raspberry Pi Zero. Para manter o hardware seguro, um deslocador de nível lógico deve ser usado. A maneira mais simples de fazer isso é com um divisor de resistor, como já implementado em meu projeto anterior Calduino, mas isso pode não funcionar em altas velocidades (a porta serial do Roomba funciona a 115200 bauds).
Em vez disso, um deslocador de nível ativo é preferível. Se você quiser construir seu próprio circuito, use o transistor de efeito de campo AN10441 conforme explicado aqui. Uma opção muito mais fácil é usar um dos conversores de nível lógico bidirecional existentes, como este da Adafruit. Este dispositivo pode gerenciar até 4 sinais e reduzi-los com segurança de 5V para 3,3V. Ao mesmo tempo, ele aumenta os sinais de 3,3 V para 5 V.
Alimentando Raspberry Pi do Roomba
Existem algumas alternativas para fornecer fonte de alimentação por meio da bateria do Roomba:
Alimentando a partir do Mini DIN 7
O mini DIN 7 fornece uma conexão direta não regulamentada nos pinos 1/2 (Vcc) - 6/7 (Gnd) à bateria do Roomba. A conexão é limitada a 200 mA através de um fusível PTC reajustável . Oferece uma tensão entre 20,5 e 10 V, limitada a 0,2 A com uma potência de 2 W. O consumo contínuo desses dois pinos juntos não deve exceder 200 mA. Desenhar um pico maior que 500 mA reinicializará o fusível.
Um Raspberry Pi Zero W deve ser capaz de funcionar com este suprimento. A Raspberry Pi Foundation avalia o consumo de corrente ativa típico de placa nua em 150 mA. Este benchmark o coloca entre 120 mA em inativo status e 180 mA under stress (reproduzindo vídeo FullHD, por exemplo). No entanto, aqui o consumo extra da câmera não é considerado. Pelas minhas medições, a câmera (eu uso esta, com o mesmo sensor da câmera Pi oficial da versão 1) aumenta o consumo de energia para mais de 300 mA, com picos de 450 mA. Durante meu teste, o fusível disparou várias vezes durante a gravação de vídeos.
Como conclusão, o termofusível existente descarta o uso desta conexão para alimentar o Raspberry Pi Zero W. Não consegui descobrir se é possível e seguro remover o fusível da placa sem danificar outros componentes.
Alimentando a partir de um banco de energia externo
Existem algumas alternativas para evitar esse limite de fusível. Por outro lado, a solução mais fácil seria usar um banco de potência para fornecer alimentação externa ao Raspberry Pi Zero. No entanto, será necessário que o usuário o carregue periodicamente. Outra opção seria projetar uma conexão serial entre a fonte de alimentação mini DIN 7 e o banco de energia. Com alguns componentes eletrônicos, deve ser possível usar a bateria do Roomba para carregar o banco de energia. Para simplificar meu projeto, decidi evitar o uso de quaisquer fontes adicionais de energia.
Alimentando a bateria
Eu finalmente decidi ignorar o fusível construindo uma conexão direta para o pacote de bateria . A contrapartida desta opção é que você terá que desmontar parcialmente o robô . No Roomba série 600, há dois grandes pads conectados diretamente à bateria abaixo do botão de dock. Na série Roomba 700/800, você terá que desmontar mais alguns componentes. Dê uma olhada no vídeo a seguir até o minuto 6 para ver, passo a passo, como acessar a placa-mãe do seu robô . Feito isso, basta soldar alguns cabos na almofada da bateria, conforme mostrado nas próximas fotos.
Esses cabos fornecem uma conexão direta com a bateria não limitada por qualquer fusível. Eles fornecem entre 20,5 e 10V, dependendo do nível de carga da bateria. No entanto, o Raspberry Pi Zero W precisa de uma fonte de alimentação regulada de 5 V. Para reduzir a tensão, uma redução é usado. Existem muitas opções para fazer isso, desde o uso de um regulador linear barato (como o 7805 TO-220) com alguns capacitores para instalar um regulador de comutação .
Devido à sua maior eficiência , e considerando que estará sempre conectado, aconselho usar / comprar um de boa qualidade (evite imitações da China) regulador de comutação abaixador . Eu usei o regulador de buck Pololu D24V5F5 que pega uma entrada de até 36 V e reduz para 5 V para uma corrente de saída máxima de 500 mA. Sua eficiência é avaliada entre 85% e 90% e tem um dropout muito baixo. Você também pode usar um UBEC (Circuito de Eliminação de Bateria Universal), como o comumente usado no mundo RC. Coloquei meu regulador de tensão em um espaço livre situado no centro - lado direito do robô.
As conexões foram devidamente protegidas com termoencolhível e o módulo D24V5F5 foi coberto com plástico isolante (eu não tirei nenhuma foto disso). Soldei a saída do módulo a um cabo micro-USB, o que me permite conectá-lo diretamente à entrada de alimentação Raspberry Pi Zero W.
Usando uma ferramenta de perfuração rotativa e uma lixa, criei um pequeno entalhe na tampa superior do Roomba para permitir uma saída limpa do cabo micro USB, como pode ser visto em a imagem a seguir.
Modos OI do Roomba
O Roomba OI tem quatro modos de operação:Desligado, Passivo, Seguro e Completo.
Modo desligado :Após a troca da bateria ou quando ligado pela primeira vez, o OI está no modo desligado. Nesse status, o Roomba escuta a porta na taxa de transmissão padrão (115200), aguardando um comando de início. Os comandos reset e stop podem ser enviados a qualquer momento e colocarão o OI no modo off.
Modo Passivo: Assim que um comando Iniciar é enviado, o Roomba entra no modo passivo . Nesse status, você pode solicitar e receber dados do sensor usando qualquer um dos comandos do sensor. No entanto, você não pode alterar os parâmetros de comando atuais para os atuadores (motores, alto-falante, luzes, drivers de baixo, saídas digitais). O Roomba entrará no modo passivo também se um dos comandos do modo de limpeza (Spot, Clean, Seek Dock, etc.) for enviado.
Enquanto estiver no modo passivo, o Roomba entrará no modo desativado após cinco minutos de inatividade para economizar energia e preservar a bateria. De acordo com a documentação do iRobot, o sono pode ser desativado apenas pressionando o pino BRC para baixo periodicamente antes que esses cinco minutos expirem. Cada pulso deve zerar este contador de cinco minutos. Nos testes que realizei (com um Roomba 780), puxar o BRC para baixo apenas acordará o robô, mas não o impedirá de ir para o modo de economia de energia. O robô emitirá um bipe ao acordar (se não estiver sendo carregado na dock station).
Modo de segurança :O Roomba entrará no modo de segurança se o comando Safe for enviado. O modo de segurança oferece controle total do robô e desliga todos os motores e LEDs. No entanto, se uma condição relacionada à segurança não for atendida, o robô mudará automaticamente para o modo passivo . Essas condições de segurança são:detecção de um precipício durante o avanço, queda da roda e conexão do carregador. Neste modo, o Roomba não carrega (embora esteja na base) e não economiza energia ao alternar para o modo desligado após 5 minutos de inatividade. Este ponto é muito importante:você pode acabar descarregando a bateria do robô e danificando-a se não alternar para o modo passivo ou desligado.
Modo completo :Quando você envia um comando Full para a OI, o Roomba entra no modo Full . O robô se comportará exatamente como no modo de segurança, mas não levará em consideração as condições relacionadas à segurança comentadas anteriormente, portanto, esteja ciente dos riscos!
Precauções com a bateria :Conforme comentado, no modo Passivo, o Roomba entrará em hibernação após 5 minutos de inatividade para preservar a energia da bateria. Nos modos Seguro e Completo, o Roomba nunca hibernará e, se for deixado nesse estado por um longo período de tempo, descarregará profundamente a bateria, mesmo se conectado ao carregador. O carregador alimentará o Roomba em todos os modos, mas não carregará a bateria no modo Seguro ou Completo. É importante retornar o Roomba ao modo Passivo ou Desligado assim que um trabalho for concluído e / ou quando o nível da bateria estiver baixo para protegê-lo.
Raspberry Pi Zero W
O Raspberry Pi Zero W é uma versão atualizada do Raspberry Pi Zero com LAN sem fio e Bluetooth . O modelo inclui uma CPU de núcleo único de 1 GHz, 512 MB de RAM, mini-HDMI, uma porta micro-USB OTG, micro-USB para alimentação, conector de 40 pinos, vídeo composto, redefinir cabeçalhos, um conector de câmera, bem como os novos recursos sem fio. Ele usa o chip sem fio Cypress CYW43438 que oferece suporte a 802.11b / g / n Wi-Fi (apenas 2,4 GHz) e Bluetooth 4.0 (mesmo chip do Raspberry Pi 3 Modelo B). Comprei-o na Pimoroni com cabeçalhos (não soldados) e adaptadores por 16 €.
Câmera
O conector da câmera Raspberry Pi Zero W CSI é menor do que o Pi 3. Se você já tem uma câmera, terá que comprar um adaptador para usá-la. Caso contrário, eu recomendaria comprar este módulo de câmera, que incorpora um sensor de 5MP (igual à câmera Pi oficial da versão 1) e pode gravar vídeo em 1080p. Custa 18 €. Eu escolhi a câmera grande angular com corte IR. Eu sei que não poderei ver nada à noite, mas o uso de LEDs IR aumentará o consumo de energia, que eu queria manter baixo. Você sempre pode usar as luzes Philips HUE para controlar remotamente as luzes de sua casa.
Energizando Raspberry Pi Zero W
Há algumas considerações a serem feitas em relação à fonte de alimentação do Pi Zero. Em primeiro lugar, e ao contrário dos modelos maiores, o Pi Zero não tem qualquer regulamento ou fusível para protegê-lo de sobretensão ou picos de corrente. Isso significa que você deve fornecer uma fonte estável de energia com 5 V. A fonte de alimentação pode ser conectada ao micro USB do lado direito (Pwr In) ou ao pino de 5 V no conector GPIO. Ambos são da mesma linha. Certifique-se de que, se uma tensão incorreta for aplicada ou um pico de corrente ocorrer na linha, você provavelmente danificará seu Raspberry Pi permanentemente .
Como já foi comentado, picos de consumo de 400 mA com a câmera conectada foram medidos durante a execução de testes de estresse. A Raspberry Pi Foundation recomenda uma fonte de alimentação de pelo menos 1,2 A. No entanto, os 0,5 A fornecidos pelo regulador de buck têm sido suficientes para mim. Até agora não encontrei nenhum problema relacionado com a fonte de alimentação.
Redução do consumo de energia
Considerando que o Raspberry funcionará com a bateria do Roomba, será interessante reduzir o consumo de energia tanto quanto possível. Por exemplo, sabendo que o Pi Zero funcionará sem cabeça (sem um monitor conectado) e só será acessado por SSH, não há necessidade de ligar o circuito do monitor. Desativar a porta HDMI pode economizar até 25 mA. Para fazer isso, basta executar / usr / bin / tvservice -o (ou com -p para reativar). Coloquei um pequeno script em /etc/rc.local que verifica se o cabo HDMI está conectado ou não e desativa a porta HDMI de acordo.
# Obtenha o tipo de saída de vídeo atual e remova os bits sem importância
video =“$ (tvservice -s | sed“ s /^.*\[\([^] * \). * $ / \ 1 / ”)“
if [“$ video“! =“HDMI”]; em seguida,
printf “HDMI não detectado. Desligando. \ N ”
tvservice -off> / dev / null
else
printf“ HDMI detectado. \ N ”
fi
Outra forma de reduzir o consumo de energia é desabilitando os LEDs do Pi. O Raspberry Pi Zero tem apenas um, o LED de atividade, que pisca toda vez que o cartão SD é acessado. Seu consumo é de aproximadamente 5 mA. Para desabilitá-lo totalmente, adicione estas linhas em seu arquivo /etc/rc.local:
# Defina o acionador de LED Pi Zero ACT para ‘nenhum’
echo nenhum | sudo tee / sys / class / leds / led0 / trigger
# Desligue o LED Pi Zero ACT
echo 1 | sudo tee / sys / class / leds / led0 / brilho
Você também pode fazer isso editando o arquivo /etc/config.txt:
# Desative o LED ACT no Pi Zero
dtparam =act_led_trigger =nenhum
dtparam =act_led_activelow =on
Não tenho certeza se isso se traduzirá em uma redução real do consumo, mas como não será usado, você pode desativar o módulo bluetooth do Pi Zero adicionando a seguinte linha a / etc / config .TXT:
# Desative o bluetooth no Pi Zero
dtoverlay =pi3-disable-bt
Finalmente, tente reduzir o software instalado e em execução no Pi Zero. Por exemplo, use Raspbian Lite em vez da versão para desktop e não instale software extra, a menos que seja realmente necessário. Quanto mais processos rodando em sua máquina, mais consumo ela terá.
Outras considerações
- Será muito útil construir um botão de reset no Pi Zero. Desta forma, você evitará ter que desconectar e conectar a fonte de alimentação toda vez que quiser reiniciar o sistema. Para fazer isso, você só precisa conectar os orifícios do Raspberry marcados com correr com uma mudança momentânea. Eu usei um deste do Sparkfun.
- Você precisará de um cartão MicroSD novo e fresco com Raspbian Stretch lite ou mais recente. Conforme explicado neste post, eu recomendaria usar um cartão tão grande quanto possível. Embora a configuração aplicada aqui tente reduzir as gravações em disco, deixar bastante espaço livre garante uma vida útil mais longa aos cartões SD.
- Este tutorial considera que o Raspberry Pi Zero usado está executando o Raspbian Stretch sem cabeça . Você pode ler em postagens anteriores como instalar o Rasbian, criar novos usuários e conectar-se usando SSH.
Construindo Roomberry
Depois que todas as peças foram descritas, vamos ver como construir e executar o Roomberry, sua interface do Raspberry com o Roomba.
Meu objetivo era encapsular os componentes (Raspberry Pi Zero, módulo de câmera, conversor de nível lógico e botão switch) em uma caixa estável com fácil acesso a todas as portas e cartão SD. A única opção que encontrei, excluindo imprimir meu próprio design 3D, foi esta. Este gabinete atende a todos os requisitos e me permite conectar um HAT (Hardware Attached on Top), uma placa complementar com alguns componentes eletrônicos necessários. A imagem a seguir mostra o esquema PCB. Observe que os pinos de execução estão localizados no Pi Zero e não no HAT. Para construí-lo, um pedaço de uma placa PCB de 12 x 10 pinos será suficiente. Para cortar o PCB, usei uma ferramenta rotativa.
O conversor de nível lógico precisará de alta e baixa tensão, que podem ser obtidas no GPIO (o Pi Zero inclui um conversor redutor de 5 para 3,3 V denominado PAM2306AYPKE). Coloquei o botão de mudança no meio do Pi Zero, pois era uma extensão do HAT. Ao fazer isso, a haste do botão destaca-se da caixa para que possa ser pressionado externamente. Você terá que fazer alguns furos na caixa:um para o botão de vapor e outro (e maior) para a câmera. Além disso, tive que lixar cuidadosamente o espaço da caixa projetado para o conector CSI para abrir espaço para uma volta de 180 graus do cabo. As fotos a seguir mostram os resultados:
Configurando Raspbian Stretch
Antes de conectar o Roomberry ao conector mini DIN 7 do Roomba, algumas etapas de configuração devem ser executadas. Supondo que o Raspberry Pi Zero W esteja executando a última versão do Raspbian e já esteja configurado sem cabeça.
Conecte a fonte de alimentação micro USB construído anteriormente para o Pi Zero. Após alguns segundos, o sistema deve estar instalado e funcionando. Abra uma conexão SSH com seu pi Zero.
Por padrão, a porta serial do Pi é configurada para ser usada para entrada / saída do console . Para se comunicar com o Roomba por meio dessa porta, o login do console serial precisa ser desativado. Você pode fazer isso com o menu 5 de configuração do raspi - Opções de interface e P6 - Serial. Resposta Não à pergunta “Você gostaria de fazer login no shell para ser acessível via serial?” e Sim para “Deseja que o hardware da porta serial seja habilitado?”. Não reinicie o sistema ainda. Como alternativa, você também pode comentar a definição do console e adicionar ao final do arquivo / boot / config a seguinte linha:
# Encontre e comente a definição do console
# console =serial0,115200
...
enable_uart =1
Se você ainda não fez isso, ative o módulo da câmera . Novamente, você pode fazer isso através do raspi-config escolhendo o menu 5 e a opção P1. Por outro lado, você também pode editar o arquivo / boot / config e incluir essas alterações (desativar o LED da câmera não é necessário, mas recomendado para economizar energia):
start_x =1
gpu_mem =128
disable_camera_led =1
Não tenho certeza de qual é a quantidade ideal de RAM para atribuir como gpu_memory quando o módulo da câmera está sendo usado. Até agora, não encontrei nenhum erro de “Sem recursos” ao operar a câmera, então presumo que 128 Mb seja uma boa escolha.
Desative todas as trocas e o diretório mount / tmp no disco RAM com 50 megabytes de espaço. Este local será usado para armazenar arquivos efêmeros, como instantâneos de câmera e arquivos de status do Roomba. Aumente o tempo de confirmação em etc / fstab para 30 minutos e inclua a opção noatime na partição SD. Encontre os comandos neste post.
Agora é hora de testar se tudo está funcionando corretamente. Abaixe seu Pi e conecte a porta serial ao Roomba. Coloque o Roomba na base de carregamento . Inicialize o sistema e verifique se tudo está funcionando conforme o esperado (e se o robô não está fazendo nada de estranho).
Teste de leitura da porta serial :Usei o minicom para ler os dados enviados pelo Roomba. Para instalar basta digitar:
sudo apt-get minicom
Conecte-se à porta serial do Roomba fazendo:
minicom –b 115200 -o -D / dev / serial0
Se o seu Roomba estiver carregando, você deverá ver um texto semelhante à imagem a seguir relatando o estado de carga do Roomba a cada segundo. Pressione CTRL + A e X para sair do minicom.
Leia mais detalhes:Roomberry Surveillance Robot:Roomba + Pi Zero + Camera
Processo de manufatura