Como trazer a câmera e exibir em uma placa de suporte do módulo de computação
Desenvolvemos a nossa própria placa porta-módulos computacional, chamada PCCB. É compatível com Raspberry Pi Compute Modules 1 - 3 Plus, e tem uma série de características muito úteis para uso industrial (RS232, CAN Bus, RS485, TPM, DC/DC Stepdown).
Hoje, eu verifiquei a câmera e a interface de exibição de 7'' que nós fornecemos no quadro também.
Observe os conectores DISP1 e CAM1.
Conhecimento de fundo sobre a câmera
O módulo da câmera tem dois pinos GPIO adicionais. Estes são designados:
- CAM_IO0 ou CAM_GPIO / CAMERA_0_SHUTDOWN
- CAM_IO1 ou Linha de LED / CAMERA_0_LED
CAM_IO0 é utilizado para dirigir a câmera, e ligá-la para cima / baixo, quando é necessário. Isto não pode ser feito manualmente configurando o pino alto em tempo de execução - o VideoCore Blob tem que ser capaz de fazer isto.
(possivelmente é possível puxar isto para cima sempre, mas isto deixará a câmara ligada e aumentará o consumo de energia).
O CAM_IO1 (LED Line) foi utilizado na câmara v1 previamente para conduzir o LED. Não está em uso na Câmara Raspberry Pi v2, segundo os engenheiros da Raspberry Pi.
O pino do conector da câmara (tanto na Câmara Raspberry Pi como na nossa placa) é:
- GND
- CAM_D0_N
- CAM_D0_P
- GND
- CAM_D1_N
- CAM_D1_P
- GND
- CAM_CK_N
- CAM_CK_P
- GND
- CAM_IO0
- CAM_IO1
- CAM_SCL
- CAM_SDA
- CAM_3V3
A câmera geralmente usa o barramento interno I2C (SDA0 e SCL0 disponíveis, por exemplo, em GPIO0 e GPIO1)
Esquemas
Estes são os esquemas do nosso esquema de hardware:
Como você pode ver (e como discutido anteriormente), estamos utilizando GPIO_27 como CAM_IO0 e GPIO_26 como CAM_IO1.
O visor não necessita de pinos GPIO adicionais.
Tanto o display quanto a câmera utilizam o barramento interno I2C, nos Pinos GPIO_1 e GPIO_0.
dt-blob.bin
Este arquivo é uma parte opcional dos arquivos de inicialização do Raspberry Pi. Ele é colocado em /boot e substitui um dt-blob.bin embutido que é compilado em start.elf.
Ele comunica a configuração do pino GPIO ao Firmware rodando no VideoCore (VCOS, Video Core OS). Como as placas Compute Module Carrier, como as nossas, terão configurações de pinos personalizados, frequentemente, este dt-blob.bin precisa de ser fornecido.
Aqui estão mais informações sobre este ficheiro, incluindo um processo de arranque passo a passo:
- https://www.raspberrypi.org/documentation/hardware/computemodule/cm-peri-sw-guide.md
- https://www.raspberrypi.org/documentation/configuration/pin-configuration.md
Raspberry Pi fornece a fonte para várias configurações possíveis com o dt-blob.bin aqui:
Eu selecionei o arquivo dt-blob-disp1-cam1.dts como fonte e renomeei-o para dt-blob-disp1-cam1_pccb.dts.
Você pode baixar o arquivo fonte original do Raspberry Pi aqui:
Este arquivo precisa ser modificado para refletir nossa escolha de pinos GPIO (que, por sua vez, permitirá que o VideoCore Firmware ligue a câmera e fale com ela).
Este arquivo fonte inclui configurações para muitos modelos Pi diferentes. Estamos interessados apenas nas configurações do módulo de computação: pins_cm3 e pins_cm
(Note que os seus números de linha podem estar desligados por alguns contadores, pois incluí algumas coisas adicionais no ficheiro que não são relevantes para a nossa discussão aqui).
Aqui você deve modificar quatro linhas. Em nossa configuração de hardware específica (!), eu modifiquei:
para
e
para:
As mesmas modificações precisam ser aplicadas tanto para CM3 como para CM.
pin@p26 { function = "output"; termination = "no_pulling"; }; // LED CAMERA 0
pin@p27 { function = "output"; termination = "no_pulling"; }; // CAMERA 0 SHUTDOWN(…)
pin_define@CAMERA_0_LED {
tipo = "interno";
número = ;
};
pin_define@CAMERA_0_SHUTDOWN {
tipo = "interno";
número = ;
};
pin_define@CAMERA_0_UNICAM_PORT {
tipo = "interno";
número = ;
};
Note que você também tem a possibilidade de utilizar uma CAMERA_0_I2C_PORT e CAMERA_0_SDA_PIN / CAMERA_0_SCL_PIN diferentes se a configuração do seu hardware assim o exigir.
O mesmo se aplica à exibição, existem as entradas DISPLAY_SDA, DISPLAY_SCL, DISPLAY_I2C_PORT que podem ser modificadas.
No nosso caso, deixei-os no padrão, pois é assim que o nosso quadro foi concebido.
Compilar este arquivo
No pi, corre:
sudo dtc -I dts -O dtb -o dt-blob-disp1-cam1_pccb.dtb dt-blob-disp1-cam1_pccb.dts
Isso lhe dará um muro de avisos, que pode ser ignorado com segurança.
Instalar o dt-blob.bin
sudo cp dt-blob-disp1-cam1_pccb.dtb /boot/dt-blob.bin
E reiniciar.
Teste
os pinos 26 e 27 estão agora configurados como pinos de saída, e são conduzidos para baixo:
vcgencmd get_camera
rendimentos:
suportado=1 detectado=1
Podes levar um alambique a usar:
raspistill -v -o test.jpg
(Não se esqueça de ativar a câmera usando raspi-config também!)
Transmissão de vídeo
Uma pequena dica de bónus. No seu Pi, você pode começar um fluxo usando:
raspivid -o - - -t 0 -hf -w 800 -h 400 -fps 24 |cvlc -vvvvv -h264-fps=24 stream:///dev/stdin -sout '#standard{access=http,mux=ts,dst=:8160}' :demux=h264
Note os -fps 24 e -h264-fps=24 para ambos, raspivid e cvlc, para sincronizar os seus framerados!
use VLC para visualizar o fluxo (usando o IP da sua placa de computação):
Mostrar
O visor também requer o dt-blob.bin.
Usei uma fonte de alimentação externa para alimentar o display, em uma revisão do PCCB teremos +5 V de energia em um cabeçalho para uso com o display.
Por favor, note que eu não podia usar o cabo flexível da câmera para fazer o display funcionar; ele tinha que ser conectado usando o seu próprio cabo (curto).
Sequencio a energia primeiro para o visor, depois para o PCCB
O toque funciona.
Mostrador e câmera juntos
Isso também funciona, o fluxo da câmera também é exibido ao vivo no visor.
Erros
durante a execução
raspistill -v -o test.jpg
vais ter:
mmal_vc_component_create: falhou na criação do componente 'vc.ril.camera' (1:ENOMEM)
também
vcgencmd get_camera
irá exibir um ou outro:
suportado=0 detectado=0
ou
suportado=1 detectado=0
Se suportado=0 você deve verificar se o seu dt-blob.bin está instalado corretamente em /boot.
Se detectado=0, você deve verificar se os pinos GPIO estão configurados corretamente no dt-blob.bin.
Certifique-se também de que a câmara é activada utilizando o raspi-config.
Orientação flexível adequada
Os cabos flexíveis têm de ser correctamente orientados para fazer a ligação. Você pode dar uma olhada nos pinos, e ver se os pinos GND e +3V3 se comportam como esperado, ou se não há conexão / sem tensão.
Serviço por pi3g
Podemos trazer o seu hardware para você, oferecer serviços de consultoria ou desenvolvimento de hardware e software Raspberry Pi sob medida - contacte-nos hoje.
Ref
- https://raspberrypi.stackexchange.com/questions/95420/raspivid-es-out-set-group-pcr-is-called-too-late-stream-keeps-freezing
- https://www.raspberrypi.org/documentation/hardware/display/
- https://raw.githubusercontent.com/raspberrypi/documentation/master/hardware/computemodule/dt-blob-disp1-cam1.dts
- https://www.raspberrypi.org/forums/viewtopic.php?t=164987 (isto tem a explicação sobre o que as linhas CAM_IO0 e CAM_IO1 são utilizadas)
- https://raspberrypi.stackexchange.com/questions/72549/how-can-i-enable-both-the-cameras-on-the-compute-module-3