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é
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
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
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
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:
- Get(Context ctx) retourne le singleton
- startUsage() initialise la connexion avec le Yocto-Servo
- stopUsage() libère les ressources utilisées pour la connexion avec le Yocto-Servo
- 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.
...
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.