【RP2040/Raspberry Pi】タッチセンサモジュールMPR121の使い方!配線とライブラリ導入、感度設定まで解説

MPR121 break out base

1. MPR121 静電センサをラズパイで使ってみる。

マイコンで、タッチパネルのような操作できようにしたくありませんか?

今回は、1基板で12個ものタッチ入力を扱えるIC「MPR121」を解説します。

MPR121は高感度なので、タッチセンサだけでなく、リンゴなどの果物にピンを刺して果物ボタンを作れたりします。

MPR121 モジュール

MPR121 モジュール

最大12個のタッチパッドを作れる高精度タッチセンサモジュール自動校正付き

広告

ラズパイ等のマイコンに触れたことがない方は、まず安価に手に入るRP2040で開発環境を整えておきましょう。

RP2040のセットアップマニュアルのサムネイル

RP2040(Pico/Zero) + CircuitPython 始め方ガイド

RP2040-Zeroの環境構築をPythonで楽に進めたい方必見!CircuitPythonのインストール手順、Thonnyでのデモ実行、GP0/GP1ピンを使った入力チェックまでを詳しく紹介。上位互換のRP2350にも対応。コンパイル不要な爆速開発ベースの作り方をまとめました。

2. 静電容量センサの技術的背景

セットアップの前に、仕組みについて軽く触れておきます。

MPR121が検知しているのは、物理的な接触ではなく「電界の変化」です。

仕組み:コンデンサの原理

静電容量センサの紹介用。コンデンサの仕組み

電極(銅箔テープ)と指の間には、目に見えないコンデンサが形成されます。この時の静電容量 \(C\) は以下の式で表されます。

\[C = \epsilon \frac{A}{d}\]

ここで、 \(\epsilon\) は誘電率、 \(A\) は電極の面積、 \(d\) は距離です。指が近づくと距離 \(d\) が縮まり、相対的に誘電率 \(\epsilon\)(空気から生体へ)が変化するため、静電容量 \(C\) が増加します。

MPR121の内部処理

MPR121は内部に10ビットのADC(アナログ-デジタル変換器)を備えており、各チャンネルの充放電時間を計測することでこの微細な変化をデジタル値化します。

  • Baseline(基準値): 環境ノイズや湿度による変化を学習した「触れていない状態」の値。
  • Filtered Data(生データ): リアルタイムの計測値。この2つの差分(Delta)が一定の閾値(Threshold)を超えた時に「タッチ」と判定されます。

基準値と生データを比較し、その値の差からタッチされたかどうかを判断しています。

3. I2C通信とピンアサインの注意点

MPR121はI2C(Inter-Integrated Circuit)という通信方式を採用しています。RP2040で安定した通信を行うためには、適切なピン選択が不可欠です。

RP2040では、I2C通信のバス2つを利用することができます。(I2C0 / I2C1)以下の説明は、I2C0のデフォルトピンにおける構成です。

接続構成

RP2040-Zeroでは、デフォルトで利用しやすい以下のピンを使用します。

MPR121側RP2040-Zero側機能
VCC3.3V電源 (3.3V)
GNDGND接地
SDAGP0データ信号線
SCLGP1クロック信号線
IRQGP2割り込み信号線 (Active Low)
なぜIRQ(割り込み)が必要か?

通常、プログラムは常に「触れられたか?」をマイコンに聞きに行きます(ポーリング)。しかし、IRQピンを接続すると、変化があった時だけMPR121側から通知を送ることができるようになります。(サーバ上の呼び出しもこんな風にポーリングすることでコスト削減できたりします)。これにより、CPUリソースを節約し、より複雑な信号処理にパワーを割くことが可能になります。

I2Cアドレスの設定

基板上の「ADDR」ピンをどこに繋ぐかで、I2Cバス上の住所(アドレス)が決まります。

RP2040のI2Cバスは最大4つの基盤を接続して通信できますが、もしアドレス指定がないと、どの通信がどの基板からなのかわからなくなってしまいます。そこで、アドレスをそれぞれの基板で設定することでどの基盤なのか識別できるようになります。

1. 配線のルール:SDAとSCLは「全員共通」

2枚以上のMPR121を使う場合、以下のように配線します。

  • VCC / GND: 全員同じ場所に繋ぎます。
  • SDA (データ): 全員のSDAピンを1本の線にまとめ、RP2040の GP0 に繋ぎます。
  • SCL (クロック): 全員のSCLピンを1本の線にまとめ、RP2040の GP1 に繋ぎます。

2. アドレス(住所)の決め方

各基板の ADDRピン を使って「住所(アドレス)」を書き換えます。

基板のADDRピンをどこに繋ぐかI2Cアドレス役割(コード上の指定)
GND (または未接続)0x5A1台目
VCC (3.3V)0x5B2台目
SDA (自身のSDAピンへ)0x5C3台目
SCL (自身のSCLピンへ)0x5D4台目

4. 実践:4ボタン・タッチコントローラーの製作

ELE0〜ELE3の端子を使って、簡単な方向キー(上下左右)モジュールを作ってみましょう。

touchコントローラは、銅線テープとカプトンテープ(普通のセロファンテープでも大丈夫)と100均で売ってた板を使って作りました。

タッチパッド作成手順

静電容量センサを使った十字タッチパネル作成手順、サイズ確認のため仮貼り
静電容量センサを使った十字タッチパネル作成手順、銅線テープを仮決めした寸法で切る

銅線テープを切る

十字操作したいので、4つ十字に並ぶように銅線テープべたを張る。
大まかなサイズが決まったので、銅線テープを切る。

静電容量センサを使った十字タッチパネル作成手順、べたの銅線箔が貼れた。ここがタッチボタンになる
静電容量センサを使った十字タッチパネル作成手順、カプトンテープで上から保護し完成
静電容量センサを使った十字タッチパネル作成手順、べたの銅線箔が貼れたのではんだ付けしている様子

センサにしたい形に銅線テープを貼る

このとき、別の操作を割り当てたい銅線テープと重ならないようにすること。

(できれば、テスタで短絡チェックすると良いです。)

はんだ付け

基板に接続するための導線をはんだ付け。

保護のため上からテープを張る

カプトンテープ(セロファンテープでも可。薄いのでより繊細に検知できるカプトンテープを選択)を上から貼って完成。

銅線テープは両面導電のものを選ばないと重ねて大きなタッチパッドにできないので注意です。

銅箔テープ

銅箔テープ

厚めのものが感度が良いです。

広告

タッチセンサ動作検証

ライブラリをダウンロード(adafruit_mpr121adafruit_hid)

RP2040などで通信を行うには、MPR121のライブラリを取ってくる必要があります。

以下のリンクから自身のcircutpythonのバージョンに合わせて、ダウンロードし、libフォルダに配置してください。

ライブラリや環境がわからない場合は以下の”始め方ガイド“に詳しく書いてあります。

RP2040のセットアップマニュアルのサムネイル

RP2040(Pico/Zero) + CircuitPython 始め方ガイド

RP2040-Zeroの環境構築をPythonで楽に進めたい方必見!CircuitPythonのインストール手順、Thonnyでのデモ実行、GP0/GP1ピンを使った入力チェックまでを詳しく紹介。上位互換のRP2350にも対応。コンパイル不要な爆速開発ベースの作り方をまとめました。

MPR121ライブラリ : adafruit_mpr121.mpy

MPR121ライブラリ

MPR121ライブラリ

MPR121

github.com

もし、リンクが切れていたら、↓こちら、もしくは”circuit python MPR121”などの文言で検索してください。

circut python MPR121ライブラリページ 予備リンク

キーボード入力用ライブラリ : adafruit_hid

キー入力できるようにするためのライブラリです。adafruit_hidをフォルダごとコピーしてくる必要があります。

ver10ならadafruit-circuitpython-bundle-10.x-mpy-20251225.zipのようなものがあるので、これをダウンロード、展開し、libフォルダを見るとたくさんのライブラリフォルダがあるので、その中からadafruit_hidを探します。

adafruitのライブラリからadfruit_hidを探す

adafruit-circuitpython-bundle-10.x-mpy-20251225\lib\adafruit_hid
のような階層にあります。

circut python ライブラリページ

circut python ライブラリページ

circuitpythonのライブラリバンドル

circuitpython.org

もし、リンクが切れていたら、↓こちら、もしくは”circuit python hid”などの文言で検索してください。

circut python hid github 予備リンク
libフォルダの構成例

配置後のlibフォルダ

adafruit_mpr121.mpy ファイルと

adafruit_hid フォルダが必要です。

配線図と実行例

以下のような配線で、接続し、下に示すようなプログラムをcode.pyに書きこんで実行してみました。

十字キータッチセンサの配線図

配線は、以下の通り

RP2040側MPR121側
3.3V3.3V
GP2IRQ
GP1SCL
GP0SDA
無しADDR
GNDGND

十字キー入力できるプログラム

TOUCH_SENSITIVITYとRELEASE_SENSITIVITYでタッチ感度を変更できます。

import time
import board
import busio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
import adafruit_mpr121

# --- セットアップ ---
i2c = busio.I2C(board.GP1, board.GP0)
mpr121 = adafruit_mpr121.MPR121(i2c)
kbd = Keyboard(usb_hid.devices)

# --- 感度の明示的設定 ---
# threshold: タッチ判定のしきい値。小さいほど高感度(デフォルトは通常12)
# release_threshold: 離したと判定するしきい値。thresholdより小さい値を設定(デフォルトは通常6)
TOUCH_SENSITIVITY = 12
RELEASE_SENSITIVITY = 6

for i in range(12):
    mpr121[i].threshold = TOUCH_SENSITIVITY
    mpr121[i].release_threshold = RELEASE_SENSITIVITY

mpr121._write_register_byte(0x2F, 0x00)

# キーマップ設定 (ELE 0:左, 1:上, 2:右, 3:下)
key_map = {
    0: Keycode.LEFT_ARROW,
    1: Keycode.UP_ARROW,
    2: Keycode.RIGHT_ARROW,
    3: Keycode.DOWN_ARROW
}

touch_counters = {pin: 0 for pin in key_map.keys()}
BUFFER_THRESHOLD = 2

print("--- 十字キーコントローラー起動 ---")

while True:
    for pin, keycode in key_map.items():
        if mpr121[pin].value:
            touch_counters[pin] += 1
            if touch_counters[pin] >= BUFFER_THRESHOLD:
                kbd.press(keycode)
        else:
            if touch_counters[pin] >= BUFFER_THRESHOLD:
                kbd.release(keycode)
            touch_counters[pin] = 0
            
    time.sleep(0.01)

動作検証結果

まとめと運用のコツ

MPR121は非常に高機能ですが、その繊細さゆえに「あれ?勝手に反応する」「触っても反応が鈍い」といった事象が起こることがあります。作品のクオリティを上げるために、以下の3つのポイントを意識してみてください。

① ノイズ対策:配線は「短く・捻る」が鉄則

電極から基板までの配線が長すぎると、その線自体がアンテナのように周囲の電磁波ノイズを拾ってしまいます。

  • ツイストペア: 信号線(ELE)とGND線をペアにして軽く捻る(ツイストする)と、ノイズ耐性が大幅に向上します。
  • 長さの統一: 各ボタンの配線の長さを揃えることで、各チャンネルの「浮遊容量(配線自体が持つ静電容量)」が等しくなり、プログラム側での感度調整が圧倒的に楽になります。

② キャリブレーションの罠を回避する

MPR121は「電源を入れた瞬間の状態」を基準値(触れていない状態)として学習します。

  • 注意点: 起動時にたまたま電極に指が触れていると、その「触れた状態」が基準になってしまい、離しても反応しなくなります。
  • 対策: プログラムの冒頭でソフトリセットをかける、あるいは「キャリブレーション完了まで触れないでください」というLED演出を加えるなどの工夫が有効です。

③ 環境変化に合わせた感度設定

静電容量は湿度や気温、設置場所の素材によって微妙に変化します。

  • 今回のコードの TOUCH_SENSITIVITY(閾値)を、設置環境に合わせて微調整してください。
  • 厚いアクリル板越しに操作したい場合は、数値を小さくして感度を上げ、逆に誤作動が多い場合は数値を大きくして「鈍く」するのがコツです。

最後に

MPR121を使ったタッチセンサの基本はここまでです。 ボタンを物理的なスイッチから「面」に変えるだけで、デバイスのデザイン性は一気に向上します。銅箔テープだけでなく、導電糸で刺繍した布や、水の入ったコップ、あるいは果物まで。「電気を通すものなら何でもボタンにできる」というこのセンサの特性を活かして、ぜひあなただけのユニークなインターフェースを形にしてみてください。

また、筋力が低下したなどの理由から通常のボタンをどうしても押しずらいというとき、このタッチセンサが使えれば、触るだけで操作できるピープルフレンドリーなモジュールができると思います。

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero

使った材料一覧

RP2040

RP2040

ラズパイzeroの互換基板でそれなりに安価で手に入ります

広告

上位基板RP2350 (RP2040より高性能,2024発売)新しく買うならこっちが良いかもしれません。

RP2350

RP2350

RP2040の上位モデル

広告

MPR121 モジュール

MPR121 モジュール

最大12個のタッチパッドを作れる高精度タッチセンサモジュール自動校正付き

広告

銅箔テープ

銅箔テープ

厚めのものが感度が良いです。

広告

カプトンテープ

カプトンテープ

上から貼る絶縁の薄いテープ

広告

ピンヘッダ(メス)

ピンヘッダ(メス)があると、タッチパネルを複数作って差し替えるだけで簡単にタッチパネルを変えられて簡単です。

折って使うもの(コツがいる)

ピンヘッダ(メス)

ピンヘッダ(メス)

抜き差しを簡単にするためのピンヘッダ

広告

長さぴったりのものを探す

ぴったりサイズだが、ちょっと高い。綺麗に作りたいならこっちで作ると良いです。アマゾンなどだと見つかりずらいので。ぴっちり作りたいときは、5pin,6pin,9pin,12pinのもの作りたい個数に合わせて秋月電子などで探してみてください。

単列メスピンヘッダセット

単列メスピンヘッダセット

奇数がないので若干見栄えが悪いかもしれませんが使えます。

広告

導線の先の処理。ピンヘッダに刺せるようにする方法

ジャンパ線の作り方をコツを含めて紹介した記事のサムネイル

【ジャンパー線-作り方のコツ】メスピンヘッダやブレッドボードに刺せるジャンパー線を自作しよう!長さを自由に、分岐も自在にする方法

電子工作に欠かせないジャンパ線の作り方をステップ形式で解説。市販品より安く、自由な長さで作れる自作のメリットを徹底比較。適切な材料選びや、はんだ付け・熱収縮チューブによる絶縁保護のポイントも紹介します。電源分岐やピンヘッダ化など、自作だからできるカスタマイズ術も必見です。