Stap 5: De MPR121 capacitieve Sensor
https://www.Sparkfun.com/products/9695
De capacitieve Sensor die ik voor dit project gebruikte is de MPR121. De MPR121 is een Capacitieve touch sensor controller gedreven door een I2C-interface (in dit geval de hoofdbesturing is een Arduino). De chip kunt maximaal twaalf individuele elektroden. Zoals in mijn project was ik met behulp van 20 pins (voor 20 knopen), gebruikte ik 2 sensoren: Ik gebruikte de 12 elektroden van de elektroden van de 1ste en 8 van de tweede. Er is een zeer nuttig hookup gids op de website van sparkfun, waardoor het makkelijker om te begrijpen hoe te gebruiken deze sensor. Ik adviseer de code ze gebruiken en wijzigen het vier te downloaden uw behoeften. Als u maken van de meer geavanceerde dingen wilt dan wat wordt uitgelegd in deze handleiding, adviseer ik een kijkje nemen in het gegevensblad om te weten hoe te communiceren met de Arduino via I2C maken.
Hookup gids:
https://Learn.Sparkfun.com/tutorials/mpr121-hookup...
Datasheet:
https://www.Sparkfun.com/datasheets/Components/MPR...
Als je keek naar het Fritzing bestand schema die ik gekoppeld, vindt u uit dat veel van de aansluitingen van het schema (pull-up weerstanden, condensatoren...) al wanneer u de MPR121 sensor op Sparkfun koopt worden gesoldeerd.
Vervolgens zal ik de opmerking van sommige belangrijke opmerkingen over het opzetten van de sensor voor dit project:
1) Vdd:
Wees voorzichtig!! de MPR121 werkt met Vdd = 3,3 v. U zal het branden als u deze op de uitgang van de 5V van de Arduino aansluit.
2) de instellen:
In de gids van de aansluiting vindt u dit:
void mpr121_setup(void) { set_register(0x5A, ELE_CFG, 0x00); set_register(0x5A,.... .........
Wat het doet is het opzetten van de MPR121-sensor correct: Selecteer het nummer van de elektroden gebruikt, kiest u de lading/kwijting stroom en de tijd voor elke sensor, stel de versie van de aanraking/drempel voor elke elektrode... U hoeft niet te weten precies waar het om gaat: u kunt gewoon kopiëren en veranderen sommige van de regels voor uw project. U hoeft deze functie oproepen op uw Arduino Setup, en doe het opnieuw welbeschouwd u zin voor het wijzigen van de instelling van de sensor (in mijn geval, toen ik de knoppen aanpassen of wijzigen van de sjablonen, bijvoorbeeld). Ik zal enkele aspecten uitleggen over de instelling van de sensor in de volgende punten.
De 'set_register'-functie maakt in principe de I2C communicatie tussen de sensor en de Arduino. Zij wordt gedefinieerd als volgt:
void set_register(int address, unsigned char r, unsigned char v) { Wire.beginTransmission(address); Wire.write(r); Wire.write(v); Wire.endTransmission(); }
Twee van de meest belangrijke registers worden de registers van de AFE configuratie 1 en 2 (registers 0x5C en 0x5D). Zie bladzijde 13 van het gegevensblad voor meer informatie. Veranderen de waarden van deze registers zal definiëren de lading/kwijting stroom en de tijd voor de elektroden, de filter iteraties, enzovoort. Ik beveel het spelen die een beetje met de CDT en CDC waarden zodat geschikt zijn voor de detectie van de juiste touch/release vindt u in uw project (misschien ze niet hoeft te worden gewijzigd, maar misschien ze zullen).
3) het adres van elke sensor:
Er is een probleem wanneer u gebruiken twee of meer MPR121 sensoren tegelijk, wilt omdat ze allemaal het zelfde standaardadres voor de I2C communicatie: dit is het adres 0x5A. Als je kijkt naar het gegevensblad, het zegt dat 4 verschillende adressen kunnen worden gekozen, afhankelijk van waar u de adres-pin solder: Vdd, Vss, SDA of SCL. Standaard komt de Raad van bestuur met de adres-speld vastgesoldeerd aan Vss (gemalen), dus als je gebruiken meer dan één sensor wilt, heb je te snijden hierover: naast de pin adres vindt u twee kleine metalen vierkanten die zijn verbonden met een zeer dunne lijn: deze regel is de verbinding tussen het adres pin en de grond. U moet deze kleine lijn van één van de sensoren met een kotter knippen, en soldeer de adres pin aan Vdd, bijvoorbeeld, zodat het nieuwe adres van deze sensor niet meer 0x5A is: in plaats daarvan het 0x5B zal worden.
Dit is precies wat ik deed voor dit project, dus ik had twee sensoren: de ene's adres was 0x5A en de tweede iemands was 0x5B.
4) touch/Release drempel instellen:
De aanraking en release drempel setup wordt gedaan binnen het MPR121-setup. Als je de aansluiting gids volgen en kijken naar de mpr121.h-bibliotheek, zijn de standaardwaarden 0xA0 voor touch_threshold en 0xB0 voor release drempel. Eén mogelijkheid is te wijzigen van de waarde van de aanraking en de vrijgave van de drempel voor elke pin, met behulp van een byte-variabele voor het. Bijvoorbeeld voor een sensor:
<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>
Ik vind dit de eenvoudigste manier om verschillende touch/release drempelwaarden definiëren voor elk sjabloon: u kunt de waarden op de Arduino EEPROM opslaan en laden ze gewoon in de sensor, afhankelijk van de sjabloon die u gebruikt.
Echter had ik problemen met dit: sommige van de knoppen die ik trok op sommige sjablonen werden buiten het bereik, zodat ik kon niet het maken van een juiste installatie. Dus in plaats van de waarden voor drempel wijzigen, ik was het veranderen van de lading/kwijting huidige voor elke individuele pin van de sensor. U kunt leren hoe dit te doen op bladzijde 14 van het gegevensblad. Dit werkte beter voor me, want het aantal touch/release detectie voor elke elektrode groter was. Dit is een voorbeeld van hoe ik het deed:
<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>
U moet proberen te gebruiken de manier waarop is meest geschikt voor jou: de elektrode drempelwaarden of de huidige waarden van afzonderlijke kosten wijzigen.
5) Arduino onderbreken:
De MPR121-sensor heeft een IRQ-pin, die worden ingesteld met een pull-up weerstand moet, en gaat naar lage everytime de sensor detecteert een aanraking of een release in één van de elektroden. Dus adviseer ik om te solderen deze pinnen op de Arduino interrupt-pinnen, die digitale 2 en 3. Op deze manier kunt u de Arduino Attachinterrupt functie:
http://Arduino.CC/en/Reference/AttachInterrupt
Maar wees voorzichtig! niet veel code spullen moet gebeuren binnen de interrupt: bijvoorbeeld, de seriële poort niet werkt (dus de MIDI-berichten werken of niet, want de seriële poort wordt gebruikt voor de transmissie ervan). Ik gebruikte alleen de interrupts te wijzigen van de waarde van een Booleaanse variabele, die bepaald of één pin was geraakt of niet. Vervolgens, mij did de corresponderende wijzigingen aangebracht in de algemene lus-programma. Zie de 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>
Met dit alles, ik denk dat je genoeg informatie om sommige beginner en middellange niveau dingen doen met de MPR121-sensor.