Un distributeur automatique de capsules Nespresso

Un distributeur automatique de capsules Nespresso

Quand on possède une machine à café Nespresso, la première question que l'on se pose est "Comment est-ce que je vais classer les différentes couleurs de capsules à café?". En discutant avec des amis aux solutions existantes à ce "problème", on nous a mis au défit de réaliser un distributeur automatique de capsules. Évidemment on n'a pas pu résister...




Autant être clair, le but est simplement de frimer un peu quand les amis viennent prendre un café à la maison. Ce distributeur est plus cher, plus compliqué et probablement moins pratique qu'un bête bol avec toutes les capsules en vrac.

Ce distributeur automatique de capsules à café utilise une vieille tablette Android et plusieurs servomoteurs contrôlés par un Yocto-Servo. La tablette exécute une application native qui liste les cafés disponibles. Une fois le café sélectionné, l'application actionne un servomoteur qui libère une capsule du café choisi.

Voilà notre distributeur automatique de capsules à café
Voilà notre distributeur automatique de capsules à café



La partie mécanique: le distributeur


Le distributeur est composé de 5 rails de distribution. Les rails sont disposés verticalement. Les capsules sont insérées par le haut du rail et sortent par le bas. Chaque rail de distribution est actionné par un seul servomoteur et permet de contenir 10 capsules. Les 5 rails sont branchés sur les 5 sorties du Yocto-Servo.

La plus grosse difficulté de ce projet est la réalisation des rails de distribution, plus particulièrement du mécanisme qui permet de distribuer une capsule à la fois.

En bas du rail se situe une came qui est actionnée par un servomoteur. En positon de repos, la came bloque l'extrémité du rail et empêche les capsules de sortir. Si l'on active le servomoteur, la came pivote de 150 degrés et libère la dernière capsule tout en bloquant les autres capsules.

  
Lorsque la came pivote, elle libère une seule capsule



Une fois que la capsule est tombée, la came revient à sa position de repos et toutes les capsules descendent d'une position.




Une vue détaillé d'un rail de distribution"



Vous pouvez télécharger les fichiers nécessaires à la construction de ce distributeur de capsules sur Thingiverse.

La partie connexion: USB ou WiFi


Dans notre cas, nous avons utilisé une tablette Acer A200 qui possède un port USB et une prise de charge. Nous avons donc branché directement le Yocto-Servo sur le port USB de la tablette avec un câble USB d'un mètre. Le Yocto-Servo est alimenté directement par la tablette qui est rechargée par le câble de charge.

Pour notre exemple, nous avons utilisé une connexion USB
Pour notre exemple, nous avons utilisé une connexion USB



Cependant, la plupart des tablettes récentes utilisent le port USB pour se recharger. Dans ce cas, il existe deux options: La première est d'utiliser un câble en Y disponible chez certains fournisseurs.

La seconde est d'utiliser un YoctoHub pour connecter le Yocto-Servo à votre réseau local. L'application communique alors avec le Yocto-Servo en utilisant le réseau local au lieu d'une connexion USB. Le code de l'application reste inchangé, il faut simplement passer en paramètre l'adresse IP de votre YoctoHub au lieu du mot clef "USB" à la méthode YAPI.RegisterHub().

Il est aussi possible d'utiliser une connexion WiFi
Il est aussi possible d'utiliser une connexion WiFi



La partie software: l'application Android


L'application Android est très simple et s'inspire très fortement de l'exemple FragmentStatePagerAdapter de la documentation Android. L'application va afficher plusieurs pages qui présentent les cafés disponibles. Chaque page contient un bouton qui libère une capsule du distributeur.

Un screenshot de l'application
Un screenshot de l'application



Tout le code qui contrôle le distributeur est regroupé dans la classe DispenserInterface. Cette classe est un sigleton qui implémente 4 méthodes:

  1. Get(Context ctx) retourne le singleton
  2. startUsage() initialise la connexion avec le Yocto-Servo
  3. stopUsage() libère les ressources utilisées pour la connexion avec le Yocto-Servo
  4. distributeCapsule(int index) envoie les commandes au Yocto-Servo pour distribuer une capsule


Les méthodes startUsage() et distributeCapsule(int index) déclenchent une communication avec le module qui peut provoquer une attente (par exemple si le Yocto-Servo est débranché). Par conséquent, le code des ces deux méthodes est exécuté en arrière plan en utilisant une AsyncTask.

Note: Étant donné que notre module est branché en permanence par USB, nous pourrions exécuter la méthode startUsage() depuis le thread principal, mais cela figerait l'interface pendant l’exécution du code. De toute façon, sous Android, il est recommandé d’exécuter les opérations d'IO en arrière plan pour que l'application reste réactive.

Le code qui libère une capsule obtient un objet YServo qui permet d’interagir avec une sortie du Yocto-Servo. Il change la position du servomoteur, attend une seconde et restaure la position. Au lieu d'utiliser directement la méthode set_position, on utilise la commande move qui permet de définir le nombre de millisecondes pour atteindre la position finale. Cela permet d'avoir un mouvement plus fluide de la came.

public class YoctopuceInterface implements YAPI.LogCallback {
  ...

  private class DistributeCapsule extends AsyncTask<Integer, Void, String> {

    @Override
    protected String doInBackground(Integer... params) {
      int index = params[0];
      String hwid = String.format("%s.servo%d", _serial, index+1);
      YServo servo = YServo.FindServo(hwid);
      try {
        servo.move(UP_POSITION, 300);
        Thread.sleep(1000);
        servo.move(DOWN_POSITION, 300);
      } catch (YAPI_Exception e) {
        e.printStackTrace();
        return e.getLocalizedMessage();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      return null;
    }

    @Override
    protected void onPostExecute(String error) {
      if (error != null) {
        Log.e("YAPI", error);
        _lastError = error;
      }
    }
  }

  public synchronized void distributeCapsule(int tubeIndex) {
    new DistributeCapsule().execute(tubeIndex);
  }
  ...
}



Le reste du code n'est pas détaillé dans cet article car il s'agit soit de code déjà détaillé dans de précédents articles, soit de gestion des éléments de l'interface. Le projet Android Studio de l'application est disponible sur GitHub pour les plus curieux.


Conclusion


  
Maintenant, c'est le moment de frimer



On ne va pas vous mentir: ce distributeur n'a pas été réalisé en 5 minutes. La modélisation, l'impression 3D, la découpe du plexiglas et l'assemblage ont occupé plusieurs soirées :-) Mais si l'on écarte la partie mécanique, le reste n'a pris que quelques heures. Les branchements sont triviaux (même pas besoin de fer à souder) et le code qui gère les servomoteurs tient dans un classe de 150 lignes. Ce projet illustre bien ce que l'on cherche à réaliser chez Yoctopuce: fournir des modules faciles à utiliser pour que l'utilisateur n'ait pas à perdre du temps sur la partie électronique et puisse se concentrer sur le reste.

Commenter 2 commentaires Retour au blog



1 - mathcoll Samedi 07 février 2015 13H58

Bon, prochaine étape : la capsule doit entrer directement dans le module de la machine afin de ne plu avoir de manipulation à faire.
Ensuite il faudra pouvoir le gérer via une application non reliée au module..
ça doit être faisable, non ? :-)

Question: j'ai pas regardé le code source, mais est ce que vous avez géré le stock de capsule ?

2 - seb (Yocto-Team)Mardi 10 février 2015 18H21

On a réfléchi à une solution qui injecte directement la capsule dans la machine, mais c'est beaucoup plus compliqué. De toute manière, il faudra vider à la main le bac de capsules utilisées.

Sinon le code ne gère pas l'inventaire des capsules, car le but était simplement de faire un distributeur. Et il faut bien qu'on laisse un peu de travail a nos lecteurs :-)

Yoctopuce, get your stuff connected.