Anneaux de photodiodes

Anneau photodiodes

 

LITZLER Cédric

ZUGMEYER Adrien

BARETTI Gaetan

 


Sommaire

 

1. Présentation du projet

2. Attributions des rôles

3. Câblage électrique & Réalisation du circuit imprimé

4. Programmation Arduino

5.Programmation Python(Spyder)

6. Serveur MQTT

7.Avancé du projet

8. Conclusion

9.Remerciements

 


1. Présentation du projet

Dans le cadre de notre projet de 2ème année en « Etudes et Réalisations », nous avons mes 2 camarades ainsi que moi-même été amenés à travailler ensemble sur le projet d’un anneau de photodiodes.

Le but de ce projet est de créer un système de mesure qui sera utilisé pour visualiser la direction de l’étirement d’un textile soumis à un test.

Le système sera composé d’une carte Arduino, d’un laser, d’un circuit électrique de forme circulaire, d’une alimentation et de photodiodes. Ce système sera placé au dessus du textile et protégé de la lumière par un tube ou une jupe. Le laser et les photodiodes pointeront en direction du textile et la lumière du laser sera plus ou moins réfléchie par le tissu vers les photodiodes placées sous la forme d’un cercle afin de connaitre l’intensité de l’étirement et la direction des fibres du textile. Ces mesures seront lues via un PC sous forme de tension .

Ci-dessous, voici un premier schéma montrant un peu à quoi va ressembler le résultat final de notre projet ainsi que 2 images de notre maquette actuelle. A cela, il faut encore y rajouter un manche ou un support permettant de fixer le matériel tel que la carte Arduino, les connexions des différents câbles électriques, la pile etc…

 


2. Attributions des rôles

 

LITZLER Cédric:

  • Programmation de la carte Arduino
  • Programmation Python
  • Câblage & conception du schéma électrique
  • Réalisation du câblage électrique de la plaquette finale
  • Rédaction du dossier texte

 

ZUGMEYER Adrien:

  • Etude de la partie électrique: Réalisation du Circuit-Imprimé & Conception du schéma électrique
  • Rédaction du dossier texte
  • Travail sur le support

 

BARETTI Gaetan:

  • Conception du Schéma électrique, Planification & création du serveur MQTT (abandoné)
  • Rédaction du dossier texte
  • Travail sur le support

 

 


3. Câblage électrique

Le projet prévoyait initialement 36 photodiodes mais après une étude plus détaillée de tous le système, nous somme passé à 8 photodiodes pour un soucis de complexité. La difficulté principale réside dans la présence du grand nombre de fils au final. Après s’être documenté sur internet et sur divers sites, j’ai pu dresser le schéma électrique qui permet la liaison des photodiodes avec la carte Arduino. Ce câblage comporte 8 résistances de 1MΩ, la carte Arduino MEGA, 8 photodiodes et beaucoup de fils électriques.

La masse est relié entre la résistance et la photodiode. La photodiode elle, est relié à l’autre entrée de la résistance et relie les entrées analogiques de A0 à A7.

Ci-dessous, le schéma électrique réalisé sur le logiciel kicad:

 

 

 

Réalisation du circuit imprimé:

A l’aide du schéma électrique réalisé sur le logiciel Kicad, nous avons pu nous en servir pour créer le circuit imprimé.

Adrien a donc dû se familiariser avec l’environnement de travail de Kicad ce qui n’a pas été chose aisée car c’est un logiciel qui n’est pas très intuitif. Kicad permet, à partir d’un schéma électrique, de créer un Circuit imprimé en associant les empreintes des composants avec leur noms. Voici le résultat obtenu après plusieurs heures de travail sur le logiciel de création:

 

 

 

 

 

 

 

                                                                                                    Voici a quoi ressemblera le circuit imprimé lorsqu’il sera fini

 

Suite à cela nous avons pu utiliser le laboratoire de Circuit imprimé pour découper le disque puis le percer pour accueillir les pattes des composants électronique, nous avons enfin, pu souder les composants à la carte.

 



4. Codage Arduino

Le codage de la carte Arduino est une étape très importante dans le projet afin de recevoir les valeurs des photodiodes. Après avoir réalisé de nombreuse recherches sur internet sur la façon de construire ce code, j’ai travaillé en plusieurs étapes.

Dans un premier temps j’ai commencé par essayer de piloter 1 seule photodiode puis 4, puis d’ajouter un bouton pour contrôler les acquisitions uniquement lors de son appui dessus. Finalement, j’ai pu supprimer ce bouton n’ayant plus de réel utilité puisque toutes les acquisitions se font maintenant via le logiciel Spyder.

A présent, le programme comporte les 8 photodiodes et fonctionne efficacement.

Le programme utilise la liaison série à 38400 bits/seconde.

 

Le principe général est le suivant:

Les photodiodes relèvent une valeur correspondant à une tension en fonction de la luminosité qu’elles perçoivent. Le programme doit pouvoir lire les valeurs du nombre d’acquisition et de la durée entre 2 acquisitions sur le port série. Ces valeurs saisies par l’utilisateur seront stockés dans des variables dans la mémoire ROM (voir explication de l’utilisation de la mémoire ROM en-dessous du code)

De plus, il doit également pouvoir envoyer les valeurs des photodiodes via le port série de façon à être récupérée grâce à une instruction bien précise sur le logiciel Spyder.

 

 

Le code arduino final:

 




 

Quelques explications importantes:

 

-On commence par déclarer les bibliothèques utilisées.

-On déclare dans un integer constant nommé numReading  la taille du tableau (Ici 6).         Objectif –> Lisser légèrement les valeurs en utilisant les 6 dernières valeurs présentes dans le tableau afin de ne pas avoir a traiter des signaux « parasites ».

-Utilisation de « EEPROM.read(0) » et « EEPROM.read(1) » dans le programme arduino car les variables sont généralement stockés dans un buffer et que les paramètres du nombre d’acquisition et du délai entre 2 acquisitions ne sont transmises qu’une seul fois par le port série. Ecrire ce résultat dans la ROM de la carte Arduino permet donc de préserver cette valeur.

-Ne pas oublier dans la fonction setup l’initiailisation de la communication serie à 38400 et l’initialisation du tableau.

-ReadIndex nous servira à évoluer de 0 à 6 pour lire chaque valeur du tableau.

-Total contient la somme de toutes les valeurs du tableau.

-Average sera la valeur moyenne du tableau (total / numReading).

 

Fonction principale loop():

-On retire de total la valeur actuellement indexée du tableau (afin de faire de la place pour la nouvelle).

-On vient stocker la valeur du potentiomètre dans l’index en cours du tableau.

-On ajoute la valeur au total.

-On augmente l’index de 1 afin de passage à la « case suivante » du tableau.

-Si l’index dépassee 6, alors on le remet à 0. Le tableau évolue de reading[0] à reading[6].

-On calcul la valeur moyenne du tableau reading[].

-On envoit la moyenne au moniteur série.

 

 

 


 

5. Programmation Python (Spyder)

 

Spyder est un environnement de développement pour Python qui intègre de nombreuses bibliothèques à usage scientifique tel que « Matpolib » que nous importons afin de pouvoir tracer notre graphique en forme de polygone.

 

Préparation:

Si le module du port série n’est pas installé, vous obtiendrez ce message d’erreur: “No module named serial”. Cela est dû au fait que le port série n’est pas directement inclut avec python

Pour ce faire il a fallu l’installer  à l’aide de la ligne de commande « pip install pyserial » dans Anaconda Prompt*:

 

*J’ai installé Anaconda Navigator qui regroupe en quelque sorte tous les fichier dont a besoin Spyder pour fonctionner

 

Afin d’accélérer la vitesse de transmission du port série, il a fallu modifier le réglage de la vitesse de transmission du port associé (dans notre cas COM6). Réglé de manière générale à 9600, je l’ai accéléré à 38400!

Il est également important de ne pas oublier de renseigner ce paramètre dans le code Arduino et Python!

 

 

 

 

 

 

 

Code Python utilisé dans le projet:



 

J’ai mis des commentaires un peu partout dans le code pour ne pas s’y perdre et comprendre l’application générale du programme. Sachez qu’une fois les données du port série récupérées, il est possible de créer plus ou moins n’importe quelle interface graphique à l’aide de code trouvable sur internet. Dans notre cas, il s’agit du diagramme de Kiviat.

 

 

Démonstration du fonctionnement du programme:

 

Lorsque nous lançons le logiciel Spyder, celui-ci affichera dans la console la chose suivante:

 

Nous pouvons ainsi lancer l’exécution de fichier depuis le bandeau général du logiciel (voir icône au centre du cercle rouge)

 

Il faudra ensuite renseigner les bons paramètres:

  • « start » : lance le processus d’acquisition
  • le nombre d’image crée avant la temporisation
  • L’intervalle de temps en secondes entre 2 acquisitions

Remarque:

La saisie des données (nombre d’acquisition et intervalle de temps) est limité à une valeur de 255. Cette valeur limite est du au fait qu’elle est est envoyé sous forme de caractère. Lors de son envoi sur le port série, elle est encodé sous forme de table Ascii qui contient 255 valeurs.

 

 

Après avoir renseigné les paramètres nécessaire, le programme en Python va générer un graphique correspondant aux différentes valeurs des photodiodes relevées.

Nous affichons le numéro de l’image (ici 0 puis 1 puis 24)pour connaitre l’avancée de l’acquisition ainsi que les valeurs mesurées par les photodiodes.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lorsque le bon nombre d’acquisition est atteint, la temporisation dure le nombre de seconde indiqués (ici 10s) puis recommence à effectuer les acquisitions et ainsi de suite.

 

 

Pour arrêter la console, il suffit d’appuyer sur le bouton suivant:

 

 

Une fois la console arrêté, il faut redémarrer le noyau puis relancer l’exécution du fichier.

 

Si nous ne redémarrons pas le noyau un message d’erreur viendra. Il indiquera un problème au niveau du port série.

En effet, le fait d’interrompre la console, le port série reste en quelque sorte ouvert et ne se referme pas. Cependant il est difficile de le refermer efficacement puisque la seule solution serait d’écrire quelque chose de bien définit dans la console qui exécuterait ensuite une instruction fermant le port série; seulement le défilement des images générés rend impossible la saisie (où alors uniquement lorsque la pause entre 2 acquisitions se réalise). J’ai alors opté pour l’interruption et le redémarrage du noyau. Cette solution ne prend pas beaucoup plus de temps, et n’ayant pas de contrainte défini dans le cahier des charges, cette méthode peut-être validé!

 

Une image en extension png  identique à celle présente dans la console est aussi crée dans le dossier ou se trouve le fichier Python et ceux à chaque acquisition. Cependant, seul la dernière image (celle avant la temporisation) n’est vraiment accessible puisque les autres, dès que crées, sont aussitôt écrasés par celle d’une nouvelle acquisition.

 


 

5. Serveur MQTT

L’Intérêt de créer un serveur MQTT était de pouvoir bénéficier d’une interface à distance qui aurai permis de lancer les acquisitions à distance et récupérer les valeurs sans devoir être connecté a un PC. Pour cela Gaetan a créé un serveur local sur son PC via le broker Mosquitto. Nous avons réussi à obtenir des résultats en interconnectant deux PC avec un câble ethernet: nous avons réussi à nous connecter à un topic et pu lire et publier sur celui-ci via l’interface de commande Windows.

Voici l’initialisation du serveur sur le premier PC

 

 

On peut ensuite publier sur un topic de test via un second PC pour vérifier que le serveur fonctionne

 

 

Un souscripteur au topic va pouvoir lire le message envoyé depuis le second PC

Il faut maintenant pouvoir connecté notre Arduino à ce serveur MQTT.

Pour cela on va utiliser un shield ethernet pour le connecté sur le même réseau local que le serveur.

On doit alors ajouté les bibliothèque Arduino liés au protocole MQTT pour la communication entre l’Arduino et le serveur ainsi qu’une bibliothèque ethernet pour interagir avec le shield.

Ci dessous le code permettant à l’Arduino de se connecter au serveur MQTT et souscrire à un topic :

Nous avons malheureusement été contraint d’abodonner le serveur MQTT à cause d’un manque de matériel, nous n’avions qu’un shield ethernet pour l’Arduino alors que nous avions besoin d’un shield Wi-Fi ( rupture de stock depuis plusieurs mois ) qui nous aurai permis de nous connecter à distance au réseau local. Dans un souci de respect des délais Gaetan a décidé de travailler sur le support.

 


6. Support

Dans un premier temps nous avons créé la partie principale du support qui va maintenir le laser et diriger le faisceau vers le bas. Il est constitué d’un tube ainsi que d’un capuchon réalisé à la découpe laser.

 

 

 

 

 

 

 

 

 

On a ensuite constitué une plateforme pour positionner l’Arduino, le tout est surélevé à l’aide de baguette en bois pour que le tissu placer en dessous puisse réfléchir la lumière du laser sur l’anneau de photodiode.

On place alors une « jupe » sur la structure afin d’isoler l’anneau de photodiode de toute lumière exterieur qui risque de perturber les résultats.

L’ensemble de la structure à été réalisé à la découpe laser.

Le support est léger donc facilement déplaçable au dessus d’un tissu cependant il est très fragile.

 


7. Avancé du projet

Le schéma électrique ainsi que son montage fonctionne correctement.

La partie concernant la programmation Arduino & Python à été entièrement réalisé.

Le circuit imprimé ne fonctionnant pas, j’ai décidé de prendre l’initiative d’assembler moi-même les composants sur une plaquette que j’ai découpé moi même. Bien que cette solution ne soit pas très soigné, cette solution permet ainsi l’acquisition des données et de « sauver » le rendu final du projet.

L’idée du serveur MQTT a été abandonné.

Le circuit imprimé à été réalisé mais ne fonctionne pas.

 

8. Conclusion

 

La partie concernant la programmation Arduino & Python à été entièrement réalisé et son principe fonctionne correctement. Cependant, il peut encore être perfectible en simplifiant peut-être encore les codes et améliorant encore certaines choses (ex:vérifier les saisies rentrées par les utilisateurs, simplifier l’arrêt et le redémarrage des acquisitions)

Le circuit imprimé ne fonctionnant pas, j’ai décidé de prendre l’initiative d’assembler moi-même les composants sur une plaquette que j’ai découpé moi même. Bien que cette solution ne soit pas très soigné, cette solution permet ainsi l’acquisition des données. J’ai pu approfondir mes connaissances en language c++ et découvrir le langage python.

Devant réaliser des tâches qui ne me concernait pas à l’origine, j’aurai pu perfectionner les codes que j’ai écris avec ce temps de perdu.

Grace à ce projet nous avons pu apprendre à utiliser de nouveaux logiciels,  de nouveaux langages de programmation, nous avons pu rencontrer de nouveaux matériaux (photodiodes).  Mais il faut avant tout savoir faire preuve d’esprit critique  savoir ce qui a fonctionné c’est bien, savoir ce qui n’a pas marché et pourquoi c’est mieux.

 

Nous avons accumulé beaucoup de retard ce qui nous a fait perdre toute notre marge d’erreur, nous avons accumulé du retard pour différentes raisons,  certains membres du groupe ont manqué d’organisation durant la durée du projet et ainsi empêché la finalisation du projet, il y a aussi eu un manque de communication dans l’équipe.

Il faut donc garder à l’esprit les erreurs que l’on a commises lors de ce projet afin de ne plus les reproduire dans le futur .

 


9. Remerciement

Nous souhaitons tous les 3 remercier les professeurs pour les aides, les explications et les conseils qu’ils nous ont fournis. Nous souhaitons également Christophe De Sabbata pour sa patience et son aide.