Arduino Lektion 86: kapazitives Touchpad MPR121

In diesem Tutorial möchte ich das kapazitive Touchpad „MPR121“ vorstellen.

kapazitives Touchpad MPR121
kapazitives Touchpad MPR121

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.

kapazitives Touchpad MPR121 am Arduino Leonardo
kapazitives Touchpad MPR121 am Arduino Leonardo

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.

wahl der Adresse für ide I2C Kommunikation am kapazitiven Touchpad MPR121
wahl der Adresse für ide I2C Kommunikation am kapazitiven Touchpad MPR121

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.

Bibliothek "MPR121" von Adafruit
Bibliothek „MPR121“ von Adafruit

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.

kapazitives Touchpad MPR121 Adresse 0x5B gesetzt durch ein Lötpunkt
kapazitives Touchpad MPR121 Adresse 0x5B gesetzt durch ein Lötpunkt

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

2x kapazitives Touchpad MPR121 am Arduino Leonardo

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.

Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert