Un émulateur de cartes à puce
Suivante

 

Accueil
Remonter

 

Ca faisait longtemps que l'idée me trottait dans la tête et puis il faut le dire aussi, que certaines personnes me le demandaient.

Le système à cartes à puces a de nombreux atouts et en particulier sa convivialité proche de celle du carton, mais certains utilisateurs aimeraient bien simplifier l'approvisionnement et éventuellement diminuer le coût des cartes. Voici donc un petit appareil qui à lui seul peut remplacer des milliers de cartes, tout en offrant la même facilité d'utilisation.

L'exercice est le suivant : Notre carte à puce est simplement une mémoire interfacée selon le protocole I2C. Du coup, on se dit qu'il doit bien être possible de remplacer la petite mémoire de chaque carte par une "portion" d'une plus grosse mémoire et d'y accéder en émulant ce même protocole, au moyen du microcontroleur d'une arduino, par exemple. Le lecteur PPCaP n'y verrait rien et pour changer de carte il suffirait de changer de zône mémoire.

Alors j'ai parcouru quelques forums à la recherche de pistes allant dans ce sens ou pourquoi pas, d'une solution existante. Et là, je suis tombé sur des "savants" qui m'ont expliqué que c'était une mauvaise idée parce que dans le monde arduino il était impossible de faire cohabiter les protocoles I2C et SPI (gestion d'une carte SD), à cause d'un timer qu'il faudrait partager. Soit.
Mais bon, il n'y a rien de plus vain que de m'expliquer qu'une chose est impossible, puisque de toutes façons j'essaye quand-même. Et au final... Ben ça marche ! ;o). Non pas que ces personnes avaient complètement tort (quoique...), mais en se débrouillant bien pour écrire le code et en faisant en sorte que les 2 protocoles ne soient jamais actifs en même temps, tout baigne. Non mais.

Le principe

Les fichiers de données sont exactement les mêmes que ceux qui sont habituellement sur les cartes à puces. Cette fois-ci ils sont stockés sur une carte micro-SD et sont identifiés par un numéro. L'émulateur devra donc permettre de choisir ce numéro. Le fichier sélectionné est ensuite lu séquentiellement au rythme des requètes reçues sur le bus I2C et en réponse les données sont transmises sur ce même bus, exactement comme le fait une carte mémoire.

Plusieurs prototypes ont été réalisés, dont un premier où la sélection des morceaux se faisait avec des roues codeuses. A l'ancienne quoi. C'est efficace, peu gourmand en ressources et cela a permis de valider le mécanisme de cohabitation entre SPI et I2C. C'était déjà un grand pas dans la bonne direction.

Les fonctions principales sont validées

Mais les roues codeuses c'est un peu vieillot et finalement assez encombrant. Alors, pourquoi pas un petit écran du genre de ces Oled fort sympathiques et peu onéreux que l'on trouve sur le commerce chinois. Seulement voilà... ils sont pour la plupart interfacés eux aussi en I2C. Et là il a fallut se gratter la tête une fois de plus, puisque l'émulateur va devoir tantôt être maitre vis à vis de son écran, tantôt esclave vis à vis de l'instrument PPCaP.  En sachant qu'il est hors de question de toucher au programme PPCaP qui est toujours maitre vis à vis de ce qu'il considère commme une simple carte à mémoire.
Mais bon, tout ça est résolu ;o)

Le proto avec écran et un seul bouton de sélection. Reste à mettre au propre

Version de base

Voici ce premier croquis d'assemblage où l'on ne trouve que des éléments commerciaux :
- En premier une sorte d'adaptateur/connecteur de cartes à puces. Il reçoit des cartes au format SIM d'un côté et les connecte à un terminal selon le format ISO7816. Ne me demandez pas à quoi ça peut servir "en vrai", mais dans le domaine des terminaux de paiement électroniques on appelle ça une carte biberon... Ici on ne va utiliser que la fonction connecteur qui a la particularité de fonctionner quelque soit le sens d'insertion de la carte. Cool.
- Un adaptateur pour cartes micro-SD qui est nécessaire pour faire la conversion en 3.3V. J'ai préféré ce format, qui est plus répandu aujourd'hui que le SD.
- Un petit écran Oled 128x64 pixels de 0.91".
- Un bouton à 5 contacts façon joystick pour la sélection. C'est un dispositif compact et d'utilisation assez intuitive.
- Et bien sûr une arduino Nano.

Montage

La carte connecteur ISO7816 a été débarrassée de ses connecteurs de cartes SIM inutiles ici. Elle a ensuite été sciée de manière à ne conserver que les 85 mm de longueur d'une carte à puce. On repique les 4 contacts vers la puce sur les multiples pistes qui arrivent en haut.
La carte arduino est fixé sur une face à l'aide de ruban adhésif double-face et l'adaptateur de carte micro-SD sur l'autre face.
Une petite carte collée perpendiculairement à l'Araldite contre l'extrémité supérieure supporte l'écran et les boutons. Je n'avais pas encore reçu les joysticks et pour ce proto ce sont 3 boutons "reset" récupérés sur des cartes arduino Nano hors service. L'écran détermine la hauteur de cette carte : 12.7 mm.

C'est serré hein, mais pas impossible.

 

 

Et finalement, un boitier réalisé à l'imprimante 3D (résine ici) vient coiffer le tout selon la photo en tête de cette page. Si le modèle FreeCad ou les stl de cette version de base vous intéressent, contactez-moi.

Affichage

Voici des exemples d'affichage sur l'écran. Les boutons permettent de sélectionner un numéro de morceau. Ici le bouton gauche sélectionne un digit et les 2 autres boutons font progresser le digit sélectionné.
Le titre comporte les 10 caractères habituellement enregistrés par ProCaP sur les cartes. Et bien que ce ne soit pas utile mais il y avait la place, on indique si le morceau est en Pmidi ou non.

 

Morceau normal et morceau Pmidi

Morceau Pmidi en mode AA (lecture automatique sans manivelle)

Utilisation

Une fois qu'un morceau est sélectionné, on "bascule" dessus par une pression longue sur le bouton PPCaP, comme on le fait habituellement pour passer de A à B sur une carte à puce normale.
Pour sélectionner un nouveau morceau il n'est donc pas nécessaire d'extraire l'émulateur. On arrête de tourner, on sélectionne un numéro de fichier, on appuie sur le bouton PPCaP pour basculer et on tourne. Simple non ?
Et dès le basculement, les tags habituels sont aussitôt pris en compte :
- AA : Le morceau part tout seul en lecture automatique sans actionner la manivelle.
- MM : Tempo original du morceau.
- RF : Si on est récepteur, basculement rouge/vert et attente de synchro. Si émetteur, double clignotement rouge et départ immédiat.
- Etc...

Condition

Ce système fonctionne parfaitement à condition côté instrument de retarder le démarrage du programme PPCaP de quelques centaines de millisecondes. En effet, dès l'insertion de la carte, ce dernier entamme un dialogue avec elle de manière à vérifier sa taille, le type de morceau, la présence de tags etc. Il faut donc donner un peu de temps à l'émulateur pour qu'il s'initialise, qu'il "devienne" une carte à mémoire et soit en mesure de répondre à ce dialogue.
Cette ajout d'une tempo au démarrage de PPCaP est quasiment imperceptible en utilisation normale et n'a bien sûr aucune conséquence sur la synchro radio. Mais il faut faire tout de même intervenir sur l'existant et c'est un peu dommage. La version suivante de l'émulateur va permettre de s'en dispenser.

 

Version évoluée

Le montage précédent a été complètement mis à plat afin de ne conserver que ce qui est nécessaire, en particulier côté arduino. Une carte spécifique a été développée et la plupart des composants sont montés en surface. On récupère ainsi de la place pour un petit accu Lipo qui va permettre de mettre l'émulateur sous tension avant de l'insérer, résolvant ainsi le petit inconvénient de la version de base. Cet accu se recharge sur le 5V du connecteur de cartes à puce dès l'insertion de l'émulateur. Il n'y a donc pas besoin d'un chargeur spécifique et il est toujours chargé. L'émulateur est alors directement compatible avec toutes les versions de PPCaP.

   

La batterie est fixée avec de l'adhésif double face

Le schéma
Tout s'articule autour d'un Atmega328-AU en boitier TQFP. La possibilité d'insérer le connecteur de carte à puce dans n'importe quel sens a été conservée. Donc on retrouve les contacts au bon emplacement sur chacune des faces du circuit imprimé. L'adaptateur de niveau vers la carte micro-SD a été conçu "à ma sauce" autour d'un 74HC4050. Je dis à ma sauce car la plupart des schémas que l'on trouve sur le net avec ce 4050 ne fonctionnent pas dans ce contexte.

Cas particulier de la batterie
Un interrupteur de mise en circuit a été ajouté. Le modèle de batterie retenu comporte son propre module de charge et se recharge sur le 5V du connecteur ISO. Une diode a été ajoutée en série afin d'abaisser la tension à un niveau plus proche des 4.2V habituels pour un seul élément de batterie.
A noter que cette diode n'est pas obligatoire si le module de charge coupe vraiment à 4.2V. Mais bon... Je préfère prendre "ceinture et bretelles" et ne pas appliquer 5 V directement sur la batterie. Et comme le reste du montage se contente très bien d'une tension aux alentours de 4.3 V, la présence de la diode est rassurante ;o)

Mais qui dit batterie dit surveillance de son état de charge.
Cette opération s'effectue via l'entrée ADC2 broche 25 de l'Atmega, sur le pont R5/R6 (4.7K/1K). Comme il s'agit de surveiller la tension sur laquelle le processeur lui-même fonctionne, on ne peut utiliser le fonctionnement par défaut du convertisseur CAN qui prend cette même tension comme référence, sinon on obtient toujours le maximum et on ne surveille rien du tout ;o). On va donc activer la référence interne de 1.1 V pour la fonction analogRead. Ce qui veut dire que la tension maximale qui donnera la valeur 1023 est de 1.1 V. En conséquence, le rôle de ce pont est de ramener la tension à mesurer dans un plage compatible.
Vu de la batterie, on considère 4 paliers qui sont ensuite reportés sur une icone en haut à droite de l'écran : Moins de 3.1V = batterie vide, entre 3.1V et 3.55 V une barre, deux barres entre 3.55V et 4V et batterie chargée avec 3 barres au-dessus de 4 V.
Remarque : Cette information est purement indicative et n'agit en rien sur le module électronique de la batterie qui est complètement autonome. Celui-ci fait son boulot dans tous les cas et stoppe automatiquement la décharge à 3V tandis qu'il arrête la charge à 4.2V.

Le circuit imprimé
L'électronique tient dans la même hauteur de 30 mm que le proto ci-dessus. La cartelette qui supporte l'écran et l'interrupteur-joystick fait partie du même circuit imprimé bien qu'elle ne comporte pas à ce stade de liaison électrique avec le reste. Elle sera donc fabriquée en même temps. Il suffira ensuite de scier le pcb en 2 parties et lorsque les composants CMS seront en place, de souder la carte écran perpendiculairement à la carte principale au niveau des contacts prévus à cet effet et établir ainsi toutes les liaisons requises.

Montage des CMS
Je ne vais pas décrire les détails de cette opération ici car cela dépend beaucoup des habitudes, de l'équipement et de la dextérité de chacun. Voir les nombreuses vidéos à ce sujet, sur Youtube par exemple.
En quelques mots voici comment je procède :
- Ca commence par la fabrication d'un masque pour la soudure (un "stencil" comme ils disent de l'autre côté de la mer). Pour ce qui me concerne, je l'ai gravé à la CNC en une seule passe, avec une fraise à PCB dans de la tôle alu de boite de soda. Ca fait pile la bonne épaisseur. Pour la gravure, la tôle est collée temporairement à la néoprène sur une chute d'époxy et on grave avec une vitesse d'avance assez basse : 80 mm/mn contre 400 mm/mn pour le cuive. Et puis pour faciliter l'évacuation des copeaux c'est mieux de faire travailler la fraise dans de l'huile en déposant quelques gouttes sur la tôle. Une fois que c'est gravé on décolle tranquillement en chauffant au décapeur thermique et en faisant attention à ce que le stencil reste plat.
Sous Eagle et en cochant les bonnes options, le script "PCB-Gcode" génère directement le fichier gcode pour fabriquer ce masque.
- En alignant bien le masque sur le circuit imprimé, une soudure en pâte spécifique (fusion à 181°C) est ensuite étalée uniquement sur les contacts au travers de ce masque.
- On retire délicatement le masque puis on positionne tous les composants le plus précisément possible sur les pavés de pâte à souder.
- Et enfin le circuit imprimé muni de tous ses composants est déposé sur une plaque chauffante afin de refondre la soudure. Dès que l'on atteint la bonne température (environ 200°C), c'est presque magique, on voit les composant littéralement flotter sur la soudure fondue et se centrer sur les pads.
Si tout est correctement effectué, pas trop de soudure pouvant entrainer des court-circuits et composants bien positionnés, en quelques minutes seulement on obtient une carte du plus bel aspect, totalement équipée et prête à l'emploi.

   

Le fameux stencil et le pcb terminé. Le pont de mesure de la tension batterie a été ajouté après-coup

Programmation
Ici il n'y a pas de port USB et l'Atmega est programmé via un connecteur ISP à partir de l'IDE arduino, en utilisant une carte Uno (ou Nano) comme programmateur. J'ai bricolé un connecteur mâle qui s'insère directement dans les trous métallisés du circuit imprimé. Comme ça il n'y a pas besoin de souder un connecteur qui prendrait de la place pour ne servir que quelques fois et ça fonctionne très bien. Les pins sont constituées de broches Dupont mâles doublées d'un morceau de fil de laiton de 8/10 qui procure un peu d'élasticité.

 

Une fois que la programmation est réalisée, il n'y a aucun paramétrage à effectuer et ça fonctionne tout de suite.

 

Enregistrement des morceaux

Il y a 2 manières de procéder:
1. Morceau par morceau
Cela se passe comme pour une carte classique.
- Positionner le commutateur Enregistrement/lecture (R/W) sur Enregistrement (W), mettre l'émulateur en marche et l'insérer dans un lecteur PPCaP connecté à un port USB, puis lancer ProCaP.
- Avec le joystick de l'émulateur sélectionner un numéro libre ("FICHIER INEXISTANT") ou le numéro que l'on veut remplacer.
- Ouvrir le fichier midi, cocher Morceau A et cliquer Programmer lorsque la touche est valide.
- Et c'est tout.

2. Un ensemble de morceaux
Dans ce cas le traitement des fichiers midi s'effectue "en lot" sur ProCaP. On recopie ensuite en une seule fois tous les fichiers générés sur la carte SD.
- Lancer la version de ProCaP qui a été modifié pour traiter de multiples fichiers.
- Faire Fichier/Ouvrir fichier midi...
- Sélectionner plusieurs fichiers par les méthodes usuelles sous Windows (Ctrl A, Ctrl, Maj...) puis cliquer Ouvrir
Les traitements ProCaP vont alors s'enchainer de manière récursive.
Lorsque tous les fichiers sélectionnés auront été traités, on retrouvera les .dat correspondants sous Documents/ProCaPII/Fichiers_emulateur. Ce sont ces fichiers qu'il suffit de recopier sur la carte SD de l'émulateur.
Dans ce même répertoire on trouve également un fichier texte nommé "Table_titres.txt" qui est généré à des fins de documentation. Il contient la liste des noms de tous les fichiers qui viennent d'être traités rangés par ordre alphabétique, ainsi que les .dat associés.

Bien sûr c'est la méthode la plus efficace, mais elle nécessite de posséder un adaptateur et d'un connecteur pour rendre la carte micro-SD visible de son PC. Il est possible de traiter un nombre illimité de fichiers. Donc en une seule fois on peut transférer la totalité de ses fichiers midi sur l'émulateur ;o)

Lecture des morceaux

Avec le commutateur en position "Lecture" (R), on met l'émulateur en marche et on l'insère en lieu et place d'une carte.
- Immédiatement on peut tourner la manivelle et jouer le morceau qui est affiché à l'écran.
- Pour changer de morceau, arrêter de tourner, naviguer avec le joystick pour sélectionner un nouveau morceau.
- Presser le bouton de PPCaP pour "basculer sur le morceau affiché.
- Et tourner.

 

Et maintenant...

Vous savez tout ou presque, concernant la conception de ce petit système fort pratique et qui à mon sens fonctionne plutôt bien. Contrairement à mes habitudes je n'ai pas publié les fichiers de CAO ni le programme du microcontroleur et c'est volontaire. Non pas que j'entends exceptionnellement en tirer quelque profit que ce soit, mais c'est juste pour me faire une idée de l'intérêt porté à cette réalisation.
Alors... Si ça vous intéresse de vous lancer dans sa construction, contactez-moi. Je me ferai un plaisir de vous faire parvenir gracieusement les fichiers Eagle et les programmes arduino. Il me reste également 4 circuits imprimés nus et puis si vous désirez acquérir un exemplaire déjà assemblé, commme pour les orgues je n'ai pas vraiment vocation à construire pour les autres (ni surtout le temps), mais en fonction du nombre de personnes intéressées, nous devrions pouvoir trouver une solution ;o)

La batterie est chargée

horizontal rule