Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TUTO] Touch Sensor

    24 octobre 2014 à 17:11:03

    Bonjour à tous,

    Je lance à travers ce forum une ébauche de tuto et un suivit de travail concernant la création d'un capteur sensitif, l'objectif étant de proposer de créer son propre "clavier" sensitif pour un prix le plus bas possible.

    Objectifs :

    • création d'un capteur sensitif proche du capacitif et non du restrictif
    • sensibilité : du toucher direct de la touche, à la détection du doigt à plusieurs centimètres
    • grande fiabilité
    • grand nombre de touches
    • détection du toucher en moins de 10ms
    • petit prix

    Ce qui existe déjà :

    J'ai eu l'occasion de tester deux solutions quand j'ai voulu développer mon clavier. Toutes deux utilisent la notion de capacité électrique : dans un circuit RC, le condensateur met un certain temps à se charger et il en résulte donc une courbe exponentielle quand on mesure la tension à ses bornes. En obtenant tau et en connaissant R, on peut déterminer C (http://fr.wikipedia.org/wiki/Circuit_RC).
    Une fine feuille conductrice reliée à un capteur de tension joue le rôle du condensateur. En approchant une partie du corps de cette feuille, on augmente C et par conséquent tau. En mesurant la variation de tau, on peut alors déterminer s'il y a toucher ou non. Cette technique peut aussi être utilisée pour calculer facilement la capacité d'un condensateur.
    • La première solution que j'ai testée est le capteur  MPR121 (https://www.sparkfun.com/products/9695). Il est précis (pas de faux positifs ou de vrais négatifs) et plutôt facile à utiliser. Par contre, il ne gère "que" 12 touches (donc pour un clavier 48 touche : 40$...), et nécessite un toucher direct de celles-ci ou un maximum de quelques micromètres entre le doigt et les touches (épaisseur d'une feuille en gros). Bref pas forcément optimisé si on veux cacher les capteurs sous une petite surface rigide. Il reste tout de même un très bon capteur pour d'autres applications moins restrictives.
       
    • La deuxième solution est d'utiliser la librairie CapacitiveSensor (http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense). Cette librairie mesure tau, et on peut donc déterminer s'il y a toucher ou non... en tout cas dans la théorie, car en pratique ce n'est pas du tout aussi simple :

      1. La capacité "produite" par le corps varie entre 0.1pf et 0.01pf, c'est vraiment rien du tout donc difficile à identifier.
      2. Le fil de l'électrode doit être cours.
      3. Point le plus important : la feuille joue le rôle d'antenne, il y a donc énormément de bruit et les mesures ne sont donc pas fiables sauf si on fait des moyennes sur plusieurs secondes (bien trop long pour mes besoins).

      En fait c'est cette librairie qui m'a le plus déçu car on vois clairement la courbe exponentielle varier sur l'oscilloscope, mais les bruits parasites perturbent trop la lecture pour être précis. J'utilise des câbles blindés (ce que je fais toujours quand je lis un signal). J'ai aussi testé différents condensateurs en parallèle (1pf à 100pf), mais le bruit est bien trop fort pour être compensé. Finalement, j'ai recodé la librairie en l'optimisant et en appliquant quelques algorithmes de réduction du bruit, mais en vain.
       
    Lecture du bruit au niveau de la feuille (échantillons sur 10ms)   -   img 1 au repos   -   img 2 en approchant le doigt.
    Comme on peut le voir sur ces images, le fait d’approcher le doigt de la feuille conductive perturbe beaucoup le signal, à tel point que l'effet RC se voit écrasé par le bruit.
    Bref tout ça pour dire que malgré tous mes efforts, je n'ai rien réussit à obtenir d'efficace en passant par la lecture de la capacité.

    Mon approche :

    Plutôt que de se servir de la capacitance, je me suis dis : pourquoi ne pas utiliser le corps comme antenne ?
    En effet, le corps humain conduit plutôt bien le courant (c'est pour ça qu'on évite de mettre les doigts dans les prises :p), et on "capte" sans cesse les milliers de fréquences électromagnétiques qui nous entourent, provenant de la radio, de la TV, du WiFi et même de l'espace ! Bien entendu, il n'est pas question de pouvoir regarder la télé en branchant le câble d'antenne à même la peau, mais on peut tout de même observer un joli signal si on approche l'entrée de l’oscilloscope à quelques cm de notre peau. D'autre part, plus on se rapproche, plus le signal est amplifié, de ce fait, en mesurant cette amplitude on peut déterminer approximativement à quelle distance ce situe le doigt.
    Lecture du bruit au niveau du corps humain (échantillons sur 100ms)   -   img 1 au repos   -   img 2 et 3 en approchant petit à petit le doigt.


    Maintenant, la question que vous pourriez vous poser est : mais comment on mesure l'amplitude ?

    Une approche naïve serait de calculer le max ou le min et le les comparer avec un seuil, mais cela ne marche que si le signal est périodique et "élégant" (sur les graphiques précédent, je pense que les pics observés sont dus au courant AC d'EDF car ils ont une fréquence de 50Hz environ). Or la plupart du temps, le signal est anarchique, il peut donc très bien arriver de rencontrer un pic très amplifié alors qu'il n'y a eu aucun écart avant. Celui-ci sera alors détecté par erreur comme un toucher.
    En fait, il existe un moyen de calculer la dispersion sur un échantillon, on appelle cela en statistique "la variance".
    Pour détecter un toucher, il faut donc lire plusieurs valeurs du signal sur une certaine période (on appelle cela un échantillon), puis calculer la variance = somme(x[i]^2) - moyenne^2
    Plus il y aura d'écart entre les échantillons, plus la variance sera élevée. Si la variance dépasse un certain seuil, on pourra alors considérer qu'il y a toucher.

    Matériel :

    Pour le matériel, je me servirais :
    • d'une arduino pro mini 3.3V 8Mhz (marche aussi avec un autre modèle).
    • de deux résistances de 10Mohm (les résistances doivent être identiques, mais leur valeur peut changer en fonction de l'amplitude du bruit).
    • de câbles blindés. Si vous n'en avez pas, il suffit d'enrouler chaque fils par de l'aluminium, en laissant le moins de surface dépasser. N'oubliez pas de relier le blindage au GND.
    • de feuille conductrices. Par exemple de l'aluminium, du copper tape, une surface en métal, etc...

    Montage :

    Le montage est tout simple : on branche 2 résistances en série entre VCC et GND. Entre deux on place l'électrode et l'entrée pour la lecture analogique.
    En faisant ça, on crée un pont diviseur de tension pour obtenir en A0 une tension équivalente à celle de l'arduino divisée par 2, soit une lecture de 512 sur l'entrée analogique. Cela permet de lire des tensions alternatives sur A0 comme notre signal perçu par l'électrode. N'oubliez d’ailleurs pas d'utiliser du câble blindé pour l'électrode et pour la lecture analogique, sinon c'est la câble et non la feuille qui jouera le rôle d'antenne !
    La valeur des résistances R1 et R2 doit être identique et suffisamment grande pour que l'on puisse observer un signal. Plus cette valeur augmente, plus celui-ci sera amplifié. Il faudra donc choisir judicieusement R1 et R2 pour obtenir des valeurs lues par A0, sans toucher à l’électrode, comprises entre entre 384 et 640. Après quelques tests, des résistances de 1Mohm font l'affaire, mais 10Mohm assurent plus de précision.
    La suite plus tard ;)

    -
    Edité par lifaon74 26 octobre 2014 à 23:25:49

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2014 à 17:46:30

      Super intéressant tout ça...J'attends la suite :D

      -
      Edité par Nisnor 26 octobre 2014 à 17:46:50

      • Partager sur Facebook
      • Partager sur Twitter
        26 octobre 2014 à 23:33:32

        Actuellement, le projet est plutôt bien avancé. Si je prend du retard sur la rédaction du tuto c'est à cause de l'éditeur de texte mer.ique d'openclassrom qui ne permet presque pas de mise en page, ce qui est très pénible qu'on on doit rédiger un truc qui dépasse les 10 lignes... et c'est d’ailleurs pour ça que ça n'a malheureusement pas beaucoup de gueule.

        Le code que j'ai développé fonctionne très bien, gère jusqu'à 256 électrodes, mais en pratique dépasser les 64 n'est pas conseillé car l'Arduino n'a pas beaucoup de RAM ni de puissance de calculs pour lire rapidement le signal et calculer la variance, cela pour chaque électrodes séparément.

        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2014 à 12:18:53

          C'est toujours bon à prendre...Un µC Atmel utilisé sur les Arduino a de "faible" capacités (tout est relatif en fait)...Si on tape dans les µC ATMEL 32 bits (voir d'autres puce à base d'ARM), y'a surement moyen de gérer plus.

          Mais plutôt que de faire un tuto sur le forum, ce serait pas mieux de faire un mini-tuto qui apparaitrait dans la section Cours?

          -
          Edité par Nisnor 27 octobre 2014 à 12:19:20

          • Partager sur Facebook
          • Partager sur Twitter

          [TUTO] Touch Sensor

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown