Manual

do

Maker

.

com

Utilizando Raspberry Pi como servidor de câmera (web).

Utilizando Raspberry Pi como servidor de câmera (web).

Nada como ter à mão um Raspberry Pi pra chamar de seu, não é mesmo? Além das possibilidades comuns a um sistema operacional (estou falando de Linux obviamente) ainda você conta com recursos de GPIO, característico de plataformas embarcadas. Mas esse post não é pra falar de GPIO (apesar de que o recurso será agregado em outro post). Dessa vez, vamos fazer um servidor de câmera com o Raspberry e uma webcam - e o propósito não é só provar conceito, esse post é um ensaio para um projeto no mínimo interessante, também em andamento.

Todos os comandos precisarão de acesso de root, então faça:

sudo su

E digite sua senha. Assim ficará com um console de root e facilitará a vida um pouquinho para fazer as configurações. Depois é só apertar Ctrl+D ou digitar 'exit' e tudo se acaba.

/var/log/messages não existe

É, não existe mais por padrão. Eu sequer sei qual o comando relativo ao 'tail -f', mas não me preocupo com isso porque eu gosto do messages, o utilizava desde 1998. Não sou resistente a mudanças, mas não estou interessado nesse momento estudar a mudança do arquivo de log. Vamos utilizá-lo?

cd /etc/rsyslog.d
vi 50-default.conf

Ou se preferir, use nano, midnight commander, pico, kate, gedit...

Com 'vi' você pode procurar o alvo assim:

/messages

Aperte enter e então você verá um bloco de comentários com isto:

#*.=info;*.=notice;*.=warn;
#       auth,authpriv.none;
#       cron,daemon.none;
#       mail,news.none          -/var/log/messages

Descomente essas linhas e reinicie o rsyslog:

service rsyslog restart
[ -f /var/log/messages ] && echo "Arquivo agora existe"

O próximo passo é reconhecer a webcam. Espero que não a tenha conectado previamente. Inicie o monitoramento do log.

tail -f /var/log/messages

Cada câmera é um caso. No meu caso, o resultado ao conectar a webcam foi esse:

Jan 13 02:33:24 KGB kernel: [1744397.450053] usb 2-1.4: new full-speed USB device number 74 using xhci_hcd
Jan 13 02:33:24 KGB kernel: [1744397.556636] usb 2-1.4: New USB device found, idVendor=093a, idProduct=2464
Jan 13 02:33:24 KGB kernel: [1744397.556644] usb 2-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Jan 13 02:33:24 KGB kernel: [1744397.556648] usb 2-1.4: Product: CIF Single Chip     
Jan 13 02:33:24 KGB kernel: [1744397.556652] usb 2-1.4: Manufacturer: Pixart Imaging Inc. 
Jan 13 02:33:24 KGB kernel: [1744397.556895] usb 2-1.4: ep 0x83 - rounding interval to 256 microframes, ep desc says 400 microframes
Jan 13 02:33:24 KGB kernel: [1744397.556902] usb 2-1.4: ep 0x4 - rounding interval to 256 microframes, ep desc says 400 microframes
Jan 13 02:33:24 KGB mtp-probe: checking bus 2, device 74: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.4"
Jan 13 02:33:24 KGB mtp-probe: bus: 2, device: 74 was not an MTP device
Jan 13 02:33:24 KGB kernel: [1744397.586495] gspca_main: v2.14.0 registered
Jan 13 02:33:24 KGB kernel: [1744397.589248] gspca_main: pac207-2.14.0 probing 093a:2464
Jan 13 02:33:24 KGB kernel: [1744397.589775] input: pac207 as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.4/input/input675
Jan 13 02:33:24 KGB kernel: [1744397.590019] usbcore: registered new interface driver pac207

Instale o programa cheese (usando Emdebian):

apt-get install cheese

Agora você já poderá fazer o primeiro teste da webcam. Pode dar Ctrl+C no terminal, interromper o tail no log e sair de root por um momento:

su pi

Ou o usuário que porventura tenha criado. Depois para voltar pra root, não será necessário digitar a senha novamente. Desse modo, bastará um Ctrl+C, Ctrl+D e ele volta pro usuário que chamou 'su pi'.

Precisamos agora testar a velocidade de captura da webcam, mas antes disso, vamos a uma dica preciosa.

Utilizar o Raspberry como servidor de qualquer coisa que faça I/O no cartão SD é predição de morte da midia. Cartão SD é sensível como uma moça. Então, o que fazer? - Você tem duas opções (ou talvez não):

  • Se estiver utilizando um Raspberry Pi 2, poderá fazer persistência dos dados em um disco SATA (conectado à USB via HUB com alimentação externa).

  • Em qualquer outro caso, pode utilizar um espaço de memória RAM como se fosse um diretório local e assim você exponencía a velocidade de gravação, elimina gargalos e poupa a vida de qualquer midia que seja.

Em contrapartida (é assim no novo português?), não haverá persistência das gravações utilizando o segundo método. Para o projeto pretendido (que será contemplado em um próximo post) não há necessidade de persistência, portanto particularmente não vejo melhor opção do que utilizar um pouquinho da RAM. Esse processo simples e interessantíssimo pode ser feito de duas maneiras diferentes e simples, descrito nesse outro post.

Monte uma área de memória e então vamos fazer um teste com o fswebcam

apt-get install fswebcam
cd /mount_point_que_voce_montou_a_ram
fswebcam teste.jpg

Já faço teste com careta porque ser feio é minha especialidade. De longe sou feio, de perto parece que tou longe.

Como você pode ver, a captura padrão gera um banner com data e hora. É fantástico para log e nesse caso, muito bom se você resolver fazer persistência, gravando-o (ou movendo-o) para o disco. Claro que você pode também definir a resolução. Dê uma lida no manual se lhe interessar ver mais recursos:

man fswebcam

Servir câmera via página web com Motion

Tal qual os programas anteriores, instale o Motion e siga com a edição de seu arquivo de configuração:

apt-get install motion
vi /etc/motion/motion.conf

Alguns parâmetros devem ser modificados neste arquivo. Dos quais:

#iniciar o programa em background
daemon on
#resolucao - dependente da camera. No meu caso, VGA
width  640
height 480
#Taxa de quadros por segundo, de 2 a 100. Faça testes
framerate 24
#Mudar as portas pode ser uma boa ideia
webcam_port  8888
control_port 9999
#qualidade do jpeg. Faça testes
webcam_quality 70
#permitir visualização externa (alem de localhost)
webcam_localhost off

Diversos ajustes podem ser feitos nesse arquivo, incluindo autenticação. Sugiro que comece pelo básico exposto aqui e depois de ver funcionando, faça a mudança que desejar.

Tem configurações pra motion detection, faremos testes com isso em outro post, agora o foco é por pra funcionar o básico.

Em relação ao diretório na memória; pode ser qualquer mount point, qualquer nome, como preferir, mas recomendo que crie algo como /media/motion ou /mnt/motion.

Continuando no arquivo de configuração do Motion, indique esse diretório para escrita:

#diretorio para gravacao de video e imagem
target_dir /mnt/motion

Por fim, resta habilitar o daemon noutro canto.

vi /etc/default/motion

Então troque o valor para 'yes', como abaixo:

start_motion_daemon=yes

Inicie o serviço:

service motion start

E agora é hora de quebrar a garrafa de champagne nesse barco (teste local):

webcam-1-300x202.webp

Troubleshooting

Se aparecer uma tela cinza no browser, não desanime ainda. Instale o pacote libv4l-0 (apt-get install libv4l) e posteriormente:

LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libv4l/v4l1compat.so motion -n

Ou ainda:

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so motion

E se não rolar, que pena.

Espero que tenha gostado e, se gostou, espere até ver o projeto que me motivou a escrever esse post.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.