Rita själv - MIDI controller med ledande bläck (5 / 6 steg)
Steg 5: MPR121 kapacitiv Sensor
https://www.Sparkfun.com/products/9695
Kapacitiva givaren jag använde för detta projekt är MPR121. MPR121 är en kapacitiv touch sensor controller driven av ett gränssnitt som I2C (i detta fall ledarstyrning är en Arduino). Chipet kan styra upp till tolv enskilda elektroder. Som i mitt projekt jag använde 20 stift (för 20 knappar), jag använde 2 sensorer: Jag använde andra 1: a och 8 elektroder 12 elektroder. Det finns en mycket hjälpsam hookup guide på sparkfun webbplats, som gör det lättare att förstå hur man använder denna sensor. Jag rekommenderar att ladda ner koden de använda och modifiera det fyra dina behov. Om du vill göra mer avancerade saker än vad förklaras i denna guide, rekommenderar jag för att ta en titt på dess datablad till veta hur till göra det kommunicera med Arduino via I2C.
Hookup guide:
https://learn.Sparkfun.com/tutorials/mpr121-hookup...
Datablad:
https://www.Sparkfun.com/datasheets/Components/MPR...
Om du tittat på den schematiska Fritzing fil som jag bifogade, hittar du att massor av anslutningarna av schematiskt (pull-up motstånd, kondensatorer...) redan är lödda när du köper MPR121 sensorn på Sparkfun.
Jag vill vidare påpeka några viktiga anteckningar att konfigurera sensorn för detta projekt:
1) Vdd:
Var försiktig!! MPR121 fungerar med Vdd = 3.3V. Du kommer att bränna den om du ansluter det till 5V utdata från Arduino.
2) Setup:
I hookup guide hittar du detta:
void mpr121_setup(void)
{
set_register (0x5A, ELE_CFG, 0x00);
set_register (0x5A...
.........
Vad den gör är att ställa in MPR121 sensorn korrekt: Välj antalet elektroder används, väljer laddning/urladdning ström och tid för varje sensor, touch/tröskelvärde övergång till varje elektrod... Du behöver inte veta exakt vad det handlar om: du kan bara kopiera den och ändra vissa rader för ditt projekt. Du behöver bara ringa denna funktion på din Arduino Setup, och göra det igen varje gång du vill ändra sensor setup (i mitt fall, när jag justera knapparna eller ändra mallarna, till exempel). Jag kommer att förklara vissa aspekter om sensor setup i nästa poäng.
Funktionen "set_register" i grunden gör I2C kommunikationen mellan sensorn och Arduino. Det definieras så här:
void set_register (int adress, unsigned char r, unsigned char v)
{
Wire.beginTransmission(address);
Wire.write(r);
Wire.write(v);
Wire.endTransmission();
}
Två av de viktigaste register är AFE konfigurationen register 1 och 2 (register 0x5C och 0x5D). Se sidan 13 i databladet för mer i detalj. Ändra värdena för detta register kommer att definiera laddning/urladdning ström och tid för elektroderna, filtrering iterationer, och så vidare. Jag rekommenderar att spela lite med CDT och CDC värden så att du kan hitta lämpliga dem för rätt touch/release upptäckt i projektet (kanske de inte behöver ändras, men kanske de kommer).
3) adressen till varje sensor:
Det finns ett problem när du vill använda två eller flera MPR121 sensorer samtidigt, eftersom alla har samma standardadressen för I2C meddelande: det är 0x5A adressen. Om man tittar på databladet, det står att 4 olika adresser kan väljas, beroende på var du löda adress pin: Vdd, Vss, SDA eller SCL. Som standard kommer styrelsen med adress stift lödas till Vss (marken), så om du vill använda mer än en sensor, måste du klippa denna anslutning: bredvid adress stift finns två små metalliska rutor som är anslutna med en mycket tunn linje: denna linje är anslutningen mellan adress pin och marken. Du bör klippa små raden av en av sensorerna med en fräs och löda adress stift till Vdd, exempelvis så att den nya adressen av denna sensor inte är 0x5A längre: i stället blir det 0x5B.
Detta är precis vad jag gjorde för detta projekt, så jag hade två sensorer: den första som är adressen var 0x5A och andra en var 0x5B.
4) touch/Release tröskelvärde setup:
Touch och release tröskel installationen sker inuti den MPR121 setup. Om du följer guiden hookup och titta på mpr121.h biblioteket, är standardvärdena 0xA0 för touch_threshold och 0xB0 för release tröskel. En möjlighet är att ändra värdet för touch och släpp tröskeln för varje PIN-koden, med en byte variabel för den. Till exempel för en sensor:
< p > byte touch_treshold_1st_sensor [12] = {0xA0, 0X94, 0xB2... //random värden till exempel < 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 >
Jag finner detta det enklaste sättet att definiera olika touch/release tröskelvärden för varje mall: du kan spara värdena på Arduino EEPROM och bara ladda in dem i sensorn, beroende på mallen du använder.
Men jag hade problem med detta: några av de knappar jag ritade på vissa mallar var utanför intervallet, så jag inte kunde göra en korrekt installation. Så istället för att ändra värdena tröskelvärde, var jag ändra laddning/urladdning aktuell för varje individuell pin av sensorn. Du kan lära dig hur man gör detta på sidan 14 i databladet. Detta fungerade bättre för mig, eftersom utbudet av touch/release upptäckten för varje elektrod var större. Detta är ett exempel på hur jag gjorde det:
< p > / / 20 byte-array: 12 värden för 1 sensor och 8 för 2: a sensor. Startvärde: 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 jag använde kodaren välja CDC_sensor [i] värdet för varje stift < /p >< p > för (int jag = 0; jag < 20; i ++) < /p >< p > {< /p > < p > //encoder grejer < /p >< p > om... //if encoder ståndpunkt är ökad < /p >< p > {CDC_sensor [i] ++;} < /p >< p > else...//if encoder ståndpunkt är minskad < /p >< p > {CDC_sensor [i]--;} < /p >< p >} < /p >< p >
Slutligen, varje gång ett CDC_sensor värde ändras, måste du göra inställningen igen: < /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 >
Du bör försöka använda det sätt som är mest lämplig för dig: byta elektrod tröskelvärdena eller individuella avgift aktuella värden.
5) Arduino avbrott:
MPR121 sensorn har en IRQ-stift, som skall ställas in med en pull-up resistor, och går till låg varje gång sensorn upptäcker en touch eller en utgåva i en av dess elektroder. Så rekommenderar jag för att löda denna pins till Arduino avbrott stift, som är digital 2 och 3. Detta sätt kan du använda funktionen Arduino Attachinterrupt:
http://Arduino.cc/en/reference/AttachInterrupt
Men var försiktig! inte många kod saker måste göras inuti avbrottet: till exempel serieporten fungerar inte (därför MIDI-meddelanden fungerar inte heller, eftersom den seriella porten som används för deras överföring). Jag har bara använt avbrotten för att ändra värdet för en boolesk variabel, som beslutsamt huruvida en pin var beröring eller inte. Sedan gjorde jag motsvarande ändringar i programmets allmänna loop. Se koden:
avbryta variabler
statisk boolean touch_1st = false;
statisk boolean touch_2nd = false;
i inställningen:
avbryter
attachInterrupt (0, touching_1st_sensor, faller);
attachInterrupt (1, touching_2nd_sensor, faller).
utanför loopen
void touching_1st_sensor()
{
touch_1st = sant;
}
void touching_2nd_sensor()
{
touch_2nd = sant;
}
i slingan
IF(touch_1st)
{
Kolla för elektroder...
touch_1st = false;
}
IF(touch_2nd)
{
Kolla för elektroder...
touch_2nd = false;
} < br >
Med allt detta tror jag du har tillräcklig information för att göra några nybörjare och medelhög nivå grejer med MPR121 sensor.