1. Introduction

À l'aide d'un kit Arduino et d'un cours ayant permis d’acquérir des bases en matière de la programmation de circuits Arduino, un prototype de confectionneur de semainier sera réalisé. Les semainiers sont utilisés majoritairement par les personnes âgées. Ces récipients de formes et tailles diverses et variées ont pour point commun d'être divisés en 7 parties (une par jour de la semaine), elles-mêmes divisées en plusieurs parties (les moments auxquels doivent être pris les médicaments) et pour fonction de permettre à la personne les utilisant d'acquérir un automatisme consistant à simplement ingérer l'ensemble des médicaments contenu dans ledit semainier plutôt que de devoir penser à prendre chaque médicament. Les semainiers sont généralement confectionnés par de tierce personne, les personnes âgées n'ayant plus la capacité de le faire. Le problème posé par les semainiers est le temps nécessaire à leur confection, puisque après chaque utilisation, le semainier, vide doit être remplis. Cette opération, suivant la variété de médicaments nécessaire à une personne, peut prendre de nombreuses minutes d'un temps précieux. Le confectionneur automatique de semainier aurait pour fonction de remplir lui-même un semainier en fonction de la manière dont il aurait été programmé. L'avantage étant qu'il suffirait de programmer une fois l'appareil tant que le traitement ne change pas.

Ce projet ne vise à produire qu'un prototype, ainsi, l'esthétique ne fera l'objet d'aucune attention particulière et il est à noter que le confectionneur de semainier proposé ne pourra remplir qu'un jour, et ce, avec un seul médicament. Le médicament choisi est ici le Paracétamol Sandoz 500.

2. Matériel et méthodes

2.1 Matériel

Un kit Arduino est requis pour mener à bien ce projet. Dans le kit, il est absolument nécessaire d'avoir a disposition :

  • deux moteur servo et leurs embouts en croix
  • câbles arduino
  • un microcontrôleur
  • un bouton
  • 4 légos d'1 unité de large et 8 unités de long
  • un légo de deux unités sur deux unités
  • du fil de couture
  • du papier de verre

Pour la partie mécanique du projet, une imprimante 3D sera utilisée, mais l'ensemble des pièces peuvent être réalisées à la main avec, par exemple, du carton.

Projet_info_pieces.png

Ci-dessus, l'ensemble des pièces réalisées, ainsi que le fichier sketchup. Notons cependant que le système sensé convertir la rotation des moteurs en poussée n'a pas aboutit en raison des mauvaises dimensions des pièces rectangulaires comportant trois trous (2 et 10). La grande pièce (2) aurait pu être utilisée tout de même, pour autant que l'on la lime un peu, mais la plus petite des deux pièces (10) n'est pas utilisable. Le reste est théoriquement utilisable. Cependant, la hauteur du cylindre (11) devra parfois être adaptée en fonction des capacité de l'imprimante utilisée. Dans le cas où un autre médicament que le Paracétamol Sandoz 500 est utilisé, son diamètre devra également être adapté.

2.2 Montage

2.2.1 Montage électronique

Montage1.png Montage2.png

Ci-dessus, deux photos du montage.

Le montage n'a rien de compliqué, puisqu'il suffit d'alimenter les deux servos et le bouton, et de leur attribuer à chacun un port.

2.2.2 Montage du confectionneur de semainier

L'impression 3D n'ayant pas produit le résultat recherché (cf. "4. Discussion"), je ne peux mettre à disposition aucune photo du montage réalisé. Voici cependant une photo de ce qu'aurait du être le montage.

Montage_theorique.png

Pour le grand moteur, on assemble les légos et l'embout à l'aide de la ficelle et d'un peu de colle pour arriver à ce résultat.

Grand_moteur_1.png Grand_moteur_2.png

Le grand moteur ira se loger dans la pièce (3) alors que le petite fera de même dans la pièce (4).

2.3 Code

Le code est assez basique.


#include <Servo.h>

Servo servo1;  
Servo servo2;

const int buttonPin = 2; 
int buttonState = 0;

  // C'est ici qu'il faut entrer le nombre de médicaments souhaités\
  
                         int Matin   = 3      ;
                         int Midi    = 1      ;
                         int Soir    = 2      ;
                         
  //----------------------------------------------------------------\
  
  int decompteMatin  = 0;
  int decompteMidi   = 0;
  int decompteSoir   = 0;

void setup()
{
  
    pinMode(buttonPin, INPUT); 
  

  
  servo2.attach(9);
  servo1.attach(10);
}


void loop()
{
  
  
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {   
    
    decompteMatin  =   Matin  ;
    decompteMidi   =   Midi   ;
    decompteSoir   =   Soir   ;
  }
  
  if (decompteMatin > 0){
    
      servo2.write(10);
    
    delay(1000);
    
    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteMatin -= 1;
    
    delay(1000);
    
}
    
   if (decompteMidi > 0){
    
      servo2.write(60);
    
    delay(1000);
     
    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteMidi -= 1;
    
    delay(1000);
    
}
   
   if (decompteSoir > 0){
     
      servo2.write(120);
    
    delay(1000);
    
    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteSoir -= 1;
    
    delay(1000);
   
}

}

Le principe est relativement simple. Il s'agit d'attribuer manuellement aux trois moments clés de la journée une valeur représentant le nombre de médicament souhaité dans la case correspondant au moment choisi. Par exemple, dans ce cas, il y aura 3 médicaments dans la première case, celle qui correspond au matin, 1 dans la seconde, correspondant à midi et 2 dans la dernière case, correspondant au soir, car le code attribue ces valeurs aux différentes variables (l.10-16) : (Notons que dans ce code, les valeurs des angles sont arbitraires, n'ayant pu être testés (cf. "3. Résultats")

 // C'est ici qu'il faut entrer le nombre de médicaments souhaités\
  
                         int Matin   = 3      ;
                         int Midi    = 1      ;
                         int Soir    = 2      ;
                         
  //----------------------------------------------------------------\

Lorsque le bouton est pressé, il attribue la valeur de chaque variable à une "copie" de cette variable :

 buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {   
    
    decompteMatin  =   Matin  ;
    decompteMidi   =   Midi   ;
    decompteSoir   =   Soir   ;
  }

Cela permettra de soustraire des valeurs aux variables "decompte"Moment"" sans pour autant altérer la valeur des variables "Moment".

Lorsque les variables "decomptes"Moment"" sont supérieures à 0, chacune permet à une action différente de s'effectuer. Le principe est le même pour les trois variables, mais prenons l'exemple de "decompteMatin" (l.46-62). Dans ce cas, "decompteMatin"="Matin" et "Matin"=3, donc "decompteMatin"=3. Par conséquent "décompteMatin">0, l'action peut donc s'effectuer (l.46). Dans un premier temps, le moteur "servo2" positionnera le semainier correctement(l.48-50). Le moteur "servo1" ouvrira et fermera ensuite le tube contenant les médicaments, faisant tomber 1 médicament dans la case voulue (l.52-56). La valeur de "decompteMatin" diminuera alors de 1 (l.58-60), puis c'est "décompteMidi" qui sera alors exécuté. Une fois que cette partie du code a été exécuté une première fois, elle le sera une seconde, puis une deuxième, etc, jusqu'à ce que la valeur de toute les variables "decomptes"Moment"" soient égale à 0:

 if (decompteMatin > 0){
    
      servo2.write(10);
    
    delay(1000);
    
    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteMatin -= 1;
    
    delay(1000);
    
}

3. Résultats

Les résultats ne sont de loin pas ceux attendus. Le confectionneur de semainier n'a pu être monté en raison des pièces défectueuses. Ainsi, bien que le code semble parfaitement utilisable, il n'a pu être appliqué de manière pratique.

4. Discussion

4.1 Analyse des résultats

4.1.1 Le mauvais design

La première raison à l'échec du projet est le mauvais design de certaine pièce (notamment la pièce (10) qui était loin d'être précise, les trous étant trop éloignés). Cela s'explique par mon manque d'expérience en matière de design de ce genre de pièce. En effet, en plus des dimensions inappropriées, certaines évidences ne me sont pas venue à l'esprit, telles que le fait que l'embout en forme de croix restera, évidemment bloquée par les bords parallèles des trous dans la pièce (notons que limer la pièce aurait pu résoudre ce problème (cf. "4.1.3 Les restrictions techniques") :

Probleme_1.png

Ci-dessus, une illustration du problème décrit plus haut.

4.1.2 L'impression défectueuse

Si l'impression des pièces présente d'énormes avantages, au niveau de la variété des pièces possibles par exemple, elle peut parfois, si elle n'est pas maîtrisée, apporter son lot de problèmes, ce qui fut le cas ici.

4.1.2.1 La "disparition" de certaines pièces

Certaines pièces ont une forme si différente de leur forme théorique que l'ont peut pratiquement parler de disparition. Il ne fut retrouvé aucun résidu de la pièce (3), et voici une photo du cylindre (11):

Probleme_2.png

Bien qu'utilisé comme exemple car représentatif du problème, la "disparition" du cylindre n'est pas tant un problème en soi puisqu'il est possible d'en construire un à l'aide d'une fourre plastique découpée de manière à obtenir une feuille de plastique de format A4, que l'on enroulera pour atteindre le diamètre adapté au médicament utilisé. Le problème de cette méthode étant qu'il faut ensuite parvenir à fixer le nouveau cylindre à son support (12). Pour cela, un morceau de carton peut, par exemple, être utilisé.

Solution.png

Ci-dessus, une photo de la "solution" trouvée

4.1.2.2 Les défauts des pièces

Si vous ne savez pas à quoi ressemble une pièce correctement imprimée, je vous invite à aller consulter l'un des autres billets disponibles sur le site. Le problème des pièces imprimées dans ce cas était principalement la porosité de ces dernières. Là ou une pièce compacte aurait été nécessaire, voilà ce qui fut obtenu pour la pièce (12) par exemple :

Probleme_3.png

Les principaux inconvénient de cette porosité sont le manque de précision venant s'ajouter au mauvais design (empêchant ainsi d'assembler ou de coller certaines pièces telles que la (6), la (7) et la (9)), et la fragilité (empêchant, elle, de limer efficacement certaine pièces afin de corriger les autres problèmes)

4.1.3 Les restrictions techniques

Corriger le mauvais design de la pièce (10) aurait été possible avec du matériel plus performant que celui étant à ma disposition (limer les bord d'un trou de 2mm avec un bout de papier de verre n'est pas réellement faisable.)

À nouveau, ce problème n'a rien de réellement grave, et ce projet est parfaitement réalisable sans matériel de professionnel. Cependant, les diverse solutions trouvées nécessitaient soit une seconde impression (impossible en raison du temps et des ressources) soit, justement, d'avoir accès à du meilleur matériel.

4.2 Éviter de faire les mêmes erreurs

Afin de pouvoir mener à bien ce projet, il est important de: - Se renseigner sur les capacité de l’imprimante, et réaliser les pièces en conséquence. - Être méthodique en ce qui concerne la partie mécanique. Il n'y aura q'un seul essai et ça doit être le bon, faire donc bien attention à ce que, théoriquement, la partie mécanique fonctionne. - Prévoir des solutions de secoure en cas d'impression défectueuse.

5. Conclusion

Même si le projet avait pu être mené à bien, il n'aurait pu confectionner qu'un jour de semainier avec un seul médicament. Afin de pouvoir constituer un semainier entier, il faudrait un servo de plus. Et afin de pouvoir utiliser plus d'un médicament, il faudrait un servo de plus par médicament. De plus, les dimensions de ces derniers poseraient problème.

5.1 Du prototype au confectionneur de semainier final

5.1.1 Le nombre de jour

Afin d'obtenir un semainier complet (de 7 jours), il suffirait d'ajouter un servo "servo3" et une variable par moment de la journée par jour ("LundiMatin" remplacerait "Matin"). Il suffirait d'adapter un petit peu le code et les dimensions des diverses pièces afin de pouvoir répartir les médicaments dans un semainier complet. Voici un exemple de ce que donnerai une partie du code pour un semainier complet :

 if (decompteLundiMatin > 0){
    
      servo2.write(10);
    
    delay(1000);
    
    servo3.write(10)

    delay(1000)

    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteLundiMatin -= 1;
    
    delay(1000);
}

Attention à ne pas oublier d'adapter la partie qui attribue au variables "decompte"variable"" la valeur des variables "variables"

5.1.2 Diversifier les médicaments

C'est la partie la plus dur à adapter afin de faire du prototype un réel confectionneur de semainier. En effet, les médicaments présentent des dimensions diverses et variées. Il serait impossible, ou du moins peu pratique, de designer un tube pouvant contenir chacun d'entre eux. Une alternative serait d'utiliser, à nouveau, des feuilles de plastique souples afin de le plier en cylindre (cf. "4.1.2.1 La "disparition" de certaines pièces"). Cependant, au lieu de coller la feuille à elle-même, il faudrait élaborer un système permettant d'atacher la feuille à elle-même afin qu'elle ne puisse se dérouler d'elle-même, mais qu'une personne quelconque puisse adapter le diamètre du tube en tirant simplement sur le bord de la feuille :

mise_en_perspective.png

Ci-dessus un schéma d'un tube à diamètre variable.

5.1.3 Augmenter le nombre de médicaments différents

Afin d'avoir un confectionneur de semainier réellement efficace, il est nécessaire d'augmenter le nombre de tubes afin d'avoir à disposition une plus large palette de médicaments. Ensuite, il faudrait soit adapter les servo afin qu'il se positionnent sous chacun des tubes, soit positionner les tubes au dessus d'un entonnoir. La programmation ne changerait, à nouveau, que peu. Il suffirait en effet de programmer les servo afin que chaque tube aie un servo attribué, et d'adapter les variable en fonction des emplacements de médicaments.Ainsi, "LundiMatin" finirait par devenir "LundiMatin1", une variable indiquant combien de médicaments présent dans le tube numéro 1, le confectionneur devra mettre dans la case correspondant au Lundi matin. Au niveau du code, cela donnerait par exemple :

if (decompteLundiMatin1 > 0){
    
      servo2.write(10);
    
    delay(1000);
    
    servo3.write(10)

    delay(1000)

    servo1.write(90);    

    delay(1000);  

    servo1.write(10);    
    
    decompteLundiMatin1 -= 1;
    
    delay(1000);
}
if (decompteLundiMatin2 > 0){
    
      servo2.write(10);
    
    delay(1000);
    
    servo3.write(10)

    delay(1000)

    servo4.write(90);    

    delay(1000);  

    servo4.write(10);    
    
    decompteLundiMatin2 -= 1;
    
    delay(1000);
}
etc...

Dans l'exemple ci-dessus, le servo attribué au tube 2 est "servo4"

Encore une fois il faudrait également adapter les dimensions des pièces, ainsi que leur nombres.

5.2 En conclusion

En conclusion, bien que le projet n'ai pu aboutir, il aura permis tout de même, je pense, de remplir son rôle en tant que prototype. En effet, quelques bases à partir desquels élaborer un réel confectionneur de semainier sont à présent disponibles. De plus, ce travail m'a fortement enrichi personnellement. Il n'était donc pas inutile bien que le résultat soit décevant.