Étape 5: Le capteur capacitif MPR121
https://www.Sparkfun.com/Products/9695
Le capteur capacitif, que j’ai utilisé pour ce projet est le MPR121. Le MPR121 est un contrôleur de capteur tactile capacitif piloté par une interface I2C (dans ce cas le contrôleur maître est un Arduino). La puce peut contrôler jusqu'à 12 électrodes individuels. Comme dans mon projet, j’utilisais 20 broches (pour 20 boutons), j’ai utilisé 2 capteurs : J’ai utilisé les 12 électrodes des électrodes 1er et 8 de la seconde. Il y a un guide très utile de raccordement sur le site de sparkfun, qui rendra plus facile à comprendre comment utiliser ce capteur. Je vous recommande de télécharger le code qu’ils utilisent et modifiez-la quatre vos besoins. Si vous voulez faire des trucs plus avancés que ce qui est expliqué dans ce guide, je recommande de jeter un oeil à sa fiche technique pour savoir comment le faire communiquer avec l’Arduino via I2C.
Guide de branchement :
https://Learn.Sparkfun.com/tutorials/mpr121-hookup...
Fiche technique :
https://www.Sparkfun.com/datasheets/Components/MPR...
Si vous regardé le schéma de fichier de Fritzing que j’ai joint, vous découvrirez que beaucoup des connexions du schéma (pull-up résistances, condensateurs...) est déjà soudés lorsque vous achetez le capteur MPR121 à Sparkfun.
Ensuite, j’ai va remarquer quelques remarques importantes sur la façon de configurer le capteur pour ce projet :
1) DMV :
Fais attention!! le MPR121 fonctionne avec Vdd = 3, 3V. Vous brûlerez il si vous le connectez à la sortie 5V de l’Arduino.
2) le programme d’installation :
Dans le guide de raccordement, vous trouverez ceci :
void mpr121_setup(void) { set_register(0x5A, ELE_CFG, 0x00); set_register(0x5A,.... .........
Ce qu’il fait est de mettre en place le capteur MPR121 correctement : sélectionnez le nombre d’électrodes utilisées, choisissez la charge/décharge actuelle et l’heure pour chaque capteur, définir la version de touch/seuil pour chacune des électrodes... Vous n’avez pas besoin de savoir exactement de quoi il s’agit : vous pouvez simplement copier et modifier certaines lignes pour votre projet. Vous avez juste besoin d’appeler cette fonction sur la configuration de votre Arduino et faites-le encore chaque fois que vous voulez modifier la configuration du capteur (dans mon cas, quand j’ai les boutons de réglage ou de modifier les modèles, par exemple). Je vais vous expliquer quelques aspects sur la configuration du capteur dans les prochains points.
Fondamentalement, la fonction « set_register » a fait la communication I2C entre le capteur et l’Arduino. Elle est définie comme suit :
void set_register(int address, unsigned char r, unsigned char v) { Wire.beginTransmission(address); Wire.write(r); Wire.write(v); Wire.endTransmission(); }
Deux des plus importants registres sont les registres de Configuration AFE 1et 2 (registres 0x5C et 0x5D). Voir la page 13 de la feuille de données pour plus de détails. Changer les valeurs de cette registres définira le courant de charge/décharge et le temps pour les électrodes, les itérations de filtrage et ainsi de suite. Je recommande de jouer qu'un peu avec les valeurs de CDT et CDC afin que vous puissiez trouver ceux adaptés pour la détection correcte touch/publication dans votre projet (peut-être qu’ils n’auront pas à être modifiés, mais peut-être qu’ils vont).
3) l’adresse de chaque capteur :
Il y a un problème lorsque vous souhaitez utiliser deux ou plusieurs capteurs de MPR121 à la fois, parce que tous ont la même adresse par défaut pour la communication I2C : c’est l’adresse 0x5A. Si vous regardez la feuille de données, il est dit que 4 adresses différentes peuvent être choisis, selon où vous soudez la broche adresse : DMV, Vss, le SDA ou SCL. Par défaut, le jury est livré avec la goupille d’adresse soudée à Vss (sol), donc si vous souhaitez utiliser plus d’un capteur, il faut couper cette connexion: à côté de la broche d’adresse, vous trouverez deux petits carrés métalliques qui sont liés par une ligne très fine : cette ligne est la connexion entre la broche de l’adresse et le sol. Vous devez couper cette petite ligne d’un des capteurs avec un cutter et souder la broche d’adresse à la DMV, par exemple, afin que la nouvelle adresse de ce capteur n’est pas 0x5A plus : au contraire, il sera 0x5B.
C’est exactement ce que j’ai fait pour ce projet, donc j’ai eu deux capteurs : première adresse était 0x5A et le second sa a été 0x5B.
4) configuration du seuil de touch/Release :
La configuration du seuil tactile et sortie se faite à l’intérieur de l’installation de MPR121. Si vous suivez le guide de branchement et regardez la bibliothèque de mpr121.h, les valeurs par défaut sont 0xA0 pour touch_threshold et 0xB0 pour seuil de rejet. Une possibilité est de changer la valeur de la touche et seuil pour chaque broche, en utilisant une variable byte pour cela. Par exemple, pour un capteur :
<p>byte touch_treshold_1st_sensor[12] = { 0xA0, 0X94, 0xB2.... //random values for example<br>byte release_treshold_1st_sensor[12] = { 0xB0,0xC3, 0xA8.... ...... ..... void mpr121_1st_sensor_setup(void) { ....... set_register(0x5A, ELE0_T, touch_treshold_1st_sensor[0]); set_register(0x5A, ELE0_R, release_treshold_1st_sensor[0]); set_register(0x5A, ELE1_T, touch_treshold_1st_sensor[1]); set_register(0x5A, ELE1_R, release_treshold_1st_sensor[1]); ........</p>
Je trouve que cela est la façon la plus simple pour définir les valeurs seuils touch/publication différente pour chaque modèle : vous pouvez enregistrer les valeurs sur l’Arduino EEPROM et il suffit de les charger dans le capteur, selon le modèle que vous utilisez.
Cependant, j’ai eu des problèmes avec cela : certains des boutons j’ai dessiné sur certains modèles étaient hors de portée, donc je ne pourrais pas faire un montage correct. Donc au lieu de modifier les valeurs de seuil, je changeais l’actuel pour chaque broche individuelle du capteur de Charge/décharge. Vous pouvez apprendre comment faire cela à la page 14 de la feuille de données. Cela a fonctionné mieux pour moi, parce que la gamme de détection tactile/sortie pour chaque électrode est plus élevée. Il s’agit d’un exemple de comment je l’ai fait :
<p>// 20 byte array: 12 values for 1st sensor and 8 for 2nd sensor. Initial value: 0x28<br>byte CDC_sensor[20] = {0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28};</p><p>.......</p><p>//Then I used the encoder to select the CDC_sensor[i] value for each pin</p><p>for (int i=0; i<20; i++)</p><p>{</p><p> //encoder stuff</p><p> if... //if encoder position is increased</p><p> {CDC_sensor[i] ++;}</p><p> else...//if encoder position is decreased</p><p> {CDC_sensor[i] --;}</p><p>}</p><p> //finally, everytime a CDC_sensor value is changed, you need to make the setup again:</p><p>void mpr121_1st_sensor_setup(void)<br>{ ....... </p><p> set_register(0x5A, 0x5F, CDC_sensor[0]); //el 0<br> set_register(0x5A, 0x60, CDC_sensor[1]); //el 1 set_register(0x5A, 0x61, CDC_sensor[2]); //el 2</p><p> ........</p>
Vous devriez essayer d’utiliser de la manière qui convient le mieux pour vous : changer les valeurs de seuil d’électrodes ou les valeurs actuelles de frais individuels.
5) interruption pour Arduino :
Le capteur MPR121 dispose d’une broche d’IRQ, qui doit être défini avec une résistance de pull-up, et va vers le bas chaque fois que le capteur détecte une touche ou une sortie dans l’une de ses électrodes. Je recommande donc à souder ce broches aux broches interruption Arduino, qui sont 3 et 2 numériques. De cette façon, vous pouvez utiliser la fonction Arduino Attachinterrupt :
http://Arduino.cc/en/Reference/AttachInterrupt
Mais soyez prudent ! pas beaucoup de trucs code doit se faire à l’intérieur de l’interruption : par exemple, le port série ne fonctionne pas (par conséquent, les messages MIDI ne fonctionnent pas soit, parce que le port série est utilisé pour la transmission). J’ai seulement utilisé les interruptions pour modifier la valeur d’une variable de type boolean qui détermine si une broche a été touchée ou non. Ensuite, j’ai fait les changements correspondants dans le programme général de boucle. Voir le code :
//interrupt variables static boolean touch_1st = false; static boolean touch_2nd = false; //in the setup: //interrupts attachInterrupt(0, touching_1st_sensor, FALLING); attachInterrupt(1, touching_2nd_sensor, FALLING); //outside the loop void touching_1st_sensor() { touch_1st = true; } void touching_2nd_sensor() { touch_2nd = true; } //in the loop if(touch_1st) { //check for electrodes... touch_1st = false; } if(touch_2nd) { //check for electrodes... touch_2nd = false; }<br>
Avec tout cela, je pense que vous avez suffisamment d’informations pour faire quelques débutants et trucs niveau moyen avec le capteur MPR121.