.. note:: こんにちは、FacebookでのSunFounder Raspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Raspberry Pi、Arduino、ESP32についてもっと深く探求しましょう。 **参加する理由** - **エキスパートサポート**:コミュニティやチームからの支援を受けて、販売後の問題や技術的な課題を解決します。 - **学びと共有**:スキル向上のためのヒントやチュートリアルを交換します。 - **独占プレビュー**:新製品の発表や先行公開に早期アクセスします。 - **特別割引**:最新製品に対する独占割引を楽しめます。 - **祭りのプロモーションとギブアウェイ**:ギブアウェイや祝祭のプロモーションに参加します。 👉 私たちと一緒に探索し、創造しませんか?[|link_sf_facebook|]をクリックして今日から参加しましょう! .. _ar_mpr121: 4.3 MPR121で作るエレクトロードキーボード ======================================================== このレッスンでは、 **MPR121静電容量タッチセンサー** を使用してRaspberry Pi Pico 2でタッチ感応キーボードを作る方法を学びます。MPR121では、最大12個の電極に接続されたタッチ入力を検出でき、電極はワイヤーやアルミホイル、果てはバナナのような導電性のある物質に接続できます! **必要なもの** このプロジェクトには、以下のコンポーネントが必要です。 全キットを購入する方が便利です。こちらがリンクです: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - 名前 - このキットのアイテム - リンク * - Newton Lab Kit - 450以上 - |link_newton_lab_kit| 以下のリンクから個別に購入することもできます。 .. list-table:: :widths: 5 20 5 20 :header-rows: 1 * - SN - コンポーネント - 数量 - リンク * - 1 - :ref:`cpn_pico_2` - 1 - |link_pico2_buy| * - 2 - Micro USBケーブル - 1 - * - 3 - :ref:`cpn_breadboard` - 1 - |link_breadboard_buy| * - 4 - :ref:`cpn_wire` - 数本 - |link_wires_buy| * - 5 - :ref:`cpn_mpr121` - 1 - **MPR121センサーの理解** **MPR121** は静電容量タッチセンサーコントローラーで、I2Cインターフェースを通じて通信します。12個のタッチ入力を扱えるため、複数のタッチポイントを持つインタラクティブなプロジェクトに最適です。 MPR121センサーは、電極の静電容量の変化を検出します。電極に触れると静電容量が変化し、センサーがタッチを登録します。この情報はI2Cを通じてRaspberry Pi Pico 2に伝えられます。 **回路図** |sch_mpr121_ar| **配線図** |wiring_mpr121_ar| * MPR121の電極ピン( **E0** から **E11** と表示)にワイヤーや導電性材料を接続します。 * ワイヤーの他端をフルーツやアルミホイルの形、タッチパッドなどの導電体に取り付けます。 **コードの書き方** .. note:: * ファイル ``4.3_electrode_keyboard.ino`` を ``newton-lab-kit/arduino/4.3_electrode_keyboard`` から開くことができます。 * またはこのコードを **Arduino IDE** にコピーしてください。 * **Raspberry Pi Pico 2** ボードと正しいポートを選択し、「Upload」をクリックしてください。 * ここでは ``Adafruit MPR121`` ライブラリを使用しています。 **ライブラリマネージャー** からインストールできます。 .. image:: img/lib_mpr121.png .. code-block:: arduino #include #include // MPR121センサーのインスタンスを作成 Adafruit_MPR121 cap = Adafruit_MPR121(); // 各電極のタッチ状態を保持する配列 bool touchStates[12] = { false }; // 現在および前回のタッチ状態を格納する変数 uint16_t currtouched = 0; uint16_t lasttouched = 0; void setup() { Serial.begin(115200); // シリアル通信を115200ボーで初期化 while (!Serial); // シリアルモニターが開くのを待つ // I2Cアドレス0x5AでMPR121センサーを初期化 if (!cap.begin(0x5A)) { Serial.println("MPR121が見つかりません。配線を確認してください?"); while (1); } Serial.println("MPR121 found!"); } void loop() { // 現在タッチされているパッドを取得 currtouched = cap.touched(); // タッチ状態に変更があったか確認 if (currtouched != lasttouched) { // 最後のタッチ状態を更新 lasttouched = currtouched; // 各電極をイテレート for (int i = 0; i < 12; i++) { // 電極がタッチされているか確認 if (currtouched & (1 << i)) { touchStates[i] = true; } else { touchStates[i] = false; } } // タッチ状態をバイナリ文字列として出力 for (int i = 0; i < 12; i++) { Serial.print(touchStates[i] ? "1" : "0"); } Serial.println(); } delay(100); // 読み取りを安定させ、シリアルモニターを過負荷にしないための小さな遅延 } コードをアップロードした後、MPR121センサーに接続された電極に触れてください。 * シリアルモニターで、どの電極がタッチされているかを示すバイナリ出力を観察します。 * 例えば、最初と11番目の電極に触れると ``100000000010`` と表示されます。 **コードの理解** #. ライブラリのインクルード: * ``Wire.h``:I2C通信を処理します。 * ``Adafruit_MPR121.h``:MPR121センサーとのやり取りに必要な機能を提供します。 #. MPR121センサーの初期化: MPR121センサーのインスタンスを作成します。 .. code-block:: arduino Adafruit_MPR121 cap = Adafruit_MPR121(); #. セットアップ関数: * デバッグ用にシリアル通信を開始します。 * I2Cアドレス0x5AでMPR121センサーを初期化します。 * センサーが見つからない場合、エラーメッセージを出力してプログラムを停止します。 .. code-block:: arduino void setup() { Serial.begin(115200); // シリアル通信を初期化 while (!Serial); // シリアルモニターが開くのを待つ // I2Cアドレス0x5AでMPR121センサーを初期化 if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); } #. ``loop()`` 関数: * MPR121センサーから現在のタッチ状態を取得します。 ``currtouched`` 変数の各ビットは電極のタッチ状態を表します(タッチされている場合は1、そうでない場合は0)。 .. code-block:: arduino currtouched = cap.touched(); * 前回のループイテレーション以降にタッチ状態に変化があったかどうかを確認します。 .. code-block:: arduino if (currtouched != lasttouched) { // タッチ状態を更新 } * 各電極を順番に処理し、 ``touchStates`` 配列を更新します。各電極がタッチされているかどうかに基づいて配列を更新します。 .. code-block:: arduino for (int i = 0; i < 12; i++) { if (currtouched & (1 << i)) { touchStates[i] = true; } else { touchStates[i] = false; } } * タッチ状態をシリアルモニターに12ビットのバイナリ文字列として出力します。例えば、最初と11番目の電極がタッチされた場合、100000000010と表示します。 .. code-block:: arduino for (int i = 0; i < 12; i++) { Serial.print(touchStates[i] ? "1" : "0"); } Serial.println(); * 読み取りを安定させ、シリアルモニターを過負荷にしないために短い遅延を加えます。 .. code-block:: arduino delay(100); **電極の拡張** 様々な導電材料に電極を接続することで、プロジェクトをさらに充実させることができます: * **果物**:バナナ、リンゴ、その他の果物にワイヤーを取り付けて、タッチ感知入力に変えます。 * **アルミホイル形状**:アルミホイルから形を切り出し、それを電極に取り付けます。 * **導電性ペイント**:導電性インクやペイントで模様を描きます。 .. note:: 電極を変更する場合(例えば、異なる材料を接続するなど)、センサーをリセットして基準値を再校正する必要があるかもしれません。 **さらなる探索** * インタラクティブプロジェクトの作成: 各電極が個別のLEDを制御するタッチ操作LEDマトリックスを構築します。 * キーデバウンスの実装: デバウンス技術を実装することで、タッチ検出の信頼性を向上させ、誤タッチを除外します。 * 他のセンサーとの組み合わせ: 温度や光センサーなどの他のセンサーとMPR121を統合して、より複雑なインタラクティブシステムを作ります。 * タッチベースのゲームコントローラーの開発: タッチ入力を使用してゲームの要素を制御します。例えば、キャラクターの移動やオプションの選択などです。 **結論** このレッスンでは、Raspberry Pi PicoとMPR121静電容量タッチセンサーを使用してタッチ感知キーボードを作る方法を学びました。複数の電極でタッチ入力を検出することで、カスタムキーパッド、制御パネル、創造的な入力デバイスなど、プロジェクトのためのインタラクティブなインターフェースを構築できます。タッチ入力の読み取りと処理の方法を理解することは、応答性が高くユーザーフレンドリーな電子プロジェクトを開発するための貴重なスキルです。