Linux Embedded

Le blog des technologies libres et embarquées

Test de Qt5 sur Raspberry pi

Présentation de la Raspberry pi

Est-il encore nécessaire de présenter cette carte devenue très populaire grâce à son faible coût et ses performances honorables? Elle est équipée d'un processeur ARM cadencé à 700 MHz et surtout d'un processeur graphique Broadcom qui va nous permettre d'utiliser l'accélération matérielle OpenGL ES dans nos applications Qt.

www.raspberrypi.org/

Présentation de Buildroot

Buildroot est un ensemble de makefiles permettant de générer facilement un système Linux personnalisé. Il est principalement utilisé pour des systèmes embarqués car il permet d'obtenir des images d'une taille très réduite.
Depuis quelques temps, le support de la Raspberry pi est inclus dans Buildroot:

Sortie de la version 2013.05 de buildroot

Dans la suite de cet article la version 2014.08 de Buildroot est utilisée.

Présentation Qt 5

Qt est un framework permettant de construire des applications graphiques multi plates-formes. La version 5.2 a été décrite ici:

Sortie de Qt 5.2

Dans le cadre de cet article, nous utiliserons la version Qt 5.3.1. Notre objectif va être d'utiliser Qt5 afin de créer des applications graphiques fluides sur la Raspberry Pi grâce au rendu OpenGL ES.

Buildroot et Raspberry pi

Configuration et compilation

Depuis que Buildroot supporte la Raspberrypi, il est aisé de créer un système minimal. Le fichier board/raspberrypi/readme.txt contient toutes les informations nécessaires.

La commande suivante permet de configurer Buildroot pour la cible.

$ make raspberrypi_defconfig

Afin de préparer le terrain pour Qt il convient de configurer la toolchain avant de lancer la première compilation:

$ make menuconfig

Il est important de sélectionner les options suivantes dans le menu toolchain:

  • Enable large file (files > 2 GB) support
  • Enable IPv6 support
  • Enable RPC support
  • Enable WCHAR support
  • Enable C++ support

Nous pouvons ensuite lancer la compilation.

$ make

Test

Quelques cafés plus tard, le rootfs est disponible dans le dossier output/images et peut être copié sur la carte SD. La marche à suivre pour créer la carte SD est également décrite dans le fichier board/raspberrypi/readme.txt, elle ne sera donc pas détaillée ici.

Après le boot, la carte affiche une page de connexion sur la sortie HDMI. Il suffit de se connecter avec l'utilisateur root sans mot de passe pour obtenir un accès sur la console.

Il est donc très facile d'obtenir un système minimal fonctionnel pour Raspberry pi avec Buildroot. Si la carte est prévue pour être un serveur, il suffira d'ajouter les paquets nécessaires puis de réaliser la configuration du système. Les problèmes surviennent lorsque des applications graphiques doivent être utilisées. Les distributions courantes utilisent le serveur X et ne disposent pas d'accélération matérielle. Il en résulte un système lent et désagréable à l'utilisation. Nous allons voire comment utiliser qt5 sans serveur X.

Ajout de qt 5

Qt 5 est capable de créer des fenêtres via le framebuffer et d'utiliser OpenGL ES. Cela nous permettrait d'avoir des applications graphiques utilisant le GPU et donc ayant un rendu fluide. La version de Qt dans Buildroot 2014.08 est la version 5.3.1.

Compilation

Nous allons tout d'abord activer les bibliothèques et utilitaires spécifiques de la Raspberry pi pour pouvoir utiliser les fonctionnalités de la puce d'accélération graphique.

$ make menuconfig
-> Target packages
  -> Hardware handling
    [*] rpi-userland

Nous pouvons ensuite activer les options relatives à Qt5 (ici les plus importantes).

-> Target packages
  -> Graphic libraries and applications (graphic/text)
    -> Qt5
      [*] qt5base
      [*] gui module
      [*] widgets module
      [*] eglfs support
      [*] qt5declarative

Ajoutons également la compilation des exemples afin de pouvoir tester facilement les fonctionnalités de Qt 5.

-> Target packages
  -> Graphic libraries and applications (graphic/text)
    -> Qt5
      [*] Compile and install examples (with code)

Test

Les exemples Qt se trouvent dans /usr/lib/qt/examples/. La plupart sont fonctionnels. On peut notamment lancer gui/openglwindow/openglwindow qui fait tourner un triangle avec OpenGl. Le répertoire widget contient des exemples qui permettent de tester de nombreuses fonctionnalités de Qt. Afin d'utiliser eglfs, il convient de définir la variable QT_QPA_PLATFORM:

 export QT_QPA_PLATFORM=eglfs

QML

QML est un langage déclaratif basé sur javascript qui permet de définir des interfaces graphiques dans QT 5. Un des avantages de QML est l'utilisation de l'accélération matérielle automatiquement lors de l'affichage de l'interface. Pour tester les possibilités sur la Raspberry Pi, nous utilisons la démo Qt5 Cinematic Experience.

Nous allons tout d'abord installer une dépendance requise pour pouvoir lancer ce programme. Le paquet a ajouter dans buildroot est le suivant:

-> Target packages
  -> Graphic libraries and applications (graphic/text)
    -> Qt5
      [*] qt5graphicaleffects

Vous trouverez ci-joint un patch a appliquer à Buildroot. Ce patch ajoute une entrée pour Qt5 Cinematic Experience dans le menuconfig. qt5cinex.patch

Nous allons tout d'abord télécharger ce patch et l'appliquer à la racine du projet buildroot-2014.08:

$ patch -p1 < qt5cinex.patch
patching file package/Config.in
patching file package/qt5cinex/Config.in
patching file package/qt5cinex/qt5cinex-0001-Fix-execution-problem-with-Qt5.3.patch
patching file package/qt5cinex/qt5cinex.hash
patching file package/qt5cinex/qt5cinex.mk
$

En relançant la commande make menuconfig, nous pouvons maintenant activer la compilation du programme Qt5 Cinematic Experience:

-> Target packages
  -> Graphic libraries and applications (graphic/text)
    [*] Qt5 Cinematic Experience
    [*]   RaspberryPI Edition

Activons également l'option RaspberryPI Edition qui va construire une application au format HD (1920x1080).

Après intégration dans buildroot de la version pour Raspberry pi, le résultat est bluffant. Les mouvements sont très fluides et les effets très réussis. Il y a par contre un bug lorsque l'on clique sur une image de film et que la description s'affiche. Ceci est du au fait que nous lançons Qt5CinematicExperience sans gestionnaire de fenêtre.

Note: Nous sommes en train de réaliser l’intégration du paquet Qt5CinematicExperience dans buildroot. Il ne devrait pas tarder à être disponible dans les futures versions et le patch précédent ne sera alors plus nécessaire.

Une autre application, elle aussi faite avec QML, montre les limites du plugin eglfs. Les combobox, et plus généralement toute création de fenêtre secondaire provoquent un crash car il est impossible de manipuler de multiples fenêtres sans gestionnaire de fenêtre.

Conclusion

Il est très simple de créer un système Linux pour Raspberry pi intégrant Qt 5 avec Buildroot. Il permet de lancer des applications Qt sans serveur graphique tout en disposant de l'accélération matérielle en cas d'utilisation d'OpenGl ES. QML permet de faire rapidement une application agréable pour l'utilisateur et, si on y passe un peu plus de temps, d'utiliser toute la puissance d'OpenGl ES pour créer des effets visuels complexes.

Cependant il subsiste toujours des limitations dues au fait que nous ne disposons pas de système de gestion de fenêtres. Certaines applications ne sont pas totalement fonctionnelles ou même parfois ne se lancent pas du tout.

Nous verrons dans un prochain article comment rajouter un gestionnaire de fenêtre ainsi qu'un serveur X ou mieux : Wayland, ce qui permettra de profiter pleinement des fonctionnalités apportées par OpenGL ES sur la Raspberry pi.

    • le 11 avril 2017 à 20:47

      Bonjour
      Question naive:
      Vous pensez qu'on peu raisonnablement utiliser un touchscreen (Display lcd 7'' spécial rasberryPi) et y coller une appli QML (avec les super gadget quickcontrol2!) pour faire une GUI utilisateur (ce dernier étant capable d'interagir donc avec le touchscreen et les GPIO de la raspberry) Bref faire une application interactive?
      Associer finalement la force de QT pour le graphisme, la force de Buildroot pour le coté "légèreté" et la raspi pour le prix. Au final c'est trés puissant comme perspective

    • le 13 avril 2017 à 17:40

      Cet article est un peu vieux et les techno ont toutes évoluées depuis, mais je vous pas pourquoi on ne pourrait pas... c'est plus une question de config QT pour le touchscreen qu'un PB buildroot ou Raspberry. tout ça devrait marcher quasi out of the box...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.