Softwareseitig verwenden Sie eine funktionierende C-Umgebung aus Teil 9 dieser Reihe. Trotz des einfachen Aufbaus sollten Sie ihn testen. Um zu sehen, ob sich das Modul ordentlich am Bus meldet, verwenden Sie das Werkzeug I2cdetect (Listing 1).
Listing 1
$ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Die Adressleitung wurde nicht angeschlossen, die Halbleiterwelt interpretiert einen offenen Eingang so gut wie immer als logisches HIGH. Die Adresse unseres Halbleiters lautet 0x5A (Listing 1). Jetzt schließen Sie an die Eingänge des Moduls einige selbst gebaute Sensoren an (Abbildung 3).
Bei Sensor 1 handelt es sich um ein handelsübliches Alu-Klebeband. Berührt man es mit den Fingern, löst der MPR121 aus – nichts besonderes, dazu hätte auch das Messen des Ohmschen Widerstands genügt. Als Sensor 2 dient eine Aderendhülsen-Quetschzange. Das Interessante daran: Der Sensor löst aus, sobald Sie die Zange in die Hand nehmen. Dabei darf man nicht vergessen, dass die Griffe extrem gut isoliert sind. Dieses Verhalten lässt sich tatsächlich nur mit einem kapazitiven Sensor erreichen.
Sensor 3 weist einen ähnlichen Aufbau auf wie Sensor 1, mit dem Unterschied, dass sich das Aluminium hinter Papier befindet. Theoretisch könnte man so berührungsempfindliche Bereiche hinter Tapeten oder Bildern realisieren. Sensor 4 besteht aus einer simplen Rolle Lötzinn. Interessanterweise genügt es, den Finger hineinzustecken, um den Sensor zu triggern.
Bei Sensor 5 handelt es sich um den altbekannten, allseits beliebten “Apfelsensor”. Wegen des hohen Wassergehalts eignen sich Obst und Gemüse hervorragend als Sensoren. Wie unsere Experimente zeigen, lässt sich fast alles als Sensor für den MPR121 verwenden.
Testprogramm
Das Programm aus Listing 2 ist recht einfach aufgebaut. Alle Befehle vor der While-Endlosschleife dienen der Initialisierung des MPR121. Die zwei For-Schleifen laden die Grenzwerte für die Berührungserkennung in die entsprechenden Register.
Listing 2
/* MPR121.c */
#include <wiringPiI2C.h>
#include <stdio.h>
#include <string.h>
int main(void) {
int handle = wiringPiI2CSetup(0x5A);
int touch = 0x0F;
int release = 0x0A;
int i;
char out[13];
wiringPiI2CWriteReg8(handle, 0x5e, 0x00);
wiringPiI2CWriteReg8(handle, 0x2B, 0x01);
wiringPiI2CWriteReg8(handle, 0x2C, 0x01);
wiringPiI2CWriteReg8(handle, 0x2D, 0x00);
wiringPiI2CWriteReg8(handle, 0x2E, 0x00);
wiringPiI2CWriteReg8(handle, 0x2F, 0x01);
wiringPiI2CWriteReg8(handle, 0x30, 0x01);
wiringPiI2CWriteReg8(handle, 0x31, 0xFF);
wiringPiI2CWriteReg8(handle, 0x32, 0x02);
for (i = 0x41; i < 0x57; i = i+2) {
wiringPiI2CWriteReg8(handle, i, touch);
}
for (i = 0x42; i < 0x58; i = i+2) {
wiringPiI2CWriteReg8(handle, i, release);
}
wiringPiI2CWriteReg8(handle ,0x5D, 0x04);
wiringPiI2CWriteReg8(handle ,0x5E, 0xFC);
while(1) {
int in = wiringPiI2CReadReg16(handle, 0x00);
out[0] = '\0';
for (i = 2048; i > 0; i >>= 1) {
strcat(out, ((in & i) == i) ? "1" : "0");
}
printf ("%s\n", out);
usleep(100000);
}
}
Der MPR121 ist jetzt so konfiguriert, dass er beim Start die Kapazität aller seiner Eingänge misst und danach nur noch auf Veränderungen reagiert. Das bedeutet, sobald sich etwas an den Sensoren verändert, muss man ihn neu starten, damit er sich auf die veränderten Bedingungen einstellen kann.
Der Rest des Programms besteht aus einer einfachen Endlosschleife, die alle 100 Millisekunden die Eingänge abfragt. Um sich das Leben etwas leichter zu machen, lesen Sie anstelle von zweimal 8 Bit einen 16-Bit-Wert aus dem Register 0x00. Bei diesem Baustein klappt diese Vorgehensweise. Allerdings sollte man nicht davon ausgehen, dass man immer mit einer 16-Bit-Leseoperation anstelle von zweimal 8 Bit auskommt.
Die For-Schleife innerhalb der Endlosschleife dient dazu, die einzelnen Bits (Eingänge des MPR121) einzeln als Nullen und Einsen darzustellen. Abbrechen lässt sich das Programm wie üblich mit [Strg]+[C]. Um es zu kompilieren, tippen Sie gcc MPR121.c -lwiringPi -o MPR121; den Start übernimmt ./MPR121.
Fazit
Der MPR121 ist kein Must-have-Bauteil, das in jede Bastelkiste gehört. Dennoch eignet er sich für den Einsatz in vielen Projekten, um die altmodischen Taster auf vielfältige und ideenreiche Weise zu ersetzen. Wir konnten sogar zeigen, dass es nicht immer Äpfel oder Birnen sein müssen, die den Schaltvorgang auslösen.
Der Autor
Martin Mohr erblickte im Zeitalter der Magnetringkernspeicher und Hebdrehwähler das Licht der Welt. Schon früh entwickelte er eine Vorliebe für alles, was blinkt; eine Ausbildung zum Elektroniker verstärkte das noch. Nach einem Informatikstudium lag sein Beschäftigungsfeld überwiegend in der Entwicklung von Java-Applikationen. Mit dem Raspberry Pi erwachte die alte Liebe zur Elektronik wieder.
Infos
- MPR121-Modul bei Amazon: https://www.amazon.de/dp/B01N0BWFGW/
- Datenblatt MPR121: http://www.nxp.com/files/sensors/doc/data_sheet/MPR121.pdf






