Notre projet consiste a améliorer une cafetière connectée (Interface + boitier). L’interface affichera plusieurs informations qui faciliterons beaucoup de choses a l’utilisateur. Notamment, le nombre de café pris, par jour ou par an, la consommation électrique, journalière et annuelle, ainsi que l’état de l’alimentation de la cafetière. Cependant, le boitier nous permettra de couvrir l’interface ainsi que les fils qui lient la Raspberry au capteur et a la cafetière.
La vie est trop courte pour continuer a boire du mauvais café.
Charles-maurice De Talleyrand-périgord
Points a améliorer :
L’interface :
On devait améliorer l’esthétique de l’interface et corriger les valeurs qui s’y affichaient, notamment, la consommation électrique, le temps d’alimentation ainsi que le temps de chauffage.
L’alimentation :
On devait aussi mettre une unique alimentation a l’ensemble des composants électriques (Raspberry + Cafetière).
Solutions mises en œuvre :
Partie programmation :
On a utiliser le logiciel « Spyder » et la bibliothèque « Tkinter » qui est une bibliothèque graphique libre d’origine pour le langage Python et qui permet la création d’interfaces graphiques.
Logo TkinterL’interface
Nombre de café
Consommation électrique
Temps d’alimentation
Le nombre de café consommé.
Le nombre de Watt consommée par la cafetière.
Le temps où la cafetière est allumée.
Temps de chauffage
Alimentation de la cafetière
Etat de la cafetière
Le temps où la cafetière chauffe.
Si la cafetière est allumée ou pas : ON / OFF
Si la cafetière est branché a la prise ou pas : ON / OFF
Partie conception :
Le logiciel « CorelDraw » qui est un logiciel de dessin virtuel nous a permis de faire le boitier en 3D.
Boitier et interface
Conclusion
Ce projet nous a permis de travailler en équipe pour réaliser les différentes tâches et les mettre en œuvre pour finaliser le projet.
Nous tenons a remercier comme il se doit Mr. Verrier, Mr. Bazeille et Mr. Al Assaad pour leurs soutien et leurs apport de connaissance qui nous a énormément aidé à mener à bien ce projet, et Mr. DE SABBATA pour l’aide à l’IUT-Lab lors de la réalisation du boitier.
Notre projet de deuxième année de DUT GEII était d’améliorer une table interactif qui avait été commencer par d’anciens élèves de GEII. Notre travail sur cette table était de rendre simple et logique son lancement ainsi que son utilisation pour optimiser au maximum les sensations du ou des joueurs. Pour se faire, nous avons dus nous penchés sur plusieurs parties : la partie programmation, la partie technique, ainsi que l’aspect visuelle et la simplicité d’utilisation.
2 ) Problèmes rencontrés :
Partie esthétique :
Pour la partie esthétique et technique nous devions rendre la table plus jolie et faciliter le transport de celle-ci.
Partie programmation :
Le but du projet était de programmer un jeu du nom de « PONG ». Ce jeu est l’un des premier jeux vidéo d’arcade. « Développé par Allan Alcorn à partir de novembre 1972. »
3 ) Solutions apportés :
Partie esthétique :
Nous devions rendre le lancement du jeu plus esthétique et plus intuitif, donc, pour ce faire nous avons mis en place plusieurs menus :
Menu pour choisir le nombre de joueurs.
Menu pour choisir le niveau de difficulté.
Menu pour choisir le score maximum.
Partie programmation :
Pour rendre notre projet plus intéressant, on a dû créer plusieurs programmes pour pouvoir gérer toutes les fenêtres de jeu.
Programme « 1vs1 » : Jouer contre un ami.
Programme « 1vsIA » ; Jouer contre l’intelligence artificielle.
Programme « Choix difficulté » : Pour choisir le niveau de difficulté (Facile, Moyen, Try-hard).
Programme « Choix du score » : Pour pouvoir choisir le score max qu’on peut atteindre au cours d’une partie.
Programme « Choix du nombre de joueurs » : Pouvoir choisir le nombre de joueurs (1 joueur / 2 joueurs).
4 ) Conclusion :
Durant ce projet, on a dû travailler en équipe et pouvoir mettre en œuvre nos compétences en programmation. On tiens a remercier nos professeurs qui ont contribuer a la réussite de ce projet.
Enoal PERRAIS/ Mehdi Boumakhloufi / Mohamed Amine Fadlallah
Sommaire
1/ Description du projet et problématique
2/ Diagrammes
3/ Améliorations apportées
4/ Partie Logicielle
5/ Conclusion
1/ Description du projet et problématique
Nous avons pour projet de créer un système embarqué dans un robot qui aura de nouveaux capteurs et permettra de réaliser un suivi de ligne.
Nous avons repris le projet que nous avions choisi l’année dernière pour y ajouter des éléments supplémentaires.
L‘année précédente nous avions démarré le projet Smart car uniquement avec le châssis de la voiture et les moteurs DC pas à pas à l’intérieur.
Le châssis :
Les moteurs pas à pas double sens :
Nous lui avons ajouté de nombreuses améliorations :
Ajout d’ un boîtier pour y ajouter du design et contenir les composants ainsi que les capteurs.
Ajout de capteurs ultrasons HC-SR04 à l’avant et à l’arrière pour détecter un obstacle (la distance de l’obstacle sera indiquée sur un afficheur 7 segments et si obstacle il y a, un buzzer bippera, les leds vertes s’éteindront et les leds rouges s’allumeront)
HC-SR04
Afficheur 7 segments
Buzzer
Leds
Ajout d’ un capteur de centrale inertielleIMU9DOF qui calcule l’accélération sur les axes x,y et z de la voiture :
Un module WifiESP8266 qui transmet à un serveur en ligne les données des capteurs :
ESP8266
Données en temps réel
La voiture dispose d’un mode autonome et un mode manuel. Pour le mode manuel on pilotait la voiture avec un simple clavier d’ordinateur.
Un switch permet d’arrêter complètement le système en toute sécurité.
Un afficheur LCD qui permet d’afficher un texte comme le nom du projet par exemple.
2.Diagrammes
Diagramme Bête à corne :
Diagramme Pieuvre :
3/ Améliorations apportées
Cette année nous allons lui ajouter différents composants électroniques et améliorer notre système pour obtenir une meilleure performance :
Mode suivi de ligne grâce à des capteurs infrarouges (dans l’illustration ici nous en avons deux -> carrés rouges)
Dans la situation 1 : Les deux capteurs détectent une ligne noire et continue leur trajectoire
Dans la situation 2 : Le capteur gauche détecte la ligne noire et s’y dirige donc en tournant vers elle
Dans la situation 3 : Le capteur droit détecte la ligne noire et s’y dirige donc en tournant vers elle
Dans la situation 4 : Les deux capteurs ne détectent plus la ligne noire et donc le robot recule
Capteur TCRT5000
Système photovoltaïque qui se dirige vers les rayons lumineux en récupérant les photons grâce à des photorésistances
Dans ce système photovoltaïque nous trouverons différents composants :
4 Photo – résistances
Shield + Arduino Uno
2 Servomoteurs
Panneau solaire 6 V
Socle
Leds
Communication à distance :
Xbee : de l’Arduino dans la smart car avec la Raspberry Pi via module Xbee RX TX : pilotage manuel de la voiture sur la Raspberry, allumer/éteindre des leds…
Module XBEE :
Interface Homme-machine sur l’écran de la Raspberry PI :
Bluetooth : On peux piloter via une application Android les leds et le moteur de la voiture avec le module HM-10
Module HM-10 :
Interface APPInventor (Android) sur le smartphone :
Camera thermiqueAMG8833 permettant d’alerter l’utilisateur d’une présence humaine.
En plaçant sa main devant la caméra (à gauche) on peux constater que sur un écran TFTLCD (à droite) les pixels correspondent à des pics de chaleurs et en l’occurrence ici en rouge c’est la main qui est détectée.
Quand une présence humaine est détectée (par une chaleur supérieure à 32°), il est écrit « Humain » en bas de l’écran.
4/ Partie Logicielle
Voici les logiciels que nous avons été amenés à utiliser tout au long du projet.
RASPBERRY PI
ARDUINO IDE
Python et ses librairies
5/ Conclusion
Ce projet nous a permis de développer nos compétences dans les systèmes embarqués et dans la gestion de projet en groupe.
Nous avons su améliorer notre projet autant sur les fonctionnalités que sur l’esthétique.
Le budget de la Smart Car est également monté d’un cran et cette petite voiture peut désormais être considérée comme un véritable robot haut-de-gamme.
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 :
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.
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 .py
Rô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_warnwindows
Affichage dans une fenêtre de la liste des librairies manquantes sur l’appareil et nécessaires au bon fonctionnement de l’application.
Split_mainwindows
Dé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_helpwindows
Définition de la fenêtre d’aide de l’application.
Split_infowindows
Définition de la fenêtre d’information sur l’application.
Split_advancedwindows
Dé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_hatwindows
Dé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_capwindows
Définition du bouton « Créer un film » et des fonctions utilisées pour la création de vidéos.
Split_unicornhathd
Définition des fonctions de contrôle de la matrice à LEDs.
Split_stepper
Définition des fonctions de contrôle des moteurs pas à pas.
Split_capture
Dé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 bleueFigure 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 bleueFigure 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 bleueFigure 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)
Notre but est donc de trouver un moyen de trier et de calculer la somme de ces pièces automatiquement
Cahier des charges fonctionnel
Cahier des charges fonctionnel
Trier
Distinguer les différentes pièces
Stocker les pièces par valeur
Compter
Calculer la somme total
Calculer les sommes par valeur
Calculer la différence par rapport à un objectif
Afficher (IHM)
Vue Principale
Somme totale
Vue Tiroir
Gestion de tous les tiroirs
Vue Objectif
Fixer une valeur à atteindre et l’écart avec celle-ci
Vue Conversion
Comparer la somme avec d’autre monnaies prédéfini
Coût
Environ 130 €
Matériel utilisé
Solutions techniques mises en œuvre
Partie électronique
Nous avons réalisé une carte pour regrouper les résistances. Cela permet de simplifier le câblage et le rangement à l’intérieur de la boîte ce qui permet une meilleur ergonomie à lors d’action dans la boîte (tels que la récupération des pièces et changement éventuel de composants).
Nous avons mis des résistances de 3,3k Ohm afin d’enlever l’effet de rebond du signal produit par les capteurs.
Partie programmation
Interface graphique
L’IHM (interface homme-machine) permet d’interagir et de rendre compte du contenu de la tirelire.
Pour cela nous utilisons la bibliothèque Tkinter qui est une graphique libre d’origine pour le langage Python, permettant la création d’interfaces graphiques.
Utilisation de la bibliothèque Tkinter
Menu principale avec ses 3 sous-menu
from tkinter import *
Résultat final pour chaque menu
Menu tiroir
Menu objectif
Menu principal
Menu conversion
Permet une visualisation du nombre de pièces par tiroir
Permet de définir un montant à atteindre
Affiche la somme et permet d’accéder aux autres menus.
Convertit la somme actuelle dans la tirelire en différente monnaie
Détection pièce
Parallèlement au programme qui gère l’interface graphique, un programme détecte les impulsions des capteurs et incrémente à la somme de la tirelire la valeur qui correspond à chaque capteur.
Utilisation de la bibliothèque « gpiozero »
Incrémente la valeur de la pièce
from gpiozero import Button
Partie conception
Utilisation du logiciel CorelDRAW
Conclusion du projet et amélioration possibles
Durant ce projet nous avons du travailler en équipe pour réaliser les différentes tâches et les mettre en communs pour finaliser le projet.
En guise d’amélioration, nous aurions pu rajouter un moteur qui aurait permis un écoulement plus fluide des pièces dans l’entonnoir.
Le projet trackeur GPS pour la cartographie de locaux a pour objectifs grâce à un dispositif créées par nos soins d’enregistrer le parcours fait lors de déplacement, dans notre cas nous avons parcouru l’enceinte de l’IUT. Suite à cela les informations du parcours sont enregistré et retranscrites sur un site internet ainsi que sur un fichier dans la mémoire de la Raspberry PI. Pour mettre à bien ce projet nous sommes compose d’un binôme.
Le principe est de retracer le trajet parcouru par l’utilisateur. Pour ce faire, il faut tout d’abord commencer par étudier les comportements des différents capteurs ( GPS, Centrale Inertielle, Caméra), puis de la carte Raspberry PI. Une fois ces tâches achevées, il faut programmer chaque capteur dans un programme différent afin d’arriver à ses fins sans risques de perdre toute la progression sur une petite erreur. Pour finir, il faut créer une interface afin de pouvoir lancer l’application et visualiser quelques données.
Liste de matériel et logiciel utilisé:
Raspberry PI
Batterie externe
Caméra
Boîtier
Ecran
Langage Python
GPS
Diagramme bête à cornes
Diagramme pieuvre
A partir du diagramme pieuvre on réalise le tableau des fonctions pieuvre le tout en détaillant chaque fonction principale dite FP dans notre cas seulement FP1 mais également les fonctions contraintes dite FC qui vont de FC1 à FC7 dans notre cas.
II) Gestion et réalisation du projet
Exploitation et activation des capteurs
GPS
Pour commencer, nous avons tout d’abord pris connaissance du module GPS dont nous disposions.
Après avoir pris connaissance du GPS, il a fallu le configurer sur la Raspberry PI afin de pouvoir récupérer les coordonnées sur la carte.
Pour cela, il a tout d’abord fallu installer le module GPSD grâce à cette ligne de commande:
sudo apt-get install gpsd gpsd-clients python-gps
Puis désactiver le gps:
sudo systemctl stop gpsd.socket
sudo systemctl disable gpsd.socket
Ensuite le réactiver :
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socket
Finalement, nous avons pu visualiser les données obtenues grâce au GPS:
gpsmon
Voici ce que nous obtenons:
Nous remarquons que grâce au GPS, nous obtenons la date, l’heure ainsi que les coordonnées longitude, latitude et l’altitude. Nous verrons plus tard comment exploiter ces données pour notre projet.
Exploitation et activation des capteurs
Caméra
Pour régler la caméra, il faut tout d’abord l’autoriser à communiquer avec la Raspberry Pi en la paramétrant en rentrant la commande:
sudo raspi-config
Puis ensuite paramétrer ainsi:
Une fois ceci fait, nous pouvons brancher la PiCaméra à la Raspberry PI puis redémarrer le système.
Nous verrons plus tard en détail le programme qui permet de photographier avec la PiCaméra.
Exploitation et activation des capteurs
Centrale inertielle
Afin de nous repérer et pouvoir guider l’utilisateur à l’intérieur d’un bâtiment de l’IUT, nous avons pensé à utiliser une centrale inertielle qui calculerait la trajectoire lorsque l’on perd le signal GPS car il est impossible d’obtenir un signal GPS au sein d’un bâtiment avec un tel module GPS.
Nous avons tout d’abord essayé d’étudier la précision du capteur. Pour ce faire, nous avons placé le capteur sur un banc afin de pouvoir effectuer des trajectoires droites dans une seule direction verticale et horizontale (x ou y). Nous avons donc branché le capteur aux bonnes entrées de la Raspberry PI grâce à des câbles puis créer un petit programme afin de relever les données obtenues avec ce capteur.
Suite à un changement de groupe et donc une baisse d’effectif dans le groupe de ce projet, nous avons été contraints d’abandonner cette partie du projet…
Programmation
Coordonnées GPS
Dans cette partie, nous verrons les différents programmes utilisés pour ce projet. Commençons par le GPS.
Pour le GPS, nous devions tout d’abord récupérer les données captées par le GPS (Longitude, Latitude) grâce à ce programme trouvé sur internet que nous avons adapté à nos beoins:
port = '/dev/ttyAMA0' #Sélection du port du GPS
gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE)
list_lat = [] #création de listes pour stocker les coordonnées
list_lon = []
x = [] #Coordonnées X
y = [] #Coordonnées Y
D = [] #Distance parcourue
i=1
try:
while True:
report = gpsd.next() #
if report['class'] == 'TPV':
lat = getattr(report, 'lat', 0.0) #Récup latitude
lon = getattr(report, 'lon', 0.0) #Récup longitude
Temps = getattr(report, 'time','') #Récup temps
Cependant, les coordonnées récupérées de cette manière sont des coordonnées brutes avec lesquelles nous ne pouvons pas nous repérer et tracer le trajet effectué. Pour remédier à cela, nous devons convertir les coordonnées GPS en coordonnées cartésiennes:
calc_lat = (6371*cos(float(lat))*cos(float(lon))) #conversion latitude
calc_lon = (6371*cos(float(lat))*sin(float(lon))) #conversion longitude
list_lat.append(calc_lat) #stock les données converties dans les listeslist_lon.append(calc_lon)#Conversion des données converties en points cartésiens X et Yx1 = float(list_lat[0]-list_lat[i-1])
y1 = float(list_lon[0]-list_lon[i-1])
x.append(x1)
y.append(y1)#Calcul de la distance parcourue grâce à un calcul de distance entre deux vecteurs qui calcule la distance entre le point actuel et le point précédent puis qui s'additionne au fil du temps.calc_dist = sqrt((x[i-1])**2+(y[i-1])**2)
D.append(calc_dist)
Ensuite, nous affichons les valeurs que nous avons calculé:
print "Coordonnees x : ",x[i-1]print "Coordonnees y : ",y[i-1]
print "Distance parcourue : ",D[0]+D[i-1]," m"i=i+1#Incrémentation pour mesure d'un nouveau point de position
Pour avoir le tracé du parcours effectué, nous devons tracer un « graphique » des points x et y et l’afficher ensuite:
plt.plot(x,y) #Traçage d'un point en fonction de x et y
time.sleep(1) #Attente d'une seconde pour recommencer la boucle
os.system("clear") #Actualisation de la fenêtre d'affichage
Nous affichons simplement le tracé final une fois que nous fermons l’application:
plt.show() #Affichage du tracé
Grâce à ce programme simple, nous pouvons déjà obtenir un tracé du parcours effectué, avec en temps réel la distance parcourue et la position cartésienne x et y. Cependant, les coordonnées obtenues contenaient beaucoup de chiffres après la virgule, pour y remédier nous avons fait ainsi:
xi=str(x[i-1])
yi=str(y[i-1])
di=str(D[0]+D[i-1])
#Ensuite nous affichons seulement les 6 premiers caractères de ces données:
print "...",xi[0:5]
print "...",yi[0:5]
print "...",di[0:5]
Programmation
Photos
Pour la prise de photos lors du trajet, nous avons fait un programme simple de prise de photos. Ceci est un programme pour prendre 5 photos à une intervalle de 30 secondes entre chaque photos. Il faut ensuite l’adapter à nos besoins, c’est-à-dire, prendre des photos du début du trajet jusqu’à la fin.
from picamer import PiCamera #Importation des librairies nécessaires
from time import sleepcamera = Picamera() #Choix de la caméra
camera.resolution = (1024,768) #Choix de la résolution de la caméra
camera.rotation = 180 #Rotation de la caméra à 180° selon sa positioncar elle est placée à l'envers
i=0
while i<5:
#Choix de la direction des photos
chaine1=('/home/pi/Desktop/Photos_projet/image%d.jpeg')%i
#Prévisualisation de la photo
camera.start_preview(fullscreen = False, window = (50,50,640,480))
sleep(1.5) #Attente de 1,5 seconde pour la visualisation
camera.capture(chaine1) #Prise de la photo
camera.stop_preview() #Arret de la visualisation
print ('photo numero ', i+1, 'prise')
i=i+1 #Incrémentation du numéro de la photo
sleep(30) #Attente de 30s pour la prochaine photos
Une fois ce programme adapté à nos besoins, nous l’ajoutons au programme principal. Pour notre cas, il fallait le rajouter au programme principal, nous avons donc choisi cette solution:
j=0#Effectuer cette tâche uniquement lorsque i est un multiple de 30 (soit toutes les 30 secondes)
if i%30==0 :
chaine1=('/home/pi/Desktop/Photos_projet/image%d.jpeg')%i
camera.capture(chaine1)
j = j+1 #Comptage du nombre de photos prises
Programmation
Interface
Pour une question d’esthétique, nous créons une interface afin de visualiser le tout sur une seule fenêtre. Nous utilisons ici la librairie Tkinter fin de la créer. Voici le programme crée pour l’interface:
from Tkinter import*
fenetre = Tk()
fenetre.title('Trackeur GPS') #Titre de la fenêtre d'interface#Création du label fenetre qui contiendra les objets (frame)
champ_label = label(fenetre)
cadre = Frame(fenetre, width=300, height=150, borderwidth=1)
cadre.pack(fill=BOTH)
#Création du premier 'frame' qui contiendra du texte
pos_x = Frame(fenetre, width=20, height=50, borderwidth=1)
ligne_texte = Label(pos_x, text=("position x = "+str(x[i-1])),width=30
ligne texte.pack(side="left")
pos_x.pack(fill=BOTH)
#Création du deuxième 'frame' qui contiendra du texte
pos_y = Frame(fenetre, width=20, height=50, borderwidth=1)
ligne_texte2=Label(pos_y, text=("Position y = "+str(y[i-1])), width=30)
ligne_texte2.pack(side="left")
pos_y.pack(fill=BOTH)
#Création du troisième 'frame' qui contiendra du texte
dist = Frame(fenetre, width=20, height=50, borderwidth=1)
ligne_texte3=Label(dist, text=("Distance parcourue = "+str(D[0]+D[i-1])+" m"), width=30)
ligne_texte3.pack(side="left")
dist.pack(fill=BOTH)#Création du quatrième 'frame' qui contiendra le nombre de photos prises depuis le début du trajet
nb_ph = Frame(fenetre, width=20, height=50, borderwidth=1)
ligne_texte4=Label(dist, text=("Photos prises : "+str(j)), width=30)
ligne_texte4.pack(side="left")
dist.pack(fill=BOTH)
#Création d'un bouton 'Quitter'
Bouton_Quitter = Button(cadre, fg="red", text = "quitter", command = fenetre.destroy
Bouton_Quitter.pack(side="right")
champ_label.pack()
fenetre.update()#Actualisation de la fenêtre
Une fois tous ces programmes achevés, nous les mettons ensemble sur un seul programme afin d’avoir la totalité de l’application sur un seul programme, ce qui nous permettra de lancer un trajet et de l’arrêter lorsqu’on le souhaite.
Finalisation
Le système terminé, il ne fonctionne malheureusement pas comme on le souhaiterait. En effet, l’interface ne fonctionne pas comme prévu car lorsque les positions se mettent à jour, l’interface précédente reste présente et les nouvelles s’accumulent en dessous de celle-ci.
De plus, le module GPS que nous utilisons n’est pas très stable au vu de sa position dans le boîtier car il est « enfermé » ce qui crée des perturbations et donc fausse les données du tracking.
Difficultés rencontrées
Nous avons rencontré plusieurs difficultés au cours de ce projet. Premièrement, nous ne connaissions rien à propos de la Raspberry PI, ce fut pour nous une très bonne découverte.
De plus, le changement de groupe nous a contraint à devoir abandonner une partie du projet. Cela nous a aussi quelque peu ralenti.
Le module GPS met beaucoup de temps pour capter des satellites lors de la mise en tension. Ceci est encore plus ralenti lorsque le ciel est couvert.
III) Conclusion
Pour conclure, malgré que le projet ne soit pas fonctionnel à 100% et ne fonctionne pas comme nous le voudrions, nous avons beaucoup avancé et il nous a vraiment plu car il était très agréable à réaliser et il nous a permis de développer des compétences en programmation ainsi que de découvrir ce qu’est le Raspberry PI et toutes ces fonctionnalités. Il nous a aussi permis d’effectuer un agréable travail d’équipe, ce qui est très intéressant.
Remerciements
Nous tenons à remercier tout d’abord M.VERRIER Nicolas et M.BAZEILLE Stéphane non seulement pour nous avoir aidé mais également guidé tout au long du projet. Nous tenons à remercier également M.DE SABBATA qui nous a laissé accès à l’IUT LAB sans modération.
Le projet consiste à mettre en place un système de vidéosurveillance à l’extérieur qui sera autonome. Il faudra placer le système dans un endroit propice au soleil car celui ci sera alimenté grâce à l’énergie solaire. Ce système sera munit d’un boitier comportant le système ainsi que de la caméra et d’un petit panneau solaire. Pour ce projet, nous utiliserons un Raspberry Pi 3, un Witty Pi 2, une caméra, un panneau solaire, des capteurs et un ordinateur portable pour la partie de programmation.
Nous avons donc dans un premier temps, il fallait faire l’étude du sujet en réalisant plusieurs diagrammes, ensuite nous avons pu commencer la programmation en même temps que la création du boitier. Pour la suite, il a fallu se concentrer sur la détection de mouvement. Pour finir, nous avons réalisé une étude énergétique du projet, par rapport à la batterie.
Présentation des composants
En ce qui concerne les composants utilisés : nous utiliserons un Raspberry Pi 3, un Witty Pi 2, une caméra, un panneau solaire, des capteurs et un ordinateur portable pour la partie programmation.
Etude du projet
Au cours de cette étape du projet il était important de savoir sur quoi nous allions travailler, pour cela nous avons réaliser un certains nombre de diagrammes :
Une fois que les différentes tâches ont été déterminé nous nous sommes scindés en 2 groupes pour avancer en parallèle :
Présentation de l’aspect technique
Dans un premier temps nous nous sommes concentré sur l’aspect programmation du Raspberry Pi, notamment en élaborant un programme de redémarrage automatique du Raspberry Pi a l’aide du module Witty Pi, de cette façon nous pouvons contrôler la fréquence des prises de vue. Ensuite nous avons étudier le stockage nécessaire et le poids des photos pour optimiser le stockage des photos, un programme peut être activer pour supprimer les anciennes photos automatiquement (il est possible de stocker 1500 photos en Full HD). Nous avons ajouter les programme crée au démarrage du Raspberry Pi ce qui nous permet de rendre le système entièrement autonome d’un point de vue prise de photo.
Par la suite nous avons ajouté un système de détection de mouvement, ce système est pleinement fonctionnelle mais nécessite cependant une alimentation constante en énergie et cela sort de la quantité d’énergie dont nous disposons avec notre batterie actuelle (2000 mAh). Le flux vidéo peut aussi être accessible via internet si il y a une nécessité de contrôler la zone a distance.
Dans un deuxième temps nous avons étudier la partie énergétique du projet, notamment la consommation du Raspberry Pi et le rendement du panneau solaire. Avec une partie de 2000 mAh tel que la notre nous obtenons une autonomie théorique de 48 minutes, a cela nous devons ajouter l’usure de la batterie, nous avons donc du optimiser la consommation d’énergie pour que le système puisse être autonome le plus longtemps possible notamment la nuit ou en cas d’ensoleillement faible. A propos du temps de charge de la batterie, nous avons calculé un temps de charge de 4 H (Capacité batterie / Puissance du chargeur = 2000/500 = 4 heures de charge)
Pour finir nous avons réalisé un boitier pour le Rasberry et le matériels électroniques ( batterie … ) afin d’avoir un support et une protection pour cette partie. Ensuite nous avons fixé le panneau solaire puis nous avons ajouté une barre réglable afin de choisir l’angle qui permettra au panneau de recevoir le meilleur rendement énergétique et d’alimenter au mieux la Raspberry.
Réalisation du projet
Au cours de la réalisation le groupe a été scindé en deux, une partie sur la programmation du Raspberry Pi et une autre sur la réalisation du boitier.
Dans la partie programmation nous avons utilisé le langage Python ainsi que l’environnement de travail Thonny Python 3. Les scripts était ensuite exécuter au démarrage avec le fichier rc.local.
En parallèle, le groupe occupé à la création du boitier a utilisé le logiciel CorelDRAW pour la réalisation de celui-ci, puis nous avons utilisé la découpeuse laser pour la créer.
Une fois le boitier réalisé, nous nous sommes attelé à la création d’un support pour le panneau solaire. Celui ci se devait d’être adaptable notamment en ayant pour contrainte la possibilité de changer l’inclinaison du panneau. Pour se faire nous avons opter pour un support en bois en deux parties, une partie sur le panneau solaire et une autre sur le sol, le tour relié par une charnière et avec la présence d’une crémaillère sur la partie basse du support. Ainsi l’angle du panneau peut être changer a tout moment.
Conclusion
Pour conclure, nous avons rencontré quelques problèmes notamment avec la batterie qui ne chargeait plus. Lorsque l’on voulait la charger cela prenait également beaucoup de temps donc nous ne pouvions que réaliser les essais lorsque la Raspberry était alimentée par l’ordinateur.
Nous avons un code python servant à commander la caméra, la prise de photo et ses différents paramètres comme la résolution et la luminosité. Ainsi que pour l’enregistrement de l’image à un endroit spécifique du raspberry, et un autre pour la gestion des photos en effaçant les plus anciennes, de cette façon nous pouvons garder un nombre défini de photos.
Ensuite, nous avons ajouté ces deux fichiers pythons au lancement grâce au fichier rc.local. Ce fichier permet d’exécuter les deux programmes au lancement du raspberry et en arrière-plan, et cela en moins de 30 secondes.
Nous avons géré la fréquence des prises grâce au module Witty Pi2. Grâce à ce module nous pouvons définir quand le raspberry s’allume ou s’éteint et ainsi gérer l’énergie.
Malgré quelques soucis, le but du projet a été atteint et le système fonctionne très bien. Dès que quelqu’un passait devant le capteur, le système prenait une photo. Pour la fiabilité du projet, nous conseillons de choisir une batterie avec une meilleure capacité et un plus grand panneau solaire pour la recharger.
Au final, nous avons un programme autonome et fonctionnel de prise de photos en milieu extérieur ou intérieur avec gestion de stockage d’énergie.
Remerciements
Nous souhaitons remercier nos professeurs : – M. Verrier Nicolas – M. Bazeille Stephane
Ainsi que les personnes suivantes pour leur aides : – M. De Sabatta Christophe
Nous les remercions pour leurs aides et leurs conseils dans ce projet.
Notre groupe est constitué de 3 étudiants de deuxième année :
CLERBOUT Romain
DUDENHOEFFER Maxime
ZIMMERMANN Benjamin
Dans le cadre du cours d’Études et Réalisations de deuxième année du DUT Génie Électrique et Informatique Industrielle, nous avons dû réaliser un projet.
Le but de notre projet est de créer une machine qui trie et compte les pièces. Il faut également ajouter un afficheur à cette machine afin d’avoir le total des pièces.
Dans ce projet nous avons dû travailler sur la partie structure et sur la partie programmation.
Présentation du matériel utilisé
Pour crée la structure il nous a fallu une imprimante 3D, une découpeuse laser et du plastique.
Pour la partie programmation, il nous a fallu un Arduino, un écran LCD et un capteur de poids.
Étude du projet
Pour mener à bien la réalisation de notre projet nous avons séparé le travail en 2 parties : la partie informatique et la structure.
Romain s’est occupé de la programmation pendant que Benjamin et Maxime se sont occupés de la structure.
Avant de commencer le projet nous avons dû faire une analyse du capteur de poids ainsi que des pièces. Nous avons dû mesurer et peser chaque pièce afin de faciliter le triage. Par exemple, la pièce de 2 euros est la plus grande et la plus lourde, elle a 25,75 mm de diamètre et 8,5 g. Nous avons relevé ces deux caractéristiques pour chaque pièce. Le capteur a une plage de mesure qui va de 0 à 780 g. Il a une précision de 4 mg, en effet, le capteur de poids fonctionne grâce à une résistance interne qui varie selon la courbure du matériau qui l’entoure. On récupère alors, en sortie,une tension qui nous permet, après une simple règle de trois, de connaître le poids en grammes de la pesée. On utilise aussi une carte qui permet de faire la liaison entre l’arduino et le module de pesée, celle-ci est utile pour amplifier le signal de sortie du capteur. On utilise d’ailleurs dans le programme, non pas une valeur de poids de la pièce en gramme mais une unité arbitraire.
Voici l’analyse des pièces que nous avons réalisé :
La pièce de 2 euros a un diamètre de 25.75 mm et un poids de 8.5g(1850ua).
La pièce de 1 euro a un diamètre de 23.25 mm et un poids de 7.5g(1615ua).
La pièce de 50 centimes a un diamètre de 24.25 mm et un poids de 7.80g(1650ua).
La pièce de 20 centimes a un diamètre de 22.25 mm et un poids de 5.74g(1245ua).
La pièce de 10 centimes a un diamètre de 19.75 mm et un poids de 4.10g(880ua).
La pièce de 5 centimes a un diamètre de 21.25 mm et un poids de 3.92g(850ua).
La pièce de 2 centimes a un diamètre de 18.75 mm et un poids de 3.06g(652ua).
La pièce de 1 centimes a un diamètre de 16.25 mm et un poids de 2.30g(505ua).
Ensuite il a fallu choisir comment programmer le comptage des pièces. Nous avons commencé sur une Raspberry pi mais au final nous sommes passé sur Arduino car c’était plus pratique entre autres parce que que celui-ci possède des entrées analogiques et le système d’exploitation de la raspberry pi n’était pas utilisé.
Déroulement du projet
Dans un premier temps, nous avons dû réfléchir à une solution pour trier les pièces. Nous avons opté pour une rampe fait à la découpe laser avec des trous à l’intérieur en fonction de la taille de chaque pièces, l’idée était d’incliner cette plaquette pour que les pièces roulent dessus et tombent dans le trou correspondant. Il fallait faire attention car les pièces de 50 cents et de 5 cents étaient plus grandes que les pièces de 1 euro et de 10 cent. Par la suite nous avons créé des tuyaux en dessous de chaque trou pour que la pièce se glissent dedans.
Ensuite, il a fallu trouver une solution pour peser les pièces précédemment triées. Après avoir essayé de les peser séparément nous avons décidé de les peser toutes ensemble sur un banc de pesage. Celui-ci était équipé du capteur de poids.
Pour finir, nous avons pu améliorer notre structure qui fonctionnait déjà pour qu’elle soit plus simple d’utilisation. En effet, nous avons rajouté une pièce, faite avec l’imprimante 3D à l’entrée de la rampe de tri pour guider les pièces plus facilement. Nous avons également ajouté des tiroirs à la sortie des tuyaux pour pouvoir récupérer les pièces une fois pesées.
Pour le déroulement du côté de la programmation, qui a été fait en parallèle de la structure, nous avons fait un programme qui se divise en 2 parties. Une partie gère la pesée, on pèse tout le banc de pesé, on ajoute la pièce et on fait une soustraction de la nouvelle pesée moins l’ancienne, ce qui nous donne le poids de la pièce qui vient de tomber et nous permet de déterminer le type de celle-ci. La deuxième partie gère l’affichage. On affiche soit la cagnotte qui est l’affichage de base, soit le nombre de pièce par type. Cet affichage est géré par un bouton pendant qu’un autre bouton permet la remise à zéro de la cagnotte.
Après avoir fini la structure et la programmation nous avons fini par améliorer notre projet. Nous avons ajouté une boîte pour ranger l’arduino et poser les deux boutons. Nous avons également re-designer notre projet pour en améliorer l’esthétique.
Résultats
La structure marche très bien, on met les pièces sur le trieur elles roulent puis tombent dans différents tuyaux selon leur taille. Ensuite, elle tombe dans des tiroirs posés sur le banc de pesage. Quand on a fini de compter les pièces, on peut retirer les tiroirs et récupérer les pièces.
Nous avons réussi à afficher sur un écran LCD deux modes.
Sur le premier mode, on peut voir un jackpot qui s’incrémente à chaque pièce qui arrive sur le banc de pesage.
Sur le second mode, on peut voir un tableau avec les différentes pièces qui vont de 1 centime à 2 euros et à côté on voit le nombre de pièces posés sur le banc de pesage.
Conclusion
Nous avons réussi à terminer le projet dans les temps.
Le projet étant centré plus sur la partie conception de l’objet et mise en place de nos idées grâce aux outils qui étaient à notre disposition, il nous a permis de développer nos compétences en programmation, mais également en conception 3D avec Tinkecad et en utilisation de programme de dessins vectoriels (CorelDraw) dont nous nous sommes aidés pour la découpe laser. Il a également permis de travailler en équipe, ce qui est la partie la plus intéressante du projet car nous mettons nos connaissances et nos idées en commun pour arriver à nos fins.
Remerciements
Finalement, nous tenons à remercier nos professeurs, M.Bazeille et M.Verrier pour leur aide et leurs conseils mais aussi M.de Sabbata qui nous a laissé accès à l’IUT Lab et à ses machines.
Dans le cadre des projets d’étude et réalisation du DUT Génie Electrique et Informatique Industrielle de Mulhouse, nous avions un volume de 96h pour réaliser le projet suivant : équiper une cafetière de capteurs pour monitorer son utilisation. Ce projet a duré pendant les quatre cinquièmes du volume horaire total, arrêté brutalement pour cause de COVID-19, c’est-à-dire d’octobre à mars.
Notre équipe s’est formée autour de ce projet par souci d’affinités et de préférences. Ce projet fut encadré par deux professeurs : M. Bazeille et M. Verrier. En dehors de nos heures de travail nous avons développé le projet en complément dans l’IUT LAB pour nous tenir à jour dans le diagramme prévisionnel.
Membres du projet et répartition des tâches
Les 4 membres de ce projet.
Anthony Tort Mathieu Rey Victor Seiler Thibaut Cauvez
Une fois les compétences de chacun découvertes, nous nous sommes réparti les tâches de telle sorte:
Présentation du projet
Le projet qui nous a été attribué est celui de la machine à café connectée. Ce projet consiste à apporter des modifications à une cafetière basique (Cosylife CL-PRG27) en y ajoutant des capteurs pour monitorer son utilisation.
Les différents buts de ce projet sont :
La prise en main d’une raspberry pi
L’implantation de capteurs
La récolte d’informations à l’aide de ces capteurs
La réalisation de statistiques à partir de ces informations
L’enregistrement des données sur un site internet
Problématiques
Quels capteurs seront présents et comment les intégrer à notre cafetière ?
Comment adapter notre système dans un environnement humide et chaud ?
Comment utiliser des informations déjà présentes sur les capteurs de la cafetière ?
Comment traiter et croiser ces informations de manière à avoir le plus de données utiles ?
Gestion du projet
1) Bête à cornes
Afin de ne pas s’égarer sur le sujet, nous avons mis en place une bête à cornes:
2) Mindmap
Ce diagramme a pour objectif de guider les avancées du projet.
3) Diagramme de GANTT
Les diagrammes de GANTT nous permet de comparer la durée d’avancement du projet prévisionnelle et réelle.
4) Budget initial
Notre budget de départ était de 50 euros avec l’emprunt de la raspberry pi et de son écran tactile. Ce budget étant modulable il pouvait augmenter en cas d’achat de fournitures nécessaires au développement du projet qui dépasserait le plafond initial.
5) Liste des achats
Article(s)
Prix unitaire (TTC)
Quantité
Total (TTC)
Cafetière filtre programmable COSYLIFE CL-PRG27
19.81 €
1
19.81€
Capteur de vibrations ST040
5.60€
1
5.60€
Capteur De Lumière Photosensible
3.97€
1
3.97€
Optocoupleur Traversant (RS : 395-6344)
0.238€
10
2.38€
Prix Final(TTC)
31.76€
Les prix des résistances, des câbles et de la carte électronique pour l’optocoupleur ne sont pas pris en compte car sont insignifiants ou récupérés sur d’anciens systèmes.
Réalisation du projet
1) La cafetière à filtre programmable
Ce projet consiste à agir sur la cafetière programmable de la marque Cosylife, il s’agit d’une cafetière basique avec un système d’horloge programmable pour l’allumer et l’éteindre de manière automatique à l’horaire que l’on souhaite.
La raspberry pi est un nano-ordinateur nous permettant de faire le lien avec nos capteurs. En effet, les informations sont directement envoyées sur celle-ci afin d’être traitées et utilisées. Elles sont ensuite envoyées sur un écran LCD afin de les afficher.
Fiche technique:
Processeur
ARM v8, Quad-core 1.2 GHz, Broadcom2837 64bit CPU
Mémoire
1 GB
Connectique
4 x USB 2.0, 1 x CSI, 1 x micro SD, 1 x GPIO, Sortie vidéo et stéréo, 1x DSI
Communication
BCM43143 Wifi WLAN, Bluetooth BLE
Alimentation
Micro USB, jusqu’à 2,5A
2.2) Capteur de vibrations
Le capteur de vibrations permet de détecter l’utilisation de la machine à café. La cafetière tremblant un peu lorsqu’elle fait couler le café, son but ici est de capter ce tremblement. Un potentiomètre nous permet de calibrer le seuil de détection du capteur, ce dernier pouvant être utilisé avec une entrée analogique ou numérique.
Fiche technique:
Alimentation
3 à 5 VCC
Sorties
4 Sorties: VCC, GND, D0,A0
Dimensions
42 x 17 x 9 mm
2.3) Photorésistance
La photorésistance est disposée contre le pichet de la cafetière, nous informant si le réservoir de café est présent ou non. Cette information nous permet de savoir si un café est servi et de savoir combien de fois le réservoir a été retiré.
Fiche technique:
Alimentation
3,3 à 5 VCC
Sorties
4 Sorties: VCC, GND, D0,A0
Dimensions
3,2 x 1,4 cm
2.4) Optocoupleur
Nous utilisons des optocoupleurs afin de récupérer une information là où circule du courant. Ces optocoupleurs sont reliés directement à la cafetière afin de connaître si elle est branchée à un réseau électrique et aussi pour savoir si le bouton ON est activé.
Fiche technique:
Type de montage
Traversant
Type de sortie
Transistor
Tension directe maximum
1,4 V
Nombre de broches
4
Type de boîtier
DIP
Temps de croissance
5µs
Courant d’entrée maximum
50 mA
Tension d’isolement
5 kVrms
Taux de transfert de courant maximum
260%
Rapport de transfert de courant minimum
60%
Temps de chute
4µs
2.5) Ecran LCD tactile
L’utilisation d’un écran LCD tactile nous permet de faire l’affichage de toute les informations récoltées grâce au capteur. L’utilisation d’un écran LCD tactile permet de faciliter l’utilisation de la cafetière car utiliser un écran d’ordinateur serait beaucoup moins ergonomique.
Fiche technique:
Version
LCD
Couleur
16-bit
Affichage
ab 7.0 Zoll
Résolution physique
800 x 400 Pixel
Diagonale
17.78 cm
Modèle
Raspberry Pi
Particularité
Touch kapazitiv
3) Implantation des capteurs
3.1) Capteur de vibrations et photorésistance
Capteur de vibrations
Pour intégrer le capteur de vibrations à notre cafetière, nous avons eu comme idée de le placer contre celle-ci. L’objectif a été de détecter les vibrations lorsque l’eau, présente dans le réservoir s’écoule dans le filtre. Cela nous a permis de savoir quand la cafetière passe du mode chauffage et remplissage au chauffage de la cafetière seul, et ainsi de connaître la consommation exacte en énergie car la cafetière consomme plus quand elle chauffe et écoule de l’eau. Nous savions aussi que lorsque l’eau s’écoule à un temps T (le débit d’écoulement étant constamment le même) il déverse un certain volume d’eau correspondant à un nombre de tasses à café moyen. Cela nous permis de connaître le volume de ces cafés servis.
Photorésistance
La photorésistance placée contre la verseuse en verre nous permet de détecter un changement d’état correspondant à la prise en main de cette même verseuse. Cela permet de savoir que quelqu’un est en train de se servir un café, et ainsi de connaître le nombre moyen de cafés servis à chaque utilisation.
Le branchement des ces deux capteurs, chacun composés de quatre broches, fut assez simple à réaliser :
VCC = alimentation du capteur (5V)
GND = masse du capteur
D0 = information de sortie logique du capteur
A0 = information de sortie analogique du capteur
Nous avions uniquement utilisé la sortie D0 des deux capteurs de manière à détecter les changements d’état pour détecter les cas cités précédemment.
3.2) Optocoupleur
L’optocoupleur est un composant électronique capable de transmettre unsignal d’un circuit électrique à un autre, sans qu’il y ait de contact galvanique entre eux.
Dans le cas présent, il permet de récupérer des informations dans la cafetière elle-même et de l’envoyer dans la raspberry tout en séparant les deux circuits car la carte électronique d’où nous tirons les signaux est alimentée en 5V continu mais en 230V alternatif ce qui est à la fois dangereux pour la raspberry et pour l’homme. Les signaux électriques que nous avons récupérés de la cafetière étant l’alimentation globale de la cafetière pour savoir si elle est branchée à une source de courant et l’appui sur le bouton de mise en marche de la cafetière pour savoir si elle est en veille ou en train de chauffer et faire du café. Nous avons donc deux circuits de l’optocoupleur, séparés mais branchés de la même façon c’est pour cela que l’image décrivant le branchement de l’optocoupleur ci-dessous correspond aux deux circuits de l’optocoupleur.
Le branchement d’un optocoupleur consiste à récupérer le signal sur la pin 1 sortant par la pin 2 et d’alimenter la pin 3, s’il y a présence de signaux entre la pin 1 et 2 le transistor serra passant et et laissera passer le courant de la pin 4 à 3 pour ainsi récupérer un signal ou non sur la pin 3. En sortie de pin 3 nous avons intégré une diode au pont diviseur de tension pour savoir visuellement si le l’optocoupleur est passant ou bloquant.
Afin d’intégrer l’optocoupleur nous sommes passés par une phase test sur une breadboard puis nous avons dû créer la plaque électronique:
Néanmoins, afin de passer à l’étape de la création, des mesures de protection sont nécessaires à cause du contact avec des produits dangereux. Il faut donc se munir:
De gants en latex
D’une blouse de travail
De lunette de protection
Après la création de la carte virtuellement, l’étape suivante consiste à créer la carte électronique qui est réalisée en plusieurs étapes:
Imprimer, découper et passer aux rayons UV
Après avoir imprimé le schéma des pistes KiCad sur une feuille de calque, il faut découper la plaque qui va accueillir la piste avec les dimensions nécessaires. Ensuite, il faut placer la plaque découpée sur la feuille de calque dans les rayons UV afin de créer une réaction chimique sur la résine présente sur la plaque n’étant pas protégée par les pistes de la feuille de calque.
Passage au révélateur et nettoyeur
La plaque passant dans le révélateur va afficher les pistes qui n’étaient pas exposées aux rayons UV. Elle va ensuite passer dans une nettoyeuse au perchlorure afin d’enlever les résidus de résine pour ainsi afficher les pistes cuivrées. La plaque sera encore passée aux UV afin d’enlever toute trace de résine.
Étamage
La plaque va être ensuite plongée dans de l’étain chimique à froid pour y déposer une couche d’étain sur le cuivre afin de le protéger de l’oxydation.
Perçage des pistes
Perçage des pistes avec différentes tailles de foret suivant les différentes pattes des composants. Le trou ne doit être ni trop petit ni trop grand.
Nous avons ensuite intégré l’optocoupleur en utilisant le logiciel kicad puis en réalisant toute les étapes de la création d’une plaque pour enfin l’intégrer dans un boite créé à la découpeuse laser pour nous permettre de le mettre en place et de manipuler le système en toute sécurité.
Voici une vidéo montrant les phases de test de l’optocoupleur ou l’on peut distinguer un changement d’état de l’information récupérée prouvant que le système fonctionne
Une fois tous les capteurs mis en place voici une image montrant comment ils sont disposés dans la boîte (ce n’est pas la disposition finale)
4) Codage
La partie la plus importante de ce projet consiste à faire le codage de la raspberry pi. En effet il faut tout d’abord faire l’acquisition des différentes informations prises par les capteurs, il faut ensuite traiter ces informations et les croiser afin d’en tirer des statistiques et des informations sur l’état de la machine à café. Enfin il faut afficher ces informations sur un écran LCD.
En raison de l’épidémie de Covid-19 nous n’avons pas de capture d’écran de notre code.
Tout d’abord nous utilisons nos capteurs en numérique, dans le but de savoir si la machine tremble ou non et si le pichet est présent ou non. Nous n’avons pas besoin de savoir la quantité de lumière et de vibrations, c’est pourquoi notre code fait de la détection de changement d’état. Nous croisons nos données des différents capteurs afin de connaître l’état de la cafetière comme indiqué sur le schéma ci-dessous:
L’utilisation de la librairie “time” nous permet de savoir la date et l’heure réelle. Nous l’utilisons aussi pour compter la durée d’allumage de la cafetière et pour savoir depuis combien de temps la cafetière est branchée au réseau électrique. Ces valeurs multipliées aux valeurs mesurées de consommation dans ses différents états nous permet de connaître sa consommation en temps réel.
A l’aide d’un appareil permettant de mesurer les Watts par seconde, nous avons fait des tests et des courbes afin d’évaluer la consommation de la machine à café:
La programmation d’un compteur à chaque fois que quelqu’un retire le pichet nous permet de connaître le nombre de cafés servis et de créer des petites alertes (par exemple « changez filtre ») à partir d’un certain seuil dépassé.
On affiche puis on retire très rapidement notre code afin de faire le rafraîchissement des valeurs.
Voici une représentation de ce qu’affiche l’écran après le lancement de notre programme:
5) Support
Afin de protéger les composants, nous avons dû créer un support. Pour cela, nous avons d’abord imaginé un boîtier qui suit la forme de la cafetière. Ainsi commence la modélisation de la cafetière.
Nous avons pris les mesures de la cafetière et modulé celle-ci. Par souci de moyens, nous avons décidé de changer notre fusil d’épaule et utiliser la découpeuse laser. Nous avons du refaire des plans et penser aux orifices afin de faire passer les fils et les composants et de placer l’écran de la raspberry PI sans que celui-ci ne tombe. Ci-dessous, les plans de la boîte.
Les parties noires signifient l’enlèvement de matière.
Ensuite, nous avons dû choisir la couleur de notre boîtier. Étant donné que nous avons besoin de mettre la photorésistance dans la pénombre, nous avons opté pour un noir uni sans transparence.
Voici la face avant vue de l’intérieur de la boîte :
Pour fixer l’écran nous avons utilisé un ruban adhésif d’électricien.
Ci-dessous une image de la construction du boîtier:
Nous n’avons guerre pu finir sa construction car il nous faut encore ajuster différents capteurs.
Bilan
Pour conclure sur notre projet, nous n’avons pas atteint tous nos objectifs principaux. En effet, il reste encore à finir l’intégration du support dans la cafetière puis régler la sensibilité des capteurs en situation réelle et enfin créer et récupérer les informations déjà acquises sur un site web. Malgré cela, la cafetière a reçu beaucoup d’améliorations depuis son état initial. Nous avons découvert que le fait de modifier un système déjà fini en y ajoutant des améliorations est très intéressant. Nous avons réussi à tenir la plupart de nos prévisions malgré un certain retard pour cause de mauvais branchement de capteur, de programme, support ou encore dû au contexte actuel. Tout en avançant dans le projet nous avons continué à penser à de nouvelles améliorations car le projet nous a beaucoup plu et nous a permis d’apprendre et développer des connaissances portant sur notre formation GEII.
Perspectives d’évolution
Notre projet n’a pas atteint son maximum:
Nous pourrions piloter la cafetière à distance en enlevant la carte électronique qui pilote la cafetière et en intégrant un système de transistor piloté par la raspberry pi, elle-même pouvant être pilotée par une interface web
Intégrer un capteur de vibration adapté au système serait un grand avancement pour l’acquisition de nouvelles données et la précision de valeurs mesurées actuelles telles que la consommation électrique et le volume de café créé sur un temps donné.
La prise en compte de la consommation électrique de la raspberry pi est intéressante car, à présent intégré au système, il fait partie de la cafetière.
Fixer un objectif de consommation de la cafetière sur l’interface pourrait sensibiliser ses utilisateurs et faire des économies d’énergie de manière à pouvoir exploiter ce projet dans un but d’économiser l’énergie.
L’ajout de nouveaux capteurs permettrait de créer plus d’informations, par exemple un capteur de niveau d’eau pourrait informer la quantité de cafés servis.
Une autre idée serait d’ajouter une information lorsque le pichet est retiré de la cafetière.
En utilisant un autre type de cafetière, nous pourrions pallier au problème de vibrations.
Remerciements
Nous tenons à remercier l’IUT de Mulhouse ainsi que l’IUT LAB pour le budget et l’apport de matériels.
Également un grand merci à nos professeurs encadrants M. Bazeille et M. Verrier.
Nous sommes deux étudiants en deuxième année GEII et avons comme projet l’amélioration d’un système d’arrosage automatique proposé par Soléa. Nous étions chargés de la partie alimentation tandis qu’un autre groupe était chargé de la partie « intelligence ».
1 – Objectif du projet
A- Contexte
L’objectif du projet est d’élaborer un système d’arrosage automatisé alimenté à l’aide d’un système d’alimentation indépendant et renouvelable. Pour limiter la consommation d’énergie on devait programmer l’allumage et l’extinction du système. Afin de mener notre projet à bien nous avions structuré notre travail de façon à accomplir ces taches-là :
Estimation de la consommation du système complet
Alimentation de la raspberry sur batterie
Mise en place du panneau solaire pour le rechargement de la batterie
Extinction et allumage automatique de la Raspberry
Conception CAO
B- énoncé du besoin
C- environnement du produit
le système devra résister à la température et à l’humidité ambiante . La batterie devra être à l’abri de l’humidité pour éviter qu’elle ne s’abime. Pour ce qui est du panneau solaire il faut évidemment qu’il soit exposé entièrement au soleil pour fournir de l’énergie. NB il suffit qu’une seule cellule soit recouverte pour que le panneau ne fournisse pas d’énergie , il faut faire très attention à la position du panneau
2–Matériels
Dès le début nous disposions d’un certain nombre d’équipements à l’élaboration de notre projet :
Carte Raspberry pi 3
c’est la base du projet, c’est à partir d’elle que nous avons réalisé notre profilage énergique
Batterie en lithium
cette batterie polymère de 2000mAh a servit à alimenter la Raspberry pi ainsi que les capteurs
3.Un panneau solaire :
Le panneau photovoltaïque utilisé pour recharger notre batterie a une puissance de 2W et une tension de 6V
Un driver : ce qui permet la charge décharge simultané de la batterie et maximise l’énergie produite par le panneau
5 .Witty pi 2
elle a servit pour programmer les séquences d’allumage extinction
6. booster de tension
Toutefois la batterie débite une tension de 3.7 V ce qui est insuffisant devant les 5V nécessaire à l’alimentation de la raspberry pi. nous avons donc utilisé un booster de tension qui transforme les 3.7V d’entrée en 5V de sortie pour alimentation la Raspberry.
5 -Programmation
1.Envoi d’un mail
Dans notre cas nous n’utilisons que des adresses gmail
XXX@gmail.com est l’adresse d’envoi et YYY@gmail.com est le destinataire. Nous avons utilisé le serveur SMTP.gmail.com qui est un serveur gratuit qui nous permet d’envoyer jusqu’à 100 mails par jour
Ce code est indépendant de la configuration du serveur. Pas besoin d’installer quoi que ce soit pour que le mail puisse être envoyé, toutes les librairies nécessaires sont normalement déjà installées.
Cette fonction sera utilisé pour signaler l’ouverture et la fermeture de la vanne .
2.Lancement d’un script au démarrage
Pour le lancement il suffit tout simplement de placer le chemin du script voulu dans le fichier Rc. Local tout à la fin avant le « exit 0 ». Et le script se lancera tout seul au démarrage. Cependant dans certains cas il faut ajouter le caractère « & » pour éviter que le code se répète en boucle.
pour vérifier que le code se lance bien au démarrage nous avons relié une Led à notre Raspberry pi qui s’allume pour confirmer que le programme se lance bien .
A chaque fois que la Raspberry pui démarre elle envoi une impulsion pour allumer la Led
3.Séquence allumage/extinction
Pour cette partie nous avons utilisé une Witty Pi 2 qui est une horloge temps Réel pour Raspberry Pi. Nous avions d’abord utilisé une RTC for Pi au début mais elle nétait pas adapté car elle ne disposait pas de pin d’alarme
Après avoir connectée la Witty Pi 2 à notre Raspberry, l’installation de notre module se fait en exécutant ces lignes de codes :
Après avoir installé le module on peut ouvrir de menu et constater que 8 possibilités s’offrent à nous
les options 1,2 et 3 servent à régler la date et l’heure. Ce qui vas nous intéresser ici sont les points 4,5 et 6.
l’option 4 sert à programmer la prochaine extinction , l’option 5 elle sert à programmer le prochain démarrage tandis que l’option 6 nous permet de choisir un script de séquence d’allumage/ extinction.
voici un exemple simple de séquence
ce script tout simple met en marche la Raspberry pi pendant 5 minutes toutes les 20 minutes
nous avons utilisé des scripts du même type
si les conditions d’arrosage sont bonnes on active le script de gauche :
on met en marche la raspberry pi pendant 5 min c’est à dire le temps d’ouvrir la vanne , puis elle s’arrête pour redémarrer à 4h pendant 5 min pour fermer la vanne
si les conditions sont mauvaises :
on met en marche la raspberry et on l’arrête jusqu’au lendemain.
la commande python pour lancer le script est :
4.Consommation énergétique
1. Recharge par panneau solaire
voici la courbe caractéristique de notre panneau solaire .
Nous pouvons constater qu’avec une luminosité maximale , nous pouvons récolter 0.038 A par cellules. Le panneau étant constitué de 12 cellules on fait le produit. 12*0.038= 0.456 A
Ainsi grâce à la relation suivante nous pouvons déterminer le temps de charge de la batterie avec un rayonnement optimal. T = Q / I
T représente le temps en secondes
Q la quantité de charge en coulomb (1000mAh = 3600 Coulomb)
I l’intensité en ampères
Donc : T = 7200 / 0.456 = 15789.4s soit 4h et environ 20 minutes de temps de charge
La même formule nous servira par la suite afin de calculer notre temps de décharge avec l’ensemble des équipements nécessaire à l’élaboration du projet.
2.Estimation de la consommation du système
pour notre batterie de 2000mAh on a :
1 capteur de 35 mA
1 capteur de 0.15 mA
1 Raspi de 490 mA
dans la formule I = intensité en Ampères
Q= quantité de charge en Coulomb ou en Ah (1Ah = 3600 coulombs)
et t correspond au temps en secondes
calculons à présent le temps qu’il faut à notre système pour décharger la batterie.
Notre batterie peut donc tenir environ 3H48mn
3. Courbe de charge et de décharge
courbe de charge pratique
En extrapolant nous avions obtenus ces résultats en chargeant la batterie avec le panneau solaire.
Donc un temps de charge d’environ 6 heures avec l’ensoleillement présent ce jour-là. Cette courbe
nous prouve que la batterie peut bien se charger grâce au panneau solaire.
courbe de charge théorique
Nous avions tracé la courbe de charge de la batterie avec le logiciel Scilab. Afin de faire une
hypothèse sur le temps que pourrait mettre la batterie à se décharger
courbe de décharge théorique
Nous faisons la même expérience en pratique en utilisant un moteur à courant continue et en
relevant la tension à plusieurs moments à l’aide d’un voltmètre.
courbe en pratique
Donc avec un moteur à courant continue la batterie se déchargeait au bout d’environ 33 minutes.
Donc en faisant cette mesure nous avons pu déterminer si la batterie fonctionnait.
Cette courbe de décharge nous l’avions réalisée en relevant plusieurs mesures au cours de la
décharge à l’aide d’un voltmètre, puis en extrapolant ces valeurs obtenus afin d’obtenir une courbe.
4. Allumage et extinction
nous avons le courant consommé pendant 10 min par notre système. Nous constatons des pics pendant l’allumage et pendant l’extinction . on a mesuré environ 82mAh
nous avons réalisé les mêmes mesure mais cette fois nous avons allumé et éteint 2 fois notre système pendant 3 min . on a mesuré environ 47 mAh d’où l’intérêt de faire des allumage et extinction pour économiser la batterie .
5. importance du driver
La puce MCP73871 du chargeur USB / solaire possède une fonctionnalité très astucieuse appelée « partage de charge ». Supposons que nous ayons un chargeur lipoly tous les jours et que nous souhaitions utiliser la batterie pendant la charge. Pour ce faire, nous pouvons connecter le projet directement à la sortie de la batterie. Cela signifie toutefois que le chargeur charge à la fois une batterie et pilote votre projet en même temps. il fait parfois sombre et nous ne pouvons pas utiliser de chargeur solaire. Il y a donc également un port USB sur le tableau. Nous pouvons utiliser n’importe quel câble mini-B pour brancher et charger.
Si quelque chose est connecté à la prise CC, il débranchera mécaniquement le mini-connecteur USB. Il faut donc s’assurer de débrancher le panneau solaire lors du chargement par USB.
CONCLUSION
Nous voudrions tout d’abord remercier Monsieur Nicolas VERRIER et Monsieur Stéphane BAZEILLE de nous avoir donné l’opportunité de réaliser ce projet et de nous avoir apporter leur aide tout au long de celui-ci. Ce projet nous a permit d’apprendre à travailler en équipe et à se repartir les taches de façon à finir le travail qui nous avait été confié.
Pour conclure, grâce à un grand travail de recherche nous avons pus élaborer un système d’arrosage automatique avec une alimentation indépendante et renouvelable.
Nous avons pus déterminer quels équipements étaient nécessaire, faire un bilan de consommation énergétique et de déterminer le moyen le plus économique d’utiliser la batterie. nous avions aussi réussi à programmer en langage python de nombreux programmes dont l’allumage et l’extinction de la raspberry pi 3. finalement nous avons réalisé une conception CAO pour stocker nos composants électroniques.
Nous pourrions également ajouter à ce projet divers point d’amélioration. Comme par exemple, installer un capteur qui mesurerai l’état de la batterie et ainsi l’envoyer par mail.
Voici une vidéo illustrant la mise en action des scripts, extinction/allumage et le rechargement de la batterie par le panneau solaire.
PROJET ER2 : Mise en œuvre d’un système de régulation d’un arrosage automatique
Contexte :
L’entreprise Soléa a pris contact avec l’IUT de Mulhouse dans le but de commanditer un projet auprès des étudiants de deuxième année GEII :
Ils souhaiteraient que nous réalisons pour eux un système intelligent et autonome de régulation pour leur système d’arrosage automatique des pelouses sur les voies de tramway.
Pour réaliser cette commande, le travail sera divisé en deux projets : notre groupe se concentrera sur la partie “intelligence” du système, un autre groupe de nos camarades se chargera de la partie “autonomie” du système.
Matériel :
Pour mener à bien ce projet, l’IUT a mis à notre disposition le matériel suivant :
– 2 Raspberry Pi 3
– Capteurs de température, pression & humidité du sol
– Shield GrovePi+
– 2 Modules Xbee (communication sans fil longue portée)
Objectifs :
Nous devons réaliser un système de régulation pour un arrosage automatique des pelouses.
Le système devra contrôler l’arrosage en fonction de plusieurs paramètres : température, humidité du sol, la pression atmosphérique.
Notre système doit pouvoir se raccorder par dessus le système déjà existant en station.
Pour ce faire, nous allons devoir faire communiquer sur une longue distance un Raspberry Pi de mesure situé a coté de l’électrovanne, et un Raspberry Pi de contrôle se situant en station.
On souhaite aussi pouvoir présenter une analyse statistique à l’utilisateur.
Tout d’abord, nous avons commencé par tester nos capteurs :
Après avoir écrit des petits programmes simples, nous avons pu relever des valeurs sur nos capteurs.
Toutefois, certains capteurs n’étaient pas compatibles avec un Raspberry Pi 3 : En effet, le quartz régulant la fréquence de synchronisation des capteurs sur les Pi 2 sert a la communication BlueTooth sur les Pi 3 ; les Raspberry Pi 3 ne sont donc pas compatibles avec les protocoles de communication synchrone.
Seuls les capteurs se connectant sur les ports I2C fonctionnent : le protocole I2C est asynchrone et utilise des acquittement et des handshakes.
Ensuite, nous avons assemblé ces codes simples permettant de relever les valeurs de chaque capteurs, pour obtenir un code capable de relever les valeurs de chaque capteur, l’un après l’autre, puis de les enregistrer dans un fichier texte à fin de les traiter puis de les transmettre par la suite à la Raspberry Pi réceptrice.
Nous avons tout d’abord établi une communication sur le réseau Ethernet local de l’UHA entre nos deux Raspberry Pi.
Nous avons opté pour le protocole TFTP car il était simple d’utilisation et répondait à nos besoins
Après avoir réussi à récupérer les valeurs de nos capteurs sur la Raspberry Pi réceptrice et à contrôler l’allumage d’une LED (représentant l’électrovanne) en fonction des valeurs reçues, nous nous sommes attelés à réaliser la communication sans fil à l’aide des modules Xbee.
Nous avons alors opté de moyenner nos mesures sur une période d’une dizaine de mesures avant de les émettre, la transmission textuelle des donnée n’étant pas instantanée.
Après, nous avons ajouté à notre code de réception l’écriture des données reçues dans un fichier Excel dans le but de permettre une analyse statistique par l’utilisateur.
Voici l’un des graphiques que nous avons pu obtenir en changeant d’environment le capteur d’humidité du sol.
On constate un pic anormal pour les valeurs d’humidité « Moisture » : celui ci correspond à une erreur de transmission.
On voit aussi des intervalles ou il n’y a pas de mesures enregistrées : ces intervalles correspondent à une perte de la communication.
Ici, on peut voir à gauche le ficher .txt dans lequel les valeurs brutes relevées sont stockées, et à droite, les valeurs traitées apparaitre dans la console de Raspberry Pi réceptrice.
Enfin, voici les algorigrammes de nos codes émetteurs et récepteurs :
Vidéo de démonstration :
Conclusion :
Nous estimons avoir bel et bien montré la faisabilité d’un tel système.
L’un de nos camarades qui viendra à réaliser son stage de fin d’études au sien de l’entreprise Soléa pourrait bien devoir approfondir sur ce projet et le mettre en place en conditions réelles.
Groupe: Florian BRAUN, Noah BEAUPERE et Hugo TISSOT
Sommaire
Cahier des charges
1. Présentation générale du problème
1.1. Projet
1.2. Contexte
1.3. Énoncé du besoin
1.4. Environnement du produit
2. Expression fonctionnelle du besoin
Gestion et réalisation du projet
1. Simulation des capteurs
A) Générateur de fonctions arbitraires
a) Analyse du système des valeurs recherchés
b) Création de la fonction arbitraire
c) Le générateur
B) Convertisseur Analogique Numérique
a) Branchement
b) Configuration
c) Code
C) Avertissement visuel
a) Branchement
b) code
2. Programmation du RaspberryPI
A) Récupération des données
B) Communiquer entre les RaspberryPi
C) Analyse et utilisation des données
D) Envoie des données au serveurs
3. Stockage et Interprétation des Données
A) Récolte et Stockage
a) Étude de marché
b) Architecture
B) Accès à Distance et Interprétation
Cahier des charges
1.Présentation générale du produit
1.1. Projet
Le but du projet est de collecter les données de température sur chacun des fours à tabac d’une exploitation, les envoyer sur un serveur accessible depuis un smartphone ou autre pour permettre de visualiser et comparer facilement les données instantanées. Une alarme sera également créée, en cas de fort dépassement des valeurs attendues ou de problèmes matériels et l’utilisateur sera averti.
1.2. Contexte
Lors du processus de séchage du tabac, le séchage des feuilles doit passer par différents cycles avec différentes température et humidité afin d’extraire efficacement toute l’humidité. Ces cycles de séchage durent, au total, une semaine avec des fours continuellement allumés. Si un four vient à tomber en panne ou subi une anomalie durant le processus et qu’il n’y a pas de surveillance, (la nuit par exemple) les dégâts et la perte de la récolte peuvent se chiffrer en milliers d’euros.
1.3. Énonce du besoin
1.4. Environnement du produit
Le dispositif final doit pouvoir directement se connecter aux capteurs des fours et doit répondre à un minimum de contraintes environnementales:
résister à une température minimum de 90°C
résister à l’humidité ambiante
Liste du matériel:
2 Raspberry Pi
Générateur de tension (fonction arbitraire)
Oscilloscope
CAN
Afficheur 7-seg
Relais wifi
On estime le coup total à 158€, étant donner que l’oscilloscope et le Générateur nous on été prêté.
2.Expression fonctionnelle du besoin
Tableau des Fonctions
Fonction
Désignation
Critères d’appréciations
Niveau
Flexibilité
Observations
Limite d’accep-
tation
FP1
Permettre à l’utilisateur de consulter l’état des fours en temps réel
– visualiser sur un smartphone
– comparer les valeurs attendues et réelles
/
/
/
FP2
Avertir l’utilisateur en cas de dysfonctionnement d’un four
– envoyer une notification ou mettre en place une alarme sur le smartphone
– mettre en place un avertisseur visuel
état des alarmes récoltées toutes les 15 minutes
/
fréquence d’acquisition de 30s pour la simulation
FS1
Récolter les données des fours
– récolter les données de température et d’humidité avec les Raspberry PI
données récoltées toutes les 15 minutes
/
fréquence d’acquisition de 30s pour la simulation
FS2
Détecter un dysfonctionnement
– etre capable de détecter un écart de température trop grand
– réguler la température
15minutes
/
régulation de la température uniquement dans la simulation
FS3
Être alimenté en énergie
– branchement secteur
/
/
/
FS4
Résister aux agressions du milieu ambiant
– résister à une haute température
– résister à l’humidité ambiante
90°C
+ ou- 5°C
/
FS5
Communiquer entre les Raspberry PI et le serveur
– communiquer entre la raspberry et le serveur internet
– communiquer entre les deux raspberry PI
/
/
/
FS6
Respecter le budget du client
-Coût final accessible
500€
+ ou – 100€
/
Gestion et réalisation du projet
1. Simulation des capteurs
A) Générateur de fonctions arbitraires
(Tissot)
a) Analyse du système des valeurs recherchés
On sait que les différents four à tabac possède déjà leurs propres capteurs de températures,n’ayant pas la références de ces capteur, on choisit comme référence un capteur qui correspond le plus nos besoins.
Ici on choisit donc comme référence un thermomètre à sortie analogique “THERMOSA”, avec les caractéristiques suivantes:
Gamme de température : -20 à +120 °C
Sortie analogique : Tension proportionnelle à la température -2,5 V (-20 °C) à +2,5 V (+120 °C)
On a donc 140°C sur une tension d’amplitude 5V, 1°C correspond à 0.035V.
Pour des raison pratique lié à la simulation, on affirme que 0°C correspond à une tension 0V.
On a pour but de créer une fonction capable de reproduire le cycle du séchage du tabac (voir courbe si-dessous).
La fonction devra donc obligatoirement passer par tous ces points.
On va donc avoir:
1°C correspond à 0.035V
20s dans la simulation correspond à 1h
On établit donc les points principaux de la fonction:
température (c°)
temps simulation (s)
tension de sortie (V)
32
0
1,12
40
160
1,4
40
960
1,4
57
1300
1,995
57
2400
1,995
73
2720
2,555
73
3110
2,555
40
3120
1,4
40
3280
1,4
b) Création de la fonction arbitraire
Afin de créer cette fonction, on a besoin de générer un fichier de points (CSV File). Pour le générer il existe de nombreuses solutions, ici nous allons utiliser le logiciel gratuit EasyWawe.
Pour cela, après avoir installé ce logiciel, exécutez le.
Une fenêtre va s’ouvrir, cliquez sur “File” puis “New”.
La fenêtre “Property setting” s’ouvre, dans la case “Sample” vous pouvez sélectionner le maximum de points pour avoir la meilleur précision.
Sélectionnez ensuite une période de 3280s, puis cliquez sur “Ok”.
La fenêtre “Wawe1” s’ouvre, cliquez sur “Draw” puis “Coordinate Draw”.
Indiquez le nombres de points nécessaire, ici “9”, et sélectionnez ensuite “Table”.
Rentrez ensuite les coordonnées des différents points. (ATTENTION Xpos est en kiloseconde et non en seconde).
temps simulation (s)
tension de sortie (V)
0
1,12
160
1,4
960
1,4
1300
1,995
2400
1,995
2720
2,555
3110
2,555
3120
1,4
3280
1,4
Une fois tous les points entrés cliquez sur “Ok” et votre fonctions va être générer.
Il ne vous reste plus qu’à enregistrer en “.csv”, et vous avez votre fichier de points.
c) Le générateur
Concernant le générateur, nous utilisons le générateur de fonctions arbitraire hameg hmf2525. Celui-ci est très pratique car il permet d’obtenir des période très longue et possède un port USB. On va donc utiliser ce port afin d’y transférer le fichier CSV précédemment créé (munissez vous de la notice de générateur si vous ne connaissez pas son fonctionnement).
Chargez le fichier
Réglez ensuite la période à 3280s, l’amplitude à 2.555V et l’offset à 1.25V afin que la tension de sortie corresponde à la tension souhaiter précédemment.
Il ne faut pas hésiter à utiliser un oscilloscope pour mieux visualiser la courbe.
B) Convertisseur Analogique Numérique
(Tissot)
Le CAN (Convertisseur Analogique Numérique) va nous servir à convertire la tension analogique du générateur, afin de pouvoir l’analyser sur le Raspberry PI. Le CAN possède deux entrées, on va donc y rajouter un potentiomètre pour simuler un second four.
Nous utilisons le CAN MCP 3002:
a)Branchement
A l’aide d’une Breadboard, on va connecter la sortie du générateur et le potentiomètre au CAN, et le CAN au Raspberry PI comme ci dessous:
b) Configuration
Il faut configurer votre Raspberry PI pour utiliser le CAN.
Il faut tout d’abord vérifier que le SPI est activer.
Ouvrez un terminal et lancez la commande suivante :
sudo raspi-config
Sélectionnez « Advanced Options » puis validez :
Puis sélectionnez « SPI » puis validez :
Une fois cela fait, exécuter les commande suivante dans le terminal:
sudo apt-get install python2.7-dev
sudo apt-get install python3-dev
sudo apt-get libevent-dev
sudo pip install spidev
c) Code
#!/usr/bin/python
import time
import spidev
DEBUG = 0
spi = spidev.SpiDev()
spi.open(0,0)
# read SPI data from MCP3002 chip
defget_adc(channel):
# Only 2 channels 0 and 1 else return -1
if ((channel > 1) or (channel < 0)):
return -1
r = spi.xfer2([1,(2+channel)<<6,0])
ret = ((r[1]&31) << 6) + (r[2] >> 2)
return ret
while 1:
print (get_adc(1))
Tension = (get_adc(1)*2.7)/1024
print (Tension)
time.sleep(5)
Dans ce code on va créer une fonction “get_adc(channel)” qui va nous permettre de sélectionner l’entré du CAN et d’y lire la valeur. Si “channel” est différent de 0 ou 1 on retourne -1.
La valeur reçu est entre 0 et 1023, on procède alors à un calcul pour que cette valeur corresponde à une tension.
C) Avertissement visuel
(Tissot/Braun)
Le but est d’avertir visuellement l’utilisateur à l’aide d’un afficheur 7 segments.Il va alors pouvoir savoir sur quel four une alarme s’est déclenchée, cela peut être dû à un écart de température ou un problème matériel.
a) Branchement
Pour procéder correctement au branchement il nous faut un afficheur 7 segment et 7 résistances de 240 . Un segment va alors correspondre à un pin du Raspberry PI, il suffit de suivre le schéma ci-dessous
Pour ma part, j’ai connecter:
le segment A au PIN11
le segment B au PIN12
le segment C au PIN13
le segment D au PIN22
le segment E au PIN18
le segment F au PIN16
le segment G au PIN15
b) code
#librairies à importer
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)# On supprime les avertissements inutiles
seg={« A » : 11, « B » : 12, « C » : 13, « D » : 22, « E » : 18, « F » : 16, « G » : 15} #on indique quel segment est sur quel PIN
#fonction d’affichage
def display(x) :
GPIO.output(seg[‘A’], x in [1,4])
GPIO.output(seg[‘B’], x in [5,6])
GPIO.output(seg[‘C’], x in [2])
GPIO.output(seg[‘D’], x in [1,4,7])
GPIO.output(seg[‘E’], x in [1,3,4,5,7,9])
GPIO.output(seg[‘F’], x in [1,2,3,7])
GPIO.output(seg[‘G’], x in [0,1,7])
La fonction display va permettre de choisir quelle pin il faut allumer en fonction du nombre x. L’afficheur 7 segment étant en logique inverse on indique les nombres pour lesquels chaque segment ne doit pas s’allumer.
On intègrera donc la fonction display dans le code final.
2. Programmation du Raspberry PI
(Braun)
A) Récupération des données
import cantest2#cantest2 est le programme du Convertisseur Analogique-Numérique.
Il me permet de récupérer les données à l’aide d’une fonction
Cette fonction va récupérer la température du four (Tfour), d’un four précis choisi (Nfour), il converti également la tension que le programme cantest2 me donne en une température lisible.
B) Communiquer entre les RaspberryPI
La communication entre les Raspberry Pi est gérée par un serveur MySQL, celui-ci sera gérer sur le Raspberry maître et l’esclave lui enverra ses données. Il faut d’abord initialiser la connexion avec MySQL :
os.system ("sudo service mysql restart")
mydb = mysql.connector.connect( host = '192.168.xxx.xxx',
user = 'FAT',
passwd = '****',
database = 'FAT')
Cette fonctionnalité est faite par une fonction qui enverra chaque valeur au serveur qu’il pourra par la suite gérer
C) Analyse et utilisation des données
L’analyse des données de se fait four par four, chaque seconde.
La première étape dans l’analyse d’un four est l’initialisation de celui-ci. Pour cela, on considère que le four s’allume quand on détecte une température entre 31 et 33 °C.
def InitialisationFour(Nfour) : if (Tfour[Nfour]>=31) and (cycle_start[Nfour]==0) and (Tfour[Nfour]<=33) : temps_depart[Nfour] = time.time() cycle_start[Nfour] = 1
A partir de ce moment, on active un timer (temps_depart) pour savoir depuis quand ce four est allumé.
Une fois le four allumé, il faut calculer la température attendue : le tabac doit sécher pendant une semaine à des paliers de température différents.
def CourbeAttendu(Nfour) :
if (time.time()-temps_depart[Nfour]<=16) : Tatt[Nfour]=32+(time.time()-temps_depart[Nfour])*0.5
if (time.time()-temps_depart[Nfour]>16) and (time.time()-temps_depart[Nfour]<=96) : #palier 40 Tatt[Nfour]=40
if (time.time()-temps_depart[Nfour]>96) and (time.time()-temps_depart[Nfour]<=130) : #montée 40-57 Tatt[Nfour]=40+(time.time()-temps_depart[Nfour]-96)*0.5
if (time.time()-temps_depart[Nfour]>130) and (time.time()-temps_depart[Nfour]<=240) : #palier 57 Tatt[Nfour]=57
if (time.time()-temps_depart[Nfour]>240) and (time.time()-temps_depart[Nfour]<=272) : #montée 57-73 Tatt[Nfour]=57+(time.time()-temps_depart[Nfour]-240)*0.5
if (time.time()-temps_depart[Nfour]>272) and (time.time()-temps_depart[Nfour]<=312) : #palier 73 Tatt[Nfour]=73
if (time.time()-temps_depart[Nfour]>312) and (time.time()-temps_depart[Nfour]<=328) : #palier 40 Tatt[Nfour]=40
if (time.time()-temps_depart[Nfour]>328) : Tatt[Nfour]=0 cycle_start[Nfour]=0 temps_depart[Nfour]=0
On peut voir ici que l’on a des conditions pour savoir à quel palier le four devrait se trouver.
Suivant ce palier, on définit un Tatt qui est la température théorique que le four devrait avoir à cet instant précis. Puis à la fin, quand le four a fini son cycle, on remet l’état du four (Cycle_start) à 0 pour qu’il soit considéré comme éteint et on reset son timer.
def Alarme(Nfour) :
if (abs(Tatt[Nfour]-Tfour[Nfour])<3) : temps_ecart[Nfour] = time.time()-temps_depart[Nfour] alarme_ecart[Nfour] = 0 display(10) if ((time.time()-temps_depart[Nfour])-temps_ecart[Nfour]>5) : #print(« ecart de temperature de plus de 5s »); alarme_ecart[Nfour] = 1 display(Nfour)
A coté de cela, il y a une fonction alarme qui compare l’écart entre la température théorique (Tatt) et la température actuelle du four (Tfour) et actionne une alarme si cet écart dure dans le temps (5 secondes).
D) Envoie des données au serveurs
Une fois l’analyse des données terminée, il faut envoyer celles-ci au serveur.
Cette fonction s’occupe d’envoyer chaque donnée de chaque four au serveur et cela chaque seconde.
3. Stockage et Interprétation des Données
A) Récolte et Stockage
(Beaupere)
a) Étude de marché
Avant de commencer à coder, nous avons effectué une étude de marché pour connaitre la solution technique la plus fiable, simple et peu coûteuse sur le long-terme afin de ne pas compliquer la tâche de l’utilisateur avec des maintenances ou des actions pénibles ou excessives hors de son domaine de confort.
Première idée : Tirer des câbles entre les capteurs et le serveur
Les câbles résistants à une utilisation extérieure sont chers et devraient être remplacés ou réparés au minimum annuellement si ce n’est plus. Un seul défaut dans le câble et toutes les données reçues jusqu’à la réparation seront inutilisables.
Deuxième idée : Connecter les capteurs à un micro-ordinateur possédant une liaison GSM
Il existe des services tout prêt permettant ce genre de prouesse mais malheureusement ces services sont dimensionnés pour des cas ayant plusieurs machines à superviser (comme une industrie) et serait donc un coût beaucoup trop élevé pour notre cas particulier.
Troisième idée : Étendre le réseau Wi-Fi jusqu’aux fours à tabac grâce à des répéteurs
Contrairement aux 2 autres solutions celle-ci n’implique qu’une simple vérification logicielle et physique des relais afin de s’assurer de leur bon fonctionnement, et dans le cas échéant le remplacement du matériel. Les facteurs d’erreurs potentielles seront les intempéries puissantes.
La solution finale a donc été le choix de la troisième idée : Étendre le réseau Wi-Fi et donc connecter 2 Raspberry Pi entre elles via le SGBD (Système de Gestion de Base de Données) MySQL.
b) Architecture
Pour plus de clarté voici un schéma des différentes connexions :
Les 2 RaspBerry Pi sont reliées entre elles via le Wi-fi. L’un occupe la fonction de serveur MySQL et donc stockera les données ainsi que le site Web et l’autre sera la client MySQL.
Le tabaculteur accède aux données depuis son ordinateur (ou son smartphone) seulement si il est connecté en Wi-Fi.
Et voici également un schéma du trafic de données :
Chaque RaspBerry Pi possède un identifiant pour se connecter à la base de données, ainsi que le Site Web qui utilise un autre identifiant afin d’éviter des modifications non voulues.
Toutes les secondes, les données sont transmises à la base de données, 1 table pour chaque four. Une fois en situation réel, on pourra espacer la transmission des données (jusqu’à 15 minutes) vu que le processus complet dure une semaine et qu’une erreur de température n’est fatale qu’après 1 ou 2 heures.
B) Accès à Distance et Interprétation
(Beaupere)
Sur le RaspBerry Pi Serveur, nous avons codé une page a l’aide des langages de programmation Html5, CSS et PHP. Il a été pensé comme une application Web pour simplifier sa compréhension et son utilisation par le tabaculteur. Le résultat est le suivant :
Page d’accueil pour accéder aux dernières mise à jour des fours, ainsi qu’une ‘‘Led’’ de couleur verte ou rouge pour les alarmes de température ou de défaut matériel.
Page détaillé d’un four pour suivre l’avancement sur le cycle hebdomadaire. En bleu, le cycle idéal et en noir, qui apparaîtra au fur et à mesure du cycle, nous verrons le cycle actuel.
Vidéo de présentation
Remerciements
Merci à nos professeurs référents M. BAZEILLE et M. VERRIER et l’IUT.Lab pour le matériel.
Lors de notre deuxième année de DUT GEII, nous avons proposé nous-même un projet à nos professeurs. C’est ainsi que nous avons choisi de travailler sur la conception et la création d’une table interactive. Il s’agit d’une table dotée d’un écran tactile et qui peut être utilisée de différentes situations, comme lors de réunions ou simplement pour se divertir, dessiner ou jouer.
Nous tenons à remercier Messieurs Verrier et Bazeille, nos professeurs, qui nous ont encadré lors de ce projet et sans qui il n’aurait pas été possible.
1. Phase d’étude
1. Présentation du projet
Notre table tactile est basée sur une technologie nommée “FTIR” (Frustrated Internal Reflection). Pour mettre en place un tel écran, il faut d’abord une plaque translucide entourée de leds infrarouges. Cette plaque servira de support aux rayonnements infrarouges des leds qui se dispersent de manière uniforme dans ce support.
Lorsqu’un doigt est posé sur la surface, nous modifions le comportement de la lumière infrarouge dans la plaque. Une partie de cette lumière est alors déviée vers le sol et grâce à une caméra infrarouge, nous pouvons repérer cette modification sous la forme de “blobs”.
En traitant les images reçues de la caméra, nous pouvons déterminer à quel endroit simuler un clic de souris sur l’ordinateur.
Le choix de cette méthode dite “FTIR” est intéressant car nous pouvons utiliser un vidéoprojecteur pour afficher l’écran de l’ordinateur. En effet le vidéoprojecteur émet de la lumière visible et ne perturbe donc pas notre système infrarouge.
Cependant afin de pouvoir projeter sur l’écran (qui est entièrement transparent), il faut rajouter une surface de couplage légèrement opaque. Cette surface de projection, comme visible sur le schéma, permet aussi d’améliorer la réflection de la lumière infrarouge lorsque nous touchons l’écran.
2. Matériel en possession
Pour réaliser notre projet l’IUT nous a prêté un vidéo projecteur et un Raspberry Pi 3 pour réaliser le traitement d’image et la programmation de la détection de blob et le tracking.
3. Répartition des tâches
Nous nous sommes réparti les tâches afin que tout le monde puisse contribuer au projet. Nous avons tous réalisé de la surface de couplage. M. Merimeche a fait la conception et la réalisation de la table, il a fait la recherche des caméras que nous pouvons modifier afin de lui enlever son filtre infrarouge. M. Vessot s’est occupé de la recherche des composants pour l’écran, a réalisé le schéma électrique et le soudage des LED. M. Giudilli s’est occupé surtout de la programmation et du polissage du polycarbonate du prototype. M. Binder s’est occupé de l’organisation du projet et du polissage du polycarbonate de la table. Quand une personne avait fini sa tâche, il en aidait une autre afin d’aller plus vite.
4. Recherche de matériel
Il nous a fallu rechercher un écran transparent, nous pensions à une plaque de plastique. Après de nombreuses recherches, nous avons opté pour un écran en polycarbonate.
Nous avons dû ensuite chercher une webcam sur laquelle le filtre infrarouge est facile à enlever, nous avons retenu quelques modèles :
Sony Playstation Eye Camera
Philips SPC900NC
Logitech QuickCam Express
Microsoft LifeCam VX-1000
Nous avons finalement choisi la Sony Playstation Eye Camera car elle était plus facile à obtenir et dans un délai rapide. Cependant après certains tests, nous avons tout de même changer l’objectif de cette caméra pour mieux détecter les infrarouges et supprimer le visible.
5. Conception du prototype
Il nous a fallu d’abord concevoir un prototype avant de commencer la table tactile. Ce prototype a d’abord été modélisé en 3D sur le logiciel Fusion 360. De dimension raisonnable (40*20*20 cm), il permettait d’être transporté facilement et de simuler correctement le comportement d’une table tactile grandeur nature.
Le prototype modélisé sur Fusion360
La fente supérieure permet d’accueillir une plaque de polycarbonate de 10x20cm avec sa surface de couplage ainsi que les leds infrarouges qui l’entourent. Ce prototype intègre une partie amovible à l’avant (en rouge) pour faciliter l’installation de la caméra sous l’écran.
Nous avons choisi de maintenir les leds autours de l’écran en utilisant des profilés en aluminium
6. Conception de la table
Après des essais concluant sur le prototype, nous avons modélisé notre table tactile en 3D. Ce modèle nous a permis de quantifier le matériel nécessaire (bois et visserie). Nous nous sommes inspirés de différents modèles de tables et d’établis pour concevoir une table solide et non bancale.
2. Phase prototypage
1. Réalisation du prototype
Le prototype a été réalisé à la découpe laser selon le modèle vu précédemment. Voici son apparence une fois les différentes pièces montées.
2. Polissage du polycarbonate
La lumière ne passait pas bien dans la plaque de polycarbonate. De ce fait, nous avons dû la polir à l’aide du papier à poncer, du fil de fer et une dremel.
3. Connection des LEDs avec des fils
Nous avons choisi d’utiliser une alimentation d’ordinateur pour alimenter nos leds. Cette alimentation à une tension de 3.3 V à ses bornes et est capable de délivrer jusqu’à 33A. Ainsi, nous avons dimensionné nos résistances sur 18 Ω pour que nos leds puissent bénéficier d’un courant optimal. Toutes les leds étaient placées en parallèle.
Voici le schéma électrique :
Dans un premier temps, nous avons voulu connecter les LEDs avec des fils sur le prototype, cependant il s’est avéré que cette connection n’était pas adaptée pour ce prototype.
Ils y auraient eu trop de fils, l’isolation aurait été très compliqué à réaliser sur l’ensemble du prototype qui comportait déjà 15 LEDs. Nous avion donc un problème au niveau de l’espace que nous avions pour les fils et aussi de l’isolation du système. Nous avons donc cherché une autre méthode qui résolvait ces deux problèmes.
4. Connection des LEDs avec des PCB
Afin de pallier aux problèmes de dimension et d’isolation du schéma électronique, nous avons opté pour une méthode de connections avec PCB. Cette méthode nous permet en effet de gagner beaucoup de place dans le prototype car la soudure des LEDs est faite sur le PCB à des petits fils. Cela a donc permis un gain de place important, pour résoudre le problème de l’isolation, le PCB en lui-même était déjà bien adapté pour isoler le système électronique, mais nous avon rajouté par-dessus de la colle qui permettait d’isoler les parties un peu plus vulnérable que le PCB ne pouvait pas protéger.
Nous avons donc vu que ce système est très pratique pour un schéma électronique de petite taille et avec un courant peu élevé (jusqu’à 1,5A). Cependant pour un schéma électronique plus grand, le choix des PCB aurait été trop coûteux, nous avons donc dû chercher une autre méthode pour la table.
5. Fabrication de la surface de couplage
La surface de couplage à deux fonctions : elle sert à afficher l’écran via le vidéoprojecteur et à mieux détecter les doigts. Elle a été créée à partir d’une feuille de papier calque (ayant les mêmes dimensions que la plaque de polycarbonate) qui a été enduit d’un mélange de silicone et de diluant.
6. Assemblage
Nous avons installé les différentes composantes du prototype vues dans les parties précédentes sur la maquette.
3. Phase réalisation
1. Réalisation de la table
Une fois la commande de bois reçue, nous avons découpé les planches et les chevrons en se basant sur la modélisation 3D pour les dimensions. Nous les avons ensuite assemblés.
Une fois la table montée nous avons installé la plaque de polycarbonate par-dessus. Ensuite, nous avons rajouté autour de l’écran les profilés U avec les leds et la surface de couplage a été posée par-dessus.
2. Soudure des LEDs
La solution que nous avons choisie pour connecter les leds entre elles sur la table est de modéliser nos propres PCB en bois et de les fabriquer avec la découpe laser.
PCB en bois modélisé en 3D
Soudure des leds
3. Programmation
Traitement flux d’entrée : Pour repérer uniquement les changements effectué sur l’image d’entrée nous soustrayons l’image acquise par une première image prise lorsqu’il n’y a aucun doigt de posé. Ensuite nous appliquons différents filtres pour supprimer le bruit de fond dû à la caméra.
Détection des blobs : Comme nous l’avons vu précédemment, notre système infrarouge permet de repérer les doigts posés sur l’écran sous la forme de “blobs”.
Tracking : La détection de blob nous permet d’avoir un tableau de coordonnées représentant les différentes positions de chaque blob. Pour identifier ces derniers et les différencier un algorithme de proche en proche programmé par nos soins est utilisé ainsi chaque blob se voit donner un ID unique nous permettant de le différencier.
Calibrage : La webcam étant en train de filmer avec un grand angle, il fallait donc lui donner à travers le programme les dimensions de l’écran. Aussi, cette caméra n’étant pas totalement droite par rapport à l’écran, l’image reçue n’était pas 100% rectangulaire. Pour cela notre programme intègre une partie de calibrage. Il faut lui donner 4 positions sous la forme de blobs (en posant nos doigts) aux 4 coins de l’écran. Ainsi le programme en traitant ces données récupère les dimensions de l’écran et est capable de le redresser sous la forme d’un rectangle.
Interface et application : Les différentes parties du programme ont été regroupées sous une même interface.
4. Jeux
Nous avons aussi programmé quelques applications qui ont été optimisées pour la table. Elles ont été programmées en C++ et à l’aide de la librairie SFML.
“Paint” : Notre Paint reprend les bases du Paint sur ordinateur et on peut être plusieurs à l’utiliser en même temps.
“Hanoï” : Notre jeu des tours de Hanoï reprend les règles classiques du jeu pour 3 disques, il faudra donc utiliser le tactile afin de les déplacer.
“Pong” : Ce jeu n’a pas encore été implémenté sur la table et nécessite 2 joueurs. Son amélioration et installation pourrait faire l’objet d’un projet futur.
5. Démonstration
6.Améliorations possibles
Des améliorations peuvent encore être réalisées sur notre table tactile. En voici certaines :
Adapter les jeux Hanoï et Pong sur la table
Soigner son esthétique (ponçage, peinture ..)
Investir dans une caméra de meilleure qualité (avec un plus grand nombre d’image par seconde notamment)
Porter les programmes sur un ordinateur plus puissant et l’intégrer dans la table
Le but de ce projet est de créer un programme permettant à une personne d’affronter soit une personne soit une intelligence artificielle via un écran connecté à une Raspberry Pi. L’intelligence artificielle aura plusieurs niveaux de difficultés. Par la suite, il a été convenu de faire en sorte que la partie se joue sur un vrai puissance 4, avec un bras robotisé qui effectue les mouvements pour le joueur et l’intelligence artificielle.
Le programme devra s’exécuter sur une Raspberry Pi, c’est pourquoi notre code sera en Python. L’interface devra être également tactile, ce qui nous amène à prendre du matériel spécifique.
Matériel et logiciel
Pour le matériel, il faudra:
une Raspberry Pi 3
un écran tactile LCD 7″ Raspberry Pi Officiel
un bras robotisé Staübli TX40 avec une pince
On utilisera également comme logiciel:
Python IDLE
Staübli Robotics Suite
Bête à cornes
Au niveau de la bête à cornes, on aura quelque chose de plutôt simple:
Traduction: Grâce au programme “Puissance 4”, on rend service au joueur en le divertissant.
Diagramme Pieuvre
Pour le diagramme pieuvre, on a deux fonctions principales et six fonctions contraintes:
Fonctions principales:
FP1: L’information venant du programme puissance 4 devra être accessible à l’utilisateur
FP2: L’information devra être livrée de façon ergonomique afin d’être comprise
Fonctions contraintes:
FC1: Le projet puissance 4 devra être utilisable par un utilisateur quelconque
FC2: Le projet devra fournir des informations de jeu
FC3: Le projet devra être ergonomique lors de son utilisation
FC4: Le projet sera exécuté sur une Raspberry Pi en continu
FC5: Le projet doit être adapté à son environnement, c’est-à-dire en dans une pièce
FC6: Le projet ne devra pas excéder un certain coût
Solutions face aux contraintes:
FC1: L’utilisateur pourra exécuter et utiliser le programme via l’écran
FC2: Les informations seront affichées sur l’écran via des images (jeu sur écran) ou via du texte (jeu avec le robot)
FC3: Le joueur pourra sélectionner avec l’écran tactile la colonne de son choix
FC4: La Raspberry Pi sera alimenté sur secteur
FC5: Aucune protection à l’environnement n’est nécessaire du fait que le projet est utilisé en intérieur
FC6: Le matériel étant déjà disponible, le coût du projet est nul
II. Programmation P4
Format du code
Nous avons choisi d’utiliser majoritairement de l’anglais afin d’éviter les accents qui ne font pas partie des caractères utilisables dans les noms de fonction.
Pour les noms de fonction nous avons utilisé le préfixe “is” ou “has” pour les fonctions retournant une valeur booléenne. Puis nous avons utilisé “get” et “set” pour les fonctions retournant ou modifiant l’état d’une variable.
exemples:
De plus nous avons essayé de respecter autant que possible la règle disant qu’une fonction ne doit pas effectuer plus d’une seule tâche afin de rendre le code plus simple à utiliser et débugger.
Finalement nous avons décidé d’utiliser uniquement Python 3 car elle était déjà présente sur la Raspberry Pi et que les différentes versions de python n’ont pas toujours le même comportement.
C’est pour cela que les programmes ne fonctionnent pas sur les PC de l’IUT qui eux sont sous Python 2.7 !
Création de la logique et structure du jeu
Dans un premier temps nous avons créé la classe au cœur de notre programme : “Tableau”
Cette dernière nous permet de stocker l’état du jeu, de lui apporter des modifications simples ainsi que de vérifier divers éléments sur l’avancement de la partie.
Elle se présente de la façon suivante:
L’état du jeu est stocké dans un tableau en 2 dimensions de 7 colonnes et 6 lignes, chaque case de ce tableau représente une case du puissance 4 réel.
Une case vide prend la valeur de 0, une case avec un pièce du joueur 1 prend la valeur 1 et finalement une case avec une pièce du joueur 2 prend la valeur -1.
Descriptif des fonctions
_init_()
Constructeur de l’objet, elle permet d’initialiser les valeurs du tableau.
getTableau()
Renvoi le tableau de valeurs du jeu.
display()
Permet d’afficher le tableau de jeu de façon ergonomique dans la console python en ajoutant le numéro des colonnes et en remplaçant les valeurs par des symboles.
getSlot()
isSlotPlayable()
Permet de savoir si la case est jouable.
getRowSlot()
Cette fonction permet d’identifier la position “y” de la case jouable dans la colonne “x”.
Si cette colonne est pleine la fonction renvoie “-1”.
setPiece()
isFull()
Cette fonction permet de savoir si il ne reste plus aucune case de libre dans la grille du puissance 4.
hasPlayerWon()
Cette fonction nous permet de vérifier si un des joueurs a gagné la partie en alignant 4 pièces de sa couleur. Elle nous renvoie la position x, y de la case et la direction de cette ligne dans un tableau. Si le joueur n’as pas fait de ligne de 4 pièces la fonction renvoie “false” (0).
Mode PvP
Tout d’abord, il faut savoir que chaque niveau est représenté par un chiffre dans le code:
Niveau 0 : mode PvP
Niveau 1 : mode IA aléatoire (baptisé “Timmy”)
Niveau 2 : mode IA logique (baptisé “Captain Obvious”)
Niveau 3 et supérieur : mode IA prédictive (baptisé “Hawking”)
Dans les variables globales, on choisira donc le niveau de l’adversaire dans la variable “level”, ici 4 soit le niveau IA prédictive.
Pour la création du mode PvP ou “level=0”, nous avons simplement fait en sorte de demander au joueur 2 quelle colonne il veut jouer comme le joueur 1. Pour cela nous avons réalisé la chose suivante:
Si c’est au tour de l’adversaire (soit turn différent de 1) et si le level = 0 (soit le mode PvP), alors on demande au joueur 2 quelle colonne il souhaite jouer ( x = askPlayer( ) ) . Dans le cas contraire soit (level différent de 0) il faudra demander à l’IA de jouer.
Création d’une IA
Une fois le système d’alternance entre joueur mis en place nous avons ajouté au code pour le deuxième joueur, la fonction askIA(). Cette fonction fait appel à différents algorithmes qui vont être chargés de retourner la colonne jouée par l’ordinateur avec une difficulté variable.
Dans un premier temps nous avons créé une “IA” retournant simplement une colonne jouable aléatoirement afin de tester le bon fonctionnement du code.
Ajout d’intelligence pour l’IA
IA logique
L’IA logique, nommée “CaptainObvious”, doit faire en sorte de bloquer le joueur, tout d’abord en lui empêchant d’aligner 4 pièces. Si le joueur ne peut pas en aligner 4, alors il lui empêchera d’en aligner 3. Si le joueur ne peut pas en aligner 3, alors “CaptainObvious” va chercher à en aligner 3. Si il ne peut pas en aligner 3, alors il va chercher à empêcher le joueur d’en aligner 2. Le code se présente de la façon suivante:
La fonction CheckFor() permet d’identifier toutes les cases vides qu’un joueur donné pourrait jouer afin de faire une ligne de n pièces de sa couleur. Elle va nous renvoyer le résultat sous forme de tableau de position.
Exemple:
Si on effectue une vérification de 4 pièces pour le joueur 1, la fonction nous renvoie “[1,0] [4,1]”, ce sont les coordonnées de tous les cases vides que le joueur pourrait utiliser pour faire une ligne de 4 pièces en un seul coup.
Afin de vérifier si le joueur peut réellement faire le coup permettant de mettre une pièce à une de ces positions, on se sert de la fonction isSlotPlayable(). En effet dans l’exemple suivant le coup en “[4,1]” n’est pas possible car la case en dessous est vide.
IA prédictive
Cette IA représente le niveau de difficulté le plus élevé de notre programme.
Elle va se baser sur la prédiction et l’analyse de tous les états futurs possibles du jeu.
Pour ce faire nous avons pris exemple sur l’algorithme surnommé “minimax“, celui-ci se base sur tous les états du dernier rang pour faire sa prédiction.
Cet algorithme se base sur le fait que le joueur lui aussi, fait à chaque fois le coup le plus avantageux pour lui. Les règles sont simples, un joueur tente d’arriver au nombre le plus faible et l’autre au nombre le plus élevé.
Il va donc partir du bas de “l’arbre” en sélectionnant à chaque fois l’option la plus avantageuse pour chaque joueur afin d’identifier le chemin que l’IA doit prendre pour avoir le plus de chances de gagner.
La clé de la réussite de cet algorithme est l’identification de la valeur de l’état actuel du jeu.
Il serait en effet simple de se contenter de vérifier si l’IA ou le joueur gagne dans une branche donnée mais la puissance de calcul de la Raspberry Pi étant limitée il nous est pas possible de calculer tous les coups possible avec beaucoup de coups d’avance.
Nous avons donc décidé de créer une fonction attribuant une valeur à un jeu. Elle va nous retourner une valeur positive si le joueur gagne et une valeur négative si l’IA gagne. Dans le cas ou aucun des deux gagne la fonction va nous retourner une valeur intermédiaire dépendant de l’avantage qu’a un joueur. En effet si le joueur possède plusieurs options pour aligner 3 pions alors que l’IA n’en a aucune la valeur du jeu va être en faveur du joueur.
Pour cela elle va s’appuyer sur la fonction countPossible() qui va retourner le nombre de coups possibles qu’un joueur va pouvoir faire pour aligner un certain nombre de pièces.
Il a fallu ensuite créer une fonction permettant de simuler tous les coups possibles et de renvoyer la valeur du coup à l’IA.
Finalement nous avons réalisé la fonction permettant de faire le choix de l’IA en fonction de toutes les possibilités qui lui sont proposées.
Elle va prendre le résultat de chaque branche pour trouver le coup avec la valeur la plus faible car c’est ce coup qui va lui donner le plus de chances de gagner.
Interface utilisateur
Pour l’interface utilisateur, nous avons utilisé PyGame qui permet de créer des interfaces via Python.
Tout d’abord on définit les dimensions de l’IHM (ici l’écran tactile), la taille d’un emplacement, le titre de la fenêtre et l’ouverture de la fenêtre:
Par la suite on charge les images et on les adapte au format que l’on souhaite:
les variables red_image et yellow_image sont utilisées uniquement pour l’interface avec le jeu sur écran.
On affiche ensuite l’écran puis le fond d’écran :
La suite du programme diffère en fonction de son utilisation avec le jeu sur écran ou avec le robot.
Interface avec jeu sur écran uniquement
On va donc d’abord afficher le puissance 4. Pour cela on écrit une fonction qui colle des cases bleues (slot_image) en 6 lignes et 7 colonnes soit 42 cases. La fonction est donc la suivante:
Il faut ensuite afficher chaque pièce jouée. Pour cela on regarde d’abord si c’est la pièce du joueur ou de l’adversaire qui doit être ajoutée ( tableau[x][y] == 1 ou tableau[x][y] == -1) et on affiche la pièce de couleur rouge ou jaune en fonction de ça:
Joueur:
Adversaire:
Au final la fonction complète sera la suivante:
Pour savoir quelle colonne le joueur souhaite utiliser, on doit recueillir l’emplacement du curseur de la souris ou du doigt avec l’écran tactile.
position[0] correspond à la position en x du curseur.
position[1] correspond à la position en y du curseur.
On cherche d’abord à voir si le curseur est posé sur une case et non en dehors du puissance 4, on va donc vérifier de la façon suivante:
Si la position en x est inférieure à la position en x de la case la plus à gauche ou supérieure à la position en x de la case la plus à droite, alors on return -1 pour signifier que le curseur est en dehors du jeu.
De même, si la position en y est inférieure à la position en y de la case la plus en bas, on return -1 pour signifier que le le curseur n’est pas dans le jeu. Nous avons décidé de ne pas faire de même si le curseur est au dessus de la case la plus haute pour que le joueur puisse poser sa pièce au dessus du jeu, afin de paraître plus réel.
Si le curseur est dans le jeu, alors on return la position en x du curseur.
La dernière fonction utilisée pour l’interface permet d’animer cette dernière. Lors de la pose d’une pièce, on souhaite la faire défiler du haut de l’écran jusqu’à son emplacement. Pour cela, on définit d’abord la hauteur de début (startheight = 0) et la hauteur finale qui dépendra de l’emplacement de la pièce jouée. On fait avancer la pièce et on réaffiche le fond d’écran, puis la pièce ajoutée, puis le puissance 4 et les autres pièces et on on affiche le tout.
La fonction est donc représentée de la manière suivante:
Le rendu visuel sera donc le suivant:
la zone avec le contour rouge représente la surface sur laquelle on peut cliquer pour mettre une pièce dans la colonne n°0.
Interface avec jeu via le robot
Pour l’interface avec le robot, on n’affichera pas autant d’éléments que pour une partie sur l’écran uniquement. On n’affichera qu’une ligne du puissance 4 et on n’affichera pas les pièces, étant donné que l’utilisateur les verra en vrai. On laissera donc l’utilisateur choisir uniquement la colonne de son choix.
Pour l’affichage des cases on aura donc ceci:
Étant donné qu’on n’aura qu’une ligne, la fonction qui prend la position en x du curseur change également:
Il ne reste donc plus qu’à utiliser ces fonctions dans le code principal (Main).
Voici une image montrant l’écran lorsque qu’on joue avec le robot:
Assemblage du programme (Main)
Diagramme des classes
Tout d’abord, on importe les autres fichiers:
Afin de pouvoir faire plusieurs actions en même temps, on utilise le threading.
On initialise par la suite toutes les variables vues dans les programmes précédents:
On initialise le tableau, puis on définit que le premier à jouer sera le joueur. On met le level à 4, soit l’IA prédictive et on définit que la variable qui arrête l’affichage est a False.
On affiche le jeu:
On crée une fonction qui va demander au joueur quelle colonne il souhaite jouer.
On regarde d’abord si le joueur veut quitter le jeu ou si il a cliqué pour jouer:
Si le joueur veut quitter le jeu, on renvoie x = -2.
Si le joueur a cliqué, on vérifie qu’il a cliqué dans une colonne, sinon on envoie un message à l’utilisateur:
“le nombre choisi doit être entre 0 et 6, veuillez réessayer”.
Si le joueur a cliqué dans une colonne mais qu’elle est pleine , on envoie un message à l’utilisateur:
“la colonne est pleine, veuillez en choisir une autre”.
Si le joueur a cliqué dans une colonne est qu’elle n’est pas pleine, on renvoie la valeur de x.
La fonction complète est la suivante:
On crée également une fonction qui va demander à l’IA la colonne qu’elle souhaite jouer via AITread.
C’est à ce moment qu’on va utiliser le threading. En effet, pendant que l’IA va calculer la colonne qu’elle doit jouer, on doit continuer à rafraîchir l’écran pour éviter un “freeze” de l’application.
A nouveau, si le joueur cherche à quitter le jeu, on renvoie la valeur x = -2.
Si le joueur ne souhaite pas quitter le jeu, on arrête le threading et on récupère la réponse de l’IA.
Le code de la fonction est le suivant:
La fonction IATread va donc recueillir la réponse de l’IA. En fonction du niveau de l’IA, on va demander la réponse à l’IA correspondante:
On crée la boucle de jeu. On regarde d’abord à qui est le tour. Si c’est le tour du joueur, on va utiliser la fonction askPlayer(). Si c’est le tour de l’adversaire, on regarde si l’adversaire est un autre joueur (mode PvP avec level = 0), sinon on utilise la fonction AskIA().
Si la valeur de x est de -2, on met la variable quit_game à True, la partie s’arrête.
Sinon, on utilise slotAnimation pour afficher la pièce qui rentre dans le puissance 4.
Quand l’animation est finie, on définit la place de la nouvelle pièce.
On affiche le fond d’écran, les pièces et le puissance 4. On aura donc le code suivant:
On vérifie par la suite si quelqu’un a gagné: si c’est le joueur 1 qui gagne, on lui envoie “Le joueur 1 a gagné”. Sinon, on regarde si c’est le joueur 2 qui gagne et on envoie le message “Le joueur 2 a gagné”. On fait de même avec l’IA, avec un message personnalisé en fonction du niveau de l’IA. Enfin, on arrête le programme.
Si personne ne gagne, on vérifie si le puissance 4 est plein, dans ce cas là on envoie le message “Personne ne gagne, retente ta chance” et on arrête le programme.
Sinon, on passe le tour à l’autre: turn = turn * (-1).
On a le code suivant:
On crée une autre boucle qui vérifie si le joueur souhaite quitter le jeu:
Main version robot
Dans cette version nous avons simplement repris le code déjà écrit pour le main précédent et nous y avons ajouté les éléments permettant d’interagir avec le robot.
Diagramme des classes version Robot
La classe “DisplayRobot” est une version simplifiée de la classe “Display”. en effet il n’est plus nécessaire d’afficher l’état du jeu sur l’écran vu que nous pouvons le voir en réel. Son but est simplement de proposer à l’utilisateur une grille simplifiée pour qu’il puisse choisir ou le robot doit jouer.
On ajoute aussi la nouvelle classe “SocketCom” qui permet, à l’aide de la fonction “sendSocketToRobot()”, d’envoyer les coups joués au robot, on reviendra plus en détail sur cette classe dans la troisième partie.
Il a fallu ici encore faire appel à des threads pour pouvoir envoyer les données au robot car une fois de plus le programme ne peut pas se permettre d’attendre le robot. Cette technique permet au programme de continuer à exécuter sa boucle principale tout en attendant que le robot confirme la réception des données.
On va utiliser une variable “SocketComState” afin de resynchroniser le programme une fois le message envoyé.
Voici une vidéo de présentation du projet puissance 4 avec le jeu sur écran:
III. Bras robotisé
Étant donné que nous n’avions pas utilisé tout le temps consacré au projet après avoir finalisé le programme, nous avons eu pour nouvel objectif de prendre notre programme et de faire jouer un robot sur un vrai puissance 4.
Programme embarqué sur le robot
En premier nous avons écrit le code qui va être exécuté sur le robot.
Celui-ci va stocker la position des piles de pièces ainsi que l’emplacement du plateau de puissance 4. Il va pouvoir recevoir la colonne et la couleur de la pièce jouée par le joueur ou l’IA.
Le programme est initialisé par la fonction start qui va se charger de placer le robot à sa position de départ et d’initialiser la hauteurs des piles de pièces.
C’est elle aussi qui va configurer le port du serveur Socket en “timeout” (temps d’attente) limité car on ne connaît pas le temps que va prendre le programme pour envoyer les données au robot (le joueur humain pouvant attendre des heures avant de faire un coup si il le veut). Finalement elle va appeler la fonction “p4” qui s’occupe de la réception des données et du calcul des mouvements du robot.
La fonction p4
Cette fonction contient la boucle principale du programme.
Elle va attendre les données de la Raspberry Pi avec la fonction “sioGet” qui prend comme argument le serveur Socket configuré au préalable dans les configurations du robot et une variable de sortie “nCom” qui va stocker les données reçues. La fonction “clearBuffer()” permet de supprimer les données après leur lecture afin que le serveur puisse recevoir les données du prochain coup.
Après avoir calculé les positions de déplacement du robot on va faire appel à la fonction “mouvement()” qui elle, va ajouter les vitesses et les points d’approche des mouvements du robot ainsi que la gestion de l’ouverture et de la fermeture de la pince.
On a par la suite ajouté un delay avant que le robot lâche les pièces car les pièces qui restaient légèrement collées à la pince se voient projetées en arrière.
Il ne reste donc plus qu’à transmettre les coups du programme au robot afin qu’il puisse les réaliser sur le plateau du puissance 4.
Communication
A la place d’afficher les différents coups des joueurs sur l’écran nous devons désormais envoyer ces derniers au robot. Pour cela nous avons créé une nouvelle librairie du nom de “SocketCom” (pour la communication par socket).
Dans un premier temps nous avons mis en place une convention d’envoi des données aussi utilisée lors de la réception du coté robot.
Les données sont envoyées en paquet de 3 char (nombre de 8 bits). Le premier donne la colonne jouée, le deuxième la couleur jouée et le troisième est utilisé pour envoyer des commandes au robot. Si ce dernier est à 1 par exemple, le robot va automatiquement arrêter le programme et ainsi ne pas être dangereux. Comme le robot ne contient aucune intelligence cela est le seul moyen pour lui de savoir quand la partie est terminée.
La fonction “moveRobot” se charge de la création du message à transmettre et de la boucle d’envoi du message qui s’assure que le robot a bien reçu le message avant de continuer.
La fonction chargée de l’envoi du message est “sendMoveToRobot”. Elle crée la connection avec le robot, encode le message et le transmet au robot.
CAO
(Conception Assistée par Ordinateur)
L’utilisation du bras robotisé entraîne des contraintes que nous avons dû gérer. En effet, les vibrations causées par le déplacement du bras font bouger le puissance 4, ce qui provoque une imprécision notable. Il est donc nécessaire de faire en sorte que le puissance 4 reste stable. Pour cela nous avons eu l’idée de créer un support permettant de caler le jeu sur la table, qui soit en plus installé de manière non définitive. Le support a donc été créé avec le logiciel Corel Draw et une découpeuse laser.
Le support est en bois et est muni de deux encoches pour insérer les pieds du puissance 4 ainsi que deux emplacements gravés afin de savoir ou poser précisément les piles de pièces rouges et jaunes.
Étant donné que le puissance 4 sera utilisé dans la salle où se trouve le Staübli, la table utilisée est munie d’encoches comme vous pouvez le voir ci-dessus. Nous avons donc créé une encoche dans chaque coin du support afin de le fixer à la table, comme ci-dessous:
Suite à cela, malgré le fait que le puissance 4 soit stable, nous avons remarqué que le nombre de pièces tombant en dehors du puissance 4 reste conséquent (environ 7% des pièces tombent en dehors lors d’une partie).
Après plusieurs observations, nous avons conclu que cette imprécision peut provenir de différents éléments:
Les pièces collent parfois à la pince
Le robot peut avoir une erreur de 2mm sur un mouvement
Le robot n’est pas bien calibré à la table
Une des solutions possible est d’ajouter une mousse sur la pince pour que les pièces ne collent plus. Cependant cela n’aurait pas suffit car même lorsque les pièces ne collent pas il arrive que la pièce tombe en dehors du puissance 4.
C’est pourquoi nous avons décidé de créer une goulotte afin d’agrandir la “zone de chute” de la pièce. Nous avons donc à nouveau utilisé Corel Draw afin de créer la goulotte. Cette fois-ci nous avons utilisé du plastique bleu, afin d’avoir la même couleur que le puissance 4.
La forme du puissance 4 nous a permis de réaliser une goulotte amovible. Le puissance 4 n’a donc pas été modifié directement, il peut être utilisé sans goulotte.
Après plusieurs essais avec la goulotte, nous avons observé une erreur de 0%. La solution est donc validée.
Voici une vidéo de présentation du programme en action, joué avec le Staübli:
IV. Conclusion et remerciements
Nous tenons à remercier avant tout M.VERRIER Nicolas ainsi que M.BAZEILLE Stéphane pour nous avoir aidé pendant le projet. Nous tenons également à remercier M.DE SABBATA qui nous a été d’une grande aide pour la réalisation de la CAO.
En conclusion, nous pouvons affirmer que ce projet nous a offert une expérience non négligeable dans le domaine de l’informatique, la robotique et la CAO. Ce projet nous a également appris à nous partager les tâches en fonction des nos compétences et surtout à travailler durablement en groupe. Nous sommes d’autant plus heureux de savoir que ce projet sera utilisé lors des portes ouvertes de l’IUT de Mulhouse.
Quant aux améliorations éventuelles à réaliser sur ce projet, il serait possible de rajouter un deuxième bras robotisé qui puisse jouer contre le premier. Cela servirait donc à faire une démonstration du programme devant les spectateurs. Nous avons également pensé à rajouter une caméra visant le puissance 4 afin de pouvoir faire jouer directement l’utilisateur sur le puissance 4, cependant le robot Staübli n’étant pas fait pour une utilisation ludique, la sécurité ne serait pas assurée. Pour ajouter des fonctionnalités au robots, on pourrait néanmoins faire en sorte qu’il ouvre la grille en fin de partie et qu’il empile les pièces sur deux piles. Il faudrait alors rajouter une caméra en plus.
Un CanSat (Canette-Satellite) est un dispositif autonome de faible volume (equivalent a une canette de soda de 33cl) qui réalise des missions scientifiques à très haute altitude ou en orbite. Cet appareil prend la forme d’une sonde nanosatellite cylindrique, qui est lancée par une fusée ou un ballon et qui redescend sous parachute en effectuant ses missions.
Dans notre cas nous n’allons pas lancer notre CanSat en orbite ou le larguer depuis un ballon sonde, mais nous allons le larguer depuis un parapente en vol, ceci étant plus simple à organiser.
Contraintes :
Raspberry PI3
Module émetteur/récepteur XBee
Volume max : 1L
Objectifs
Crée un CanSat équipé de :
Raspberry PI3
Capteur ultra sons (approche)
Caméra
Capteur de températures, de vitesse, d’humidité et de pression
Module émetteur/récepteur Xbee
Système autonome (via pile/batterie)
Test en condition réelle
Volume minimum
Diagramme pieuvre
Planification
Perspective
Crée un CanSat équipé de :
Raspberry PI3
Capteur ultra sons (approche)
Caméra
Capteur de températures, de vitesse, d’humidité et de pression
Module émetteur/récepteur Xbee
Système autonome (via pile)
Test en condition réelle
Réalisations
Recherche sur les CanSat
Apprentissage Raspberry PI/python
Test des capteurs (ultra sons, caméra, Sense Hat …)
Transmission des données avec les modules XBee
Construction 3D CanSat
Programmation du capteur ultrason
Le module Sense Hat
Capteur de température
Capteur de pression
Capteur d’humidité
Matrice LED
Gyroscope/accéléromètre
Transmission des données
Deux modules XBee émetteur/récepteur
Logiciel XCTU
Capteur ultrason
Alimentation : 5Vcc
Portée: de 10cm à 4 m
Consommation :30mA
Alimentation
Power Board:
Deux Vcc de 5V
Deux Vcc de 3,3V
Deux Gnd
Entrée VIN
Conception 3D
Pour la création de la structure du CanSat nous avons utiliser Sketchup car il s’agit d’un logiciel que je connaissait déjà, et nous avons utiliser l’imprimante 3D de l’IUT LAB pour le crée
Parachute
S=(2.g.M)/(R.Cx.Vd²)
g = 9,81 m·s−2
M = 1,2 kg
R = 1,21 m
Cx = 1 : coefficient de frottement
Vd = 3m/s : Taux de chute
Points complexe et solutions
Test des capteurs
Début compliquer puis simplifier avec l’utilisation du Sense Hat
Transmission des données lors de la descente
Utilisation de Xbee complexe
Problème priorité entre les ports série GPIO et le bluetooth du Raspberry Pi
Conception 3D
Intégration du Raspberry Pi, du Sense Hat, des capteur, … dans un volume restreint
Programmation
Le code permettant de gérer la prise de mesure a été écrit en python car il s’agit d’un langage simple et très utiliser sur Raspberry Pi.
Vous pouvez trouver le code commenter ici : Code du CanSat
1) Initiation au Raspberry (interface Raspberry, python…)
2) Logiciel MOTION
3) Détection de mouvement à l’aide d’un capteur
4) Ajout d’un servomoteur
5) Transfert des images
6) Packaging
III. Conclusion
I.Contexte du projet
1. Définition du projet
Dans le cadre de nos projet de deuxième année il nous a été demandé de réaliser une vidéo surveillance a l’aide d’un raspberry pi 3, d’une caméra et d’un capteur ultrason. L’objectif primaire de ce genre de projet est non seulement de nous introduire au travail en équipe mais aussi en autonomie.
Notre projet vidéo surveillance a pour but la protection des biens et des personnes. Ce projet se base sur la détection de mouvement, lorsque le capteur ultrason détecte un obstacle (mouvement dans la pièce ) il prend une photo.
2.Cahier des charges
-Récupération des données capteurs
-Ecriture du programme
-Interface web pour la sauvegarde
3.Expression du besoin
II. Déroulement du projet
1) Initiation au raspberry (interface raspberry, python…)
Avant de commencer l’utilisation du Raspberry, il nous a fallu prendre connaissance des différentes commandes utile pour l’utilisation de ce dernier car, pour la plupart d’entre nous, nous n’avons jamais utilisé de raspberry. Une fois a l’aise avec le raspberry nous nous somme initier au langage python, car c’est essentiellement avec ce langage que nous avons travailler.
2) Logiciel MOTION
Avant de commencer a coder en utilisant le capteur, nous avons d’abord tester si la caméra du raspberry fonctionnait et réagissait bien. En recherchant sur internet nous avons trouver l’existence du logiciel « MOTION ». La fonction première de Motion est de faire de la vidéo-surveillance avec diffusion en ligne, en temps réel, via une ou plusieurs caméras ! Motion permet également de faire de la « motion capture », c’est-à-dire, que Motion est capable de comparer la dernière image prise avec la nouvelle pour faire de la détection de mouvements.
Avec Motion la caméra réagissait bien au mouvement, comme nous pouvons le voir sur l’image de droite, a chaque mouvement une photo est prise et enregistrer.
3) Détection de mouvement à l’aide d’un capteur
Lorsqu’une personne passe devant le capteur d’ultrasons, une photo est prise car il y a un changement de distance entre la distance précédente et la distance capter par le passage d’une personne.
4) Ajout d’un servomoteur
Une fois la partie détection faite, nous sommes passé à la partie servomoteur pour faire des balayages, pour avoir un champ plus grand 180°.En effet, nous avons constater des saccades, pour régler le souci, avant de d’executé le programme principale nous lancions un programme qui gênerait un tableau avec les distances capté par l’ultrasons chaque 20° jusqu’à 180°, le servomoteur balaye un champ de 180° par pas de 20 ° et le fichier stocke les distances chaque 20° pour ainsi optimiser la détection des obstacles lors des balayages pendant le programme principale. En effet, le programme principale comparait la valeur de la distance prise par celle du capteur et celle stocké dans le tableau, si la distance était différente à plus de 5% elle prenait des photos.
5) Transfert des images
Une fois la photo prise par détection de l’ultrasons , la photo était transféré sur un serveur web par FTP puis afficher sur un site web.
6) Packaging
Nous avons modéliser en 3D une boite pour le Raspberry Pi, le capteur d’ultrasons et le servomoteur pour avoir une meilleure ergonomie.
III. Conclusion
Pour conclure, ce projet nous a beaucoup apporté, tant niveau théorique,pratique et tant au niveau sociable. Au début de ce projet nous avions aucune connaissance sur le raspberry, grâce à ce projet nous avons pu acquérir toutes les connaissances en Linux nécessaires pour utiliser son interface. Durant ce projet nous avons aussi apprit à coder en python et transféré des fichiers en FTP.
Finalement notre projet a parfaitement fonctionner, ceci grâce au réelle investissement de toute l’équipe et aussi grâce au professeurs qui étaient la pour répondre a toutes nos questions.
» On ne devient pas champion dans un gymnase. On devient champion grâce à ce qu’on ressent; un désir, un rêve, une vision. On doit avoir du talent et de la technique. Mais le talent doit être plus fort que la technique. «
Mohammed Ali
REMERCIEMENTS
Nous tenons a remercier nos professeurs tuteurs sans qui ce projet n’aurait certainement pas aboutis. Nous remercions également Mr De Sabbata qui a été présent à chaque étapes du projets ainsi que nos camarades qui ont fait preuve d’une bienveillance exceptionnelle lors de la conception et des tests.
Cet article fait office de rapport dans le cadre du cours Etudes et réalisation. Il s’agit de l’étape final de notre projet qu’est, vous l’aurez compris, le lanceur de volant. Ce projet à été choisie par nous même et réalisé sous la tutelle de nos professeurs référents que sont Mr Bazeille et Mr Verrier. Dans la suite de ce développement, nous allons essayer de vous expliquer et illustrer les étapes intrinsèques à notre réalisation, puis nous allons conclure sur une petite démonstration.
Objectif: Réaliser un lanceur de volant pour badminton
Membres de l’équipe: Alexandre DARTOIS, Adin BADIENZI et Marvin DARBOUX
Sommaire
I) Contextualisation
1) Présentation du projet
2) Gantt
II) Conception
1) Construction mécanique
2) Conception électrique
III) Programmation
IV) Conclusion
I) Contextualisation
Tout d’abord comme son nom l’indique notre projet sera un robot qui va lancer des volants à différentes positions du terrain. Il devra idéalement pouvoir faire des routines permettant l’entrainement du joueur. Notre projet n’a pas vraiment de cahier des charge unique car il évolue au fur est à mesure des besoins liées aux contraintes de jeux.
1) Présentation du projet
Avant de se lancer dans la conception d’un objet tels que celui ci , quelques prérequis sont importants. Par exemple la vitesse d’un lancer de volant qui peut atteindre les 450 km/h ou encore la taille du terrain étant de 13,40 m sur 5,20 m pour la réalisation des routines. De ce fait il nous est très vite venu l’idée de se servir de deux disques tournant en sens inverse de façons a pouvoir propulser un volant vers un endroit prédéfinis. On s’est aussi inspiré des modèles existants tels que :
– Le BLK
– Le Aliobot Supra
On peut voir que ces 2 lanceur sont vraiment riches en choix d’exercices et de fonctionnement car il peuvent faire énormément de routines ainsi que des routine spéciales crées par le joueur lui même en réglant la vitesse des volant. Mais le plus intéressant est que le BLK peut se connecter via le Bluetooth à un portable et a son application propre pour faire différente routines.
De ce fait, l’idée du support viens très rapidement afin de stabiliser le tout et permettre éventuellement de réaliser manuellement les routines. Pour que ce système soit un peu plus optimale voila les premiers objectifs que nous nous sommes fixés :
Le capteur devait servir à l’incrémentation des volants. Il permettait au lanceur de savoir si le volant est effectivement parti ou non. Si oui il devra permettre au lanceur de repositionner un autre volant de façon autonome et aussi de connaitre le nombre de volant que compose sa série. Pour ce faire il fallait bien évidement un support pour les volants et un système permettant de bloquer les volants le temps que le capteur perçoive un volant.
Afin de réaliser ce tour de force on a eu comme matériel droit à :
– Un RasPi 3 Model B
– Des kits de construction mechano ( gentillement fournis par l’iut lab)
– La possibilité de commander des composants sous peine d’accord de nos tuteurs
2) GANTT
Avant de pouvoir passer à la partie physique de notre projet on a du commencer par une approche plutôt papier sur l’étude de notre système: la répartition des tache, comment aboutir au résultat escompté, etc . Donc pour ce faire on a commencé par faire différentes analyses avec différents logiciel permettant la facilité pour l’avancement de notre projet et des taches a réaliser.
Première analyse fonctionnelle dit « la Bête a corne » :
Cette première analyse nous a permis d’exprimer le besoin primaire, donc son exigence principal sous forme très simplifiée.
Seconde analyse :
Maintenant qu’on a exprimé la fonction principal de notre lanceur on peut passer à une autre analyse qui est le « le MindMap », cette analyse est le fait de représenter les grande idée et partie qui vont constituer un même sujet qui pour nous est notre lanceur de volant:
Dernière analyse :
Maintenant grâce a notre MindMap on peut faire notre Gantt qui est le fait de planifier toutes les idées trouvé lors de l’analyse précédente en fonction de la durée de notre projet ainsi que d’autres contraintes.
Grace a notre planification on peut voir les durée « prévisionnelle » et surtout la date de début et de fin du projet et de chaque sous partie.Notre projet commença le 30 novembre 2017 et la dernière consacré a celui-ci était le 22 janvier 2018.
II) Conception
Maintenant que toute l’étude est faite on peut passer au gros du projet qu’est la partie conception d’une structure adéquate pour notre lanceur.
1) Conception mécanique
Avant de pouvoir tester des programmes on doit tout d’abord ce pencher sur une structure permettant de lancer des volants.
Schémas illustrant le mode de fonctionnement
D’où Notre choix qui c’est très vite porté sur les méchanos pour la réalisation de la structure à cause de la diversité des composants et outils que présente ces boites(Makeblock). On a commencé dans l’optique que ce que nous réaliserons avec les méchanos sera un prototype pour ensuite créer notre « vrai » réalisation. Dans un premiers temps nous nous sommes concentrés sur la structure:
Première réalisation et problèmes associés
Réalisation intermédiaire (I)
On peut voir sur cette image que notre réalisation n’est pas adéquate pour lancer des volants de part ça rigidité qui n’est pas bonne car certaines pièces sont déformé sous le poids de nos moteur et des tremblements du a la rotation des moteur. L’impacte de la mise en route des moteurs provoque un bruit assourdissant à cause de l’écart et des frottements entre les roues dentés.
Après ces premiers résultats quelques peut chaotiques, voici ce que nous avions imaginé ensuite
Résultat intermédiaire (II)
On peut voir sur cette image que le second test juste l’aspect externe montre un peu plus de rigidité mais il y a d’autre aspect technique qui on était résolu comme par exemple le niveau des roue qui était du a la mauvaise rigidité de la structure ainsi que l’espace pour le volant ou encore les vibration des moteur qui on était réduite, etc. Donc au vue des aspects résolu on remarque qu’une grande partie était du a la rigidité de la structure. Cependant les 2 plus gros problème sont toujours a résoudre : Les tremblement ainsi que le bruit assourdissant.
Le modèle illustré ci-dessus fait office de premier prototype pour notre lanceur de volant. Bien que plutôt satisfaisant pour effectuer des lancers, on a préférer le solidifier pour le prototype finale, prototype que nous illustrerons dans la partie conception électrique car cette structure comporte des composant qui seront expliqué dans cette partie.
Maintenant que nous disposons d’une structure convenable au lancé on va pouvoir y incorporé des composant qui vont permettre le confort des utilisateurs ainsi que le bon fonctionnement de notre lanceur.
2) Conception électrique
Pour commencer voici un petit schéma qui regroupe les grandes parties qui compose notre lanceur et qui seront implantés dans la structure vu dans la partie conception mécanique :
Principe de fonctionnement
Nous avons essayé par le biais du schémas ci-dessus de vous illustrer les différents composants électriques qui ont intervenus lors de la conception du lanceur.Voici une liste non exhaustive des composants que nous avions choisi:
dans le cas des moteurs on a opté pour le 42BYG Stepper
dans le cas du capteur Ultrason on a opté pour le Me Ultrasonic sensor
pour l’affichage du choix des routines on a choisi le Me TFT LCD screen
pour gérer l’ensemble des composants on a choisi le Me Orion
pour choisir son mode de jeux on a préférer le Me 4Button
Pourquoi le 42BYG stepper ?
En résumé il s’agissait tout simplement du moteur pas à pas le plus puissant disponible dans les boites Makeblock. Avec sa puissance, on pouvait se rapprocher (avec un système similaire à celui des engrenages) d’un lancer ordinaire de volant par un individus quelconque. De plus par le biais du contrôleur qui lui est systématiquement associer on pouvait gérer le voltage et l’ampérage, donc agir sur la façons dont allait tourner le moteur ( les roues) .
2H ME Make (contrôleur pas à pas)
Le Me 2H Microstep Driver est une pilote de moteur pas à pas hybride à 2 phases, et adopte l’alimentation de DC 12 ~ 36V. Il est adapté pour piloter le moteur pas à pas hybride à 2 phases avec une tension de 24 ~ 36V et un courant inférieur à 2,0A. Ce pilote utilise la boucle de courant numérique complète pour mettre en œuvre le contrôle de micropas, de sorte que le moteur présente une faible ondulation du couple, une faible vitesse et un fonctionnement fluide, des vibrations et du bruit faibles. Lorsqu’il tourne à grande vitesse, son couple de sortie est relativement élevé et sa précision de positionnement est élevée.
Le Me Orion , qu’est ce que c’est ?
Me Orion
Le Makeblock Orion est une sorte de carte mère basée sur Arduino Uno . Il se munit de huit ports RJ25 pour se connecter à tous les autres modules de la série Me (kit Inventor ou séparé sur demande) avec des étiquettes couleur. Il supporte la plupart des logiciels de programmation (Arduino / Scratch / AduBlock).
Maintenant que vous connaissez la plupart des composant qui seront implanté dans notre lanceur voici le résultat final après que chaque composants soit inséré :
On peut voir sûr cette image la structure final avec les solution technique au problème expliqué dans la partie conception mécanique et donc les solution sont pour le bruit on a utilisé une courroie entre l’axe du moteur et celui des roue qui permet d’évité le frottement entre les 2 axes et pour les tremblement on a opté pour des pied qui vont permettre au moteur de ne pas être directement en contacte avec le sol et ainsi limité au maximum les vibrations. On peut voir aussi les composant électrique utilisé comme : – la carte Me Orion (en haut au milieu)
– les 2 moteur (en bas) et leur driver (en haut)
– l’écran LCD (en haut)
– le capteur (au milieu de l’image)
– la télécommande (a gauche au milieu)
Maintenant que nous avons un prototype opérationnel on peut passez a la partie programmation.
III) PROGRAMMATION
Avant de ce lancé dans du code pur et dur voici un schéma explicatif de comment notre lanceur fonctionnera et donc de comment le programme sera fait.
Principe de fonctionnement informatique
1) Rasberry Pi 3
Qu’est ce que c’est ?
Le Raspberry Pi est un ordinateur à processeur ARM conçu par David Braben, dans le cadre de sa fondation Raspberry Pi2. Cet ordinateur permet l’exécution de plusieurs variantes du système d’exploitation libre GNU/Linux et des nombreux logiciels compatibles. Il existent actuellement plusieurs versions du Raspberry-Pi. Il est malgré sa taille réduite suffisamment ouvert (ports USB, réseau) et puissant (ARM 700 MHz, 256 Mo de mémoire vive pour le modèle d’origine, 512 Mio sur les dernières versions) pour permettre une grande palette d’utilisations.
Le Raspberry Pi 3 est quant à lui équipé d’un processeur ARM Cortex-A53 quad-core 64 bits (Bradcom BCM2837) fonctionnant à 1.2GHz, de 4 ports USB 2.0, 1Go de mémoire, 1 sortie vidéo HDMI 1.3a, 1 port Ethernet 10/100, 1 prise jack audio/vidéo. La version 3 ajoute le support du Bluetooth 4 BLE (BCM43438) et plus du WiFi 802.11 b/g/n (BCM43438). Enfin, il possède un connecteur CSI permettant de brancher une caméra compatible.
Raspi 3
Un problème c’est alors très vite posé. Celui de se servir d’un rasberry Pi pour piloter une cate arduino. Afin de palier à ce problème une solution existe : le Megapi
Megapi Makerblock
Mais on très vite abandonné cette piste faute de matériel. Il fallait se munir d’un Megapi et coté timing on étais assez limités. On a donc écarté le fait d’inclure le Rasberry Pi dans notre projet.
Nous avons décidé d’utiliser arduino afin de programmer.
2) Arduino (logiciel)
Mais arduino qu’est ce que c’est ?
Le logiciel Arduino (IDE) open source fonctionne sous Windows, Mac OS X et Linux. L’environnement est écrit en Java et basé sur processing avec d’autres logiciels open-source. Il fonctionne également comme compilateur C. Le C est adopté dans le monde entier pour les microprocesseurs. Il offre un bon compromis entre l’effort de développement et l’efficacité du programme.
Maintenant que le domaine informatique est devenu limpide on va pouvoir passez au code que je vais séparé en plusieurs partie distincte pour que votre compréhension soit plus facile :
Pour commencé on a inséré les librairie qui sont propre a notre carte MeOrion et pour notre moteur pas a pas AccelStepper, ensuite on définie une longueur max pour notre écran LCD et après on a créer des variable qu’on a mit a 0 de base ou d’autre qu’on a juste créer ensuite on a définie chaque composant utilisé : – MeSerial (écran LCD) connecté au port 5.
– Me4Button(télécommande) connecté au port 8 et on définie ce qui ce passe quand on appuie sur le bouton.
– AccelStepper(Moteur pas à pas) on définie les 2 sens de marche et sur quel variable interne au MeOrion il sont connecté, le FULL2WIRE signifie qu’il n’y a que 2 fil pour un sens.
– MeUltrasonicSensor (capteur Ultrason) connecté au port 6 du MeOrion.
Maintenant qu’on a définie les librairies, les variables et les composant on peut passez a l’initialisation.
Pour l’initialisation on a juste définie une série d’action que notre lanceur va exécuté. Le mySerial.begin permet de définir la vitesse des bits donc des bauds et les mySerial.print(ln) permette d’écrire sur l’écran LCD. Donc cette série d’action va écrire UHA dans un rectangle ensuite on attend 3 seconde puis efface tous et on écris 3 phrase « Salut … » « Je suis B0-1 … » « Jouons ensemble ! » ensuite on efface tous et on écris « Owww tu vas kiffer » et aprés on efface tous.
Maintenant que notre initialisation est faite on va passez a la création de la fonction menu.
Pour la fonction menu ces une fonction qui est créé et qui pourra être appelez dans le programme, donc on peut voir que cette fonction est très simple elle permet juste d’écrire les 3 jeux qu’il y a et sur quel bouton il faut appuyé et sur quel bouton appuyé pour retourné au menu.
Maintenant on peut passez a la boucle infinie.
On peut voir dans cette boucle qu’au début définie ce que signifie appuyé sur le bouton et ensuite comme la variable start a été mise a 0 au début alors on appelle la fonction menu vu précédemment ensuite on passe start à 1 pour pouvoir commencé le programme.
Maintenant avant de passez a la création des jeux on va commencé par le capteur.
On peut voir que pour le capteur on commence par créer un compteur ensuite il faut que le moteur tourne toujours donc il faut constamment mettre des stepper(1/2).run() ensuite on demande pour que l’écran LCD écrive Nb_de volant suivi de la valeur du compteur. Puis pour un aspect visuelle on dit que pour chaque jeux on veut qu’il écrive le nom de ce jeux.
Maintenant pour un aspect visuelle on a définie des conditions.
On peut voir que ces condition sont active que quand soit tout les bits poubelle sont à 0 ou a 1 pour explication les bits poubelle sont définie pour l’activation(=1) ou la désactivation(=0) du mode de jeux pour résumé il permette soit que les moteur accélère pour pouvoir commencé le jeux soit qu’il décélère pour pouvoir arrêté le jeux, chaque jeux possède sont bit poubelle. Donc quand un des bits et a 0 alors on écrit que les moteurs vont s’arrêté et donc atteindre 0 tr/min et inversement quand un des bits et a 1 alors le moteur va atteindre 1200 tr/min.
Maintenant pour notre plus grand plaisir on a créé un événement.
On peut voir pour cette événement qu’il s’active quand le capteur a compté 10 volant et il va écrire sur l’écran « PFF petit joueur ».
Maintenant on peut passez a la création des jeux.
On peut voir pour la création du jeux 1 qu’on regarde quel bouton a été pressé si ces le bouton 1 alors on est dans le mode_jeux=1 et on incrémente la variable poubelle adéquate ensuite si celle-ci est égal a 1 alors on écrit le nom du jeux et la vitesse des moteurs. Ensuite on définie que la position actuelle des moteur est 0 et on lui donne une vitesse max une accélération et une position a atteindre (comme la position est très grande le moteur ne s’arrêtera pas tout de suite) et on fait cela pour les 2 moteurs.
Maintenant que la partie accélération et faite il faut passez a la partie décélération.
On peut voir comme je l’ai dit précédemment quand poubelle égal 2 (égal 0 car boucle infinie donc il voit poubelle égal à 0) alors le moteur est en phase de décélération, donc quand on appui de nouveau sur le même jeux la variable s’incrémente et donc on passe en phase de décélération (poubelle=2) dans cette phase on écrit la vitesse du moteur et le nom du jeux ensuite on prend la position du moteur actuelle et on lui dit qu’il a 5 fois cette distance pour s’arrêté.
Voici pour un mode de jeux mais le scénario ce répète a part que les moteur utilisé ne seront pas les même.
IV CONCLUSION
Quoi de mieux qu’une petite vidéo démonstrative pour conclure ?
Perspectives d’évolutions:
gestion plus effective du temps et des priorités
réalisation du vrai lanceur à l’instar d’un prototype
réalisation d’un socle pour les volants et choix de moteurs plus puissants
Lors de cette deuxième année en DUT GEII, je suis amené à réaliser un projet, celui-ci doit être en lien direct avec ma formation ( génie électrique et informatique industrielle ), pour mon cas, il s’agit du projet intitulé « Microscope à bille », ce projet rentre dans le cadre du module « études et réalisations » dont la notation dépend des efforts fournies (avancement du projet), ainsi que le rapport et la vidéo .
Pour mon projet, il m’est demandé d’utiliser une Raspberry Pi 3 mais également de faire une « Conception Assistée par Ordinateur » (CAO) du microscope. Afin de réaliser mon projet, qui consiste à acquérir des images et faire du traitement de donnée, j’utilise « Python » un langage de programmation intégré dans le Raspberry Pi 3.
Cahier des Charges
A quoi sert le projet et à qui il sert ?
Les différents fonctions et contraintes du projet :
Fonctions principales : Le projet doit posséder les bases d’une microscope traditionnelles, en terme d’acquisition d’image, zoom, réglage de luminosité et travaille d’un échantillon.
Contrainte Informatique : J’utilise une Raspberry Pi afin de crée le microscope. Au delà de ça, il faut une interface visuelle afin de rendre le projet plus intuitif. La prise en main et la maîtrise des différents langages sont nécessaires pour réaliser le projet.
Contrainte Conceptuelle : J’utilise Corel Draw afin de réaliser la conception assistée par ordinateur de ma microscope en obtenant en produit final, un appareil peu coûteux et simple d’accès.La prise en main et la maîtrise des notions d’optiques sont nécessaires pour réaliser le projet.
Contrainte de ressources : Le budget est limité à 100€.
Organisation du projet :
Ressources
PICAMERA :
Caméra permettant d’acquérir une image ou faire une vidéo. Dans mon cas, elle est utilisée en tant que lentille d’acquisition d’image. Elle est de très bonne qualité, en effet elle possède une multitude d’application (réglage de contraste, résolution, qualité…) très facile d’accès.
RASPBERRY PI 3:
C’est un mini-ordinateur qui relie les différents module du microscope. Cette carte contrôle l’écran, les LEDS ainsi que la caméra à travers des langages de programmations notamment le python.
SENSEHAT :
C’est un module qui contient un ensemble de capteur (pression, ultrason, température…), personnellement j’utilise seulement la matrice de LED compatible avec Raspberry Pi pour des raisons d’accessibilité. Ces LEDS sont simples à programmer. Cependant, le flux lumineux qu’elles délivrent est irrégulier après expérience.
ECRAN LCD :
Ecran tactile « 7 pouces » permettant de visualiser les images acquises par le microscope. Il est possible de travailler directement avec le microscope sans avoir besoin d’être à proximité d’un écran d’ordinateur grâce à une interface manipulée avec python.
BILLE :
C’est utilisé comme une lentille, de 1,92 millimètres de diamètre, qui permet d’agrandir 177 fois l’image de la camera, qui est placé entre la source de lumière et l’échantillon. La seule problématique est la distance entre la focale et l’échantillon.
Réalisation du Projet
Programmation :
Dans un premier temps, l’objectif consiste à acquérir une image à l’aide de la PiCamera. La maîtrise de linux et aussi python est nécessaire avant de débuter l’un est semblable à l’invite commande d’un PC et l’autre est un langage de programmation intégré dans le Raspberry PI. Pour capturer une image, il faut : télécharger la librairie appropriée, déclarée au tout début du programme python. On à ainsi accès aux différents fonctionnalités comme par exemple : le contraste de l’image, la résolution, obtenir une vidéo, image ….
Puis dans un second temps le but est de régler la luminosité délivrée par le sense hat par le biais de la matrice de LED, pour facilité l’observation de l’échantillon. Il faut également installer la librairie pour ce cas.
Ensuite il m’est demandé de mettre au point une interface permettant de manipuler le code de manière tactile via Tkinter. Et pour terminer, faire du traitement d’image avec OpenCv, le travaille ce fait sur les pixels de l’image, le but est d’obtenir un échantillon perceptible pour ensuite l’étudier, avec l’aide du détection de contours et de filtre.
Test 1 : observation d’un échantillon de plume d’oiseau avec filtre.
Test 2 : observation d’un échantillon de plume d’oiseau sans filtre.
Conception :
Pour ce projet, il m’est demandé de faire une CAO de la microscope. Pour ce faire, certains critères doivent être traités en amont, tout d’abord la distance focale entre la bille et la lentille de caméra (quelques millimètres ), ensuite la distance entre l’échantillon et la source de lumière (proche de 2cm), prendre en compte la taille de la nappe (15 cm), un support pour projeter la lumière à un point précis, un support pour tenir l’échantillon et le tout relié au Raspberry pi. Pour la conception, le logiciel utilisé est « CorelDraw ». C’est une conception en 3D utilisant une machineà découpe laser.
Perspectives D’améliorations
Afin que le projet puisse connaître de meilleur résultat, il est envisageable de travaillé sur la source d’éclairage, l’autotomie ainsi qu’un moyen de support, d’extension pour la Picamera.
Ce projet m’a permis de découvrir de nouvelles choses comme : la gestion d’un projet, le travail en autonomie, la démarche à suivre pour arriver au bout d’un projet. De plus, cela m’a permis d’approfondir mes connaissances en informatique, en langage python, l’univers de linux ainsi qu’à la conception d’une microscope.
Remerciements
Merci au département GEII de l’IUT de Mulhouse pour le budget et l’apport de matériels.
Nos professeurs encadrants Mr Verrier et Mr Bazeille de m’avoir aidé pour ce projet.
Durant notre deuxième année de DUT Génie Electrique et Informatique Industrielle nous devions effectuer un projet d’étude et réalisation. Nous avons choisi de réaliser un microscope sans lentille à l’aide d’un Raspberry Pi 3. Pour mener à bien se projet nous étions encadrés par deux professeurs, Mr Verrier et Mr Bazeille et notre équipe était composée de la manière suivante :
Arthur Gasser – Chef de Projet
Quentin Dijoux – Responsable Programmation
Raphaël Jimenez – Responsable Conception Assistée par Ordinateur
Notre microscope devait impérativement être réalisé en utilisant un Raspberry Pi 3 et nous devions le créer à l’aide d’une Conception Assistée par Ordinateur (CAO). Il nous a donc tout d’abord fallut apprendre les bases de la programmation Linux, Unix et de l’univers Raspberry en général. Mais nous avons également dû approfondir certaines notions concernant le domaine de l’optique pour pouvoir dimensionner notre microscope de manière optimale. La capture de l’image zoomée se fait à l’aide d’une RaspiCam Noire V2 et peut être visualisée sur un écran LCD et l’éclairage se fait à l’aide d’un module de leds SenseHat.
Nous avons commencé ce projet le jeudi 30/11/2107 et nous l’avons achever le lundi 22/01/2108. La réalisation d’un microscope géré électroniquement nous intéressait tout particulièrement car les différents aspects de conception et de programmation étaient nouveaux pour nous. Mais ce projet faisait appel à d’autres notions intéressantes comme l’holographie par exemple.
PROBLÉMATIQUES
Comment programmer efficacement le microscope pour qu’il soit simple d’utilisation ?
Comment dimensionner rigoureusement la CAO pour que les zooms effectués par le microscope soient suffisamment conséquents et nets ?
Nous voyons ressortir ici les deux points principaux de notre projet : CAO et Programmation.
STRATÉGIES
Ce projet était assez conséquent tant au niveau de la charge de travail qu’au niveau de la difficulté. Nous avons donc relevé le challenge en donnant le meilleur de nous même ! Nos points forts étaient notre motivation et notre bonne répartition des rôles. Nous avons également essayé de communiquer régulièrement avec nos professeurs encadrants afin qu’ils soient tenus au courant des avancements de notre projet et pour qu’ils puissent nous conseiller au mieux.
Nous avons tout d’abord réalisé le cahier des charges fonctionnelles accompagné de différents diagrammes pour bien commencer le projet. Puis nous avons effectué les différentes recherches nécessaires afin de pouvoir démarrer la programmation de la caméra et des leds. Ensuite nous avons étudié un certains nombres de documents afin de pouvoir calculer la future résolution de notre microscope qui nous a permis de le dimensionner et nous avons rédigé les différents documents accompagnant notre projet tout au long de celui-ci. Plus notre projet avançait, plus il était complexe, il a donc fallut travailler en dehors des heures prévues pour les études et réalisations, lors de nos temps libres.
Nous vous invitions à télécharger le PDF suivant afin de visualiser nos différents diagrammes qui nous ont permis de démarrer le projet dans les meilleures conditions possibles (Bête à cornes, MindMap, Pieuvre, Ligne des temps).
Notre microscope est constitué de plusieurs éléments, nous allons vous les présenter brièvement. Les caractéristiques électroniques de ces composants sont détaillées dans notre Cahier des charges techniques disponible en bas de page.
RASPBERRY PI 3 Modèle B
C’est le cœur de notre microscope. En effet cette carte contrôle notre écran, nos leds ainsi que notre caméra. L’entièreté de la programmation a été réalisé sur ce Raspberry et toutes les informations sont centralisées à l’intérieur de ce dernier.
ECRAN LCD
Cet écran tactile permet de visualiser les images récupérées à l’aide de notre microscope. Il rajoute énormément de confort car il est possible de travailler directement avec le microscope sans avoir besoin d’être à proximité d’un autre écran. Cependant, travailler sur un écran plus grand reste plus confortable sur le long terme.
RASPICAM NOIRE V2
Cette caméra nous permet de capturer nos images zoomées. Elle est de très bonne qualité mais dans le cadre de notre application, comme le nom de notre projet l’indique, nous avons été amené à retirer la lentille présente sur la caméra. Cela est indispensable pour pouvoir réaliser les zooms des images.
SENSEHAT
Cette petite carte contient un module leds compatible avec Raspberry, voilà pourquoi nous l’avons choisi pour réaliser l’éclairage dans notre microscope. Ces leds sont pratiques à utiliser et assez simples à programmer. Cependant, le flux lumineux qu’elles délivrent est assez faible. Il est possible d’augmenter la qualité de notre microscope avec des leds plus puissantes.
CARTE SD
Nous réalisons des captures ainsi que du traitement d’image, ces opérations sont assez lourdes niveau mémoire. Nous avons donc du ajouter une carte SD de 16go compatible avec Raspberry pour éviter tout problème et pour mener à bien notre projet.
ÉCHANTILLON
Enfin, comme dans tout microscope, il faut un échantillon à observer. Comme pour les microscope classique nous observons des échantillons présents sur de simples lames standards.
CAO
L’un des points principaux de notre projet était de réaliser une CAO (Conception Assistée par Ordinateur) pour créer notre microscope. Pour cela, nous avons utilisé le logiciel Tinkercad, qui était le plus pratique dans notre cas car c’est un logiciel en ligne, nous pouvions donc travailler chez nous et sur tous les PC de l’IUT (voici un lien vers le site Tinkercad).
Pour une question de praticité, nous avons décidé de réaliser notre microscope en plusieurs pièces pour faciliter le montage ainsi que la maintenance. Dans cette partie, nous allons vous présenter chacune des pièces en détail.
SOCLE
Commençons par la base de notre microscope. Ce socle a été conçu afin que la caméra et surtout le capteur soit au milieu du microscope. Il y a également un chemin de câble qui passe en dessus pour que la nappe de la caméra soit protégée et pour la connecter directement au Raspberry de manière efficace. Le Raspberry et l’écran sont donc placés sur la partie avant du socle (la plus grande) pour des questions de confort.
MURS/ÉCHANTILLON
Sur ce socle, vient la partie qui permettra d’accueillir l’échantillon. Cette pièce est constituée de 4 murs et sur deux de ces murs, il y a une fente permettant d’introduire l’échantillon dans le microscope à l’aide de la pièce que nous allons voir tout de suite.
SUPPORT/ÉCHANTILLON
On place l’échantillon sur cette pièce puis on l’introduit dans le microscope. Tout a été étudié pour que le support soit maintenu par les deux fentes vues précédemment. Cette pièce est de cette forme car l’échantillon ainsi que la lumière doivent arriver jusqu’au capteur située juste en dessous.
PROTECTION
Pour que notre écran et notre Raspberry soient protégés contre les chutes. Nous avons réalisé cette pièce permettant de les caler. Sur cette pièce nous avons également réalisé deux trous pour laisser passer les câbles provenant du SenseHat et de l’alimentation mais aussi pour brancher le clavier, la souris et un câble HDMI. Nous avons aussi placé le logo de l’IUT ainsi que nos noms sur le dessus de la pièce.
PINHOLE
Cette pièce est entièrement pleine. Mais en son centre, il y a le trou appelé « pinhole » permettant de laisser passer la lumière. Sa taille a été étudiée afin que le phénomène de diffraction soit respecté, nous verrons les détails des phénomènes physiques dans la dernière partie de ce document.
FOCALE
Afin que le flux de lumière soit plus conséquent, nous avons ajouté une focale pour concentrer la lumière en un seul point. Cette pièce est donc constituée d’un trou permettant de fixer parfaitement la focale au centre.
LEDS/TUYAU
Notre module de leds sera fixé sur cette pièce, nous avons percé un trou afin de laisser passer les câbles du SenseHat. Ces câbles passeront ensuite dans le tuyau et descendront jusqu’au Raspberry.
TOIT
Voici la dernière pièce de notre microscope. Il s’agit d’un cube permettant de refermé le montage. Sur cette pièce nous pouvons voir le nom de notre microscope « μSCO-Pi 3D » ainsi que notre logo.
La CAO était une étape très importante du projet, nous avons donc consacré beaucoup de temps pour la réaliser de la manière la plus précise, esthétique et ergonomique. Cependant, le rendu final présentait quelques erreurs de précision que nous avons tenté de corriger au mieux. Nous avons dû peindre notre microscope en noir pour empêcher la lumière extérieure de gêner notre acquisition. Nous avons utilisé l’imprimante 3D (résine) de l’IUT Lab, nous souhaitons donc remercier Mr De Sabbata pour son aide.
Nous vous invitions à télécharger notre Cahier des charges techniques (CDCT) en bas de page dans la rubrique « Pour aller plus loin… » afin de visualiser nos différentes pièces ainsi que le microscope fini sur Tinkercad et après impression.
PROGRAMMATION
La programmation de notre microscope est réalisée en Python 3. Avant ce projet, nous n’avions aucune connaissance en Python et en Linux, nous avons donc dû nous adapter et apprendre ces différents langages. Nous souhaitions que notre microscope puisse être utilisé par tout le monde, c’est pour cela que nous avons annoté chacun de nos programmes. Nous utilisons trois programmes principaux et nous allons détailler leur contenu.
ACQUISITION
La programmation de notre microscope est réalisée en Python 3. Avant ce projet, nous n’avions aucune connaissance en Python et en Linux, nous avons donc dû nous adapter et apprendre ces différents langages. Nous souhaitions que notre microscope puisse être utilisé par tout le monde, c’est pour cela que nous avons annoté chacun de nos programmes. Nous utilisons trois programmes principaux et nous allons détailler leur contenu.
RECONSTRUCTION
La capture étant réalisée, il faut maintenant améliorer le rendu de celle-ci. Pour cela veillez cliquer sur le bouton « Reconstruction 2D » afin de lancer le programme correspondant. Ce dernier va réaliser une mise au point numérique à l’aide d’un recalage de pixel. Pour cela, il faut utiliser plusieurs FFT (Fast Fourier Transformer). Ces différents termes peuvent paraître compliqués mais en visualisant la photo une fois reconstruite vous allez très vite comprendre son impact sur l’image que vous avez prise précédemment. Une fois la reconstruction terminée vous pouvez analyser votre image.
ANALYSE
Pour ouvrir ce programme il vous suffit d’appuyer sur le bouton correspondant. Une fois le programme lancé, vous pouvez réaliser un certains nombres d’actions :
Contouring
Zoom
Déplacement
Annotation
Sauvegarde
…
Pour accéder à ces différentes actions, il vous suffit de lire les instructions présentes sur votre écran.
Vous pouvez retrouver tous nos codes en téléchargement dans la rubrique « Pour aller plus loin… » en bas de page.
VIDÉO
Dans le cadre du projet nous avons du réaliser une vidéo résumant l’entièreté de celui-ci. Nous n’avons pas réalisé une vidéo classique, en effet, nous avons utilisé une macro sur PowerPoint afin de transformer ce dernier en vidéo full HD puis nous avons rajouté nos voix ainsi qu’une musique en fond. Cette vidéo est disponible juste ici, nous vous invitons à la visionner.
CONCLUSION
Malgré le manque de connaissance, nous nous sommes adaptés très rapidement à l’univers Raspberry. Nous avons réussi à créer un programme assez simple d’utilisation ainsi qu’un CAO précise, nous avons atteints nos objectifs. Nous sommes globalement très satisfaits du rendu final de notre microscope. Le projet était assez complexe mais nous avons redoublé d’effort pour le mener à bien. Nous arrivons à obtenir des images zoomées avec une résolution et une précision correctes. Nous aurions cependant pu avoir de meilleurs résultats avec une source de lumière plus adaptée à la situation et un pinhole plus petit (ce qui était difficilement réalisable). Et avec plus de temps, nous aurions aimé réaliser, en plus de la reconstruction 2D, une reconstruction 3D de nos images mais c’est encore un autre niveau de difficulté.
Mais notre microscope n’est pas encore dans son état final puisque Mr Verrier continuera à travailler sur celui-ci et l’utilisera lors de divers présentations ou événements.
POUR ALLER PLUS LOIN…
Afin que notre projet soit plus complet et plus détaillé, nous avons rédiger plusieurs documents. Si notre projet vous a intéressé, nous vous invitons à les télécharger. Les différents programmes que nous avons réalisé sont également en téléchargement.
Cahier des charges fonctionnelles
Indispensable au bon démarrage du projet, ce cahier des charges définit les différents cadres et objectifs de celui-ci. Il permet de partir dans la bonne direction et de vérifier si tous les membres de l’équipe ont la même vision des moyens à mettre en œuvre pour accomplir les objectifs.
Ce document récapitule les fonctions des composants que nous avons utilisé, la manière dont nous avons effectué notre CAO, les différents calculs de dimensionnement que nous avons du faire et aussi un résumé de la partie programmation.
Ce guide vous permet de comprendre comment utiliser notre microscope étape par étape mais il vous explique également comment installé les divers logiciels que nous avons installé sur notre Raspberry.