In diesem Tutorial möchte ich ein kapazitives Touchpad “MPR121” vorstellen.
Das kapazitive Touchpad hat 10 Felder welche als Taster verwendet werden können.
Bezug
Das kapazitive Touchpad “MPR121” kann für knapp 6,65 € bei ebay.de erworben werden.
Technische Daten des kapazitiven Touchpad MPR121
- Betriebsspannung – 3.3V
- Ausgang – I2C
- Abmaße – 48 mm x 78 mm
Anschluss
Das kapazitive Touchpad “MPR121” verfügt über 5 Pins welche wie folgt angeschlossen werden.
MPR121 | Arduino Leonardo | Arduino UNO |
---|---|---|
VCC | 3.3V | 3.3V |
GND | GND | GND |
SDA | SDA | analoger Pin A4 |
SCL | SCL | analoger Pin A5 |
IRQ | bleibt frei* | bleibt frei* |
* Bei der Verwendung der Bibliothek von Adafruit wird dieser Pin nicht gesetzt. Es gibt jedoch andere Bibliotheken, da wird dieser Pin wiederum benötigt.
Schaltung
Im Folgenden möchte ich zeigen wie man das kapazitive Touchpad MPR121 an den Arduino Leonardo anschließt. Der Arduino Leonardo verfügt über die Fähigkeit, als USB HID zu dienen, d.h. der Mikrocontroller kann eine Tastatur & Maus emulieren.
Besonderheiten beim Betrieb von 2 Touchpads
Man kann theoretisch 4 MPR121 Boards an einem Mikrocontroller betreiben, jedoch ist bauartbedingt bei dem mir vorliegenden Modul nur möglich zwischen den Adressen 0x5A & 0x5B zu wählen.
Die Wahl der Adresse erfolgt durch das Setzen eines Lötpunktes auf dem Shield.
Hinweis
Es gibt im Internet ein Datenblatt (leider nur auf Englisch) zum Chip MPR121 unter https://www.sparkfun.com/datasheets/Components/MPR121.pdf dieses Datenblatt befasst sich jedoch nur mit dem Chip. Des Weiteren gibt es diverse andere Boards, welche den gleichen Chip haben jedoch zusätzlich einen ADDR Pin besitzen. Über diesen zusätzlichen ADDR Pin kann man die Adresse bei diesen Boards bestimmen, somit sind max. 4 Boards an einem I2C Bus lauffähig. In dem mir vorliegenden Board kann man wie bereits erwähnt die Adresse mittels Lötpunkt setzen und kann somit nur 2 Boards an einem I2C Bus verwenden.
Quellcode
Bibliothek MPR121 von Adafruit
Von der Firma Adafruit gibt es eine sehr gute Bibliothek, mit welcher ich das Board zum Laufen gebracht habe und vor allem kann man mit dieser Bibliothek mehr als ein Board am I2C Bus betreiben.
Wie man eine Bibliothek in der Arduino IDE installiert, habe ich im gleichnamigen Tutorial Arduino IDE, Einbinden einer Bibliothek ausführlich erläutert.
Beispiel mit einem Board
Hier nun ein kleines Beispiel mit einem Board am Arduino Leonardo.
#include <Wire.h> #include "Adafruit_MPR121.h" #ifndef _BV #define _BV(bit) (1 << (bit)) #endif Adafruit_MPR121 cap = Adafruit_MPR121(); void setup() { Serial.begin(9600); cap.begin(0x5A); } void loop() { uint16_t currtouched = cap.touched(); for (uint8_t i=0; i<12; i++) { if (currtouched & _BV(i)) { printTouchedBtn(i); } } } void printTouchedBtn(int btn){ Serial.println(btn); }
Als Grundlage zu diesem Sketch diente mir das Beispiel “MPR121test” welches der Bibliothek beiliegt.
Video
Beispiel mit 2 Boards
Wie bereits erwähnt muss zunächst auf einem Board ein Lötpunkt für die Adresse 0x5B gesetzt werden. D.h. die beiden unteren Lötaugen werden verbunden.
Sketch
#include <Wire.h> #include <Adafruit_MPR121.h> int numBoards = 0; Adafruit_MPR121 cap0 = Adafruit_MPR121(); Adafruit_MPR121 cap1 = Adafruit_MPR121(); uint16_t currtouched0 = 0; uint16_t currtouched1 = 0; void setup() { Serial.begin(9600); if (cap0.begin(0x5A)) { numBoards++; } if (cap1.begin(0x5B)) { numBoards++; } } void loop() { currtouched0 = cap0.touched(); currtouched1 = cap1.touched(); for (uint8_t i=0; i<12; i++) { if ((currtouched0 & _BV(i))) { printTouchedNumber(0, i); } if ((currtouched1 & _BV(i))) { printTouchedNumber(12, i); } } } void printTouchedNumber(int offset, int btn){ Serial.print(btn+offset); Serial.println(" touched"); }
Video
Fazit
Die Programmierung eines Boards ist relativ einfach gewesen, jedoch beim zweiten Board war es deutlich schwieriger, da hier das Datenblatt und die Beschreibungen zum Chip MPR121 Informationen liefern welche zu dem mir vorliegenden Shield nicht passen. Ich muss gestehen, das ich mich hier der Schwarmintelligenz bedient habe und einen Beitrag in der Facebook-Gruppe “Arduino Deutschland” abgesetzt habe, dort wurde mir auf die Sprünge geholfen und ich habe herausgefunden das die beiden fast unscheinbaren Lötpunkte zum Setzen von Adressen sind.
Nachdem das Problem gelöst war, war der Rest schon wieder banal, den was mit einem Board funktioniert, funktioniert auch mit zwei, 🙂 hier war zu Nummer nur ein Offset von 12 zuzurechnen.
Entweder hat mein Touchpad einen Schaden, oder aber man kann das mit “billigen” Arduino Klonen nicht so einfach nachstellen.
Die Schleife rennt bei mir endlos durch, wenn ich das Beispiel-Programm lade, erscheint nur: check wiring.
Obgleich ich das (meines Erachtens nach) sauber verlötet habe. Naja… Schade 😉
Aber deine Arbeit war sehr hilfreich! Weiter so
Hi,
ich verwende auch manchmal die günstigen China Klone, die funktionieren ähnlich gut.
Gruß, Stefan
ja, mein Modul scheint defekt zu sein. Habe einfach mal nach allen I2C Adressen gescannt. Und: no device attached.
Werde das Teil nochmal neu ordern und hoffen, dass es dann funktioniert 😉
Hi,
ggf. mal die Verkabelung prüfen, SDA muss an analog Pin A4 & SCL an A5.
Und auch mal die Breadboardkabel mit einem Durchgangsprüfer checken, ich hatte schonmal ein kaputtes gehabt und der Fehler ist echt ärgerlich.
Gruß, Stefan