Microscope bas-coût

Cet article décrit le travail réalisé dans le cadre du projet « Microscope bas-coût » de deuxième année de D.U.T. Génie Electrique et Informatique Industrielle (GEII), du module d’Etudes et Réalisations. Ce projet a été mené par Amine Ghomrani et Paul-Alexandre Patry.


Contexte du projet

Le but de ce projet est l’élaboration d’un microscope low-cost (bas-coût). L’article Low-cost, sub-micron resolution, wide-field computational microscopy using opensource hardware sert de base de travail au projet. Il montre l’opportunité que représente les récentes évolutions de l’informatique et de la photographie grand public, en décrivant la fabrication et l’utilisation d’un microscope. Les principaux constituants sont un ordinateur mono-carte Raspberry Pi 3 et une caméra couleur, également de marque Raspberry. Une matrice de 256 diodes électroluminescentes (LEDs) sert à l’éclairage des échantillons à examiner.


Cahier des charges

Le projet comporte différents objectifs.

Le microscope présenté dans l’article Low-cost, sub-micron resolution, wide-field computational microscopy using opensource hardware ne permet pas un déplacement de l’échantillon autre que manuel. La structure du microscope doit de ce fait être modifiée, pour permettre un déplacement mécanique de l’échantillon sur les axes X et Y.

Le déplacement de l’échantillon sur les axes X et Y, ainsi que le déplacement de la caméra sur l’axe Z – déjà présent – doivent être, à terme, motorisés.

Une interface graphique, doit être élaborée, pour que l’utilisateur puisse interagir avec le microscope. Toutes les fonctions du microscope doivent être commandables via cette application.

Pour mener à bien le projet, nous avons différents éléments à notre disposition. L’annexe 1 de l’article présente la marche à suivre pour construire le microscope qui sert de modèle pour le projet. La liste des composants de ce microscope, ainsi que les fichiers des pièces qui nécessitent une impression 3D, sont fournis. En plus de ces éléments, trois programmes, écrits en langage Python (version 3 et supérieures), ainsi qu’un exemplaire du microscope (Figure 1), assemblé d’après les instructions de l’article, sont mis à notre disposition.

Figure 1 : Microscope construit d’après les indications de l’article Low-cost, sub-micron resolution, wide-field computational microscopy using opensource hardware

Interface graphique – µScope APP

Programmes existants et définition des fonctions de l’application

Il a été dit ci-dessus que trois programmes, écrits en langage Python, ont été fournis en début de projet. Ces trois programmes correspondent à trois modes d’éclairages différents de l’échantillon. En plus de contrôler l’éclairage, chaque programme affiche à l’écran ce que la caméra filme en direct.

Ces programmes présentent néanmoins deux inconvénients :

  1. Pour modifier l’éclairage de l’échantillon, l’utilisateur doit stopper l’exécution du programme en cours puis lancer l’exécution d’un autre programme.
  2. Le flux d’images en provenance de la caméra, et affiché à l’écran, est intangible pour le pointeur de la souris, et ne peut être déplacé, réduit ou enregistré.

De plus, ce flux d’images étant affiché par défaut en plein milieu de l’écran, l’utilisation d’autres fonctions du Raspberry Pi est impossible (Figure 2).

Figure 2

De cette première analyse des programmes existants il ressort que :

  • l’application doit permettre un contrôle fluide de l’éclairage de l’échantillon, avec la possibilité de passer facilement d’un mode d’éclairage à un autre.
  • le flux d’image reçu par la caméra doit être contenu dans une fenêtre qui puisse être déplacée, réduite ou fermée.

Une autre tâche que l’application doit pouvoir remplir, découle de la nature même du projet. Un microscope étant un outil d’observation, l’enregistrement de photographies des échantillons observés doit être possible.

L’éclairage de l’échantillon est assuré par une matrice de LEDs RGB – Red Green Blue – ce qui signifie qu’une multitude de couleurs d’éclairage peuvent être composées. Il a également été montré, via les trois programmes présentés plus haut, qu’il était possible de choisir précisément quelles LEDs de la matrice devaient être allumées ou éteintes. Cette flexibilité de l’éclairage – choix des LEDs et de la couleur – peut être exploitée pour permettre à l’utilisateur de composer un éclairage personnalisé. Elle peut aussi être appliquée au traitement d’image, en photographiant l’échantillon sous différents angles d’éclairage et avec différentes couleurs.

Enfin, le déplacement de l’échantillon devant être motorisé, l’application doit inclure le contrôle par l’utilisateur du mouvement de l’échantillon.

Développement de l’application

Environnement de développement

Le Raspberry Pi, en tant qu’ordinateur, nécessite un Système d’exploitation pour pouvoir fonctionner. Le système d’exploitation utilisé pour ce projet est le Raspberry Pi OS version « Bullseye ».

L’application est entièrement codée en langage Python, version 3.9. La partie interface graphique de l’application a été réalisée avec la librairie Tkinter. Les principales librairies utilisées sont la librairie unicornhathd développée pour le contrôle de la matrice à LEDs, par le fabricant Pimoroni, et la librairie OpenCV pour le contrôle de la caméra, l’enregistrement et le traitement d’images.

Descriptions des fichiers de l’application

Pour que l’application puisse fonctionner, il est nécessaire que tous les fichiers exécutables se trouvent dans le même dossier. Les fichiers qui constituent l’application sont les suivants :

Fichier .pyRôle
Split_vX
(X : numéro de version)
Fichier à exécuter pour lancer l’application.
Vérification de l’installation des librairies nécessaires au bon fonctionnement de l’application. Si les toutes les librairies sont installées le fichier Split_mainwindows sera appelé. Sinon le fichier Split_warnwindows sera appelé.
Split_warnwindowsAffichage dans une fenêtre de la liste des librairies manquantes sur l’appareil et nécessaires au bon fonctionnement de l’application.
Split_mainwindowsDéfinition de la fenêtre principale de l’application. Fait appel aux fonctions définies dans les fichiers Split_stepper, Split_capture et Split_unicornhathd. Appel des fichiers, Split_helpwindows, Split_infowindows et Split_advancedwindows si l’utilisateur appuie sur les boutons correspondants.
Split_helpwindowsDéfinition de la fenêtre d’aide de l’application.
Split_infowindowsDéfinition de la fenêtre d’information sur l’application.
Split_advancedwindowsDéfinition de la fenêtre des réglages avancés. Cette fenêtre réunit les éléments définis dans les fichiers Split_hatwindows et Split_capwindows.
Split_hatwindowsDéfinition des éléments de contrôle personnalisé de l’éclairage (mélangeur de couleur, éclairage progressif…). Fait appel aux fonctions définies dans les fichiers Split_capture et Split_unicornhathd.
Split_capwindowsDéfinition du bouton « Créer un film » et des fonctions utilisées pour la création de vidéos.
Split_unicornhathdDéfinition des fonctions de contrôle de la matrice à LEDs.
Split_stepperDéfinition des fonctions de contrôle des moteurs pas à pas.
Split_captureDéfinition des fonctions de traitement d’images et de sauvegarde d’images.

Le diagramme suivant décrit de manière visuelle l’ ordre dans lequel sont appelés les fichiers et si cet appel se fait systématiquement, ou est conditionné à un événement (ex. : appui sur un bouton) :

Figure 3 : Interactions entre fichiers

Contrôle des librairies

Le diagramme suivant montre le mécanisme utilisé pour vérifier la présence des librairies nécessaires au bon fonctionnement de l’application :

Figure 4 : Mécanisme d’importation des librairies

Si les librairies nécessaires au bon fonctionnement de l’application ne sont pas installées la liste des librairies manquantes sera affichée (Figure 5).

Figure 5 : exemple de message d’erreur

Utilisation du GPIO par l’application

Le schéma suivant montre les pins utilisés pour le contrôle de la matrice à LEDs et des trois moteurs pas à pas (Figure 6).

Figure 6 : Utilisation des pins du GPIO

Les moteurs pas à pas sont alimentés par une autre source que la carte Raspberry Pi. Les masses des drivers des moteurs doivent donc être reliées à la masse de l’alimentation, elle même reliée à la masse du Raspberry Pi.

La matrice à LEDs est alimentée directement par le Raspberry Pi et doit aussi être reliée à la masse de la carte.

µScope APP : description des fenêtres de l’application

Fenêtre principale

La fenêtre principale de l’application (Figure 7) est découpée en deux parties. Dans la partie gauche de la fenêtre est affiché le flux d’images en provenance de la caméra. Cet affichage se fait en temps réel. Dans la partie droite sont rassemblés les boutons de contrôles des fonctions de base de l’application.

Figure 7 : Fenêtre principale de l’application

La partie droite de la fenêtre principale est elle-même divisée en plusieurs sous parties, identifiées par des zones de descriptions.

Un bouton permet d’enregistrer l’image actuellement filmée par la caméra.

Deux boutons permettent d’allumer des modes d’éclairage prédéfinis : le bouton « Eclairage DARKFIELD » (Figure 8) et le bouton « Eclairage FULL » (Figure 9).

Le premier permet d’allumer les LEDs de la rangée extérieure de la matrice. Le but est d’obtenir un éclairage rasant de l’échantillon.

Figure 8

Le second bouton, quant à lui, permet d’allumer toutes les LEDs de la matrice. Dans les deux cas, l’éclairage est de couleur blanche.

Figure 9

Le bouton « OFF » permet d’éteindre complètement les LEDs de la matrice, qu’elles aient été allumées via la fenêtre principale, ou la fenêtre des réglages avancés.

Viennent ensuite six boutons qui permettent de déplacer l’échantillon en commandant les moteurs. Les boutons pour la commande des axes X et Y permettent de déplacer l’échantillon. Les boutons pour l’axe Z contrôlent la distance entre la caméra et l’échantillon, via la translation du support de la caméra.

Fenêtre de réglages avancés

La fenêtre des réglages avancés est scindée en trois parties (Figure 10).

Figure 10

La partie « Réglage RGB » permet à l’utilisateur de composer la couleur de l’éclairage de l’échantillon. La zone sous les trois tirettes permet de prévisualiser la couleur obtenue par le mélange des couleurs rouge, vert et bleu (Figure 11).

Figure 11 : exemple de composition d’une couleur

Le milieu de la fenêtre est occupé par les commandes de trois modes d’éclairage dits « progressifs ». Il est à noter que pour utiliser ces modes d’éclairage – ainsi que les modes dits automatiques – il faut d’abord avoir composé une couleur, à l’aide de la partie « Réglage RGB ». Dans chacun des modes d’éclairages, le niveau 0 sert à éteindre la matrice à LEDs.

Le premier de ces éclairages est un éclairage « depuis le centre ». Le niveau d’éclairage 1 allume un carré de LEDs en plein centre de la matrice. Chaque niveau d’éclairage supérieur épaissit le bord du carré d’une nouvelle rangée de LEDS, jusqu’à allumer toutes les LEDS avec le dernier niveau. En tout 8 niveaux d’éclairages sont disponibles, en exceptant le niveau 0 (Figures 12 et 13).

Figure 12 : Eclairage progressif depuis le centre de niveau 4 et de couleur bleue
Figure 13 : Résultat de la commande sur la matrice à LEDs

Le second mode d’éclairage est appelé « depuis le bord ». Le niveau d’éclairage 1 allume le carré que forment les LEDs à la périphérie de la matrice. Dans ce cas aussi, 8 niveaux d’éclairage sont disponibles, depuis le premier carré, jusqu’à l’utilisation de toutes les LEDs de la matrice (Figure 14 et 15).

Figure 14 : Eclairage progressif depuis le bord de niveau 4 et de couleur bleue
Figure 15 : Résultat de la commande sur la matrice à LEDs

Le dernier mode d’éclairage est appelé « Eclairage circulaire ». Contrairement aux modes d’éclairage précédents, celui-ci ne comprend que quatre niveaux d’éclairage. Les LEDs allumées forment un L contenu dans un quart de la matrice. Chaque niveau d’éclairage correspond à la commande d’un quart différent de la matrice (Figures 16 et 17).

Figure 16 : Eclairage circulaire de rang 2 et de couleur bleue
Figure 17 : Résultat de la commande sur la matrice à LEDs

A chaque mode d’éclairage est associé un bouton « Mode automatique ». Dans ce mode une photographie de l’échantillon est prise pour chaque niveau d’éclairage disponible. Le bouton « Créer un film » , à gauche de la fenêtre, permet de générer un film à partir de la série de photographies prises.

Fenêtre d’aide

La fenêtre d’aide est ouverte par le bouton vert marqué d’un point d’interrogation, situé dans la fenêtre principale (Figure 18).

Figure 18

Dans cette fenêtre se trouve un menu constitué de plusieurs boutons. L’utilisateur appuie sur le bouton correspondant à la partie de l’application sur laquelle il cherche des renseignements. Une fois qu’il a cliqué, la fenêtre d’aide est fermée et remplacée par une fenêtre contenant les explications recherchées (Figure 19).

Figure 19

Une fois la lecture finie, deux choix s’offrent à l’utilisateur :

  • soit fermer directement la fenêtre d’explications
  • soit appuyer sur le bouton retour, au bas de la fenêtre.

Dans le second cas, après la fermeture de la fenêtre d’explications, la fenêtre d’aide sera de nouveau affichée, permettent l’exploration des autres pages d’aides.

Fenêtre d’information

La fenêtre d’information est ouverte par le bouton bleu marqué d’un i, situé dans la fenêtre principale. Cette fenêtre rappelle brièvement dans quel contexte cette application a été développée et quelles personnes ont participés au projet (Figure 20).

Figure 20

Bibliographie

LOW-COST, SUB-MICRON RESOLUTION, WIDE-FIELD COMPUTATIONAL MICROSCOPY USING OPENSOURCE HARDWARE
OMAS AIDUKAS, ANDREW R. HARVEY, PAVAN C. KONDA, REGINA ECKERT, LAURA WALLER

TKINTER REFERENCE: A GUI FOR PYTHON
NEW MEXICO TECH COMPUTER CENTER

CAMERA PROJECTS BOOK : 39 EXPERIMENTS WITH RASPBERRY PI AND ARDUINO
IBRAHIM DOGAN
ELEKTOR INTERNATIONAL MEDIA – 2019 – ISBN : 978-1-907-92077-6
(Disponible à la Bibliothèque Universitaire, Campus Collines)