{"id":8215,"date":"2023-03-22T13:17:05","date_gmt":"2023-03-22T12:17:05","guid":{"rendered":"https:\/\/telefab.fr\/?p=8215"},"modified":"2026-04-30T17:33:59","modified_gmt":"2026-04-30T15:33:59","slug":"robotise","status":"publish","type":"projet","link":"https:\/\/hub.imt-atlantique.fr\/fablab\/projet\/robotise\/","title":{"rendered":"Robotise"},"content":{"rendered":"<h1><b>I &#8211; Introduction<\/b><\/h1>\n<ul>\n<li>\n<h2><b>\u00a0But du projet (et les domaines \/ technologies qu\u2019il couvre)<\/b><\/h2>\n<\/li>\n<\/ul>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095020701645283409\" aria-labelledby=\"message-username-1095020646372745258 uid_1 message-content-1095020701645283409 uid_2 message-timestamp-1095020701645283409\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095020701645283409\" class=\"markup-eYLPri messageContent-2t3eCI\">R\u00e9alisation d&rsquo;un distributeur de cocktails automatis\u00e9, contr\u00f4l\u00e9 par une application via Bluetooth et dot\u00e9 d&rsquo;une interface utilisateur conviviale. L&rsquo;utilisateur s\u00e9lectionne le cocktail souhait\u00e9 \u00e0 travers l&rsquo;application. Un prototype fonctionnel a \u00e9t\u00e9 d\u00e9velopp\u00e9 l&rsquo;ann\u00e9e pr\u00e9c\u00e9dente, tandis que cette ann\u00e9e, l&rsquo;objectif consistait \u00e0 concevoir un mod\u00e8le 3D de la machine afin de construire un ch\u00e2ssis capable d&rsquo;accueillir tous les composants. Par ailleurs, l&rsquo;application offre des fonctionnalit\u00e9s attrayantes pour les utilisateurs, telles que l&rsquo;ajout de nouveaux cocktails pour les administrateurs, l&rsquo;acc\u00e8s \u00e0 une base de donn\u00e9es de cocktails et bien d&rsquo;autres avantages.<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h2><b>\u00a0Sp\u00e9cifications du projet<\/b><\/h2>\n<\/li>\n<\/ul>\n<h3><b>Diagramme de cas d\u2019utilisation :<\/b><\/h3>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/cas_dutilisation.drawio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8264\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/cas_dutilisation.drawio-300x296.png\" alt=\"\" width=\"300\" height=\"296\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095020808520347768\" aria-labelledby=\"message-username-1095020646372745258 uid_1 message-content-1095020808520347768 uid_2 message-timestamp-1095020808520347768\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095020808520347768\" class=\"markup-eYLPri messageContent-2t3eCI\">Ce sch\u00e9ma d\u00e9crit les fonctionnalit\u00e9s mises en \u0153uvre par la machine et les diff\u00e9rents acteurs associ\u00e9s \u00e0 ces actions. Il met en \u00e9vidence l&rsquo;utilisateur et le propri\u00e9taire de la machine, ce dernier b\u00e9n\u00e9ficiant de davantage de possibilit\u00e9s qu&rsquo;un utilisateur ordinaire. Par exemple, il peut lancer l&rsquo;autonettoyage de la machine ou cr\u00e9er de nouvelles recettes qui seront directement int\u00e9gr\u00e9es \u00e0 l&rsquo;appareil gr\u00e2ce \u00e0 l&rsquo;application.<\/div>\n<div><\/div>\n<\/div>\n<div><\/div>\n<\/div>\n<h3><\/h3>\n<h3><b>Diagramme de blocs d\u2019architecture :<\/b><\/h3>\n<p>Ce diagramme offre une vue d&rsquo;ensemble de la conception de la machine et des diverses interconnexions qui la composent. Il pr\u00e9sente les flux de donn\u00e9es entre la carte de contr\u00f4le de la machine et l&rsquo;application utilisateur, les flux \u00e9nerg\u00e9tiques entre les diff\u00e9rents \u00e9l\u00e9ments de la carte m\u00e8re et le Raspberry Pi, ainsi que les flux de liquides entre les r\u00e9servoirs d&rsquo;entr\u00e9e et la sortie du bec verseur.<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/blocs-darchitectures.drawio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8263\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/blocs-darchitectures.drawio-300x188.png\" alt=\"\" width=\"300\" height=\"188\" \/><\/a><\/p>\n<p>En r\u00e9sum\u00e9, ce sch\u00e9ma permet de visualiser clairement les interactions entre les \u00e9l\u00e9ments cl\u00e9s du syst\u00e8me, mettant en lumi\u00e8re les \u00e9changes de donn\u00e9es, d&rsquo;\u00e9nergie et de liquides qui rendent possible le fonctionnement harmonieux de la machine \u00e0 cocktails.<\/p>\n<p>&nbsp;<\/p>\n<h1><b>II- Hardware<\/b><\/h1>\n<ul>\n<li>\n<h2><b>\u00a0Conception 3D<\/b><\/h2>\n<\/li>\n<\/ul>\n<h3><b>Liste n\u00e9cessaire pour impression 3D :\u00a0<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">3 raccords G1\/2\u201d femelle vers cannel\u00e9 8mm par ligne hydraulique (2 pour l\u2019\u00e9lectrovanne et 1 pour le d\u00e9bitm\u00e8tre)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Mux 2 entr\u00e9es vers 1 sortie pour raccorder 2 lignes ensemble<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">1 raccord G1\/2\u201d m\u00e2le vers cannel\u00e9 8mm par ligne hydraulique (pour le d\u00e9bitm\u00e8tre)<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Voici une repr\u00e9sentation 3D de ces 3 \u00e9l\u00e9ments dans le m\u00eame ordre que cit\u00e9 ci-dessus:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8218\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/image3-300x142.png\" alt=\"\" width=\"300\" height=\"142\" \/><\/p>\n<p>Voici une repr\u00e9sentation 3D du ch\u00e2ssis qui fait entre 40cm et 60cm :<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/solidworks.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8248\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/solidworks-266x300.png\" alt=\"\" width=\"266\" height=\"300\" \/><\/a><\/p>\n<ul>\n<li>\n<h2><b>\u00a0\u00c9lectronique embarqu\u00e9e<\/b><\/h2>\n<\/li>\n<\/ul>\n<h3><b>Liste mat\u00e9riel pour configuration 7 r\u00e9servoirs (2 sirops, 2 jus, 2 alcools et 1 eau) :<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">10 transistors NPN (ici BD241C de ST)\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">10 r\u00e9sistances de 10 ohms<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">7 \u00e9lectrovannes 12V<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">3 d\u00e9bitm\u00e8tres (ref: YF-B2)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">3 pompes 12V<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">1 alimentation 240V~ &#8211; 5V \/ 12V (ref: RD65A)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Flexibles<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Raspberry PI 3B+<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>L&rsquo;objectif ici est de concevoir la partie esclave de la machine, qui sera pilot\u00e9e via l&rsquo;application utilisateur. La carte de contr\u00f4le (en l&rsquo;occurrence, le Raspberry Pi 3B+) sera responsable de la gestion des diff\u00e9rents composants de la machine gr\u00e2ce \u00e0 ses broches GPIO. \u00c9tant donn\u00e9 que la machine doit \u00eatre capable de fournir diverses boissons \u00e0 l&rsquo;utilisateur, il est n\u00e9cessaire d&rsquo;ajouter des signaux de contr\u00f4le \u00e0 la partie mat\u00e9rielle. Ces signaux contr\u00f4leront les grilles des transistors pour les rendre conducteurs ou non, en fonction du composant \u00e0 alimenter (pompe et\/ou \u00e9lectrovanne).<\/p>\n<p>&nbsp;<\/p>\n<p>Un autre aspect crucial est le contr\u00f4le du volume de liquide vers\u00e9 par le syst\u00e8me. \u00c0 cet effet, des d\u00e9bitm\u00e8tres sont install\u00e9s sur chaque conduite hydraulique reli\u00e9e \u00e0 la sortie de chaque pompe, permettant de surveiller en temps r\u00e9el le volume de chaque liquide vers\u00e9. Ces d\u00e9bitm\u00e8tres sont des capteurs \u00e0 effet Hall qui envoient des impulsions au Raspberry Pi lorsqu&rsquo;ils d\u00e9tectent un liquide dans la conduite. Le Raspberry Pi est alors charg\u00e9 du traitement des donn\u00e9es et de la gestion du d\u00e9bit des pompes pour d\u00e9livrer le volume de liquide demand\u00e9.<\/p>\n<p>&nbsp;<\/p>\n<p>Le sch\u00e9ma \u00e9lectrique ci-dessous, impl\u00e9ment\u00e9 sur une carte PCB, pr\u00e9sente le Raspberry Pi sur la droite, repr\u00e9sent\u00e9 par ses broches GPIO, ainsi que la carte m\u00e8re de la machine, avec les composants aliment\u00e9s en 5V ou 12V. On y distingue \u00e9galement les signaux de contr\u00f4le des transistors et les signaux de retour d&rsquo;information des d\u00e9bitm\u00e8tres.<\/p>\n<p>&nbsp;<\/p>\n<h3><b>Sch\u00e9ma PCB :<\/b><\/h3>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Cablage-pcb.drawio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8269\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Cablage-pcb.drawio-288x300.png\" alt=\"\" width=\"288\" height=\"300\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">La disposition finale choisie est pr\u00e9sent\u00e9e ci-apr\u00e8s, sans les connexions filaires pour plus de clart\u00e9 :<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8220\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/image5-300x271.png\" alt=\"\" width=\"300\" height=\"271\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Pour r\u00e9sumer simplement la configuration d&rsquo;une ligne de base du circuit hydraulique, voici l&rsquo;ordre \u00e0 suivre : R\u00e9servoir -&gt; \u00c9lectrovanne -&gt; Pompe -&gt; D\u00e9bitm\u00e8tre -&gt; Bec de sortie. La s\u00e9quence de distribution d&rsquo;un liquide se d\u00e9roule comme suit : l&rsquo;\u00e9lectrovanne associ\u00e9e \u00e0 un r\u00e9servoir s&rsquo;ouvre, puis la pompe s&rsquo;active. Le volume de liquide vers\u00e9 est mesur\u00e9 par le d\u00e9bitm\u00e8tre, et une fois le volume souhait\u00e9 atteint, la pompe se d\u00e9sactive et l&rsquo;\u00e9lectrovanne se ferme.<\/p>\n<p>Afin de r\u00e9aliser des \u00e9conomies, deux lignes peuvent \u00eatre combin\u00e9es pour utiliser une seule pompe et un seul d\u00e9bitm\u00e8tre pour deux r\u00e9servoirs diff\u00e9rents. Il est donc n\u00e9cessaire de relier les deux lignes ensemble apr\u00e8s les \u00e9lectrovannes en utilisant un multiplexeur (Mux) \u00e0 deux entr\u00e9es et une sortie, qui sera connect\u00e9e \u00e0 la pompe unique.<\/p>\n<p>&nbsp;<\/p>\n<h1><b>III &#8211; Software<\/b><\/h1>\n<ul>\n<li>\n<h2><b>Application mobile<\/b><\/h2>\n<\/li>\n<\/ul>\n<h3><strong>Fonctionnalit\u00e9s<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">Cette application a de multiples fonctionnalit\u00e9s:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0&#8211; Elle permet \u00e0 l&rsquo;utilisateur de choisir un cocktail \u00e0 commander\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0&#8211; Elle permet \u00e0 l&rsquo;administrateur de mettre \u00e0 jour les cocktails de l&rsquo;application par rapport \u00e0 la base de donn\u00e9es\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0&#8211; Elle permet \u00e0 l&rsquo;administrateur de mettre \u00e0 jour les ingr\u00e9dients et leurs quantit\u00e9s dans la base de donn\u00e9es<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0&#8211; Elle permet \u00e0 l&rsquo;utilisateur d&rsquo;avoir des cocktails favoris<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>D\u00e9roulement de l&rsquo;application\u00a0<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">Dans un premier temps, l&rsquo;utilisateur doit accepter deux permissions: l&rsquo;acc\u00e8s au Bluetooth et l&rsquo;acc\u00e8s \u00e0 la position.\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8223 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_194907_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/p>\n<p>Ensuite, la configuration BLE (Bluetooth Low Energy) est indispensable. L&rsquo;application affiche une liste des appareils Bluetooth Low Energy disponibles. \u00c0 ce stade, il suffit de choisir l&rsquo;appareil portant le nom \u00ab\u00a0robotise\u00a0\u00bb ou \u00ab\u00a0rpi-gatt-server\u00a0\u00bb.<\/p>\n<p>Lorsque l&rsquo;appareil est s\u00e9lectionn\u00e9, un service est cr\u00e9\u00e9 pour g\u00e9rer le Bluetooth du t\u00e9l\u00e9phone. Si l&rsquo;appareil se d\u00e9connecte du BLE pour une raison quelconque, la m\u00e9thode onServiceDisconnected sera appel\u00e9e.<\/p>\n<p><span style=\"font-weight: 400;\">Une fois le service Bluetooth activ\u00e9, un autre service est cr\u00e9\u00e9 dans le but de g\u00e9rer la connexion et la communication entre les deux \u00e9l\u00e9ments. Ce service se connecte alors \u00e0 l&rsquo;appareil Raspberry Pi et r\u00e9cup\u00e8re le serveur GATT du Raspberry. L&rsquo;application communique avec le service, qui \u00e0 son tour communique avec l&rsquo;API Bluetooth LE.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">L&rsquo;impl\u00e9mentation BLE a \u00e9t\u00e9 fortement inspir\u00e9e d&rsquo;un projet existant : Bluetooth LE GATT.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Pour que cela fonctionne correctement, les caract\u00e9ristiques suivantes doivent \u00eatre pr\u00e9sentes dans le service :<\/p>\n<ul>\n<li>CommanderCocktailCharacteristic : la caract\u00e9ristique permettant d&rsquo;envoyer une commande de cocktail.<\/li>\n<li>BDRecettesCharacteristic : la caract\u00e9ristique permettant de recevoir la liste des recettes de cocktails.<\/li>\n<li>BDIngredientsCharacteristic : la caract\u00e9ristique permettant de recevoir la liste des ingr\u00e9dients pr\u00e9sents dans la base de donn\u00e9es.<\/li>\n<li>MajIngredientsCharacteristic : la caract\u00e9ristique permettant de mettre \u00e0 jour les ingr\u00e9dients disponibles dans la machine dans la base de donn\u00e9es.<\/li>\n<li>AddCocktailCharacteristic : la caract\u00e9ristique permettant d&rsquo;ajouter un cocktail \u00e0 la base de donn\u00e9es.<\/li>\n<li>DeleteCocktailCharacteristic : la caract\u00e9ristique permettant de supprimer un cocktail de la base de donn\u00e9es.<\/li>\n<li>AjouterIngredientCharacteristic : la caract\u00e9ristique permettant d&rsquo;ajouter un ingr\u00e9dient \u00e0 la base de donn\u00e9es.<\/li>\n<li>DeleteIngredientCharacteristic : la caract\u00e9ristique permettant de supprimer un ingr\u00e9dient de la base de donn\u00e9es.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_194956_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8224 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_194956_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/span><\/p>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095023487254544394\" aria-labelledby=\"message-username-1095022475894591538 uid_1 message-content-1095023487254544394 uid_2 message-timestamp-1095023487254544394\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095023487254544394\" class=\"markup-eYLPri messageContent-2t3eCI\">Si la configuration du BLE est un succ\u00e8s alors nous pouvons passer \u00e0 la suite de l\u2019application. Nous avons donc dans un premier temps une page qui permet la connexion en tant qu\u2019utilisateur ou administrateur (LoginActivity).<\/div>\n<\/div>\n<\/div>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Pour l&rsquo;instant, l&rsquo;utilisateur a acc\u00e8s \u00e0 une seule fonctionnalit\u00e9 : commander un cocktail. Lors de la connexion, la fen\u00eatre ListCocktailsActivity s&rsquo;ouvre, permettant \u00e0 l&rsquo;utilisateur de visualiser la liste des cocktails disponibles. Cette liste est g\u00e9r\u00e9e par la classe CocktailListView. Chaque cocktail est repr\u00e9sent\u00e9 par la classe CocktailItem, et son affichage est contr\u00f4l\u00e9 par la classe CocktailsArrayAdapter. En cliquant sur un cocktail, une page s&rsquo;ouvre (PopUpCocktail), affichant la composition du cocktail.<\/p>\n<p>Chaque ingr\u00e9dient est repr\u00e9sent\u00e9 par la classe IngredientItem, et son affichage est g\u00e9r\u00e9 par la classe IngredientArrayAdapter. L&rsquo;utilisateur peut modifier les quantit\u00e9s de chaque ingr\u00e9dient avant d&rsquo;appuyer sur le bouton \u00ab\u00a0commander\u00a0\u00bb. Il a \u00e9galement la possibilit\u00e9 de choisir un cocktail al\u00e9atoire gr\u00e2ce \u00e0 la classe WheelActivity. L&rsquo;utilisateur peut faire tourner une roue trois fois, et \u00e0 chaque tour, un ingr\u00e9dient sera s\u00e9lectionn\u00e9 avec une quantit\u00e9 al\u00e9atoire attribu\u00e9e. Ce processus permet de cr\u00e9er un cocktail al\u00e9atoire \u00e0 partir des ingr\u00e9dients disponibles.<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0 <a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/3a_Choisir_cocktail.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8232\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/3a_Choisir_cocktail-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a> \u00a0 \u00a0 \u00a0<a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/3b_Commander_cocktail.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8233\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/3b_Commander_cocktail-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a> \u00a0 \u00a0 \u00a0<a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_193927_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8221\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_193927_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/span><\/p>\n<p>Apr\u00e8s avoir command\u00e9 son cocktail, l&rsquo;utilisateur a la possibilit\u00e9 de jouer en duo au morpion en attendant que son cocktail soit pr\u00eat. Une fois le cocktail termin\u00e9, l&rsquo;utilisateur recevra une notification.<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>De son c\u00f4t\u00e9, l&rsquo;administrateur doit entrer un mot de passe pour se connecter. Pour l&rsquo;instant, le mot de passe est \u00ab\u00a0hello\u00a0\u00bb et est cod\u00e9 en dur dans l&rsquo;application. \u00c0 l&rsquo;avenir, il serait pr\u00e9f\u00e9rable d&rsquo;utiliser une m\u00e9thode de stockage et de v\u00e9rification de mot de passe plus s\u00e9curis\u00e9e.<\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195116_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8225 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195116_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a>Apr\u00e8s s&rsquo;\u00eatre connect\u00e9, la fen\u00eatre AdminActivity s&rsquo;ouvre et l&rsquo;administrateur dispose de plusieurs fonctionnalit\u00e9s. Il peut : <\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><span style=\"font-weight: 400;\">Choisir un cocktail \u00e0 commander, tout comme l&rsquo;utilisateur. <\/span><\/li>\n<li><span style=\"font-weight: 400;\">Ajouter ou supprimer un cocktail. <\/span><\/li>\n<li><span style=\"font-weight: 400;\">Ajouter ou supprimer un ingr\u00e9dient. <\/span><\/li>\n<li><span style=\"font-weight: 400;\">Mettre \u00e0 jour les quantit\u00e9s de chaque ingr\u00e9dient disponible dans la machine. <\/span><\/li>\n<li><span style=\"font-weight: 400;\">R\u00e9cup\u00e9rer la liste des cocktails propos\u00e9s par la <\/span><span style=\"font-weight: 400;\">machine.<br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\u00a0 Ces options offrent \u00e0 l&rsquo;administrateur un contr\u00f4le complet sur les cocktails et les ingr\u00e9dients disponibles, ainsi que sur la gestion des stocks de la machine.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095024838172745740\" aria-labelledby=\"message-username-1095024596534698035 uid_1 message-content-1095024838172745740 uid_2 message-timestamp-1095024838172745740\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095024838172745740\" class=\"markup-eYLPri messageContent-2t3eCI\">Si l&rsquo;administrateur choisit de r\u00e9cup\u00e9rer la liste des cocktails, la fonction \u00ab\u00a0listenToBdRecettesCharacteristic\u00a0\u00bb est appel\u00e9e. Cette fonction \u00e9coute la caract\u00e9ristique correspondant \u00e0 la liste des recettes. Le script Python, apr\u00e8s avoir d\u00e9tect\u00e9 un nouvel auditeur, renvoie la liste des recettes. La m\u00e9thode \u00ab\u00a0ReceivedData\u00a0\u00bb dans DeviceControl est alors appel\u00e9e et peut invoquer la fonction correspondante. Ainsi, les recettes sont mises \u00e0 jour dans l&rsquo;application.<\/div>\n<\/div>\n<\/div>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195246_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8228 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195246_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/span>Si l&rsquo;administrateur choisit l&rsquo;option \u00ab\u00a0ajouter un ingr\u00e9dient\u00a0\u00bb, une nouvelle fen\u00eatre s&rsquo;ouvre : AdminAddIngredientActivity. La liste des ingr\u00e9dients est charg\u00e9e depuis la base de donn\u00e9es. L&rsquo;administrateur a ensuite la possibilit\u00e9 d&rsquo;ajouter un ingr\u00e9dient. Cet ingr\u00e9dient sera envoy\u00e9 via Bluetooth Low Energy (BLE) \u00e0 la base de donn\u00e9es du Raspberry Pi. Enfin, la liste des ingr\u00e9dients mise \u00e0 jour est renvoy\u00e9e du Raspberry Pi vers le t\u00e9l\u00e9phone de l&rsquo;administrateur.<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195310_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8229 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195310_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/span><\/p>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095025277417042041\" aria-labelledby=\"message-username-1095024596534698035 uid_1 message-content-1095025277417042041 uid_2 message-timestamp-1095025277417042041\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095025277417042041\" class=\"markup-eYLPri messageContent-2t3eCI\">Si l&rsquo;administrateur choisit l&rsquo;option \u00ab\u00a0supprimer un ingr\u00e9dient\u00a0\u00bb, une nouvelle fen\u00eatre s&rsquo;ouvre : AdminDeleteIngredientActivity. La liste des ingr\u00e9dients est charg\u00e9e depuis la base de donn\u00e9es. L&rsquo;administrateur a ensuite la possibilit\u00e9 de choisir un ingr\u00e9dient \u00e0 supprimer. Cet ingr\u00e9dient sera envoy\u00e9 via Bluetooth Low Energy (BLE) \u00e0 la base de donn\u00e9es du Raspberry Pi pour \u00eatre supprim\u00e9. Enfin, la liste des ingr\u00e9dients mise \u00e0 jour est renvoy\u00e9e du Raspberry Pi vers le t\u00e9l\u00e9phone de l&rsquo;administrateur.<\/div>\n<\/div>\n<\/div>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195154_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8226 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195154_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195208_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8227 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195208_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a>Pour ajouter ou supprimer un cocktail, le principe est le m\u00eame. Pour ajouter un cocktail, on ne peut le faire qu&rsquo;\u00e0 partir de la liste des ingr\u00e9dients d\u00e9j\u00e0 pr\u00e9sents dans la base de donn\u00e9es.<br \/>\n<\/span><\/p>\n<p>Si l&rsquo;on souhaite ajouter un cocktail contenant un ingr\u00e9dient qui n&rsquo;est pas encore pr\u00e9sent dans la base de donn\u00e9es, il faut d&rsquo;abord ajouter cet ingr\u00e9dient en utilisant les options d&rsquo;ajout d&rsquo;ingr\u00e9dients d\u00e9crites pr\u00e9c\u00e9demment.<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195333_Robotise.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8230 alignleft\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/Screenshot_20230315_195333_Robotise-135x300.jpg\" alt=\"\" width=\"135\" height=\"300\" \/><\/a><\/span><\/p>\n<div class=\"message-2CShn3 cozyMessage-1DWF9U wrapper-30-Nkg cozy-VmLDNB zalgo-26OfGz\" role=\"article\" data-list-item-id=\"chat-messages___chat-messages-1049608311974150204-1095025746189234296\" aria-labelledby=\"message-username-1095024596534698035 uid_1 message-content-1095025746189234296 uid_2 message-timestamp-1095025746189234296\">\n<div class=\"contents-2MsGLg\">\n<div id=\"message-content-1095025746189234296\" class=\"markup-eYLPri messageContent-2t3eCI\">Si l&rsquo;administrateur choisit l&rsquo;option \u00ab\u00a0mettre \u00e0 jour les quantit\u00e9s des ingr\u00e9dients dans la machine\u00a0\u00bb, une nouvelle fen\u00eatre s&rsquo;ouvre : AdminMajQuantiteActivity. Sur cette fen\u00eatre, l&rsquo;administrateur peut mettre \u00e0 jour les quantit\u00e9s et le bec correspondant \u00e0 chaque ingr\u00e9dient. D\u00e8s que l&rsquo;administrateur a termin\u00e9 la mise \u00e0 jour des ingr\u00e9dients, les nouvelles donn\u00e9es sont envoy\u00e9es \u00e0 la base de donn\u00e9es du Raspberry Pi via Bluetooth Low Energy (BLE).<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Lien vers les sources applications :<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">[1]:<a href=\"https:\/\/github.com\/android\/connectivity-samples\/tree\/main\/BluetoothLeGatt\">https:\/\/github.com\/android\/connectivity-samples\/tree\/main\/BluetoothLeGatt<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">[2]:<a href=\"https:\/\/developer.android.com\/reference\/android\/bluetooth\/BluetoothGatt.html\">https:\/\/developer.android.com\/reference\/android\/bluetooth\/BluetoothGatt.html<\/a><\/span><\/p>\n<p>&nbsp;<\/p>\n<h3>Structure<\/h3>\n<p><span style=\"font-weight: 400;\"><code>Robotise\u00a0<\/code>\u00a0\u00a0 <\/span><br \/>\n<code><span style=\"font-weight: 400;\">\u251c\u2500\u2500 app\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u251c\u2500\u2500 libs\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u251c\u2500\u2500 src\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u251c\u2500\u2500 androidTest\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u2502 \u00a0 \u2514\u2500\u2500 java\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 com\/example\/robotise\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u2514\u2500\u2500 main\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 java\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u2514\u2500\u2500 com\/example\/robotise\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 ble\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 bluetooth\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 control\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 list\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 model\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 morpion\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 res\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 drawable\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 layout\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 menu\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500 mipmap\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2502 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500 values\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2502 \u00a0 \u2514\u2500\u2500 build.gradle\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u251c\u2500\u2500 build.gradle\u00a0 <\/span><\/code><br \/>\n<code><span style=\"font-weight: 400;\">\u2514\u2500\u2500 settings.gradle\u00a0\u00a0<\/span><\/code><\/p>\n<ul>\n<li>\n<h2>Communication BLE sur Raspberry Pi<\/h2>\n<\/li>\n<\/ul>\n<p>Sur le Raspberry Pi, la biblioth\u00e8que \u00ab\u00a0ble\u00a0\u00bb contient toutes les classes utiles \u00e0 l&rsquo;impl\u00e9mentation du serveur GATT sur Raspberry Pi. Le fichier main.py doit \u00eatre lanc\u00e9 sur le Raspberry Pi, il cr\u00e9e un serveur GATT qui va pouvoir communiquer avec l&rsquo;application.<\/p>\n<h3><b><\/b>Organisation<\/h3>\n<p>Cette biblioth\u00e8que contient 3 fichiers :<\/p>\n<ul>\n<li>advertisement.py : Contient les classes n\u00e9cessaires \u00e0 l&rsquo;\u00e9mission des diff\u00e9rents UUIDs apr\u00e8s la cr\u00e9ation du serveur.<\/li>\n<li>gatt_server.py : Contient les classes n\u00e9cessaires \u00e0 la cr\u00e9ation du serveur et l&rsquo;initialisation de ses diff\u00e9rents param\u00e8tres.<\/li>\n<li>main.py : Initialise le serveur BLE en utilisant les classes r\u00e9alis\u00e9es pr\u00e9c\u00e9demment.<\/li>\n<\/ul>\n<h3>Fonctionnement<\/h3>\n<p><span style=\"font-weight: 400;\">Les concepts abord\u00e9s dans la partie suivante sont expliqu\u00e9s ici :<\/span><a href=\"https:\/\/www.bluetooth.com\/bluetooth-resources\/intro-to-bluetooth-low-energy\/\"> <span style=\"font-weight: 400;\">https:\/\/www.bluetooth.com\/bluetooth-resources\/intro-to-bluetooth-low-energy\/<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Les fichiers <\/span><span style=\"font-weight: 400;\">advertisement.py<\/span><span style=\"font-weight: 400;\"> et <\/span><span style=\"font-weight: 400;\">gatt_server.py<\/span><span style=\"font-weight: 400;\"> ne sont pas de nous et \u00e0 ce titre, ne feront pas l&rsquo;objet d&rsquo;une documentation (Cr\u00e9dit :<\/span><a href=\"https:\/\/github.com\/bluez\/bluez\"> <span style=\"font-weight: 400;\">https:\/\/github.com\/bluez\/bluez<\/span><\/a><span style=\"font-weight: 400;\">).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Le fichier <\/span><span style=\"font-weight: 400;\">main.py<\/span><span style=\"font-weight: 400;\"> utilise <\/span><span style=\"font-weight: 400;\">advertisement.py<\/span><span style=\"font-weight: 400;\"> et <\/span><span style=\"font-weight: 400;\">gatt_server.py<\/span><span style=\"font-weight: 400;\"> pour cr\u00e9er le serveur BLE.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">On dispose de deux classes :<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">TxCharacteristic<\/span><span style=\"font-weight: 400;\"> qui g\u00e8re la communication dans le sens Raspberry PI -&gt; T\u00e9l\u00e9phone<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">RxCharacteristic<\/span><span style=\"font-weight: 400;\"> qui g\u00e8re la communication dans le sens T\u00e9l\u00e9phone -&gt; Raspberry PI<\/span><\/li>\n<\/ol>\n<p>Ensuite, on red\u00e9finit des classes pour chaque op\u00e9ration que l&rsquo;on veut r\u00e9aliser (mise \u00e0 jour de base de donn\u00e9es, commande, etc), chacune est identifi\u00e9e par un UUID r\u00e9f\u00e9renc\u00e9 en d\u00e9but de fichier.<\/p>\n<p>Tous les UUID ne sont pas utilis\u00e9s, mais ils permettent de couvrir l&rsquo;int\u00e9gralit\u00e9 des cas imagin\u00e9s.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h2><b>Manipulation de la base de donn\u00e9es\u00a0<\/b><\/h2>\n<\/li>\n<\/ul>\n<p>Sur le raspberry, la biblioth\u00e8que \u00ab\u00a0sql\u00a0\u00bb contient toutes les classes et fonctions utiles pour l&rsquo;int\u00e9raction entre le base de donn\u00e9es et le fichier python.<\/p>\n<h3>Fonctionnement<\/h3>\n<p><span style=\"font-weight: 400;\">Voici une description du r\u00f4le de chaque fonction de la biblioth\u00e8que :<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_cocktail_list()<\/span><span style=\"font-weight: 400;\"> : Permet de r\u00e9cup\u00e9rer toutes les colonnes de la table cocktail.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_ingredient_list()<\/span><span style=\"font-weight: 400;\"> : Permet de r\u00e9cup\u00e9rer toutes les colonnes de la table ingredient.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_quantite_machine()<\/span><span style=\"font-weight: 400;\"> : Permet de r\u00e9cup\u00e9rer toutes les colonnes de la table machine.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_all_cocktail_composition_without_bec(id_cocktail)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e l&rsquo;identifiant du cocktail, r\u00e9alise une jointure entre les tables <\/span><span style=\"font-weight: 400;\">composition<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">cocktail<\/span><span style=\"font-weight: 400;\"> et <\/span><span style=\"font-weight: 400;\">ingredient<\/span><span style=\"font-weight: 400;\"> et retourne id_cocktail, nom_cocktail, id_ingredient, nom_ingredient et quantite.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_all_cocktail_composition_with_bec(id_cocktail)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e l&rsquo;identifiant du cocktail, r\u00e9alise une jointure entre les tables <\/span><span style=\"font-weight: 400;\">composition<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">cocktail<\/span><span style=\"font-weight: 400;\"> et <\/span><span style=\"font-weight: 400;\">ingredient<\/span><span style=\"font-weight: 400;\"> et retourne id_cocktail, nom_cocktail, id_ingredient, nom_ingredient, quantite et id_bec.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_bec_from_ingredient(id_ingredient)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e l&rsquo;identifiant d&rsquo;un ingredient, retourne le num\u00e9ro de bec associ\u00e9.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_add_ingredient(nom_ingredient)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e le nom d&rsquo;un ingr\u00e9dient, puis l&rsquo;ajoute dans la base de donn\u00e9e. L&rsquo;identifiant de l&rsquo;ingr\u00e9dient est automatique et le num\u00e9ro de bec est initialis\u00e9 \u00e0 NULL.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_maj_machine(maj)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e une liste de tuples au format : <\/span><span style=\"font-weight: 400;\">&lsquo;machine.id_bec&rsquo;,&rsquo;ingredient.id_ingredient&rsquo;,&rsquo;machine.quantite&rsquo;<\/span><span style=\"font-weight: 400;\">, dans la table ingredient passe toute la colonne id_bec \u00e0 NULL (pour ne pas avoir de doublon), pour chaque identifiant de bec dans la table machine, rajoute la quantite pass\u00e9e en argument et enfin, dans la table ingr\u00e9dient ajoute le num\u00e9ro de bec correspondant \u00e0 l&rsquo;ingr\u00e9dient.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">mysql_get_composition_for_machine(commande)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e une liste de tuples au format : <\/span><span style=\"font-weight: 400;\">&lsquo;id_cocktail&rsquo;,&rsquo;id_ingredient&rsquo;,&rsquo;quantite&rsquo;<\/span><span style=\"font-weight: 400;\"> r\u00e9alise une it\u00e9ration dans la liste pour retourner une liste de tuples au format <\/span><span style=\"font-weight: 400;\">&lsquo;id_bec&rsquo;,&rsquo;quantite&rsquo;<\/span><span style=\"font-weight: 400;\"> ou id_bec repr\u00e9sente l&rsquo;identifiant du bec li\u00e9 \u00e0 l&rsquo;identifiant de l&rsquo;ingredient pass\u00e9 en argument. Si un ingr\u00e9dient ne dispose pas de num\u00e9ro de bec, il n&rsquo;est pas pr\u00e9sent dans la machine donc on sort de la boucle et on retourne None.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">formalize_data_list(function)<\/span><span style=\"font-weight: 400;\"> : Prend en entr\u00e9e une fonction (l&rsquo;une des fonctions ci-dessus) et convertis la sortie soit un tuple ou une liste de tuples en chaine textuel (<\/span><span style=\"font-weight: 400;\">x,y,z\/a,b,c<\/span><span style=\"font-weight: 400;\">) afin de permettre l&rsquo;envoie en Bluetooth.\u00a0\u00a0<\/span><\/li>\n<li><span style=\"font-weight: 400;\">unformalize_data_list(initial_data) : Inverse de la fonction pr\u00e9c\u00e9dente, prend en entr\u00e9e un string au format x,y,z\/a,b,c et reconvertis en tuple ou liste de tuple<br \/>\n<\/span><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h2>Interaction Python \/ plaque PCB<\/h2>\n<\/li>\n<\/ul>\n<p>Concernant le code, tous les d\u00e9tails se trouvent dans le README de la partie machine. Voici quelques informations :<\/p>\n<p>Le code permet de faire l&rsquo;interface entre la commande utilisateur (bec, quantit\u00e9) avec les diff\u00e9rents becs de la machine et les composants utilis\u00e9s.<\/p>\n<p>Dans la machine, les becs 1 et 2 utilisent la pompe 1, tandis que le bec 3 utilise la pompe 2. Chaque bec a sa propre \u00e9lectrovanne pour contr\u00f4ler le liquide voulu, et un d\u00e9bitm\u00e8tre se trouve en sortie et renvoie un signal lorsqu&rsquo;il d\u00e9tecte un liquide le traversant.<\/p>\n<p>Pour faire l&rsquo;interfa\u00e7age avec le Raspberry Pi, on trouve la fonction setupGPIO qui configure les entr\u00e9es-sorties et les PWM pour les pompes.<\/p>\n<p>La fonction stopLine arr\u00eate tous les composants, entre chaque ingr\u00e9dient de la commande, \u00e0 la fin de la commande, ou bien en phase de test \u00e0 la fin du programme.<\/p>\n<p>La fonction startLine g\u00e8re la majeure partie du programme. On peut s&rsquo;en servir pour amorcer le robot et ses pompes, ou bien en fonctionnement normal pour g\u00e9rer le pompage d&rsquo;un ingr\u00e9dient. \u00c0 l&rsquo;int\u00e9rieur, on ajoute l&rsquo;\u00e9v\u00e8nement de callback du d\u00e9bitm\u00e8tre pour contr\u00f4ler la quantit\u00e9 de liquide pomp\u00e9e, et on lance startPompage pour chaque ingr\u00e9dient, fonction simple qui d\u00e9marre les pompes avec une PWM.<\/p>\n<p>Le fichier main.py peut \u00eatre lanc\u00e9 pour les phases de test.<\/p>\n<p>&nbsp;<\/p>\n<h1><b>IV &#8211; R\u00e9sultats, difficult\u00e9es rencontr\u00e9es et perspectives\u00a0<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">Parcourons les diff\u00e9rentes disciplines du projet afin de balayer l\u2019ensemble des r\u00e9sultats que nous proposons en fin de projet, les difficult\u00e9s que nous avons rencontr\u00e9es et ce que nous imaginons pour le futur de ce projet.\u00a0<\/span><\/p>\n<ul>\n<li>\n<h2>Difficult\u00e9s rencontr\u00e9es<\/h2>\n<\/li>\n<\/ul>\n<p>Concernant la partie machine, le design de la carte m\u00e8re et le code Python contr\u00f4lant les composants n&rsquo;ont pas pos\u00e9 de probl\u00e8me particulier, gr\u00e2ce aux nombreux tests interm\u00e9diaires effectu\u00e9s tout au long du projet. Cependant, un probl\u00e8me cons\u00e9quent est apparu en milieu de projet concernant l&rsquo;\u00e9tanch\u00e9it\u00e9 du circuit hydraulique. Certaines pi\u00e8ces imprim\u00e9es en 3D, comme les raccords et les multiplexeurs, peuvent facilement engendrer des fuites ou laisser passer des bulles d&rsquo;air, ce qui d\u00e9samorce les pompes et rend le circuit d&rsquo;eau inutilisable. L&rsquo;id\u00e9al aurait \u00e9t\u00e9 d&rsquo;acheter \u00e9galement en amont ces diff\u00e9rents raccords pour \u00e9viter ces probl\u00e8mes. Nous avons surmont\u00e9 ce probl\u00e8me gr\u00e2ce \u00e0 l&rsquo;utilisation de t\u00e9flon de plomberie.<\/p>\n<p>&nbsp;<\/p>\n<p>Concernant la partie application, le choix du protocole de communication a \u00e9t\u00e9 la principale difficult\u00e9. En effet, la communication BLE est complexe de base, et nous avons d\u00fb l&rsquo;impl\u00e9menter en diff\u00e9rents langages : Python et Java. De plus, ce protocole de communication est assez instable. Par exemple, l&rsquo;application ne reconna\u00eet pas toujours le Raspberry Pi en tant qu&rsquo;appareil BLE disponible. Il faut donc red\u00e9marrer le service Bluetooth sur Raspberry Pi.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h2>R\u00e9sultats<\/h2>\n<\/li>\n<\/ul>\n<p>Tous les composants ont pu \u00eatre int\u00e9gr\u00e9s \u00e0 la machine, et l&rsquo;alimentation 5V \/ 12V se branche directement au secteur, ce qui permet d&rsquo;alimenter le Raspberry Pi et la carte de puissance. La machine finale comprend 3 r\u00e9servoirs de liquide que l&rsquo;on peut remplir via le haut des bouteilles.<\/p>\n<p>Concernant la partie application :<\/p>\n<p>L&rsquo;application fonctionne correctement, et l&rsquo;utilisateur peut communiquer avec la base de donn\u00e9es comme il le souhaite et commander le cocktail de son choix. Pour la d\u00e9monstration, nous avons choisi de mettre trois colorants alimentaires RJB (rouge, jaune et bleu) dans les r\u00e9servoirs afin de pouvoir r\u00e9aliser toutes les couleurs possibles (cens\u00e9es symboliser les cocktails en utilisation normale). Les r\u00e9sultats \u00e9taient tr\u00e8s probants, et la machine a pu fonctionner toute la matin\u00e9e du forum PROCOM sans souci notable, autant du c\u00f4t\u00e9 machine que du c\u00f4t\u00e9 application.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">\u00c9tat final de la machine : Rendu 3D \/ Ch\u00e2ssis final<\/span><\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/20230317_091929-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-8238 alignnone\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/20230317_091929-169x300.jpg\" alt=\"\" width=\"169\" height=\"300\" \/><\/a> \u00a0<a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/en_action_chassis-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8240\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/en_action_chassis-169x300.jpg\" alt=\"\" width=\"169\" height=\"300\" \/><\/a> <a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/received_146780154685695.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8241\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/received_146780154685695-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" \/><\/a> <a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/received_945067679836502.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8242\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/received_945067679836502-225x300.jpeg\" alt=\"\" width=\"225\" height=\"300\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/main_photo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8251\" src=\"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-content\/uploads\/archives\/2023\/03\/main_photo-300x215.png\" alt=\"\" width=\"300\" height=\"215\" \/><\/a><\/p>\n<p>Nous sommes tr\u00e8s satisfaits du r\u00e9sultat, apr\u00e8s de nombreuses difficult\u00e9s. Le travail en \u00e9quipe \u00e9tait tr\u00e8s efficace et nos liens se sont renforc\u00e9s. Nous encourageons les lecteurs de cet article \u00e0 proposer des projets de ce type \u00e0 l&rsquo;IMT, source d&rsquo;interdisciplinarit\u00e9 et de libert\u00e9 dans les choix du projet.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h2>Perspectives<\/h2>\n<\/li>\n<\/ul>\n<p>Les perspectives d\u2019am\u00e9liorations sont les suivantes :<\/p>\n<ul>\n<li>r\u00e9aliser une ligne pour le rin\u00e7age et l\u2019ajouter au syst\u00e8me<\/li>\n<li>rajouter d\u2019autres lignes pour avoir une multitude de choix<\/li>\n<li>faire un ch\u00e2ssis plus solide avec des mat\u00e9riaux plus adapt\u00e9s (r\u00e9sistant \u00e0 l\u2019eau)<\/li>\n<li>mettre une interface graphique int\u00e9gr\u00e9e au robot<\/li>\n<\/ul>\n<h1><b>V &#8211; Annexes<\/b><\/h1>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Lien gitlab : <a href=\"https:\/\/gitlab.imt-atlantique.fr\/procom2022-robotise\/\">https:\/\/gitlab.imt-atlantique.fr\/procom2022-robotise\/<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Publicit\u00e9 diffus\u00e9e lors du forum Projet : <\/span><\/p>\n\n","protected":false},"author":1,"featured_media":8251,"parent":0,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"categories":[20],"type_projet":[],"class_list":["post-8215","projet","type-projet","status-publish","has-post-thumbnail","hentry","category-projets"],"acf":{"objectifs":"","categorie":false,"fichiers_associes":null},"_links":{"self":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/8215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet"}],"about":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/types\/projet"}],"author":[{"embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/users\/1"}],"version-history":[{"count":1,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/8215\/revisions"}],"predecessor-version":[{"id":10386,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/projet\/8215\/revisions\/10386"}],"wp:attachment":[{"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/media?parent=8215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/categories?post=8215"},{"taxonomy":"type_projet","embeddable":true,"href":"https:\/\/hub.imt-atlantique.fr\/fablab\/wp-json\/wp\/v2\/type_projet?post=8215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}