Desenvolvendo Aplicações Dual Display com Qt5 no iMX6

Dual Display

Existem inúmeros artigos mostrando que é possível usar Qt5 na BeagleBone, Raspberry Pi e outros SBC’s. O diferencial deste artigo é mostrar uma das melhorias que chamou a atenção de desenvolvedores de sistemas embarcados, que é a possibilidade de executar duas aplicações simultâneas em diferentes telas. Antes da versão 5.3.0 era possível executar uma aplicação em Qt em uma tela e fazer, por exemplo, streaming de vídeo em uma segunda tela. Já a partir da versão 5.3.0, já é possível trabalhar com duas aplicações Qt, uma em cada tela. Essa nova utilidade do Qt5, entre outras, estará disponível para desenvolvedores que querem colocar melhorias em suas aplicações.

 

Você pode estar se perguntando onde aplicar essa nova funcionalidade. Existem alguns exemplos que podem ilustrar muito bem isso: 

  1. Equipamentos médicos com um display touchscreen para configuração do equipamento feita pelo médico e uma segunda tela HDMI para mostrar informações do paciente;
  2. Balanças de mercado onde um display touch screen é usado para colocar o código do produto pesado e uma segunda tela para mostrar uma tabela de preços atualizada;
  3. Kiosk de check-in em aeroportos, onde o display touchscreen é manipulado pelo usuário e a segunda tela mostra tabela de horários e voos.

 

Dual display com IMX6 - aplicações
Figura 1. Exemplos de aplicações Dual Display

 

Neste artigo estaremos usando o computador em módulo (COM) Colibri da Toradex, baseado no processador iMX6 da NXP. O módulo tem duas variantes sendo Colibri iMX6S single core com 256MB de RAM e Colibri iMX6DL dual core com 512MB de RAM, ambos com 4GB de memória eMMC.

 

 

Compilando uma imagem com Qt5 para Colibri iMX6 da Toradex

 

Preparando ambiente do OpenEmbedded

 

OpenEmbedded é um framework para geração de imagens, kernel, toolchains ou root filesystem, possibilitando aos desenvolvedores criarem distribuições de linux completas para sistemas embarcados.

 

Antes de começar a geração de imagens, é necessária a instalação de alguns pacotes na máquina host de desenvolvimento. Todo esse processo de geração de imagem usando OpenEmbedded pode ser encontrado no site de desenvolvedores da Toradex.

 

A lista abaixo se encontra no Quick Start guide do OpenEmbedded.

 

Ubuntu/Debian

 

Fedora

 

openSUSE

 

CentOS

 

O BSP da Toradex também requer alguns pacotes adicionais:

 

Para Fedora 20 e 21

 

Para Ubuntu 14.04 (64-bit)

 

Para Ubuntu 14.04 (32-bit)

 

Para Ubuntu 12.04

 

O OpenEmbedded também requer alguns repositórios do git, para isso utilizamos a ferramenta chamada “repo”. O repo gerencia os repositórios e seus branches a serem baixados. Mais informações aqui.

 

Instale o repo com os comandos:

 

 

Agora crie um diretório para o setup do oe-core e clone o meta da Toradex:

 

Após o passo acima será criada uma pasta chamada “stuff”, dentro dela encontram-se arquivos a serem modificados para adicionar o Qt5.

 

Entre na pasta stuff, aqui se encontram vários layers. Adicione o layer meta-qt5 com o comando:

 

 

A pasta stuff deve estar mais ou menos assim:

 

 

No diretório oe-core/ execute o comando abaixo para configurar o ambiente, o que nos leva para a pasta build.

 

 

Na pasta conf teremos dois arquivos para editar, bblayers.conf e local.conf.

 

Execute vi conf/bblayers.conf e adicione os seguintes layers:

 

 

Execute vi conf/local.conf e adicione ou modifique os itens abaixo:

 

 

Em nosso caso a funcionalidade touch nativa não estava funcionando como desejado. Conseguimos contornar o problema usando a aplicação tslib, que pode ser obtida adicionando em IMAGE_INSTALL_append, os seguintes pacotes: tslib, tslib-calibrate, tslib-conf e tslib-tests. Mais a frente mostraremos como a aplicação foi executada usando tslib.

 

Para gerar a imagem execute o comando bitbake console-trdx-image. (Lembre-se que para isso devemos estar no diretório build). O processo de build pode demorar algumas horas se esse for o primeiro build.

 

Após o build ser concluído a imagem pode ser encontrada no seguinte diretório:

 

 

A pasta gerada está compactada como .tar.bz2. A pasta deverá ser extraída e dentro dela se encontram os seguintes itens:

 

 

Para realizar o update da imagem no computador em módulo, fazemos uso de um cartão uSD e um script que realiza a preparação do cartão. Execute o script update.sh com o argumento -o e o path do cartão. Caso o cartão não seja montado automaticamente no diretório de media, realize o procedimento com o comando mount:

 

 

E então executamos o script.

 

 

Com o cartão SD preparado, insira-o na placa. Ligue a placa, pare o UBoot pressionando qualquer tecla no terminal ligado a serial da placa e execute os seguintes comandos para instalar a imagem no módulo:

 

 

Você encontra um tutorial do processo de alterar a imagem do SO nos módulos Toradex direto neste link ou no site de desenvolvedores da Toradex.

 

Como já visto no início, para este artigo usamos o módulo Colibri iMX6 e duas saídas de vídeo, uma sendo RGB 18 bits conectada a um display EDT RGB de 10” 1024x600 e outra saída HDMI conectada a um monitor HDMI de 21” 1920x1080. Para configurar ambas as telas e resoluções setamos a variável de U-Boot vidargs com o comando a seguir:

 

 

De acordo com a Wiki do Qt sobre iMX6, quando se tem dois displays conectados (ex: uma tela LCD touch e outra HDMI), temos dois devices de framebuffer: /dev/fb0 e /dev/fb2. Com Qt5 usa-se alguns plugins gráficos como EGLFS, LinuxFB, KMS. Mais informações sobre esses plugins você encontra aqui. Por padrão, ambos eglfs e linuxfb, usam /dev/fb0. Na versão 5.3.0 foi introduzida uma nova variável de ambiente: QT_QPA_EGLFS_FB. Antes de executarmos alguma aplicação podemos setar essa variável para o framebuffer desejado com o seguinte comando:

 

 

Com o comando a seguir podemos iniciar uma das aplicações demo do Qt5:

 

 

Dual display com i.MX6: Cinematic Experience
Figura 2. Demo do Qt Cinematic Experience

 

Para escolher em qual tela e qual aplicação exibir, podemos encadear os comandos como abaixo:

 

 

 

Com dois displays conectados temos /dev/fb0 e /dev/fb2, note que fb1 e fb3 são overlays de fb0 e fb2. Sendo assim, podemos usar esses overlays para exibirmos alguma outra funcionalidade.

  

Há variáveis de ambiente que podem ser usadas de acordo com as necessidades, uma delas é QT_QPA_EGLFS_HIDECURSOR que, ao ser setada para 1, escondemos o cursor do mouse. Outra variável necessária em nossos testes foi QT_QPA_EGLFS_DISABLE_INPUT que foi setada para 1. Assim, conseguimos usar o touch corretamente na aplicação executando a mesma da seguinte forma:

 

 

Fizemos uma aplicação de exemplo onde simulamos uma situação de check-in em um aeroporto. A tela maior exibe um FIDS (Flight information display system), enquanto o display touch LCD exibe opções de check-in. Usando a técnica de overlays, colocamos um quadro exibindo o vídeo de uma webcam, simulando, por exemplo, um check-in por QR code.

 

Dual display com i.MX6: Aplicação Demo Airport Check-In

Figura 3. Aplicação Demo Airport Check-In

 

Confiram o vídeo da aplicação em funcionamento: 

 

 

O código fonte dessa aplicação, que pode ser baixado e editado, encontra-se nesses links:

 

 

Também disponibilizamos uma imagem pre-build para o módulo Colibri iMX6 no Google Drive.

 

 

Referências

 

http://developer.toradex.com/software-resources/arm-family/linux/board-support-package/openembedded-(core)

http://developer.toradex.com

http://wiki.qt.io/I.MX-6

http://doc.qt.io/qt-5/qt5-intro.html

http://www.openembedded.org/wiki/Main_Page

https://en.wikipedia.org/wiki/OpenEmbedded

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Giovanni Bauermeister
É formado em Técnico em Mecatrônica pelo SENAI Roberto Mange de Campinas, onde teve seus primeiros contatos com microcontroladores, eletrônica e programação. Em 2016 obteve a graduação em Engenharia de Controle e Automação pela UNISAL, também em Campinas. Durante a graduação, teve a oportunidade de ingressar como estagiário na empresa Toradex, onde atuou e desenvolveu habilidades em sistemas Linux embarcado. Atualmente atua como Analista de Desenvolvimento em Eletrônica na FILIPEFLOP.

Deixe um comentário

avatar
 
  Notificações  
Notificar